diff --git a/.github/auto-assignees.yml b/.github/auto-assignees.yml deleted file mode 100644 index 222704c8b37..00000000000 --- a/.github/auto-assignees.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -# This assigns a PR to its author -addAssignees: true - -addReviewers: false - -assignees: - - wy65701436 - - Vad1mo - - OrlinVasilev - - stonezdj - - chlins - - MinerYang - -numberOfAssignees: 3 diff --git a/.github/release.tpl b/.github/release.tpl deleted file mode 100644 index 2db6df21fea..00000000000 --- a/.github/release.tpl +++ /dev/null @@ -1,19 +0,0 @@ -// publish release writes the following to release notes. -{"buildNo":"${buildNo}","preTag":"${preTag}"} -// buildNo is required,buildNo is used to specify the installer package. -// buildNo is found at https://github.com/goharbor/harbor/actions/workflows/build-package.yml -// preTag is not required, preTag is used to specify the previous tag, and generates release notes between previous tag and current tag. If preTag is not specified, previous tag will be automatically calculated. - -// Example 1 -// current tag:v2.5.0-rc1 -{"buildNo":"build.1250","preTag":"v2.4.0"} -// Specify the installer package built by Build Package Workflow #1272 as release asset. -// Specify the previous tag as v2.4.0 - -// Example 2 -// current tag:v2.5.0 -{"buildNo":"rc1"} -// Specify the installer package of v2.5.0-rc1 as the release asset of v2.5.0. -// Unspecified preTag automatically calculates preTag for v2.4.0 - -// If the wrong buildNo is specified and the Workflow fails to run, please modify the buildNo and re run \ No newline at end of file diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index 0cd23c92ad8..00000000000 --- a/.github/release.yml +++ /dev/null @@ -1,36 +0,0 @@ -# .github/release.yml - -changelog: - exclude: - labels: - - release-note/ignore-for-release - authors: - - octocat - categories: - - title: Exciting New Features 🎉 - labels: - - release-note/new-feature - - title: Enhancement 🚀 - labels: - - release-note/enhancement - - title: Component updates ⬆️ - labels: - - release-note/update - - title: Docs update 🗄️ - labels: - - release-note/docs - - title: Community update 🧑🏻‍🤝‍🧑🏾 - labels: - - release-note/community - - - title: Breaking Changes 🛠 - labels: - - release-note/breaking-change - - - title: Deprecations ❌ - labels: - - release-note/deprecation - - - title: Other Changes - labels: - - "*" \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index a4de814af53..8c343d22ffe 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -48,20 +48,20 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env #sudo apt install -y xvfb @@ -77,7 +77,7 @@ jobs: sudo service docker restart - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h bash ./tests/showtime.sh ./tests/ci/ut_install.sh @@ -85,13 +85,13 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/ut_run.sh $IP df -h - name: Codecov For BackEnd uses: codecov/codecov-action@v5 with: - file: ./src/github.com/goharbor/harbor/profile.cov + files: ./src/github.com/groq/harbor/profile.cov flags: unittests APITEST_DB: @@ -109,23 +109,23 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV IP=`hostname -I | awk '{print $1}'` echo "IP=$IP" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -136,14 +136,14 @@ jobs: sudo mv docker-compose /usr/local/bin - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h docker system prune -a -f bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP DB - name: script run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor echo IP: $IP df -h bash ./tests/showtime.sh ./tests/ci/api_run.sh DB $IP @@ -164,23 +164,23 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV IP=`hostname -I | awk '{print $1}'` echo "IP=$IP" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -191,14 +191,14 @@ jobs: sudo mv docker-compose /usr/local/bin - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h docker system prune -a -f bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP DB - name: script run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor echo IP: $IP df -h bash ./tests/showtime.sh ./tests/ci/api_run.sh PROXY_CACHE $IP @@ -219,22 +219,22 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd go env echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV IP=`hostname -I | awk '{print $1}'` echo "IP=$IP" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -245,7 +245,7 @@ jobs: sudo mv docker-compose /usr/local/bin - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP LDAP @@ -253,7 +253,7 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/api_run.sh LDAP $IP df -h @@ -272,21 +272,21 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: setup env run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd docker version go env echo "GOPATH=$(go env GOPATH):$GITHUB_WORKSPACE" >> $GITHUB_ENV echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/goharbor/harbor/tests/private_key.pem" >> $GITHUB_ENV + echo "TOKEN_PRIVATE_KEY_PATH=${GITHUB_WORKSPACE}/src/github.com/groq/harbor/tests/private_key.pem" >> $GITHUB_ENV shell: bash - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -305,7 +305,7 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/distro_installer.sh df -h @@ -322,16 +322,16 @@ jobs: node-version: '18' - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: script run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/ui_ut_run.sh df -h - name: Codecov For UI uses: codecov/codecov-action@v5 with: - file: ./src/github.com/goharbor/harbor/src/portal/coverage/lcov.info + files: ./src/github.com/groq/harbor/src/portal/coverage/lcov.info flags: unittests diff --git a/.github/workflows/auto_assign_prs.yml b/.github/workflows/auto_assign_prs.yml deleted file mode 100644 index 7331fd620ec..00000000000 --- a/.github/workflows/auto_assign_prs.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: "Auto Assign" - -# pull_request_target means that this will run on pull requests, but in -# the context of the base repo. This should mean PRs from forks are supported. -on: - pull_request_target: - types: [opened, reopened, ready_for_review] - -jobs: - # Automatically assigns reviewers and owner - add-reviews: - runs-on: ubuntu-latest - steps: - - name: Set the author of a PR as the assignee - uses: kentaro-m/auto-assign-action@v2.0.0 - with: - configuration-path: ".github/auto-assignees.yml" diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index 881c1e58e8e..2ce5f1caf2d 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -1,11 +1,12 @@ name: "Build Package Workflow" env: DOCKER_COMPOSE_VERSION: 1.23.0 + REGISTRY: ghcr.io on: push: branches: - - main + - groq_release - release-* jobs: @@ -13,67 +14,36 @@ jobs: env: BUILD_PACKAGE: true runs-on: - - ubuntu-20.04 + - ubuntu-22.04 + permissions: + contents: read + packages: write + steps: - - uses: actions/checkout@v3 - - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_CREDENTIALS }}' - - uses: google-github-actions/setup-gcloud@v2 - with: - version: '430.0.0' - - run: gcloud info - name: Set up Go 1.22 uses: actions/setup-go@v5 with: go-version: 1.23.2 id: go - - name: Setup Docker - uses: docker-practice/actions-setup-docker@master - with: - docker_version: 20.10 - docker_channel: stable - - uses: actions/checkout@v3 - - uses: jitterbit/get-changed-files@v1 - id: changed-files - with: - format: space-delimited - token: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/checkout@v3 + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + - uses: actions/checkout@v4 + - name: Log in to Container Registry + uses: docker/login-action@v3 with: - path: src/github.com/goharbor/harbor - - name: Build Base Image - if: | - contains(steps.changed-files.outputs.modified, 'Dockerfile.base') || - contains(steps.changed-files.outputs.modified, 'VERSION') || - contains(steps.changed-files.outputs.modified, '.buildbaselog') || - github.ref == 'refs/heads/main' + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Set version variables run: | - set -x - echo "BUILD_BASE=true" >> $GITHUB_ENV - - name: Build Package - run: | - set -x - env - df -h - harbor_target_bucket="" target_branch="$(echo ${GITHUB_REF#refs/heads/})" - harbor_offline_build_bundle="" - harbor_online_build_bundle="" - harbor_logs_bucket="harbor-ci-logs" - harbor_builds_bucket="harbor-builds" - harbor_releases_bucket="harbor-releases" - harbor_ci_pipeline_store_bucket="harbor-ci-pipeline-store/latest" - # the target release version is the version of next release(RC or GA). It needs to be updated on creating new release branch. target_release_version=$(cat ./VERSION) Harbor_Package_Version=$target_release_version-'build.'$GITHUB_RUN_NUMBER - if [[ $target_branch == "main" ]]; then + if [[ $target_branch == "groq_release" ]]; then Harbor_Assets_Version=$Harbor_Package_Version - harbor_target_bucket=$harbor_builds_bucket else Harbor_Assets_Version=$target_release_version - harbor_target_bucket=$harbor_releases_bucket/$target_branch fi if [[ $target_branch == "release-"* ]]; then @@ -81,28 +51,64 @@ jobs: else Harbor_Build_Base_Tag=dev fi + + echo "HARBOR_ASSETS_VERSION=$Harbor_Assets_Version" >> $GITHUB_ENV + echo "HARBOR_PACKAGE_VERSION=$Harbor_Package_Version" >> $GITHUB_ENV + echo "HARBOR_BUILD_BASE_TAG=$Harbor_Build_Base_Tag" >> $GITHUB_ENV + echo "TARGET_BRANCH=$target_branch" >> $GITHUB_ENV + echo "REGISTRY_PREFIX=${{ env.REGISTRY }}/${{ github.repository }}/" >> $GITHUB_ENV + + - name: Build Harbor Images + run: | + sudo make build \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.HARBOR_BUILD_BASE_TAG }} \ + VERSIONTAG=${{ env.HARBOR_ASSETS_VERSION }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + PULL_BASE_FROM_DOCKERHUB=true \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - build_base_params=" BUILD_BASE=false" - cd src/github.com/goharbor/harbor - if [ -z "$BUILD_BASE" ] || [ "$BUILD_BASE" != "true" ]; then - echo "Do not need to build base images!" - else - build_base_params=" BUILD_BASE=true PUSHBASEIMAGE=true REGISTRYUSER=\"${{ secrets.DOCKER_HUB_USERNAME }}\" REGISTRYPASSWORD=\"${{ secrets.DOCKER_HUB_PASSWORD }}\"" - fi - sudo make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true HTTPPROXY= ${build_base_params} - sudo make package_online GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=${Harbor_Build_Base_Tag} VERSIONTAG=${Harbor_Assets_Version} PKGVERSIONTAG=${Harbor_Package_Version} TRIVYFLAG=true HTTPPROXY= ${build_base_params} - harbor_offline_build_bundle=$(basename harbor-offline-installer-*.tgz) - harbor_online_build_bundle=$(basename harbor-online-installer-*.tgz) - echo "Package name is: $harbor_offline_build_bundle" - echo "Package name is: $harbor_online_build_bundle" + - name: Push Harbor Images to GHCR + run: | + # Get list of built images + images=$(docker images --format "table {{.Repository}}:{{.Tag}}" | grep "${{ env.REGISTRY }}/${{ github.repository }}" | grep "${{ env.HARBOR_ASSETS_VERSION }}" | awk '{print $1}') + + # Push each image + for image in $images; do + echo "Pushing $image" + docker push $image + done + + - name: Create offline installer package + run: | + sudo make package_offline \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.HARBOR_BUILD_BASE_TAG }} \ + VERSIONTAG=${{ env.HARBOR_ASSETS_VERSION }} \ + PKGVERSIONTAG=${{ env.HARBOR_PACKAGE_VERSION }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - source tests/ci/build_util.sh - cp ${harbor_offline_build_bundle} harbor-offline-installer-latest.tgz - cp ${harbor_online_build_bundle} harbor-online-installer-latest.tgz - uploader ${harbor_offline_build_bundle} $harbor_target_bucket - uploader ${harbor_online_build_bundle} $harbor_target_bucket - uploader harbor-offline-installer-latest.tgz $harbor_target_bucket - uploader harbor-online-installer-latest.tgz $harbor_target_bucket - echo "BUILD_BUNDLE=$harbor_offline_build_bundle" >> $GITHUB_ENV + - name: Create online installer package + run: | + sudo make package_online \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.HARBOR_BUILD_BASE_TAG }} \ + VERSIONTAG=${{ env.HARBOR_ASSETS_VERSION }} \ + PKGVERSIONTAG=${{ env.HARBOR_PACKAGE_VERSION }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - publishImage $target_branch $Harbor_Assets_Version "${{ secrets.DOCKER_HUB_USERNAME }}" "${{ secrets.DOCKER_HUB_PASSWORD }}" + - name: Upload packages as artifacts + uses: actions/upload-artifact@v4 + with: + name: harbor-packages-${{ env.HARBOR_PACKAGE_VERSION }} + path: | + harbor-offline-installer-*.tgz + harbor-online-installer-*.tgz diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index f97fcebcda0..00000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: "Code scanning - action" - -on: - push: - pull_request: - schedule: - - cron: '0 16 * * 6' - -jobs: - CodeQL-Build: - - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - # Override language selection by uncommenting this and choosing your languages - # with: - # languages: go, javascript, csharp, python, cpp, java - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - #- name: Autobuild - # uses: github/codeql-action/autobuild@v1 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - # to make sure autobuild success, specifify golang version in go.mod - # https://github.com/github/codeql/issues/15647#issuecomment-2003768106 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/conformance_test.yml b/.github/workflows/conformance_test.yml index db6725c2c21..420914ab954 100644 --- a/.github/workflows/conformance_test.yml +++ b/.github/workflows/conformance_test.yml @@ -17,14 +17,6 @@ jobs: #- self-hosted - ubuntu-latest steps: - - uses: actions/checkout@v3 - - id: 'auth' - name: 'Authenticate to Google Cloud' - uses: google-github-actions/auth@v2 - with: - credentials_json: '${{ secrets.GCP_CREDENTIALS }}' - - uses: google-github-actions/setup-gcloud@v2 - - run: gcloud info - name: Set up Go 1.21 uses: actions/setup-go@v5 with: @@ -32,11 +24,11 @@ jobs: id: go - uses: actions/checkout@v3 with: - path: src/github.com/goharbor/harbor + path: src/github.com/groq/harbor - name: before_install run: | set -x - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor pwd env df -h @@ -51,7 +43,7 @@ jobs: sudo service docker restart - name: install run: | - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor env df -h bash ./tests/showtime.sh ./tests/ci/api_common_install.sh $IP DB @@ -59,12 +51,6 @@ jobs: run: | echo IP: $IP df -h - cd src/github.com/goharbor/harbor + cd src/github.com/groq/harbor bash ./tests/showtime.sh ./tests/ci/conformance_test.sh $IP df -h - - name: upload test result to gs - run: | - cd src/github.com/goharbor/harbor - gsutil cp ./distribution-spec/conformance/report.html gs://harbor-conformance-test/report.html - gsutil acl ch -u AllUsers:R gs://harbor-conformance-test/report.html - if: always() diff --git a/.github/workflows/housekeeping-stale-issues-prs.yaml b/.github/workflows/housekeeping-stale-issues-prs.yaml deleted file mode 100644 index a44665e22ef..00000000000 --- a/.github/workflows/housekeeping-stale-issues-prs.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Housekeeping - Close stale issues and PRs -on: - schedule: - - cron: '0 9 * * *' - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v9.1.0 - with: - stale-issue-message: 'This issue is being marked stale due to a period of inactivity. If this issue is still relevant, please comment or remove the stale label. Otherwise, this issue will close in 30 days.' - stale-pr-message: 'This PR is being marked stale due to a period of inactivty. If this PR is still relevant, please comment or remove the stale label. Otherwise, this PR will close in 30 days.' - close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity. If this issue is still relevant, please re-open a new issue.' - close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity. If this PR is still relevant, please re-open a new PR against main.' - days-before-issue-stale: 60 - days-before-pr-stale: 60 - days-before-issue-close: 30 - days-before-pr-close: 30 - # Don't add stale label to PRs / issues with milestones "upcoming" attached. - exempt-milestones: "upcoming" - # Don't add stale label to PRs / issues with this label - exempt-issue-labels: 'never-stale, kind/requirement' - exempt-pr-labels: 'never-stale, kind/requirement' - # Make it 1000 to clean up a bit then wen can lower it - operations-per-run: 1000 diff --git a/.github/workflows/label_check.yaml b/.github/workflows/label_check.yaml deleted file mode 100644 index 6c2cd53adcc..00000000000 --- a/.github/workflows/label_check.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: Release Note Label Check - -# Trigger the workflow on pull requests only -on: - pull_request: - types: [opened, labeled, unlabeled, synchronize] - -env: - GOPROXY: https://proxy.golang.org/ - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} -jobs: - # Ensures correct release-note labels are set: - # - At least one label - # - At most one two the main category labels - check-label: - name: Check release-note label set - runs-on: ubuntu-latest - steps: - - uses: mheap/github-action-required-labels@v5 - with: - mode: minimum - count: 1 - labels: "release-note/ignore-for-release, release-note/new-feature, release-note/update, release-note/enhancement, release-note/community, release-note/breaking-change, release-note/docs, release-note/infra, release-note/deprecation" diff --git a/.github/workflows/nightly-trivy-scan.yml b/.github/workflows/nightly-trivy-scan.yml deleted file mode 100644 index 9f390f5e872..00000000000 --- a/.github/workflows/nightly-trivy-scan.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Trivy Nightly Scan -on: - schedule: - - cron: '0 2 * * *' # run at 2 AM UTC - - -jobs: - nightly-scan: - name: Trivy Scan nightly - strategy: - fail-fast: false - matrix: - # maintain the versions of harbor that need to be actively - # security scanned - versions: [dev, v2.12.0-dev] - # list of images that need to be scanned - images: [harbor-core, harbor-db, harbor-exporter, harbor-jobservice, harbor-log, harbor-portal, harbor-registryctl, prepare] - permissions: - security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@master - with: - image-ref: 'docker.io/goharbor/${{ matrix.images }}:${{ matrix.versions }}' - severity: 'CRITICAL,HIGH' - format: 'template' - template: '@/contrib/sarif.tpl' - output: 'trivy-results.sarif' - env: - # Use AWS' ECR mirror for the trivy-db image, as GitHub's Container - # Registry is returning a TOOMANYREQUESTS error. - # Ref: https://github.com/aquasecurity/trivy-action/issues/389 - TRIVY_DB_REPOSITORY: 'public.ecr.aws/aquasecurity/trivy-db:2' - - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: 'trivy-results.sarif' diff --git a/.github/workflows/pass-CI.yml b/.github/workflows/pass-CI.yml deleted file mode 100644 index 24049ba7d95..00000000000 --- a/.github/workflows/pass-CI.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: CI - -on: - pull_request: - paths: - - 'docs/**' - - '**.md' - - 'tests/**' - - '!tests/**.sh' - - '!tests/apitests/**' - - '!tests/ci/**' - push: - paths: - - 'docs/**' - - '**.md' - - 'tests/**' - - '!tests/**.sh' - - '!tests/apitests/**' - - '!tests/ci/**' - -jobs: - UTTEST: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - APITEST_DB: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - APITEST_DB_PROXY_CACHE: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - APITEST_LDAP: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - OFFLINE: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' - - UI_UT: - runs-on: - - ubuntu-latest - steps: - - run: 'echo "No run required"' diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 64f4940e2cf..2aaa602a4b8 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -5,80 +5,129 @@ on: tags: - 'v*.*.*' +env: + REGISTRY: ghcr.io + jobs: release: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 + permissions: + contents: write + packages: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup env run: | echo "CUR_TAG=${{ github.ref_name }}" >> $GITHUB_ENV echo "BASE_TAG=$(cat ./VERSION)" >> $GITHUB_ENV - release=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/goharbor/harbor/releases/tags/${{ github.ref_name }}) - echo "BUILD_NO=$(echo $release | jq -r '.body' | jq -r '.buildNo')" >> $GITHUB_ENV - echo "PRE_TAG=$(echo $release | jq -r '.body' | jq -r '.preTag')" >> $GITHUB_ENV - echo "BRANCH=$(echo $release | jq -r '.target_commitish')" >> $GITHUB_ENV - echo "PRERELEASE=$(echo $release | jq -r '.prerelease')" >> $GITHUB_ENV - - uses: 'google-github-actions/auth@v2' + echo "PRERELEASE=$(echo ${{ github.ref_name }} | grep -q 'rc\|alpha\|beta' && echo 'true' || echo 'false')" >> $GITHUB_ENV + + - name: Set up Go + uses: actions/setup-go@v5 with: - credentials_json: '${{ secrets.GCP_CREDENTIALS }}' - - uses: google-github-actions/setup-gcloud@v2 + go-version: 1.23.2 + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 with: - version: '430.0.0' - - name: Prepare Assets + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build Harbor Images run: | - if [ ! ${{ env.BUILD_NO }} -o ${{ env.BUILD_NO }} = "null" ] - then - echo "missing required parameter buildNo." - exit 1 - fi - echo "buildNo:${{ env.BUILD_NO }}" - echo "preTag:${{ env.PRE_TAG }}" + sudo make build \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.BASE_TAG }} \ + VERSIONTAG=${{ env.CUR_TAG }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + PULL_BASE_FROM_DOCKERHUB=true \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} - src_offline_package=harbor-offline-installer-${{ env.BASE_TAG }}-${{ env.BUILD_NO }}.tgz - src_online_package=harbor-online-installer-${{ env.BASE_TAG }}-${{ env.BUILD_NO }}.tgz - dst_offline_package=harbor-offline-installer-${{ env.CUR_TAG }}.tgz - dst_online_package=harbor-online-installer-${{ env.CUR_TAG }}.tgz - gsutil cp gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_offline_package} gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_offline_package} - gsutil cp gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${src_online_package} gs://${{ secrets.HARBOR_RELEASE_BUILD }}/${{ env.BRANCH }}/${dst_online_package} + - name: Push Harbor Images to GHCR + run: | + # Get list of built images + images=$(docker images --format "table {{.Repository}}:{{.Tag}}" | grep "${{ env.REGISTRY }}/${{ github.repository }}" | grep "${{ env.CUR_TAG }}" | awk '{print $1}') + + # Push each image + for image in $images; do + echo "Pushing $image" + docker push $image + done - assets_path=$(pwd)/assets - source tools/release/release_utils.sh && getAssets ${{ secrets.HARBOR_RELEASE_BUILD }} ${{ env.BRANCH }} $dst_offline_package $dst_online_package ${{ env.PRERELEASE }} $assets_path - echo "OFFLINE_PACKAGE_PATH=$assets_path/$dst_offline_package" >> $GITHUB_ENV - echo "ONLINE_PACKAGE_PATH=$assets_path/$dst_online_package" >> $GITHUB_ENV - echo "MD5SUM_PATH=$assets_path/md5sum" >> $GITHUB_ENV - - name: Setup Docker - uses: docker-practice/actions-setup-docker@master - with: - docker_version: 20.10 - docker_channel: stable - - name: Publish Images + - name: Create offline installer package run: | - tar -zxf ${{ env.OFFLINE_PACKAGE_PATH }} - docker load -i ./harbor/harbor.${{ env.BASE_TAG }}.tar.gz - images="$(docker images --format "{{.Repository}}" --filter=reference='goharbor/*:${{ env.BASE_TAG }}' | xargs)" - source tools/release/release_utils.sh - publishImages ${{ env.CUR_TAG }} ${{ env.BASE_TAG }} "${{ secrets.DOCKER_HUB_USERNAME }}" "${{ secrets.DOCKER_HUB_PASSWORD }}" $images - publishPackages ${{ env.CUR_TAG }} ${{ env.BASE_TAG }} ${{ github.actor }} ${{ secrets.GITHUB_TOKEN }} $images + sudo make package_offline \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.BASE_TAG }} \ + VERSIONTAG=${{ env.CUR_TAG }} \ + PKGVERSIONTAG=${{ env.CUR_TAG }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} + + - name: Create online installer package + run: | + sudo make package_online \ + GOBUILDTAGS="include_oss include_gcs" \ + BASEIMAGETAG=${{ env.BASE_TAG }} \ + VERSIONTAG=${{ env.CUR_TAG }} \ + PKGVERSIONTAG=${{ env.CUR_TAG }} \ + TRIVYFLAG=true \ + EXPORTERFLAG=true \ + BUILD_BASE=false \ + IMAGENAMESPACE=${{ env.REGISTRY }}/${{ github.repository }} + + - name: Generate checksums + run: | + offline_package=$(ls harbor-offline-installer-*.tgz) + online_package=$(ls harbor-online-installer-*.tgz) + + echo "Generating checksums..." + md5sum $offline_package > checksums.txt + md5sum $online_package >> checksums.txt + sha256sum $offline_package >> checksums.txt + sha256sum $online_package >> checksums.txt + + echo "OFFLINE_PACKAGE=$offline_package" >> $GITHUB_ENV + echo "ONLINE_PACKAGE=$online_package" >> $GITHUB_ENV + - name: Generate release notes run: | release_notes_path=$(pwd)/release-notes.txt - source tools/release/release_utils.sh && generateReleaseNotes ${{ env.CUR_TAG }} ${{ env.PRE_TAG }} ${{ secrets.GITHUB_TOKEN }} $release_notes_path + + # Generate release notes using GitHub API + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \ + -d '{"tag_name":"${{ env.CUR_TAG }}"}' \ + | jq -r '.body' > $release_notes_path + echo "RELEASE_NOTES_PATH=$release_notes_path" >> $GITHUB_ENV + - name: RC Release uses: softprops/action-gh-release@v2 if: ${{ env.PRERELEASE == 'true' }} with: body_path: ${{ env.RELEASE_NOTES_PATH }} + prerelease: true files: | - ${{ env.OFFLINE_PACKAGE_PATH }} - ${{ env.MD5SUM_PATH }} + ${{ env.OFFLINE_PACKAGE }} + checksums.txt + - name: GA Release uses: softprops/action-gh-release@v2 if: ${{ env.PRERELEASE == 'false' }} with: body_path: ${{ env.RELEASE_NOTES_PATH }} files: | - ${{ env.OFFLINE_PACKAGE_PATH }} - ${{ env.ONLINE_PACKAGE_PATH }} - ${{ env.MD5SUM_PATH }} + ${{ env.OFFLINE_PACKAGE }} + ${{ env.ONLINE_PACKAGE }} + checksums.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b816aebdd0..139aa96187e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,10 +31,10 @@ API explorer integration. End users can now explore and trigger Harbor’s API v * Support Image Retag, enables the user to tag image to different repositories and projects, this is particularly useful in cases when images need to be retagged programmatically in a CI pipeline. * Support Image Build History, makes it easy to see the contents of a container image, refer to the [User Guide](https://github.com/goharbor/harbor/blob/release-1.7.0/docs/user_guide.md#build-history). * Support Logger customization, enables the user to customize STDOUT / STDERR / FILE / DB logger of running jobs. -* Improve user experience of Helm Chart Repository: - - Chart searching included in the global search results - - Show chart versions total number in the chart list - - Mark labels to helm charts +* Improve the user experience of Helm Chart Repository: + - Chart searching is included in the global search results + - Show the total number of chart versions in the chart list + - Mark labels in helm charts - The latest version can be downloaded as default one on the chart list view - The chart can be deleted by deleting all the versions under it @@ -58,7 +58,7 @@ API explorer integration. End users can now explore and trigger Harbor’s API v - Replication policy rework to support wildcard, scheduled replication. - Support repository level description. - Batch operation on projects/repositories/users from UI. -- On board LDAP user when adding member to a project. +- On board LDAP user when adding a member to a project. ## v1.3.0 (2018-01-04) @@ -75,11 +75,11 @@ API explorer integration. End users can now explore and trigger Harbor’s API v ## v1.1.0 (2017-04-18) - Add in Notary support -- User can update configuration through Harbor UI +- User can update the configuration through Harbor UI - Redesign of Harbor's UI using Clarity - Some changes to API -- Fix some security issues in token service -- Upgrade base image of nginx for latest openssl version +- Fix some security issues in the token service +- Upgrade the base image of nginx to the latest openssl version - Various bug fixes. ## v0.5.0 (2016-12-6) @@ -88,7 +88,7 @@ API explorer integration. End users can now explore and trigger Harbor’s API v - Easier configuration for HTTPS in prepare script - Script to collect logs of a Harbor deployment - User can view the storage usage (default location) of Harbor. -- Add an attribute to disable normal user to create project +- Add an attribute to disable normal users from creating projects. - Various bug fixes. For Harbor virtual appliance: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6af3019b582..712ba720417 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Contributors are encouraged to collaborate using the following resources in addi * Chat with us on the CNCF Slack ([get an invitation here][cncf-slack] ) * [#harbor][users-slack] for end-user discussions * [#harbor-dev][dev-slack] for development of Harbor -* Want long-form communication instead of Slack? We have two distributions lists: +* Want long-form communication instead of Slack? We have two distribution lists: * [harbor-users][users-dl] for end-user discussions * [harbor-dev][dev-dl] for development of Harbor @@ -49,7 +49,7 @@ To build the project, please refer the [build](https://goharbor.io/docs/edge/bui ### Repository Structure -Here is the basic structure of the harbor code base. Some key folders / files are commented for your references. +Here is the basic structure of the Harbor code base. Some key folders / files are commented for your reference. ``` . ... @@ -168,13 +168,14 @@ Harbor backend is written in [Go](http://golang.org/). If you don't have a Harbo | 2.11 | 1.22.3 | | 2.12 | 1.23.2 | | 2.13 | 1.23.8 | +| 2.14 | 1.24.3 | Ensure your GOPATH and PATH have been configured in accordance with the Go environment instructions. #### Web -Harbor web UI is built based on [Clarity](https://vmware.github.io/clarity/) and [Angular](https://angular.io/) web framework. To setup web UI development environment, please make sure the [npm](https://www.npmjs.com/get-npm) tool is installed first. +Harbor web UI is built based on [Clarity](https://vmware.github.io/clarity/) and [Angular](https://angular.io/) web framework. To setup a web UI development environment, please make sure that the [npm](https://www.npmjs.com/get-npm) tool is installed first. | Harbor | Requires Angular | Requires Clarity | |----------|--------------------|--------------------| @@ -204,7 +205,7 @@ PR are always welcome, even if they only contain small fixes like typos or a few Please submit a PR broken down into small changes bit by bit. A PR consisting of a lot of features and code changes may be hard to review. It is recommended to submit PRs in an incremental fashion. -Note: If you split your pull request to small changes, please make sure any of the changes goes to `main` will not break anything. Otherwise, it can not be merged until this feature complete. +Note: If you split your pull request to small changes, please make sure any of the changes goes to `main` will not break anything. Otherwise, it can not be merged until this feature completed. ### Fork and clone @@ -278,7 +279,7 @@ To build the code, please refer to [build](https://goharbor.io/docs/edge/build-c **Note**: from v2.0, Harbor uses [go-swagger](https://github.com/go-swagger/go-swagger) to generate API server from Swagger 2.0 (aka [OpenAPI 2.0](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md)). To add or change the APIs, first update the `api/v2.0/swagger.yaml` file, then run `make gen_apis` to generate the API server, finally, implement or update the API handlers in `src/server/v2.0/handler` package. -As now Harbor uses `controller/manager/dao` programming model, we suggest to use [testify mock](https://github.com/stretchr/testify/blob/master/mock/doc.go) to test `controller` and `manager`. Harbor integrates [mockery](https://github.com/vektra/mockery) to generate mocks for golang interfaces using the testify mock package. To generate mocks for the interface, first add mock config in the `src/.mockery.yaml`, then run `make gen_mocks` to generate mocks. +As Harbor now uses `controller/manager/dao` programming model, we suggest using [testify mock](https://github.com/stretchr/testify/blob/master/mock/doc.go) to test `controller` and `manager`. Harbor integrates [mockery](https://github.com/vektra/mockery) to generate mocks for golang interfaces using the testify mock package. To generate mocks for the interface, first add mock config in the `src/.mockery.yaml`, then run `make gen_mocks` to generate mocks. ### Keep sync with upstream @@ -317,15 +318,15 @@ curl https://cdn.jsdelivr.net/gh/tommarshall/git-good-commit@v0.6.1/hook.sh > .g ``` ### Automated Testing -Once your pull request has been opened, harbor will run two CI pipelines against it. +Once your pull request has been opened, Harbor will run two CI pipelines against it. 1. In the travis CI, your source code will be checked via `golint`, `go vet` and `go race` that makes sure the code is readable, safe and correct. Also, all of unit tests will be triggered via `go test` against the pull request. What you need to pay attention to is the travis result and the coverage report. * If any failure in travis, you need to figure out whether it is introduced by your commits. -* If the coverage dramatic decline, you need to commit unit test to coverage your code. -2. In the drone CI, the E2E test will be triggered against the pull request. Also, the source code will be checked via `gosec`, and the result is stored in google storage for later analysis. The pipeline is about to build and install harbor from source code, then to run four very basic E2E tests to validate the basic functionalities of harbor, like: -* Registry Basic Verification, to validate the image can be pulled and pushed successful. -* Trivy Basic Verification, to validate the image can be scanned successful. -* Notary Basic Verification, to validate the image can be signed successful. -* Ldap Basic Verification, to validate harbor can work in LDAP environment. +* If the coverage dramatically declines, then you need to commit a unit test to cover your code. +2. In the drone CI, the E2E test will be triggered against the pull request. Also, the source code will be checked via `gosec`, and the result is stored in google storage for later analysis. The pipeline is about to build and install harbor from source code, then to run four very basic E2E tests to validate the basic functionalities of Harbor, like: +* Registry Basic Verification, to validate that the image can be pulled and pushed successfully. +* Trivy Basic Verification, to validate that the image can be scanned successfully. +* Notary Basic Verification, to validate that the image can be signed successfully. +* Ldap Basic Verification, to validate that Harbor can work in LDAP environment. ### Push and Create PR When ready for review, push your branch to your fork repository on `github.com`: @@ -344,7 +345,7 @@ Commit changes made in response to review comments to the same branch on your fo It is a great way to contribute to Harbor by reporting an issue. Well-written and complete bug reports are always welcome! Please open an issue on GitHub and follow the template to fill in required information. -Before opening any issue, please look up the existing [issues](https://github.com/goharbor/harbor/issues) to avoid submitting a duplication. +Before opening any issue, please look up the existing [issues](https://github.com/goharbor/harbor/issues) to avoid submitting a duplicate. If you find a match, you can "subscribe" to it to get notified on updates. If you have additional helpful information about the issue, please leave a comment. When reporting issues, always include: diff --git a/Makefile b/Makefile index 2bbdcfe86c3..1fa25a01544 100644 --- a/Makefile +++ b/Makefile @@ -78,6 +78,7 @@ REGISTRYSERVER= REGISTRYPROJECTNAME=goharbor DEVFLAG=true TRIVYFLAG=false +EXPORTERFLAG=false HTTPPROXY= BUILDREG=true BUILDTRIVYADP=true @@ -92,7 +93,12 @@ VERSIONTAG=dev BUILD_BASE=true PUSHBASEIMAGE=false BASEIMAGETAG=dev -BUILDBASETARGET=trivy-adapter core db jobservice log nginx portal prepare redis registry registryctl exporter +# for skip build prepare and log container while BUILD_INSTALLER=false +BUILD_INSTALLER=true +BUILDBASETARGET=trivy-adapter core db jobservice nginx portal redis registry registryctl exporter +ifeq ($(BUILD_INSTALLER), true) + BUILDBASETARGET += prepare log +endif IMAGENAMESPACE=goharbor BASEIMAGENAMESPACE=goharbor # #input true/false only @@ -129,6 +135,7 @@ endef # docker parameters DOCKERCMD=$(shell which docker) DOCKERBUILD=$(DOCKERCMD) build +DOCKERNETWORK=default DOCKERRMIMAGE=$(DOCKERCMD) rmi DOCKERPULL=$(DOCKERCMD) pull DOCKERIMAGES=$(DOCKERCMD) images @@ -144,7 +151,7 @@ GOINSTALL=$(GOCMD) install GOTEST=$(GOCMD) test GODEP=$(GOTEST) -i GOFMT=gofmt -w -GOBUILDIMAGE=golang:1.23.8 +GOBUILDIMAGE=golang:1.24.3 GOBUILDPATHINCONTAINER=/harbor # go build @@ -238,18 +245,27 @@ REGISTRYUSER= REGISTRYPASSWORD= # cmds -DOCKERSAVE_PARA=$(DOCKER_IMAGE_NAME_PREPARE):$(VERSIONTAG) \ - $(DOCKERIMAGENAME_PORTAL):$(VERSIONTAG) \ +DOCKERSAVE_PARA=$(DOCKERIMAGENAME_PORTAL):$(VERSIONTAG) \ $(DOCKERIMAGENAME_CORE):$(VERSIONTAG) \ - $(DOCKERIMAGENAME_LOG):$(VERSIONTAG) \ $(DOCKERIMAGENAME_DB):$(VERSIONTAG) \ $(DOCKERIMAGENAME_JOBSERVICE):$(VERSIONTAG) \ $(DOCKERIMAGENAME_REGCTL):$(VERSIONTAG) \ - $(DOCKERIMAGENAME_EXPORTER):$(VERSIONTAG) \ $(IMAGENAMESPACE)/redis-photon:$(VERSIONTAG) \ $(IMAGENAMESPACE)/nginx-photon:$(VERSIONTAG) \ $(IMAGENAMESPACE)/registry-photon:$(VERSIONTAG) +ifeq ($(BUILD_INSTALLER), true) + DOCKERSAVE_PARA+= $(DOCKER_IMAGE_NAME_PREPARE):$(VERSIONTAG) \ + $(DOCKERIMAGENAME_LOG):$(VERSIONTAG) +endif + +ifeq ($(TRIVYFLAG), true) + DOCKERSAVE_PARA+= $(IMAGENAMESPACE)/trivy-adapter-photon:$(VERSIONTAG) +endif +ifeq ($(EXPORTERFLAG), true) + DOCKERSAVE_PARA+= $(DOCKERIMAGENAME_EXPORTER):$(VERSIONTAG) +endif + PACKAGE_OFFLINE_PARA=-zcvf harbor-offline-installer-$(PKGVERSIONTAG).tgz \ $(HARBORPKG)/$(DOCKERIMGFILE).$(VERSIONTAG).tar.gz \ $(HARBORPKG)/prepare \ @@ -266,11 +282,6 @@ PACKAGE_ONLINE_PARA=-zcvf harbor-online-installer-$(PKGVERSIONTAG).tgz \ DOCKERCOMPOSE_FILE_OPT=-f $(DOCKERCOMPOSEFILEPATH)/$(DOCKERCOMPOSEFILENAME) -ifeq ($(TRIVYFLAG), true) - DOCKERSAVE_PARA+= $(IMAGENAMESPACE)/trivy-adapter-photon:$(VERSIONTAG) -endif - - RUNCONTAINER=$(DOCKERCMD) run --rm -u $(shell id -u):$(shell id -g) -v $(BUILDPATH):$(BUILDPATH) -w $(BUILDPATH) # $1 the name of the docker image @@ -308,13 +319,13 @@ define swagger_generate_server @$(SWAGGER_GENERATE_SERVER) -f $(1) -A $(3) --target $(2) endef -gen_apis: lint_apis +gen_apis: $(call prepare_docker_image,${SWAGGER_IMAGENAME},${SWAGGER_VERSION},${SWAGGER_IMAGE_BUILD_CMD}) $(call swagger_generate_server,api/v2.0/swagger.yaml,src/server/v2.0,harbor) MOCKERY_IMAGENAME=$(IMAGENAMESPACE)/mockery -MOCKERY_VERSION=v2.51.0 +MOCKERY_VERSION=v2.53.3 MOCKERY=$(RUNCONTAINER)/src ${MOCKERY_IMAGENAME}:${MOCKERY_VERSION} MOCKERY_IMAGE_BUILD_CMD=${DOCKERBUILD} -f ${TOOLSPATH}/mockery/Dockerfile --build-arg GOLANG=${GOBUILDIMAGE} --build-arg MOCKERY_VERSION=${MOCKERY_VERSION} -t ${MOCKERY_IMAGENAME}:$(MOCKERY_VERSION) . @@ -338,7 +349,7 @@ versions_prepare: check_environment: @$(MAKEPATH)/$(CHECKENVCMD) -compile_core: gen_apis +compile_core: lint_apis gen_apis @echo "compiling binary for core (golang image)..." @echo $(GOBUILDPATHINCONTAINER) @$(DOCKERCMD) run --rm -v $(BUILDPATH):$(GOBUILDPATHINCONTAINER) -w $(GOBUILDPATH_CORE) $(GOBUILDIMAGE) $(GOIMAGEBUILD_CORE) -o $(GOBUILDPATHINCONTAINER)/$(GOBUILDMAKEPATH_CORE)/$(CORE_BINARYNAME) @@ -393,13 +404,15 @@ build: -e REGISTRYVERSION=$(REGISTRYVERSION) -e REGISTRY_SRC_TAG=$(REGISTRY_SRC_TAG) -e DISTRIBUTION_SRC=$(DISTRIBUTION_SRC)\ -e TRIVYVERSION=$(TRIVYVERSION) -e TRIVYADAPTERVERSION=$(TRIVYADAPTERVERSION) \ -e VERSIONTAG=$(VERSIONTAG) \ + -e DOCKERNETWORK=$(DOCKERNETWORK) \ -e BUILDREG=$(BUILDREG) -e BUILDTRIVYADP=$(BUILDTRIVYADP) \ + -e BUILD_INSTALLER=$(BUILD_INSTALLER) \ -e NPM_REGISTRY=$(NPM_REGISTRY) -e BASEIMAGETAG=$(BASEIMAGETAG) -e IMAGENAMESPACE=$(IMAGENAMESPACE) -e BASEIMAGENAMESPACE=$(BASEIMAGENAMESPACE) \ -e REGISTRYURL=$(REGISTRYURL) \ -e TRIVY_DOWNLOAD_URL=$(TRIVY_DOWNLOAD_URL) -e TRIVY_ADAPTER_DOWNLOAD_URL=$(TRIVY_ADAPTER_DOWNLOAD_URL) \ -e PULL_BASE_FROM_DOCKERHUB=$(PULL_BASE_FROM_DOCKERHUB) -e BUILD_BASE=$(BUILD_BASE) \ -e REGISTRYUSER=$(REGISTRYUSER) -e REGISTRYPASSWORD=$(REGISTRYPASSWORD) \ - -e PUSHBASEIMAGE=$(PUSHBASEIMAGE) + -e PUSHBASEIMAGE=$(PUSHBASEIMAGE) -e GOBUILDIMAGE=$(GOBUILDIMAGE) build_standalone_db_migrator: compile_standalone_db_migrator make -f $(MAKEFILEPATH_PHOTON)/Makefile _build_standalone_db_migrator -e BASEIMAGETAG=$(BASEIMAGETAG) -e VERSIONTAG=$(VERSIONTAG) @@ -440,7 +453,14 @@ package_online: update_prepare_version @rm -rf $(HARBORPKG) @echo "Done." -package_offline: update_prepare_version compile build +.PHONY: check_buildinstaller +check_buildinstaller: + @if [ "$(BUILD_INSTALLER)" != "true" ]; then \ + echo "Must set BUILD_INSTALLER as true while triggering package_offline build" ; \ + exit 1; \ + fi + +package_offline: check_buildinstaller update_prepare_version compile build @echo "packing offline package ..." @cp -r make $(HARBORPKG) @@ -471,7 +491,7 @@ misspell: @find . -type d \( -path ./tests \) -prune -o -name '*.go' -print | xargs misspell -error # golangci-lint binary installation or refer to https://golangci-lint.run/usage/install/#local-installation -# curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 +# curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.2 GOLANGCI_LINT := $(shell go env GOPATH)/bin/golangci-lint lint: @echo checking lint @@ -539,7 +559,7 @@ swagger_client: rm -rf harborclient mkdir -p harborclient/harbor_v2_swagger_client java -jar openapi-generator-cli.jar generate -i api/v2.0/swagger.yaml -g python -o harborclient/harbor_v2_swagger_client --package-name v2_swagger_client - cd harborclient/harbor_v2_swagger_client; python ./setup.py install + cd harborclient/harbor_v2_swagger_client; pip install . pip install docker -q pip freeze diff --git a/README.md b/README.md index 6a8bc988490..6cfac0901d4 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![Nightly Status](https://us-central1-eminent-nation-87317.cloudfunctions.net/harbor-nightly-result)](https://www.googleapis.com/storage/v1/b/harbor-nightly/o) ![CONFORMANCE_TEST](https://github.com/goharbor/harbor/workflows/CONFORMANCE_TEST/badge.svg) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fgoharbor%2Fharbor.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fgoharbor%2Fharbor?ref=badge_shield) +[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/harbor)](https://artifacthub.io/packages/helm/harbor/harbor)
|![notification](https://raw.githubusercontent.com/goharbor/website/master/docs/img/readme/bell-outline-badged.svg)Community Meeting| diff --git a/RELEASES.md b/RELEASES.md index 368cfa8f519..ad9fbded729 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,17 +1,17 @@ # Versioning and Release -This document describes the versioning and release process of Harbor. This document is a living document, contents will be updated according to each release. +This document describes the versioning and release process of Harbor. This document is a living document, it's contents will be updated according to each release. ## Releases Harbor releases will be versioned using dotted triples, similar to [Semantic Version](http://semver.org/). For this specific document, we will refer to the respective components of this triple as `..`. The version number may have additional information, such as "-rc1,-rc2,-rc3" to mark release candidate builds for earlier access. Such releases will be considered as "pre-releases". ### Major and Minor Releases -Major and minor releases of Harbor will be branched from `main` when the release reaches to `RC(release candidate)` state. The branch format should follow `release-..0`. For example, once the release `v1.0.0` reaches to RC, a branch will be created with the format `release-1.0.0`. When the release reaches to `GA(General Available)` state, The tag with format `v..` and should be made with command `git tag -s v..`. The release cadence is around 3 months, might be adjusted based on open source event, but will communicate it clearly. +Major and minor releases of Harbor will be branched from `main` when the release reaches to `RC(release candidate)` state. The branch format should follow `release-..0`. For example, once the release `v1.0.0` reaches to RC, a branch will be created with the format `release-1.0.0`. When the release reaches to `GA(General Available)` state, the tag with format `v..` and should be made with the command `git tag -s v..`. The release cadence is around 3 months, might be adjusted based on open source events, but will communicate it clearly. ### Patch releases Patch releases are based on the major/minor release branch, the release cadence for patch release of recent minor release is one month to solve critical community and security issues. The cadence for patch release of recent minus two minor releases are on-demand driven based on the severity of the issue to be fixed. ### Pre-releases -`Pre-releases:mainly the different RC builds` will be compiled from their corresponding branches. Please note they are done to assist in the stabilization process, no guarantees are provided. +`Pre-releases:mainly the different RC builds` will be compiled from their corresponding branches. Please note that they are done to assist in the stabilization process, no guarantees are provided. ### Minor Release Support Matrix | Version | Supported | @@ -22,7 +22,7 @@ Patch releases are based on the major/minor release branch, the release cadence ### Upgrade path and support policy -The upgrade path for Harbor is (1) 2.2.x patch releases are always compatible with its major and minor version. For example, previous released 2.2.x can be upgraded to most recent 2.2.3 release. (2) Harbor only supports two previous minor releases to upgrade to current minor release. For example, 2.3.0 will only support 2.1.0 and 2.2.0 to upgrade from, 2.0.0 to 2.3.0 is not supported. One should upgrade to 2.2.0 first, then to 2.3.0. +The upgrade path for Harbor is (1) 2.2.x patch releases are always compatible with its major and minor versions. For example, previous released 2.2.x can be upgraded to most recent 2.2.3 release. (2) Harbor only supports two previous minor releases to upgrade to current minor release. For example, 2.3.0 will only support 2.1.0 and 2.2.0 to upgrade from, 2.0.0 to 2.3.0 is not supported. One should upgrade to 2.2.0 first, then to 2.3.0. The Harbor project maintains release branches for the three most recent minor releases, each minor release will be maintained for approximately 9 months. ### Next Release @@ -33,12 +33,12 @@ The activity for next release will be tracked in the [up-to-date project board]( The following steps outline what to do when it's time to plan for and publish a release. Depending on the release (major/minor/patch), not all the following items are needed. 1. Prepare information about what's new in the release. - * For every release, update documentation for changes that have happened in the release. See the [goharbor/website](https://github.com/goharbor/website) repo for more details on how to create documentation for a release. All documentation for a release should be published by the time the release is out. + * For every release, update the documentation for changes that have happened in the release. See the [goharbor/website](https://github.com/goharbor/website) repo for more details on how to create documentation for a release. All documentation for a release should be published by the time the release is out. * For every release, write release notes. See [previous releases](https://github.com/goharbor/harbor/releases) for examples of what to include in release notes. - * For a major/minor release, write a blog post that highlights new features in the release. Plan to publish this the same day as the release. Highlight the themes, or areas of focus, for the release. Some examples of themes are security, bug fixes, feature improvements. If there are any new features or workflows introduced in a release, consider writing additional blog posts to help users learn about the new features. Plan to publish these after the release date (all blogs don’t have to be published all at once). + * For a major/minor release, write a blog post that highlights new features in the release. Plan to publish this on the same day as the release. Highlight the themes, or areas of focus, for the release. Some examples of themes are security, bug fixes, feature improvements. If there are any new features or workflows introduced in a release, consider writing additional blog posts to help users learn about the new features. Plan to publish these after the release date (all blogs don’t have to be published all at once). 1. Release a new version. Make the new version, docs updates, and blog posts available. 1. Announce the release and thank contributors. We should be doing the following for all releases. - * In all messages to the community include a brief list of highlights and links to the new release blog, release notes, or download location. Also include shoutouts to community member contribution included in the release. + * In all messages to the community include a brief list of highlights and links to the new release blog, release notes, or download location. Also include shoutouts to community members contributions included in the release. * Send an email to the community via the [mailing list](https://lists.cncf.io/g/harbor-users) * Post a message in the Harbor [slack channel](https://cloud-native.slack.com/archives/CC1E09J6S) * Post to social media. Maintainers are encouraged to also post or repost from the Harbor account to help spread the word. diff --git a/ROADMAP.md b/ROADMAP.md index 19f8fe1e8ea..641b6e877e0 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -9,11 +9,11 @@ This document provides a link to the [Harbor Project board](https://github.com/o Discussion on the roadmap can take place in threads under [Issues](https://github.com/goharbor/harbor/issues) or in [community meetings](https://goharbor.io/community/). Please open and comment on an issue if you want to provide suggestions and feedback to an item in the roadmap. Please review the roadmap to avoid potential duplicated effort. ### How to add an item to the roadmap? -Please open an issue to track any initiative on the roadmap of Harbor (Usually driven by new feature requests). We will work with and rely on our community to focus our efforts to improve Harbor. +Please open an issue to track any initiative on the roadmap of Harbor (Usually driven by new feature requests). We will work with and rely on our community to focus our efforts on improving Harbor. ### Current Roadmap -The following table includes the current roadmap for Harbor. If you have any questions or would like to contribute to Harbor, please attend a [community meeting](https://goharbor.io/community/) to discuss with our team. If you don't know where to start, we are always looking for contributors that will help us reduce technical, automation, and documentation debt. Please take the timelines & dates as proposals and goals. Priorities and requirements change based on community feedback, roadblocks encountered, community contributions, etc. If you depend on a specific item, we encourage you to attend community meetings to get updated status information, or help us deliver that feature by contributing to Harbor. +The following table includes the current roadmap for Harbor. If you have any questions or would like to contribute to Harbor, please attend a [community meeting](https://goharbor.io/community/) to discuss with our team. If you don't know where to start, we are always looking for contributors who will help us reduce technical, automation, and documentation debt. Please take the timelines & dates as proposals and goals. Priorities and requirements change based on community feedback, roadblocks encountered, community contributions, etc. If you depend on a specific item, we encourage you to attend community meetings to get updated status information, or help us deliver that feature by contributing to Harbor. `Last Updated: June 2022` @@ -49,4 +49,4 @@ The following table includes the current roadmap for Harbor. If you have any que |I&AM and RBAC|Improved Multi-tenancy through granular access and ability to manage teams of users and robot accounts through workspaces|Dec 2020| |Observability|Expose Harbor metrics through Prometheus Integration|Mar 2021| |Tracing|Leverage OpenTelemetry for enhanced tracing capabilities and identify bottlenecks and improve performance |Mar 2021| -|Image Signing|Leverage Sigstore Cosign to deliver persisting image signatures across image replications|Apr 2021| +|Image Signing|Leverage Sigstore Cosign to deliver persistent image signatures across image replications|Apr 2021| diff --git a/VERSION b/VERSION index c757c9824bf..d4174a4e192 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.13.0 +v2.14.0 diff --git a/make/migrations/postgresql/0170_2.14.0_schema.up.sql b/make/migrations/postgresql/0170_2.14.0_schema.up.sql new file mode 100644 index 00000000000..b90164710f9 --- /dev/null +++ b/make/migrations/postgresql/0170_2.14.0_schema.up.sql @@ -0,0 +1,8 @@ +ALTER TABLE role_permission ALTER COLUMN id TYPE BIGINT; +ALTER SEQUENCE role_permission_id_seq AS BIGINT; + +ALTER TABLE permission_policy ALTER COLUMN id TYPE BIGINT; +ALTER SEQUENCE permission_policy_id_seq AS BIGINT; + +ALTER TABLE role_permission ALTER COLUMN permission_policy_id TYPE BIGINT; + diff --git a/make/photon/Makefile b/make/photon/Makefile index 181e6c09d44..23684c6ff46 100644 --- a/make/photon/Makefile +++ b/make/photon/Makefile @@ -18,7 +18,7 @@ TIMESTAMP=$(shell date +"%Y%m%d") # docker parameters DOCKERCMD=$(shell which docker) -DOCKERBUILD=$(DOCKERCMD) build --no-cache +DOCKERBUILD=$(DOCKERCMD) build --no-cache --network=$(DOCKERNETWORK) DOCKERBUILD_WITH_PULL_PARA=$(DOCKERBUILD) --pull=$(PULL_BASE_FROM_DOCKERHUB) DOCKERRMIMAGE=$(DOCKERCMD) rmi DOCKERIMAGES=$(DOCKERCMD) images @@ -154,7 +154,7 @@ _build_trivy_adapter: $(call _extract_archive, $(TRIVY_ADAPTER_DOWNLOAD_URL), $(DOCKERFILEPATH_TRIVY_ADAPTER)/binary/) ; \ else \ echo "Building Trivy adapter $(TRIVYADAPTERVERSION) from sources..." ; \ - cd $(DOCKERFILEPATH_TRIVY_ADAPTER) && $(DOCKERFILEPATH_TRIVY_ADAPTER)/builder.sh $(TRIVYADAPTERVERSION) && cd - ; \ + cd $(DOCKERFILEPATH_TRIVY_ADAPTER) && $(DOCKERFILEPATH_TRIVY_ADAPTER)/builder.sh $(TRIVYADAPTERVERSION) $(GOBUILDIMAGE) $(DOCKERNETWORK) && cd - ; \ fi ; \ echo "Building Trivy adapter container for photon..." ; \ $(DOCKERBUILD_WITH_PULL_PARA) --build-arg harbor_base_image_version=$(BASEIMAGETAG) \ @@ -178,7 +178,7 @@ _build_registry: rm -rf $(DOCKERFILEPATH_REG)/binary && mkdir -p $(DOCKERFILEPATH_REG)/binary && \ $(call _get_binary, $(REGISTRYURL), $(DOCKERFILEPATH_REG)/binary/registry); \ else \ - cd $(DOCKERFILEPATH_REG) && $(DOCKERFILEPATH_REG)/builder $(REGISTRY_SRC_TAG) $(DISTRIBUTION_SRC) && cd - ; \ + cd $(DOCKERFILEPATH_REG) && $(DOCKERFILEPATH_REG)/builder $(REGISTRY_SRC_TAG) $(DISTRIBUTION_SRC) $(GOBUILDIMAGE) $(DOCKERNETWORK) && cd - ; \ fi @echo "building registry container for photon..." @chmod 655 $(DOCKERFILEPATH_REG)/binary/registry && $(DOCKERBUILD_WITH_PULL_PARA) --build-arg harbor_base_image_version=$(BASEIMAGETAG) --build-arg harbor_base_namespace=$(BASEIMAGENAMESPACE) -f $(DOCKERFILEPATH_REG)/$(DOCKERFILENAME_REG) -t $(DOCKERIMAGENAME_REG):$(VERSIONTAG) . @@ -233,10 +233,17 @@ define _build_base fi endef -build: _build_prepare _build_db _build_portal _build_core _build_jobservice _build_log _build_nginx _build_registry _build_registryctl _build_trivy_adapter _build_redis _compile_and_build_exporter +ifeq ($(BUILD_INSTALLER), true) +buildcompt: _build_prepare _build_db _build_portal _build_core _build_jobservice _build_log _build_nginx _build_registry _build_registryctl _build_trivy_adapter _build_redis _compile_and_build_exporter +else +buildcompt: _build_db _build_portal _build_core _build_jobservice _build_nginx _build_registry _build_registryctl _build_trivy_adapter _build_redis _compile_and_build_exporter +endif + +build: buildcompt @if [ -n "$(REGISTRYUSER)" ] && [ -n "$(REGISTRYPASSWORD)" ] ; then \ docker logout ; \ fi + cleanimage: @echo "cleaning image for photon..." - $(DOCKERRMIMAGE) -f $(DOCKERIMAGENAME_PORTAL):$(VERSIONTAG) diff --git a/make/photon/prepare/Dockerfile.base b/make/photon/prepare/Dockerfile.base index e88bbb7da06..3df3256c9b1 100644 --- a/make/photon/prepare/Dockerfile.base +++ b/make/photon/prepare/Dockerfile.base @@ -1,7 +1,7 @@ FROM photon:5.0 RUN tdnf install -y python3 python3-pip python3-PyYAML python3-jinja2 && tdnf clean all -RUN pip3 install pipenv==2022.1.8 +RUN pip3 install pipenv==2025.0.3 #To install only htpasswd binary from photon package httpd RUN tdnf install -y rpm cpio apr-util diff --git a/make/photon/prepare/Pipfile b/make/photon/prepare/Pipfile index 61b85654f9f..efea2909bfc 100644 --- a/make/photon/prepare/Pipfile +++ b/make/photon/prepare/Pipfile @@ -12,4 +12,4 @@ pylint = "*" pytest = "*" [requires] -python_version = "3.9.1" +python_version = "3.13" diff --git a/make/photon/prepare/Pipfile.lock b/make/photon/prepare/Pipfile.lock index c087da94022..6856b3f634d 100644 --- a/make/photon/prepare/Pipfile.lock +++ b/make/photon/prepare/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "0c84f574a48755d88f78a64d754b3f834a72f2a86808370dd5f3bf3e650bfa13" + "sha256": "d3a89b8575c29b9f822b892ffd31fd4a997effb1ebf3e3ed061a41e2d04b4490" }, "pipfile-spec": 6, "requires": { - "python_version": "3.9.1" + "python_version": "3.13" }, "sources": [ { @@ -18,157 +18,122 @@ "default": { "click": { "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" + "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", + "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" ], "index": "pypi", - "version": "==8.0.1" + "markers": "python_version >= '3.10'", + "version": "==8.2.1" }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "index": "pypi", - "version": "==20.9" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" + "markers": "python_version >= '3.8'", + "version": "==25.0" } }, "develop": { "astroid": { "hashes": [ - "sha256:4db03ab5fc3340cf619dbc25e42c2cc3755154ce6009469766d7143d1fc2ee4e", - "sha256:8a398dfce302c13f14bab13e2b14fe385d32b73f4e4853b9bdfb64598baa1975" + "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", + "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce" ], - "markers": "python_version ~= '3.6'", - "version": "==2.5.6" + "markers": "python_full_version >= '3.9.0'", + "version": "==3.3.10" }, - "attrs": { + "dill": { "hashes": [ - "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", - "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" + "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", + "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.2.0" + "markers": "python_version >= '3.8'", + "version": "==0.4.0" }, "iniconfig": { "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", + "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" ], - "version": "==1.1.1" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "isort": { "hashes": [ - "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6", - "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d" + "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", + "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615" ], - "markers": "python_version >= '3.6' and python_version < '4.0'", - "version": "==5.8.0" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", - "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", - "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", - "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", - "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", - "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", - "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", - "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", - "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", - "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", - "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", - "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", - "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", - "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", - "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", - "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", - "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", - "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", - "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", - "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", - "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", - "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.6.0" + "markers": "python_full_version >= '3.9.0'", + "version": "==6.0.1" }, "mccabe": { "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" ], - "version": "==0.6.1" + "markers": "python_version >= '3.6'", + "version": "==0.7.0" }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "index": "pypi", - "version": "==20.9" + "markers": "python_version >= '3.8'", + "version": "==25.0" }, - "pluggy": { + "platformdirs": { "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", + "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" + "markers": "python_version >= '3.9'", + "version": "==4.3.8" }, - "py": { + "pluggy": { "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.10.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, - "pylint": { + "pygments": { "hashes": [ - "sha256:586d8fa9b1891f4b725f587ef267abe2a1bad89d6b184520c7f07a253dd6e217", - "sha256:f7e2072654a6b6afdf5e2fb38147d3e2d2d43c89f648637baab63e026481279b" + "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", + "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" ], - "index": "pypi", - "version": "==2.8.2" + "markers": "python_version >= '3.8'", + "version": "==2.19.2" }, - "pyparsing": { + "pylint": { "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", + "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" + "index": "pypi", + "markers": "python_full_version >= '3.9.0'", + "version": "==3.3.7" }, "pytest": { "hashes": [ - "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b", - "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" + "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", + "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c" ], "index": "pypi", - "version": "==6.2.4" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" + "markers": "python_version >= '3.9'", + "version": "==8.4.1" }, - "wrapt": { + "tomlkit": { "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" + "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", + "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0" ], - "version": "==1.12.1" + "markers": "python_version >= '3.8'", + "version": "==0.13.3" } } } diff --git a/make/photon/prepare/templates/jobservice/env.jinja b/make/photon/prepare/templates/jobservice/env.jinja index 38e8e1ba6c9..f575fc5f12d 100644 --- a/make/photon/prepare/templates/jobservice/env.jinja +++ b/make/photon/prepare/templates/jobservice/env.jinja @@ -6,6 +6,8 @@ REGISTRY_CONTROLLER_URL={{registry_controller_url}} JOBSERVICE_WEBHOOK_JOB_MAX_RETRY={{notification_webhook_job_max_retry}} JOBSERVICE_WEBHOOK_JOB_HTTP_CLIENT_TIMEOUT={{notification_webhook_job_http_client_timeout}} +LOG_LEVEL={{log_level}} + {%if internal_tls.enabled %} INTERNAL_TLS_ENABLED=true INTERNAL_TLS_TRUST_CA_PATH=/harbor_cust_cert/harbor_internal_ca.crt diff --git a/make/photon/registry/Dockerfile.binary b/make/photon/registry/Dockerfile.binary index ab13727efc2..f6e35357a08 100644 --- a/make/photon/registry/Dockerfile.binary +++ b/make/photon/registry/Dockerfile.binary @@ -1,4 +1,5 @@ -FROM golang:1.23.8 +ARG golang_image +FROM ${golang_image} ENV DISTRIBUTION_DIR /go/src/github.com/docker/distribution ENV BUILDTAGS include_oss include_gcs diff --git a/make/photon/registry/builder b/make/photon/registry/builder index 92e9e1d862a..94901ab2bb3 100755 --- a/make/photon/registry/builder +++ b/make/photon/registry/builder @@ -14,6 +14,8 @@ fi VERSION="$1" DISTRIBUTION_SRC="$2" +GOBUILDIMAGE="$3" +DOCKERNETWORK="$4" set -e @@ -32,7 +34,7 @@ cd $cur echo 'build the registry binary ...' cp Dockerfile.binary $TEMP -docker build -f $TEMP/Dockerfile.binary -t registry-golang $TEMP +docker build --network=$DOCKERNETWORK --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t registry-golang $TEMP echo 'copy the registry binary to local...' ID=$(docker create registry-golang) diff --git a/make/photon/trivy-adapter/Dockerfile.binary b/make/photon/trivy-adapter/Dockerfile.binary index 3f3cf438058..560ffd5b707 100644 --- a/make/photon/trivy-adapter/Dockerfile.binary +++ b/make/photon/trivy-adapter/Dockerfile.binary @@ -1,4 +1,5 @@ -FROM golang:1.23.8 +ARG golang_image +FROM ${golang_image} ADD . /go/src/github.com/goharbor/harbor-scanner-trivy/ WORKDIR /go/src/github.com/goharbor/harbor-scanner-trivy/ diff --git a/make/photon/trivy-adapter/builder.sh b/make/photon/trivy-adapter/builder.sh index 2635ce37055..0f89a28de8e 100755 --- a/make/photon/trivy-adapter/builder.sh +++ b/make/photon/trivy-adapter/builder.sh @@ -8,6 +8,8 @@ if [ -z $1 ]; then fi VERSION="$1" +GOBUILDIMAGE="$2" +DOCKERNETWORK="$3" set -e @@ -19,9 +21,9 @@ TEMP=$(mktemp -d ${TMPDIR-/tmp}/trivy-adapter.XXXXXX) git clone https://github.com/goharbor/harbor-scanner-trivy.git $TEMP cd $TEMP; git checkout $VERSION; cd - -echo "Building Trivy adapter binary based on golang:1.23.8..." +echo "Building Trivy adapter binary ..." cp Dockerfile.binary $TEMP -docker build -f $TEMP/Dockerfile.binary -t trivy-adapter-golang $TEMP +docker build --network=$DOCKERNETWORK --build-arg golang_image=$GOBUILDIMAGE -f $TEMP/Dockerfile.binary -t trivy-adapter-golang $TEMP echo "Copying Trivy adapter binary from the container to the local directory..." ID=$(docker create trivy-adapter-golang) diff --git a/src/.golangci.yaml b/src/.golangci.yaml index 7377e88da02..c9464bea1e0 100644 --- a/src/.golangci.yaml +++ b/src/.golangci.yaml @@ -1,76 +1,56 @@ -linters-settings: - gofmt: - # Simplify code: gofmt with `-s` option. - # Default: true - simplify: false - misspell: - locale: US,UK - goimports: - local-prefixes: github.com/goharbor/harbor - stylecheck: - checks: [ - "ST1019", # Importing the same package multiple times. - ] - goheader: - template-path: copyright.tmpl - +version: "2" linters: - disable-all: true + default: none enable: - - gofmt + - bodyclose + - errcheck - goheader - - misspell - - typecheck - # - dogsled - # - dupl - # - depguard - # - funlen - # - goconst - # - gocritic - # - gocyclo - # - goimports - # - goprintffuncname + - govet - ineffassign - # - nakedret - # - nolintlint + - misspell - revive + - staticcheck - whitespace - - bodyclose - - errcheck - # - gosec - - gosimple + settings: + goheader: + template-path: copyright.tmpl + misspell: + locale: US,UK + staticcheck: + checks: + - ST1019 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ + - .*_test\.go + - .*test\.go + - testing + - src/jobservice/mgt/mock_manager.go +formatters: + enable: + - gofmt - goimports - - govet - # - noctx - # - rowserrcheck - - staticcheck - - stylecheck - # - unconvert - # - unparam - # - unused // disabled due to too many false positive check and limited support golang 1.19 https://github.com/dominikh/go-tools/issues/1282 - -run: - skip-files: - - ".*_test.go" - - ".*test.go" - skip-dirs: - - "testing" - timeout: 20m - -issue: - max-same-issues: 0 - max-per-linter: 0 - -issues: - # Excluding configuration per-path, per-linter, per-text and per-source - exclude-rules: - # Exclude some linters from running on tests files. - - path: _test\.go - linters: - - goimports - - path: src/testing/*.go - linters: - - goimports - - path: src/jobservice/mgt/mock_manager.go - linters: - - goimports + settings: + gofmt: + simplify: false + goimports: + local-prefixes: + - github.com/goharbor/harbor + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ + - .*_test\.go + - .*test\.go + - testing + - src/jobservice/mgt/mock_manager.go diff --git a/src/common/api/base.go b/src/common/api/base.go index d2b18c251f7..213fdefc7a4 100644 --- a/src/common/api/base.go +++ b/src/common/api/base.go @@ -78,7 +78,7 @@ func (b *BaseAPI) RenderError(code int, text string) { } // DecodeJSONReq decodes a json request -func (b *BaseAPI) DecodeJSONReq(v interface{}) error { +func (b *BaseAPI) DecodeJSONReq(v any) error { err := json.Unmarshal(b.Ctx.Input.CopyBody(1<<35), v) if err != nil { log.Errorf("Error while decoding the json request, error: %v, %v", @@ -89,7 +89,7 @@ func (b *BaseAPI) DecodeJSONReq(v interface{}) error { } // Validate validates v if it implements interface validation.ValidFormer -func (b *BaseAPI) Validate(v interface{}) (bool, error) { +func (b *BaseAPI) Validate(v any) (bool, error) { validator := validation.Validation{} isValid, err := validator.Valid(v) if err != nil { @@ -108,7 +108,7 @@ func (b *BaseAPI) Validate(v interface{}) (bool, error) { } // DecodeJSONReqAndValidate does both decoding and validation -func (b *BaseAPI) DecodeJSONReqAndValidate(v interface{}) (bool, error) { +func (b *BaseAPI) DecodeJSONReqAndValidate(v any) (bool, error) { if err := b.DecodeJSONReq(v); err != nil { return false, err } diff --git a/src/common/dao/base.go b/src/common/dao/base.go index 96c854ff161..6f35c00576f 100644 --- a/src/common/dao/base.go +++ b/src/common/dao/base.go @@ -144,6 +144,6 @@ func (l *mLogger) Verbose() bool { } // Printf ... -func (l *mLogger) Printf(format string, v ...interface{}) { +func (l *mLogger) Printf(format string, v ...any) { l.logger.Infof(format, v...) } diff --git a/src/common/dao/dao_test.go b/src/common/dao/dao_test.go index 6efa0f86f5c..f68597b9d33 100644 --- a/src/common/dao/dao_test.go +++ b/src/common/dao/dao_test.go @@ -29,7 +29,7 @@ import ( var testCtx context.Context -func execUpdate(o orm.TxOrmer, sql string, params ...interface{}) error { +func execUpdate(o orm.TxOrmer, sql string, params ...any) error { p, err := o.Raw(sql).Prepare() if err != nil { return err diff --git a/src/common/dao/pgsql_test.go b/src/common/dao/pgsql_test.go index 2e046115175..f0615262e55 100644 --- a/src/common/dao/pgsql_test.go +++ b/src/common/dao/pgsql_test.go @@ -27,7 +27,7 @@ func TestMaxOpenConns(t *testing.T) { queryNum := 200 results := make([]bool, queryNum) - for i := 0; i < queryNum; i++ { + for i := range queryNum { wg.Add(1) go func(i int) { defer wg.Done() diff --git a/src/common/dao/testutils.go b/src/common/dao/testutils.go index fab162ef08c..cf2c777ba74 100644 --- a/src/common/dao/testutils.go +++ b/src/common/dao/testutils.go @@ -142,7 +142,7 @@ func ArrayEqual(arrayA, arrayB []int) bool { return false } size := len(arrayA) - for i := 0; i < size; i++ { + for i := range size { if arrayA[i] != arrayB[i] { return false } diff --git a/src/common/http/client.go b/src/common/http/client.go index ed240a168c7..aca806e6531 100644 --- a/src/common/http/client.go +++ b/src/common/http/client.go @@ -69,7 +69,7 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) { } // Get ... -func (c *Client) Get(url string, v ...interface{}) error { +func (c *Client) Get(url string, v ...any) error { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return err @@ -98,7 +98,7 @@ func (c *Client) Head(url string) error { } // Post ... -func (c *Client) Post(url string, v ...interface{}) error { +func (c *Client) Post(url string, v ...any) error { var reader io.Reader if len(v) > 0 { if r, ok := v[0].(io.Reader); ok { @@ -123,7 +123,7 @@ func (c *Client) Post(url string, v ...interface{}) error { } // Put ... -func (c *Client) Put(url string, v ...interface{}) error { +func (c *Client) Put(url string, v ...any) error { var reader io.Reader if len(v) > 0 { data, err := json.Marshal(v[0]) @@ -176,7 +176,7 @@ func (c *Client) do(req *http.Request) ([]byte, error) { // GetAndIteratePagination iterates the pagination header and returns all resources // The parameter "v" must be a pointer to a slice -func (c *Client) GetAndIteratePagination(endpoint string, v interface{}) error { +func (c *Client) GetAndIteratePagination(endpoint string, v any) error { url, err := url.Parse(endpoint) if err != nil { return err diff --git a/src/common/job/models/models.go b/src/common/job/models/models.go index 8d13bd62822..7f1f9955fb3 100644 --- a/src/common/job/models/models.go +++ b/src/common/job/models/models.go @@ -15,7 +15,7 @@ package models // Parameters for job execution. -type Parameters map[string]interface{} +type Parameters map[string]any // JobRequest is the request of launching a job. type JobRequest struct { @@ -96,5 +96,5 @@ type JobStatusChange struct { // Message is designed for sub/pub messages type Message struct { Event string - Data interface{} // generic format + Data any // generic format } diff --git a/src/common/rbac/project/evaluator_test.go b/src/common/rbac/project/evaluator_test.go index 5a995fa8e0c..ff2e147f983 100644 --- a/src/common/rbac/project/evaluator_test.go +++ b/src/common/rbac/project/evaluator_test.go @@ -119,7 +119,7 @@ func BenchmarkProjectEvaluator(b *testing.B) { resource := NewNamespace(public.ProjectID).Resource(rbac.ResourceRepository) b.ResetTimer() - for i := 0; i < b.N; i++ { + for b.Loop() { evaluator.HasPermission(context.TODO(), resource, rbac.ActionPull) } } diff --git a/src/common/rbac/project/namespace.go b/src/common/rbac/project/namespace.go index 4c696521145..efc0a40e9ac 100644 --- a/src/common/rbac/project/namespace.go +++ b/src/common/rbac/project/namespace.go @@ -43,7 +43,7 @@ func (ns *projectNamespace) Resource(subresources ...types.Resource) types.Resou return types.Resource(fmt.Sprintf("/project/%d", ns.projectID)).Subresource(subresources...) } -func (ns *projectNamespace) Identity() interface{} { +func (ns *projectNamespace) Identity() any { return ns.projectID } diff --git a/src/common/rbac/system/namespace.go b/src/common/rbac/system/namespace.go index 1e1afceb986..1bb8e05b4b9 100644 --- a/src/common/rbac/system/namespace.go +++ b/src/common/rbac/system/namespace.go @@ -38,7 +38,7 @@ func (ns *systemNamespace) Resource(subresources ...types.Resource) types.Resour return types.Resource("/system/").Subresource(subresources...) } -func (ns *systemNamespace) Identity() interface{} { +func (ns *systemNamespace) Identity() any { return nil } diff --git a/src/common/security/v2token/context.go b/src/common/security/v2token/context.go index a3615721854..b0744f89c06 100644 --- a/src/common/security/v2token/context.go +++ b/src/common/security/v2token/context.go @@ -63,7 +63,7 @@ func (t *tokenSecurityCtx) GetMyProjects() ([]*models.Project, error) { return []*models.Project{}, nil } -func (t *tokenSecurityCtx) GetProjectRoles(_ interface{}) []int { +func (t *tokenSecurityCtx) GetProjectRoles(_ any) []int { return []int{} } diff --git a/src/common/utils/test/config.go b/src/common/utils/test/config.go index 62e557f6b5c..aa6c1dc954a 100644 --- a/src/common/utils/test/config.go +++ b/src/common/utils/test/config.go @@ -18,7 +18,7 @@ import ( "github.com/goharbor/harbor/src/common" ) -var defaultConfig = map[string]interface{}{ +var defaultConfig = map[string]any{ common.ExtEndpoint: "https://host01.com", common.AUTHMode: common.DBAuth, common.DatabaseType: "postgresql", @@ -66,6 +66,6 @@ var defaultConfig = map[string]interface{}{ } // GetDefaultConfigMap returns the default config map for easier modification. -func GetDefaultConfigMap() map[string]interface{} { +func GetDefaultConfigMap() map[string]any { return defaultConfig } diff --git a/src/common/utils/test/registryctl.go b/src/common/utils/test/registryctl.go index dff8b52c2b6..686fc3213bf 100644 --- a/src/common/utils/test/registryctl.go +++ b/src/common/utils/test/registryctl.go @@ -30,7 +30,7 @@ type GCResult struct { } // NewRegistryCtl returns a mock registry server -func NewRegistryCtl(_ map[string]interface{}) (*httptest.Server, error) { +func NewRegistryCtl(_ map[string]any) (*httptest.Server, error) { m := []*RequestHandlerMapping{} gcr := GCResult{true, "hello-world", time.Now(), time.Now()} diff --git a/src/common/utils/test/test.go b/src/common/utils/test/test.go index bbf8623cffd..06b52d011db 100644 --- a/src/common/utils/test/test.go +++ b/src/common/utils/test/test.go @@ -94,9 +94,9 @@ func NewServer(mappings ...*RequestHandlerMapping) *httptest.Server { } // GetUnitTestConfig ... -func GetUnitTestConfig() map[string]interface{} { +func GetUnitTestConfig() map[string]any { ipAddress := os.Getenv("IP") - return map[string]interface{}{ + return map[string]any{ common.ExtEndpoint: fmt.Sprintf("https://%s", ipAddress), common.AUTHMode: "db_auth", common.DatabaseType: "postgresql", @@ -130,7 +130,7 @@ func GetUnitTestConfig() map[string]interface{} { } // TraceCfgMap ... -func TraceCfgMap(cfgs map[string]interface{}) { +func TraceCfgMap(cfgs map[string]any) { var keys []string for k := range cfgs { keys = append(keys, k) diff --git a/src/common/utils/uaa/client.go b/src/common/utils/uaa/client.go index dddd175a82c..c67d8176b9a 100644 --- a/src/common/utils/uaa/client.go +++ b/src/common/utils/uaa/client.go @@ -89,7 +89,7 @@ type SearchUserEntry struct { ExtID string `json:"externalId"` UserName string `json:"userName"` Emails []SearchUserEmailEntry `json:"emails"` - Groups []interface{} + Groups []any } // SearchUserRes is the struct to parse the result of search user API of UAA diff --git a/src/common/utils/utils.go b/src/common/utils/utils.go index 61e816bee8c..1df798f93cc 100644 --- a/src/common/utils/utils.go +++ b/src/common/utils/utils.go @@ -75,7 +75,7 @@ func GenerateRandomStringWithLen(length int) string { if err != nil { log.Warningf("Error reading random bytes: %v", err) } - for i := 0; i < length; i++ { + for i := range length { result[i] = chars[int(result[i])%l] } return string(result) @@ -140,7 +140,7 @@ func ParseTimeStamp(timestamp string) (*time.Time, error) { } // ConvertMapToStruct is used to fill the specified struct with map. -func ConvertMapToStruct(object interface{}, values interface{}) error { +func ConvertMapToStruct(object any, values any) error { if object == nil { return errors.New("nil struct is not supported") } @@ -158,7 +158,7 @@ func ConvertMapToStruct(object interface{}, values interface{}) error { } // ParseProjectIDOrName parses value to ID(int64) or name(string) -func ParseProjectIDOrName(value interface{}) (int64, string, error) { +func ParseProjectIDOrName(value any) (int64, string, error) { if value == nil { return 0, "", errors.New("harborIDOrName is nil") } @@ -177,7 +177,7 @@ func ParseProjectIDOrName(value interface{}) (int64, string, error) { } // SafeCastString -- cast an object to string safely -func SafeCastString(value interface{}) string { +func SafeCastString(value any) string { if result, ok := value.(string); ok { return result } @@ -185,7 +185,7 @@ func SafeCastString(value interface{}) string { } // SafeCastInt -- -func SafeCastInt(value interface{}) int { +func SafeCastInt(value any) int { if result, ok := value.(int); ok { return result } @@ -193,7 +193,7 @@ func SafeCastInt(value interface{}) int { } // SafeCastBool -- -func SafeCastBool(value interface{}) bool { +func SafeCastBool(value any) bool { if result, ok := value.(bool); ok { return result } @@ -201,7 +201,7 @@ func SafeCastBool(value interface{}) bool { } // SafeCastFloat64 -- -func SafeCastFloat64(value interface{}) float64 { +func SafeCastFloat64(value any) float64 { if result, ok := value.(float64); ok { return result } @@ -214,9 +214,9 @@ func TrimLower(str string) string { } // GetStrValueOfAnyType return string format of any value, for map, need to convert to json -func GetStrValueOfAnyType(value interface{}) string { +func GetStrValueOfAnyType(value any) string { var strVal string - if _, ok := value.(map[string]interface{}); ok { + if _, ok := value.(map[string]any); ok { b, err := json.Marshal(value) if err != nil { log.Errorf("can not marshal json object, error %v", err) @@ -237,18 +237,18 @@ func GetStrValueOfAnyType(value interface{}) string { } // IsIllegalLength ... -func IsIllegalLength(s string, min int, max int) bool { - if min == -1 { - return (len(s) > max) +func IsIllegalLength(s string, minVal int, maxVal int) bool { + if minVal == -1 { + return (len(s) > maxVal) } - if max == -1 { - return (len(s) <= min) + if maxVal == -1 { + return (len(s) <= minVal) } - return (len(s) < min || len(s) > max) + return (len(s) < minVal || len(s) > maxVal) } // ParseJSONInt ... -func ParseJSONInt(value interface{}) (int, bool) { +func ParseJSONInt(value any) (int, bool) { switch v := value.(type) { case float64: return int(v), true @@ -337,13 +337,3 @@ func MostMatchSorter(a, b string, matchWord string) bool { func IsLocalPath(path string) bool { return len(path) == 0 || (strings.HasPrefix(path, "/") && !strings.HasPrefix(path, "//")) } - -// StringInSlice check if the string is in the slice -func StringInSlice(str string, slice []string) bool { - for _, s := range slice { - if s == str { - return true - } - } - return false -} diff --git a/src/common/utils/utils_test.go b/src/common/utils/utils_test.go index 4e1ab2ef359..ab7dbf2c1f9 100644 --- a/src/common/utils/utils_test.go +++ b/src/common/utils/utils_test.go @@ -216,7 +216,7 @@ type testingStruct struct { } func TestConvertMapToStruct(t *testing.T) { - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) dataMap["Name"] = "testing" dataMap["Count"] = 100 @@ -232,7 +232,7 @@ func TestConvertMapToStruct(t *testing.T) { func TestSafeCastString(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -254,7 +254,7 @@ func TestSafeCastString(t *testing.T) { func TestSafeCastBool(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -276,7 +276,7 @@ func TestSafeCastBool(t *testing.T) { func TestSafeCastInt(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -298,7 +298,7 @@ func TestSafeCastInt(t *testing.T) { func TestSafeCastFloat64(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -342,7 +342,7 @@ func TestTrimLower(t *testing.T) { func TestGetStrValueOfAnyType(t *testing.T) { type args struct { - value interface{} + value any } tests := []struct { name string @@ -357,7 +357,7 @@ func TestGetStrValueOfAnyType(t *testing.T) { {"string", args{"hello world"}, "hello world"}, {"bool", args{true}, "true"}, {"bool", args{false}, "false"}, - {"map", args{map[string]interface{}{"key1": "value1"}}, "{\"key1\":\"value1\"}"}, + {"map", args{map[string]any{"key1": "value1"}}, "{\"key1\":\"value1\"}"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/controller/artifact/annotation/v1alpha1.go b/src/controller/artifact/annotation/v1alpha1.go index df88e42ee1e..f6abfdd8a8e 100644 --- a/src/controller/artifact/annotation/v1alpha1.go +++ b/src/controller/artifact/annotation/v1alpha1.go @@ -66,8 +66,7 @@ func parseV1alpha1SkipList(artifact *artifact.Artifact, manifest *v1.Manifest) { skipListAnnotationKey := fmt.Sprintf("%s.%s.%s", AnnotationPrefix, V1alpha1, SkipList) skipList, ok := manifest.Config.Annotations[skipListAnnotationKey] if ok { - skipKeyList := strings.Split(skipList, ",") - for _, skipKey := range skipKeyList { + for skipKey := range strings.SplitSeq(skipList, ",") { delete(metadata, skipKey) } artifact.ExtraAttrs = metadata diff --git a/src/controller/artifact/annotation/v1alpha1_test.go b/src/controller/artifact/annotation/v1alpha1_test.go index 09b376faa36..41bd6bcf64a 100644 --- a/src/controller/artifact/annotation/v1alpha1_test.go +++ b/src/controller/artifact/annotation/v1alpha1_test.go @@ -231,7 +231,7 @@ func (p *v1alpha1TestSuite) TestParse() { manifestMediaType, content, err := manifest.Payload() p.Require().Nil(err) - metadata := map[string]interface{}{} + metadata := map[string]any{} configBlob := io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) p.Require().Nil(err) @@ -244,7 +244,7 @@ func (p *v1alpha1TestSuite) TestParse() { p.Len(art.ExtraAttrs, 12) p.Equal("CNN Model", art.ExtraAttrs["description"]) p.Equal("TensorFlow", art.ExtraAttrs["framework"]) - p.Equal([]interface{}{map[string]interface{}{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) + p.Equal([]any{map[string]any{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) p.Equal("sha256:d923b93eadde0af5c639a972710a4d919066aba5d0dfbf4b9385099f70272da0", art.Icon) // ormbManifestWithoutSkipList @@ -255,7 +255,7 @@ func (p *v1alpha1TestSuite) TestParse() { manifestMediaType, content, err = manifest.Payload() p.Require().Nil(err) - metadata = map[string]interface{}{} + metadata = map[string]any{} configBlob = io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) p.Require().Nil(err) @@ -268,7 +268,7 @@ func (p *v1alpha1TestSuite) TestParse() { p.Len(art.ExtraAttrs, 13) p.Equal("CNN Model", art.ExtraAttrs["description"]) p.Equal("TensorFlow", art.ExtraAttrs["framework"]) - p.Equal([]interface{}{map[string]interface{}{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) + p.Equal([]any{map[string]any{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) p.Equal("sha256:d923b93eadde0af5c639a972710a4d919066aba5d0dfbf4b9385099f70272da0", art.Icon) // ormbManifestWithoutIcon @@ -279,7 +279,7 @@ func (p *v1alpha1TestSuite) TestParse() { manifestMediaType, content, err = manifest.Payload() p.Require().Nil(err) - metadata = map[string]interface{}{} + metadata = map[string]any{} configBlob = io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) p.Require().Nil(err) @@ -290,7 +290,7 @@ func (p *v1alpha1TestSuite) TestParse() { p.Len(art.ExtraAttrs, 12) p.Equal("CNN Model", art.ExtraAttrs["description"]) p.Equal("TensorFlow", art.ExtraAttrs["framework"]) - p.Equal([]interface{}{map[string]interface{}{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) + p.Equal([]any{map[string]any{"name": "batch_size", "value": "32"}}, art.ExtraAttrs["hyperparameters"]) p.Equal("", art.Icon) } diff --git a/src/controller/artifact/controller.go b/src/controller/artifact/controller.go index 42581878983..8a66871549d 100644 --- a/src/controller/artifact/controller.go +++ b/src/controller/artifact/controller.go @@ -313,7 +313,7 @@ func (c *controller) getByTag(ctx context.Context, repository, tag string, optio return nil, err } tags, err := c.tagCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": repo.RepositoryID, "Name": tag, }, @@ -356,7 +356,7 @@ func (c *controller) deleteDeeply(ctx context.Context, id int64, isRoot, isAcces return nil } parents, err := c.artMgr.ListReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ChildID": id, }, }) @@ -385,7 +385,7 @@ func (c *controller) deleteDeeply(ctx context.Context, id int64, isRoot, isAcces if acc.IsHard() { // if this acc artifact has parent(is child), set isRoot to false parents, err := c.artMgr.ListReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ChildID": acc.GetData().ArtifactID, }, }) @@ -752,7 +752,7 @@ func (c *controller) populateIcon(art *Artifact) { func (c *controller) populateTags(ctx context.Context, art *Artifact, option *tag.Option) { tags, err := c.tagCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": art.ID, }, }, option) diff --git a/src/controller/artifact/helper_test.go b/src/controller/artifact/helper_test.go index 14f3747e549..1b9064ff859 100644 --- a/src/controller/artifact/helper_test.go +++ b/src/controller/artifact/helper_test.go @@ -56,7 +56,7 @@ func (suite *IteratorTestSuite) TeardownSuite() { func (suite *IteratorTestSuite) TestIterator() { suite.accMgr.On("List", mock.Anything, mock.Anything).Return([]accessorymodel.Accessory{}, nil) - q1 := &q.Query{PageNumber: 1, PageSize: 5, Keywords: map[string]interface{}{}} + q1 := &q.Query{PageNumber: 1, PageSize: 5, Keywords: map[string]any{}} suite.artMgr.On("List", mock.Anything, q1).Return([]*artifact.Artifact{ {ID: 1}, {ID: 2}, @@ -65,7 +65,7 @@ func (suite *IteratorTestSuite) TestIterator() { {ID: 5}, }, nil) - q2 := &q.Query{PageNumber: 2, PageSize: 5, Keywords: map[string]interface{}{}} + q2 := &q.Query{PageNumber: 2, PageSize: 5, Keywords: map[string]any{}} suite.artMgr.On("List", mock.Anything, q2).Return([]*artifact.Artifact{ {ID: 6}, {ID: 7}, diff --git a/src/controller/artifact/model.go b/src/controller/artifact/model.go index 7305b5f3fb2..88da235c8c8 100644 --- a/src/controller/artifact/model.go +++ b/src/controller/artifact/model.go @@ -40,7 +40,7 @@ func (artifact *Artifact) UnmarshalJSON(data []byte) error { type Alias Artifact ali := &struct { *Alias - AccessoryItems []interface{} `json:"accessories,omitempty"` + AccessoryItems []any `json:"accessories,omitempty"` }{ Alias: (*Alias)(artifact), } diff --git a/src/controller/artifact/processor/base/manifest.go b/src/controller/artifact/processor/base/manifest.go index ad6e7cda1f2..0058c2fe01f 100644 --- a/src/controller/artifact/processor/base/manifest.go +++ b/src/controller/artifact/processor/base/manifest.go @@ -44,7 +44,7 @@ type ManifestProcessor struct { // AbstractMetadata abstracts metadata of artifact func (m *ManifestProcessor) AbstractMetadata(ctx context.Context, artifact *artifact.Artifact, content []byte) error { // parse metadata from config layer - metadata := map[string]interface{}{} + metadata := map[string]any{} if err := m.UnmarshalConfig(ctx, artifact.RepositoryName, content, &metadata); err != nil { return err } @@ -55,7 +55,7 @@ func (m *ManifestProcessor) AbstractMetadata(ctx context.Context, artifact *arti } if artifact.ExtraAttrs == nil { - artifact.ExtraAttrs = map[string]interface{}{} + artifact.ExtraAttrs = map[string]any{} } for _, property := range m.properties { artifact.ExtraAttrs[property] = metadata[property] @@ -80,7 +80,7 @@ func (m *ManifestProcessor) ListAdditionTypes(_ context.Context, _ *artifact.Art } // UnmarshalConfig unmarshal the config blob of the artifact into the specified object "v" -func (m *ManifestProcessor) UnmarshalConfig(_ context.Context, repository string, manifest []byte, v interface{}) error { +func (m *ManifestProcessor) UnmarshalConfig(_ context.Context, repository string, manifest []byte, v any) error { // unmarshal manifest mani := &v1.Manifest{} if err := json.Unmarshal(manifest, mani); err != nil { diff --git a/src/controller/artifact/processor/chart/chart_test.go b/src/controller/artifact/processor/chart/chart_test.go index 637da7bf6f0..e1ae67ded4d 100644 --- a/src/controller/artifact/processor/chart/chart_test.go +++ b/src/controller/artifact/processor/chart/chart_test.go @@ -89,7 +89,7 @@ func (p *processorTestSuite) TestAbstractAddition() { Repository: "github.com/goharbor", }, }, - Values: map[string]interface{}{ + Values: map[string]any{ "cluster.enable": true, "cluster.slaveCount": 1, "image.pullPolicy": "Always", diff --git a/src/controller/artifact/processor/cnai/parser/util_test.go b/src/controller/artifact/processor/cnai/parser/util_test.go index 1ebc9ad3060..f6c1b7f6b6a 100644 --- a/src/controller/artifact/processor/cnai/parser/util_test.go +++ b/src/controller/artifact/processor/cnai/parser/util_test.go @@ -156,7 +156,7 @@ func TestAddNode(t *testing.T) { // Verify the path exists. current := root parts := filepath.Clean(tt.path) - for _, part := range strings.Split(parts, string(filepath.Separator)) { + for part := range strings.SplitSeq(parts, string(filepath.Separator)) { if part == "" { continue } diff --git a/src/controller/artifact/processor/default.go b/src/controller/artifact/processor/default.go index 5cb2ad17591..394b3de2454 100644 --- a/src/controller/artifact/processor/default.go +++ b/src/controller/artifact/processor/default.go @@ -110,7 +110,7 @@ func (d *defaultProcessor) AbstractMetadata(ctx context.Context, artifact *artif } defer blob.Close() // parse metadata from config layer - metadata := map[string]interface{}{} + metadata := map[string]any{} if err = json.NewDecoder(blob).Decode(&metadata); err != nil { return err } diff --git a/src/controller/artifact/processor/default_test.go b/src/controller/artifact/processor/default_test.go index 48994153957..83bd10bae75 100644 --- a/src/controller/artifact/processor/default_test.go +++ b/src/controller/artifact/processor/default_test.go @@ -268,7 +268,7 @@ func (d *defaultProcessorTestSuite) TestAbstractMetadata() { manifestMediaType, content, err := manifest.Payload() d.Require().Nil(err) - metadata := map[string]interface{}{} + metadata := map[string]any{} configBlob := io.NopCloser(strings.NewReader(ormbConfig)) err = json.NewDecoder(configBlob).Decode(&metadata) d.Require().Nil(err) @@ -289,7 +289,7 @@ func (d *defaultProcessorTestSuite) TestAbstractMetadataOfOCIManifesttWithUnknow d.Require().Nil(err) configBlob := io.NopCloser(strings.NewReader(UnknownJsonConfig)) - metadata := map[string]interface{}{} + metadata := map[string]any{} err = json.NewDecoder(configBlob).Decode(&metadata) d.Require().Nil(err) diff --git a/src/controller/artifact/processor/image/manifest_v1.go b/src/controller/artifact/processor/image/manifest_v1.go index 8179ad81e3e..7b64ad7fcba 100644 --- a/src/controller/artifact/processor/image/manifest_v1.go +++ b/src/controller/artifact/processor/image/manifest_v1.go @@ -44,7 +44,7 @@ func (m *manifestV1Processor) AbstractMetadata(_ context.Context, artifact *arti return err } if artifact.ExtraAttrs == nil { - artifact.ExtraAttrs = map[string]interface{}{} + artifact.ExtraAttrs = map[string]any{} } artifact.ExtraAttrs["architecture"] = mani.Architecture return nil diff --git a/src/controller/artifact/processor/image/manifest_v2.go b/src/controller/artifact/processor/image/manifest_v2.go index b88c2c2b49b..98847d4c21e 100644 --- a/src/controller/artifact/processor/image/manifest_v2.go +++ b/src/controller/artifact/processor/image/manifest_v2.go @@ -59,7 +59,7 @@ func (m *manifestV2Processor) AbstractMetadata(ctx context.Context, artifact *ar return err } if artifact.ExtraAttrs == nil { - artifact.ExtraAttrs = map[string]interface{}{} + artifact.ExtraAttrs = map[string]any{} } artifact.ExtraAttrs["created"] = config.Created artifact.ExtraAttrs["architecture"] = config.Architecture diff --git a/src/controller/artifact/processor/wasm/wasm.go b/src/controller/artifact/processor/wasm/wasm.go index 1118ef470b8..19edea423a8 100644 --- a/src/controller/artifact/processor/wasm/wasm.go +++ b/src/controller/artifact/processor/wasm/wasm.go @@ -62,14 +62,14 @@ type Processor struct { } func (m *Processor) AbstractMetadata(ctx context.Context, art *artifact.Artifact, manifestBody []byte) error { - art.ExtraAttrs = map[string]interface{}{} + art.ExtraAttrs = map[string]any{} manifest := &v1.Manifest{} if err := json.Unmarshal(manifestBody, manifest); err != nil { return err } if art.ExtraAttrs == nil { - art.ExtraAttrs = map[string]interface{}{} + art.ExtraAttrs = map[string]any{} } if manifest.Annotations[AnnotationVariantKey] == AnnotationVariantValue || manifest.Annotations[AnnotationHandlerKey] == AnnotationHandlerValue { // for annotation way diff --git a/src/controller/blob/controller.go b/src/controller/blob/controller.go index 46df973e331..2ab07dbc660 100644 --- a/src/controller/blob/controller.go +++ b/src/controller/blob/controller.go @@ -225,10 +225,10 @@ func (c *controller) Get(ctx context.Context, digest string, options ...Option) opts := newOptions(options...) - keywords := make(map[string]interface{}) + keywords := make(map[string]any) if digest != "" { ol := q.OrList{ - Values: []interface{}{ + Values: []any{ digest, }, } diff --git a/src/controller/blob/controller_test.go b/src/controller/blob/controller_test.go index 51a38c5ebb1..649dfab1982 100644 --- a/src/controller/blob/controller_test.go +++ b/src/controller/blob/controller_test.go @@ -232,7 +232,7 @@ func (suite *ControllerTestSuite) TestGet() { func (suite *ControllerTestSuite) TestSync() { var references []distribution.Descriptor - for i := 0; i < 5; i++ { + for i := range 5 { references = append(references, distribution.Descriptor{ MediaType: fmt.Sprintf("media type %d", i), Digest: suite.Digest(), diff --git a/src/controller/config/controller.go b/src/controller/config/controller.go index 5302804aa14..083d97fe406 100644 --- a/src/controller/config/controller.go +++ b/src/controller/config/controller.go @@ -46,11 +46,11 @@ type Controller interface { // UserConfigs get the user scope configurations UserConfigs(ctx context.Context) (map[string]*models.Value, error) // UpdateUserConfigs update the user scope configurations - UpdateUserConfigs(ctx context.Context, conf map[string]interface{}) error + UpdateUserConfigs(ctx context.Context, conf map[string]any) error // AllConfigs get all configurations, used by internal, should include the system config items - AllConfigs(ctx context.Context) (map[string]interface{}, error) + AllConfigs(ctx context.Context) (map[string]any, error) // ConvertForGet - delete sensitive attrs and add editable field to every attr - ConvertForGet(ctx context.Context, cfg map[string]interface{}, internal bool) (map[string]*models.Value, error) + ConvertForGet(ctx context.Context, cfg map[string]any, internal bool) (map[string]*models.Value, error) // OverwriteConfig overwrite config in the database and set all configure read only when CONFIG_OVERWRITE_JSON is provided OverwriteConfig(ctx context.Context) error } @@ -70,13 +70,13 @@ func (c *controller) UserConfigs(ctx context.Context) (map[string]*models.Value, return c.ConvertForGet(ctx, configs, false) } -func (c *controller) AllConfigs(ctx context.Context) (map[string]interface{}, error) { +func (c *controller) AllConfigs(ctx context.Context) (map[string]any, error) { mgr := config.GetCfgManager(ctx) configs := mgr.GetAll(ctx) return configs, nil } -func (c *controller) UpdateUserConfigs(ctx context.Context, conf map[string]interface{}) error { +func (c *controller) UpdateUserConfigs(ctx context.Context, conf map[string]any) error { if readOnlyForAll { return errors.ForbiddenError(nil).WithMessage("current config is init by env variable: CONFIG_OVERWRITE_JSON, it cannot be updated") } @@ -97,7 +97,7 @@ func (c *controller) UpdateUserConfigs(ctx context.Context, conf map[string]inte return c.updateLogEndpoint(ctx, conf) } -func (c *controller) updateLogEndpoint(ctx context.Context, cfgs map[string]interface{}) error { +func (c *controller) updateLogEndpoint(ctx context.Context, cfgs map[string]any) error { // check if the audit log forward endpoint updated if _, ok := cfgs[common.AuditLogForwardEndpoint]; ok { auditEP := config.AuditLogForwardEndpoint(ctx) @@ -112,7 +112,7 @@ func (c *controller) updateLogEndpoint(ctx context.Context, cfgs map[string]inte return nil } -func (c *controller) validateCfg(ctx context.Context, cfgs map[string]interface{}) error { +func (c *controller) validateCfg(ctx context.Context, cfgs map[string]any) error { mgr := config.GetCfgManager(ctx) // check if auth can be modified @@ -146,7 +146,7 @@ func (c *controller) validateCfg(ctx context.Context, cfgs map[string]interface{ return nil } -func verifySkipAuditLogCfg(ctx context.Context, cfgs map[string]interface{}, mgr config.Manager) error { +func verifySkipAuditLogCfg(ctx context.Context, cfgs map[string]any, mgr config.Manager) error { updated := false endPoint := mgr.Get(ctx, common.AuditLogForwardEndpoint).GetString() skipAuditDB := mgr.Get(ctx, common.SkipAuditLogDatabase).GetBool() @@ -169,7 +169,7 @@ func verifySkipAuditLogCfg(ctx context.Context, cfgs map[string]interface{}, mgr } // verifyValueLengthCfg verifies the cfgs which need to check the value max length to align with frontend. -func verifyValueLengthCfg(_ context.Context, cfgs map[string]interface{}) error { +func verifyValueLengthCfg(_ context.Context, cfgs map[string]any) error { maxValue := maxValueLimitedByLength(common.UIMaxLengthLimitedOfNumber) validateCfgs := []string{ common.TokenExpiration, @@ -206,7 +206,7 @@ func maxValueLimitedByLength(length int) int64 { var value int64 // the times for multiple, should *10 for every time times := 1 - for i := 0; i < length; i++ { + for range length { value = value + int64(9*times) times = times * 10 } @@ -217,11 +217,11 @@ func maxValueLimitedByLength(length int) int64 { // ScanAllPolicy is represent the json request and object for scan all policy // Only for migrating from the legacy schedule. type ScanAllPolicy struct { - Type string `json:"type"` - Param map[string]interface{} `json:"parameter,omitempty"` + Type string `json:"type"` + Param map[string]any `json:"parameter,omitempty"` } -func (c *controller) ConvertForGet(ctx context.Context, cfg map[string]interface{}, internal bool) (map[string]*models.Value, error) { +func (c *controller) ConvertForGet(ctx context.Context, cfg map[string]any, internal bool) (map[string]*models.Value, error) { result := map[string]*models.Value{} mList := metadata.Instance().GetAll() @@ -270,7 +270,7 @@ func (c *controller) ConvertForGet(ctx context.Context, cfg map[string]interface } func (c *controller) OverwriteConfig(ctx context.Context) error { - cfgMap := map[string]interface{}{} + cfgMap := map[string]any{} if v, ok := os.LookupEnv(configOverwriteJSON); ok { err := json.Unmarshal([]byte(v), &cfgMap) if err != nil { diff --git a/src/controller/config/controller_test.go b/src/controller/config/controller_test.go index d3f4ed9e64e..2fd554fa970 100644 --- a/src/controller/config/controller_test.go +++ b/src/controller/config/controller_test.go @@ -33,7 +33,7 @@ func Test_verifySkipAuditLogCfg(t *testing.T) { Return(&metadata.ConfigureValue{Name: common.SkipAuditLogDatabase, Value: "true"}) type args struct { ctx context.Context - cfgs map[string]interface{} + cfgs map[string]any mgr config.Manager } tests := []struct { @@ -42,17 +42,17 @@ func Test_verifySkipAuditLogCfg(t *testing.T) { wantErr bool }{ {name: "both configured", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{common.AuditLogForwardEndpoint: "harbor-log:15041", + cfgs: map[string]any{common.AuditLogForwardEndpoint: "harbor-log:15041", common.SkipAuditLogDatabase: true}, mgr: cfgManager}, wantErr: false}, {name: "no forward endpoint config", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{common.SkipAuditLogDatabase: true}, + cfgs: map[string]any{common.SkipAuditLogDatabase: true}, mgr: cfgManager}, wantErr: true}, {name: "none configured", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{}, + cfgs: map[string]any{}, mgr: cfgManager}, wantErr: false}, {name: "enabled skip audit log database, but change log forward endpoint to empty", args: args{ctx: context.TODO(), - cfgs: map[string]interface{}{common.AuditLogForwardEndpoint: ""}, + cfgs: map[string]any{common.AuditLogForwardEndpoint: ""}, mgr: cfgManager}, wantErr: true}, } for _, tt := range tests { @@ -89,24 +89,24 @@ func Test_maxValueLimitedByLength(t *testing.T) { func Test_verifyValueLengthCfg(t *testing.T) { type args struct { ctx context.Context - cfgs map[string]interface{} + cfgs map[string]any } tests := []struct { name string args args wantErr bool }{ - {name: "valid config", args: args{context.TODO(), map[string]interface{}{ + {name: "valid config", args: args{context.TODO(), map[string]any{ common.TokenExpiration: float64(100), common.RobotTokenDuration: float64(100), common.SessionTimeout: float64(100), }}, wantErr: false}, - {name: "invalid config with negative value", args: args{context.TODO(), map[string]interface{}{ + {name: "invalid config with negative value", args: args{context.TODO(), map[string]any{ common.TokenExpiration: float64(-1), common.RobotTokenDuration: float64(100), common.SessionTimeout: float64(100), }}, wantErr: true}, - {name: "invalid config with value over length limit", args: args{context.TODO(), map[string]interface{}{ + {name: "invalid config with value over length limit", args: args{context.TODO(), map[string]any{ common.TokenExpiration: float64(100), common.RobotTokenDuration: float64(100000000000000000), common.SessionTimeout: float64(100), diff --git a/src/controller/config/test/controller_test.go b/src/controller/config/test/controller_test.go index 5753460da0e..350214d6cc2 100644 --- a/src/controller/config/test/controller_test.go +++ b/src/controller/config/test/controller_test.go @@ -28,12 +28,12 @@ import ( htesting "github.com/goharbor/harbor/src/testing" ) -var TestDBConfig = map[string]interface{}{ +var TestDBConfig = map[string]any{ common.LDAPBaseDN: "dc=example,dc=com", common.LDAPURL: "ldap.example.com", } -var TestConfigWithScanAll = map[string]interface{}{ +var TestConfigWithScanAll = map[string]any{ "postgresql_host": "localhost", "postgresql_database": "registry", "postgresql_password": "root123", @@ -67,7 +67,7 @@ func (c *controllerTestSuite) TestGetUserCfg() { } func (c *controllerTestSuite) TestConvertForGet() { - conf := map[string]interface{}{ + conf := map[string]any{ "ldap_url": "ldaps.myexample,com", "ldap_base_dn": "dc=myexample,dc=com", "auth_mode": "ldap_auth", @@ -83,7 +83,7 @@ func (c *controllerTestSuite) TestConvertForGet() { c.False(exist) // password type should be sent to internal api call - conf2 := map[string]interface{}{ + conf2 := map[string]any{ "ldap_url": "ldaps.myexample,com", "ldap_base_dn": "dc=myexample,dc=com", "auth_mode": "ldap_auth", @@ -109,7 +109,7 @@ func (c *controllerTestSuite) TestGetAll() { func (c *controllerTestSuite) TestUpdateUserCfg() { - userConf := map[string]interface{}{ + userConf := map[string]any{ common.LDAPURL: "ldaps.myexample,com", common.LDAPBaseDN: "dc=myexample,dc=com", } @@ -121,7 +121,7 @@ func (c *controllerTestSuite) TestUpdateUserCfg() { } c.Equal("dc=myexample,dc=com", cfgResp["ldap_base_dn"].Val) c.Equal("ldaps.myexample,com", cfgResp["ldap_url"].Val) - badCfg := map[string]interface{}{ + badCfg := map[string]any{ common.LDAPScope: 5, } err2 := c.controller.UpdateUserConfigs(ctx, badCfg) @@ -130,7 +130,7 @@ func (c *controllerTestSuite) TestUpdateUserCfg() { } /*func (c *controllerTestSuite) TestCheckUnmodifiable() { - conf := map[string]interface{}{ + conf := map[string]any{ "ldap_url": "ldaps.myexample,com", "ldap_base_dn": "dc=myexample,dc=com", "auth_mode": "ldap_auth", diff --git a/src/controller/event/handler/auditlog/auditlog.go b/src/controller/event/handler/auditlog/auditlog.go index 41ef86c6c2d..15c67d8f728 100644 --- a/src/controller/event/handler/auditlog/auditlog.go +++ b/src/controller/event/handler/auditlog/auditlog.go @@ -41,7 +41,7 @@ func (h *Handler) Name() string { } // Handle ... -func (h *Handler) Handle(ctx context.Context, value interface{}) error { +func (h *Handler) Handle(ctx context.Context, value any) error { var addAuditLog bool switch v := value.(type) { case *event.PushArtifactEvent, *event.DeleteArtifactEvent, diff --git a/src/controller/event/handler/internal/artifact.go b/src/controller/event/handler/internal/artifact.go index a9e380f2644..b8cab4a73a3 100644 --- a/src/controller/event/handler/internal/artifact.go +++ b/src/controller/event/handler/internal/artifact.go @@ -99,7 +99,7 @@ func (a *ArtifactEventHandler) Name() string { } // Handle ... -func (a *ArtifactEventHandler) Handle(ctx context.Context, value interface{}) error { +func (a *ArtifactEventHandler) Handle(ctx context.Context, value any) error { switch v := value.(type) { case *event.PullArtifactEvent: return a.onPull(ctx, v.ArtifactEvent) @@ -190,7 +190,7 @@ func (a *ArtifactEventHandler) syncFlushPullTime(ctx context.Context, artifactID if tagName != "" { tags, err := tag.Ctl.List(ctx, q.New( - map[string]interface{}{ + map[string]any{ "ArtifactID": artifactID, "Name": tagName, }), nil) diff --git a/src/controller/event/handler/internal/project.go b/src/controller/event/handler/internal/project.go index b6b7bf666b3..5b68e5750fc 100644 --- a/src/controller/event/handler/internal/project.go +++ b/src/controller/event/handler/internal/project.go @@ -53,7 +53,7 @@ func (a *ProjectEventHandler) onProjectDelete(ctx context.Context, event *event. } // Handle handle project event -func (a *ProjectEventHandler) Handle(ctx context.Context, value interface{}) error { +func (a *ProjectEventHandler) Handle(ctx context.Context, value any) error { switch v := value.(type) { case *event.DeleteProjectEvent: return a.onProjectDelete(ctx, v) diff --git a/src/controller/event/handler/p2p/preheat.go b/src/controller/event/handler/p2p/preheat.go index d2e1297ab47..bc1e870b320 100644 --- a/src/controller/event/handler/p2p/preheat.go +++ b/src/controller/event/handler/p2p/preheat.go @@ -36,7 +36,7 @@ func (p *Handler) Name() string { } // Handle ... -func (p *Handler) Handle(ctx context.Context, value interface{}) error { +func (p *Handler) Handle(ctx context.Context, value any) error { switch v := value.(type) { case *event.PushArtifactEvent: return p.handlePushArtifact(ctx, v) diff --git a/src/controller/event/handler/p2p/preheat_test.go b/src/controller/event/handler/p2p/preheat_test.go index 350cf478523..5d1c8282126 100644 --- a/src/controller/event/handler/p2p/preheat_test.go +++ b/src/controller/event/handler/p2p/preheat_test.go @@ -82,7 +82,7 @@ func (suite *PreheatTestSuite) TestName() { // TestHandle ... func (suite *PreheatTestSuite) TestHandle() { type args struct { - data interface{} + data any } tests := []struct { name string diff --git a/src/controller/event/handler/replication/replication.go b/src/controller/event/handler/replication/replication.go index cd09c705858..999fc1b955f 100644 --- a/src/controller/event/handler/replication/replication.go +++ b/src/controller/event/handler/replication/replication.go @@ -36,7 +36,7 @@ func (r *Handler) Name() string { } // Handle ... -func (r *Handler) Handle(ctx context.Context, value interface{}) error { +func (r *Handler) Handle(ctx context.Context, value any) error { pushArtEvent, ok := value.(*event.PushArtifactEvent) if ok { return r.handlePushArtifact(ctx, pushArtEvent) @@ -78,7 +78,7 @@ func (r *Handler) handlePushArtifact(ctx context.Context, event *event.PushArtif Metadata: &model.ResourceMetadata{ Repository: &model.Repository{ Name: event.Repository, - Metadata: map[string]interface{}{ + Metadata: map[string]any{ "public": strconv.FormatBool(public), }, }, @@ -138,7 +138,7 @@ func (r *Handler) handleCreateTag(ctx context.Context, event *event.CreateTagEve Metadata: &model.ResourceMetadata{ Repository: &model.Repository{ Name: event.Repository, - Metadata: map[string]interface{}{ + Metadata: map[string]any{ "public": strconv.FormatBool(public), }, }, diff --git a/src/controller/event/handler/util/util_test.go b/src/controller/event/handler/util/util_test.go index 21b89de52b2..27a9ae35ec1 100644 --- a/src/controller/event/handler/util/util_test.go +++ b/src/controller/event/handler/util/util_test.go @@ -17,7 +17,7 @@ func TestMain(m *testing.M) { } func TestBuildImageResourceURL(t *testing.T) { - cfg := map[string]interface{}{ + cfg := map[string]any{ common.ExtEndpoint: "https://demo.goharbor.io", } config.InitWithSettings(cfg) diff --git a/src/controller/event/handler/webhook/artifact/artifact.go b/src/controller/event/handler/webhook/artifact/artifact.go index 89bd831310b..3efff62fa92 100644 --- a/src/controller/event/handler/webhook/artifact/artifact.go +++ b/src/controller/event/handler/webhook/artifact/artifact.go @@ -39,7 +39,7 @@ func (a *Handler) Name() string { } // Handle preprocess artifact event data and then publish hook event -func (a *Handler) Handle(ctx context.Context, value interface{}) error { +func (a *Handler) Handle(ctx context.Context, value any) error { if !config.NotificationEnable(ctx) { log.Debug("notification feature is not enabled") return nil diff --git a/src/controller/event/handler/webhook/artifact/replication.go b/src/controller/event/handler/webhook/artifact/replication.go index 03a43e21d30..bc6f3fec2d4 100644 --- a/src/controller/event/handler/webhook/artifact/replication.go +++ b/src/controller/event/handler/webhook/artifact/replication.go @@ -45,7 +45,7 @@ func (r *ReplicationHandler) Name() string { } // Handle ... -func (r *ReplicationHandler) Handle(ctx context.Context, value interface{}) error { +func (r *ReplicationHandler) Handle(ctx context.Context, value any) error { if !config.NotificationEnable(ctx) { log.Debug("notification feature is not enabled") return nil diff --git a/src/controller/event/handler/webhook/artifact/replication_test.go b/src/controller/event/handler/webhook/artifact/replication_test.go index 8a8d1bca22a..a1dac0b85b1 100644 --- a/src/controller/event/handler/webhook/artifact/replication_test.go +++ b/src/controller/event/handler/webhook/artifact/replication_test.go @@ -73,7 +73,7 @@ func TestReplicationHandler_Handle(t *testing.T) { handler := &ReplicationHandler{} type args struct { - data interface{} + data any } tests := []struct { name string diff --git a/src/controller/event/handler/webhook/artifact/retention.go b/src/controller/event/handler/webhook/artifact/retention.go index b89708a6687..f75f6ac89eb 100644 --- a/src/controller/event/handler/webhook/artifact/retention.go +++ b/src/controller/event/handler/webhook/artifact/retention.go @@ -40,7 +40,7 @@ func (r *RetentionHandler) Name() string { } // Handle ... -func (r *RetentionHandler) Handle(ctx context.Context, value interface{}) error { +func (r *RetentionHandler) Handle(ctx context.Context, value any) error { if !config.NotificationEnable(ctx) { log.Debug("notification feature is not enabled") return nil diff --git a/src/controller/event/handler/webhook/artifact/retention_test.go b/src/controller/event/handler/webhook/artifact/retention_test.go index 84770ad0fbf..e5520e6f03c 100644 --- a/src/controller/event/handler/webhook/artifact/retention_test.go +++ b/src/controller/event/handler/webhook/artifact/retention_test.go @@ -61,7 +61,7 @@ func TestRetentionHandler_Handle(t *testing.T) { }, nil) type args struct { - data interface{} + data any } tests := []struct { name string diff --git a/src/controller/event/handler/webhook/quota/quota.go b/src/controller/event/handler/webhook/quota/quota.go index d4943e5bb74..efe51fa456b 100644 --- a/src/controller/event/handler/webhook/quota/quota.go +++ b/src/controller/event/handler/webhook/quota/quota.go @@ -38,7 +38,7 @@ func (qp *Handler) Name() string { } // Handle ... -func (qp *Handler) Handle(ctx context.Context, value interface{}) error { +func (qp *Handler) Handle(ctx context.Context, value any) error { quotaEvent, ok := value.(*event.QuotaEvent) if !ok { return errors.New("invalid quota event type") diff --git a/src/controller/event/handler/webhook/quota/quota_test.go b/src/controller/event/handler/webhook/quota/quota_test.go index e5d1783a657..8013dda5852 100644 --- a/src/controller/event/handler/webhook/quota/quota_test.go +++ b/src/controller/event/handler/webhook/quota/quota_test.go @@ -53,7 +53,7 @@ func TestQuotaPreprocessHandler(t *testing.T) { // SetupSuite prepares env for test suite. func (suite *QuotaPreprocessHandlerSuite) SetupSuite() { common_dao.PrepareTestForPostgresSQL() - cfg := map[string]interface{}{ + cfg := map[string]any{ common.NotificationEnable: true, } config.InitWithSettings(cfg) @@ -110,7 +110,7 @@ func (m *MockHandler) Name() string { } // Handle ... -func (m *MockHandler) Handle(ctx context.Context, value interface{}) error { +func (m *MockHandler) Handle(ctx context.Context, value any) error { return nil } diff --git a/src/controller/event/handler/webhook/scan/scan.go b/src/controller/event/handler/webhook/scan/scan.go index 9c7df3fd912..15491c11496 100644 --- a/src/controller/event/handler/webhook/scan/scan.go +++ b/src/controller/event/handler/webhook/scan/scan.go @@ -42,7 +42,7 @@ func (si *Handler) Name() string { } // Handle preprocess chart event data and then publish hook event -func (si *Handler) Handle(ctx context.Context, value interface{}) error { +func (si *Handler) Handle(ctx context.Context, value any) error { if value == nil { return errors.New("empty scan artifact event") } @@ -129,7 +129,7 @@ func constructScanImagePayload(ctx context.Context, event *event.ScanImageEvent, // Wait for reasonable time to make sure the report is ready // Interval=500ms and total time = 5s // If the report is still not ready in the total time, then failed at then - for i := 0; i < 10; i++ { + for range 10 { // First check in case it is ready if re, err := scan.DefaultController.GetReport(ctx, art, []string{v1.MimeTypeNativeReport, v1.MimeTypeGenericVulnerabilityReport}); err == nil { if len(re) > 0 && len(re[0].Report) > 0 { @@ -142,7 +142,7 @@ func constructScanImagePayload(ctx context.Context, event *event.ScanImageEvent, time.Sleep(500 * time.Millisecond) } - scanSummaries := map[string]interface{}{} + scanSummaries := map[string]any{} if event.ScanType == v1.ScanTypeVulnerability { scanSummaries, err = scan.DefaultController.GetSummary(ctx, art, event.ScanType, []string{v1.MimeTypeNativeReport, v1.MimeTypeGenericVulnerabilityReport}) if err != nil { @@ -150,7 +150,7 @@ func constructScanImagePayload(ctx context.Context, event *event.ScanImageEvent, } } - sbomOverview := map[string]interface{}{} + sbomOverview := map[string]any{} if event.ScanType == v1.ScanTypeSbom { sbomOverview, err = scan.DefaultController.GetSummary(ctx, art, event.ScanType, []string{v1.MimeTypeSBOMReport}) if err != nil { diff --git a/src/controller/event/handler/webhook/scan/scan_test.go b/src/controller/event/handler/webhook/scan/scan_test.go index 6a5498a5a3e..d6d4cddca2e 100644 --- a/src/controller/event/handler/webhook/scan/scan_test.go +++ b/src/controller/event/handler/webhook/scan/scan_test.go @@ -63,7 +63,7 @@ func TestScanImagePreprocessHandler(t *testing.T) { // SetupSuite prepares env for test suite. func (suite *ScanImagePreprocessHandlerSuite) SetupSuite() { common_dao.PrepareTestForPostgresSQL() - cfg := map[string]interface{}{ + cfg := map[string]any{ common.NotificationEnable: true, } config.InitWithSettings(cfg) @@ -92,7 +92,7 @@ func (suite *ScanImagePreprocessHandlerSuite) SetupSuite() { mc := &scantesting.Controller{} var options []report.Option - s := make(map[string]interface{}) + s := make(map[string]any) mc.On("GetSummary", a, []string{v1.MimeTypeNativeReport}, options).Return(s, nil) mock.OnAnything(mc, "GetSummary").Return(s, nil) mock.OnAnything(mc, "GetReport").Return(reports, nil) @@ -153,7 +153,7 @@ func (m *MockHTTPHandler) Name() string { } // Handle ... -func (m *MockHTTPHandler) Handle(ctx context.Context, value interface{}) error { +func (m *MockHTTPHandler) Handle(ctx context.Context, value any) error { return nil } diff --git a/src/controller/event/metadata/robot_test.go b/src/controller/event/metadata/robot_test.go index b7a2be3d770..02cafb64c5d 100644 --- a/src/controller/event/metadata/robot_test.go +++ b/src/controller/event/metadata/robot_test.go @@ -33,7 +33,7 @@ type robotEventTestSuite struct { } func (t *tagEventTestSuite) TestResolveOfCreateRobotEventMetadata() { - cfg := map[string]interface{}{ + cfg := map[string]any{ common.RobotPrefix: "robot$", } config.InitWithSettings(cfg) @@ -57,7 +57,7 @@ func (t *tagEventTestSuite) TestResolveOfCreateRobotEventMetadata() { } func (t *tagEventTestSuite) TestResolveOfDeleteRobotEventMetadata() { - cfg := map[string]interface{}{ + cfg := map[string]any{ common.RobotPrefix: "robot$", } config.InitWithSettings(cfg) diff --git a/src/controller/gc/controller.go b/src/controller/gc/controller.go index 5de9be5e5fb..0e715a0d291 100644 --- a/src/controller/gc/controller.go +++ b/src/controller/gc/controller.go @@ -75,7 +75,7 @@ type controller struct { // Start starts the manual GC func (c *controller) Start(ctx context.Context, policy Policy, trigger string) (int64, error) { - para := make(map[string]interface{}) + para := make(map[string]any) para["delete_untagged"] = policy.DeleteUntagged para["dry_run"] = policy.DryRun para["workers"] = policy.Workers @@ -129,7 +129,7 @@ func (c *controller) ListExecutions(ctx context.Context, query *q.Query) ([]*Exe // GetExecution ... func (c *controller) GetExecution(ctx context.Context, id int64) (*Execution, error) { execs, err := c.exeMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.GarbageCollectionVendorType, }, @@ -147,7 +147,7 @@ func (c *controller) GetExecution(ctx context.Context, id int64) (*Execution, er // GetTask ... func (c *controller) GetTask(ctx context.Context, id int64) (*Task, error) { tasks, err := c.taskMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.GarbageCollectionVendorType, }, @@ -203,7 +203,7 @@ func (c *controller) GetSchedule(ctx context.Context) (*scheduler.Schedule, erro // CreateSchedule ... func (c *controller) CreateSchedule(ctx context.Context, cronType, cron string, policy Policy) (int64, error) { - extras := make(map[string]interface{}) + extras := make(map[string]any) extras["delete_untagged"] = policy.DeleteUntagged extras["workers"] = policy.Workers return c.schedulerMgr.Schedule(ctx, job.GarbageCollectionVendorType, -1, cronType, cron, job.GarbageCollectionVendorType, policy, extras) diff --git a/src/controller/gc/controller_test.go b/src/controller/gc/controller_test.go index 857f4ecff74..a7f1611d2ca 100644 --- a/src/controller/gc/controller_test.go +++ b/src/controller/gc/controller_test.go @@ -38,7 +38,7 @@ func (g *gcCtrTestSuite) TestStart() { g.taskMgr.On("Create", mock.Anything, mock.Anything, mock.Anything).Return(int64(1), nil) g.taskMgr.On("Stop", mock.Anything, mock.Anything).Return(nil) - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) p := Policy{ DeleteUntagged: true, ExtraAttrs: dataMap, @@ -146,7 +146,7 @@ func (g *gcCtrTestSuite) TestCreateSchedule() { g.scheduler.On("Schedule", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(int64(1), nil) - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) p := Policy{ DeleteUntagged: true, ExtraAttrs: dataMap, diff --git a/src/controller/gc/model.go b/src/controller/gc/model.go index f94dcd5aa95..9425958cb07 100644 --- a/src/controller/gc/model.go +++ b/src/controller/gc/model.go @@ -20,11 +20,11 @@ import ( // Policy ... type Policy struct { - Trigger *Trigger `json:"trigger"` - DeleteUntagged bool `json:"deleteuntagged"` - DryRun bool `json:"dryrun"` - Workers int `json:"workers"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` + Trigger *Trigger `json:"trigger"` + DeleteUntagged bool `json:"deleteuntagged"` + DryRun bool `json:"dryrun"` + Workers int `json:"workers"` + ExtraAttrs map[string]any `json:"extra_attrs"` } // TriggerType represents the type of trigger. @@ -47,7 +47,7 @@ type Execution struct { Status string StatusMessage string Trigger string - ExtraAttrs map[string]interface{} + ExtraAttrs map[string]any StartTime time.Time UpdateTime time.Time } diff --git a/src/controller/health/controller.go b/src/controller/health/controller.go index c6c2bdc458e..4c56a653736 100644 --- a/src/controller/health/controller.go +++ b/src/controller/health/controller.go @@ -48,7 +48,7 @@ func (c *controller) GetHealth(_ context.Context) *OverallHealthStatus { for name, checker := range registry { go check(name, checker, timeout, ch) } - for i := 0; i < len(registry); i++ { + for range len(registry) { componentStatus := <-ch if len(componentStatus.Error) != 0 { isHealthy = false diff --git a/src/controller/icon/controller.go b/src/controller/icon/controller.go index 3bab2641f13..f250ea781d4 100644 --- a/src/controller/icon/controller.go +++ b/src/controller/icon/controller.go @@ -138,7 +138,7 @@ func (c *controller) Get(ctx context.Context, digest string) (*Icon, error) { } else { // read icon from blob artifacts, err := c.artMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Icon": digest, }, }) diff --git a/src/controller/jobmonitor/monitor.go b/src/controller/jobmonitor/monitor.go index 04ca93b553c..505f9d46e7c 100644 --- a/src/controller/jobmonitor/monitor.go +++ b/src/controller/jobmonitor/monitor.go @@ -17,6 +17,7 @@ package jobmonitor import ( "context" "fmt" + "slices" "strings" "time" @@ -278,12 +279,7 @@ func (w *monitorController) ListQueues(ctx context.Context) ([]*jm.Queue, error) } func skippedUnusedJobType(jobType string) bool { - for _, t := range skippedJobTypes { - if jobType == t { - return true - } - } - return false + return slices.Contains(skippedJobTypes, jobType) } func (w *monitorController) PauseJobQueues(ctx context.Context, jobType string) error { diff --git a/src/controller/jobservice/model.go b/src/controller/jobservice/model.go index 3ef1b04c6d2..eb3b4a95739 100644 --- a/src/controller/jobservice/model.go +++ b/src/controller/jobservice/model.go @@ -22,7 +22,7 @@ type Execution struct { Status string StatusMessage string Trigger string - ExtraAttrs map[string]interface{} + ExtraAttrs map[string]any StartTime time.Time EndTime time.Time } diff --git a/src/controller/jobservice/schedule.go b/src/controller/jobservice/schedule.go index e0f9ea19c2f..e80b159e307 100644 --- a/src/controller/jobservice/schedule.go +++ b/src/controller/jobservice/schedule.go @@ -35,7 +35,7 @@ type SchedulerController interface { // Get the schedule Get(ctx context.Context, vendorType string) (*scheduler.Schedule, error) // Create with cron type & string - Create(ctx context.Context, vendorType, cronType, cron, callbackFuncName string, policy interface{}, extrasParam map[string]interface{}) (int64, error) + Create(ctx context.Context, vendorType, cronType, cron, callbackFuncName string, policy any, extrasParam map[string]any) (int64, error) // Delete the schedule Delete(ctx context.Context, vendorType string) error // List lists schedules @@ -76,7 +76,7 @@ func (s *schedulerController) Get(ctx context.Context, vendorType string) (*sche } func (s *schedulerController) Create(ctx context.Context, vendorType, cronType, cron, callbackFuncName string, - policy interface{}, extrasParam map[string]interface{}) (int64, error) { + policy any, extrasParam map[string]any) (int64, error) { return s.schedulerMgr.Schedule(ctx, vendorType, -1, cronType, cron, callbackFuncName, policy, extrasParam) } diff --git a/src/controller/jobservice/schedule_test.go b/src/controller/jobservice/schedule_test.go index 4572b5e6df9..3c7cf970064 100644 --- a/src/controller/jobservice/schedule_test.go +++ b/src/controller/jobservice/schedule_test.go @@ -49,7 +49,7 @@ func (s *ScheduleTestSuite) TestCreateSchedule() { s.scheduler.On("Schedule", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(int64(1), nil) - dataMap := make(map[string]interface{}) + dataMap := make(map[string]any) p := purge.JobPolicy{} id, err := s.ctl.Create(nil, job.PurgeAuditVendorType, "Daily", "* * * * * *", purge.SchedulerCallback, p, dataMap) s.Nil(err) @@ -76,7 +76,7 @@ func (s *ScheduleTestSuite) TestGetSchedule() { func (s *ScheduleTestSuite) TestListSchedule() { mock.OnAnything(s.scheduler, "ListSchedules").Return([]*scheduler.Schedule{ - {ID: 1, VendorType: "GARBAGE_COLLECTION", CRON: "0 0 0 * * *", ExtraAttrs: map[string]interface{}{"args": "sample args"}}}, nil).Once() + {ID: 1, VendorType: "GARBAGE_COLLECTION", CRON: "0 0 0 * * *", ExtraAttrs: map[string]any{"args": "sample args"}}}, nil).Once() schedules, err := s.scheduler.ListSchedules(nil, nil) s.Assert().Nil(err) s.Assert().Equal(1, len(schedules)) diff --git a/src/controller/ldap/controller_test.go b/src/controller/ldap/controller_test.go index bf82c3ed370..bb310980734 100644 --- a/src/controller/ldap/controller_test.go +++ b/src/controller/ldap/controller_test.go @@ -29,7 +29,7 @@ import ( "github.com/goharbor/harbor/src/testing/pkg/ldap" ) -var defaultConfigWithVerifyCert = map[string]interface{}{ +var defaultConfigWithVerifyCert = map[string]any{ common.ExtEndpoint: "https://host01.com", common.AUTHMode: common.LDAPAuth, common.DatabaseType: "postgresql", diff --git a/src/controller/member/controller.go b/src/controller/member/controller.go index 0ad32164e5a..bf632100938 100644 --- a/src/controller/member/controller.go +++ b/src/controller/member/controller.go @@ -34,17 +34,17 @@ import ( // Controller defines the operation related to project member type Controller interface { // Get gets the project member with ID - Get(ctx context.Context, projectNameOrID interface{}, memberID int) (*models.Member, error) + Get(ctx context.Context, projectNameOrID any, memberID int) (*models.Member, error) // Create add project member to project - Create(ctx context.Context, projectNameOrID interface{}, req Request) (int, error) + Create(ctx context.Context, projectNameOrID any, req Request) (int, error) // Delete member from project - Delete(ctx context.Context, projectNameOrID interface{}, memberID int) error + Delete(ctx context.Context, projectNameOrID any, memberID int) error // List lists all project members with condition - List(ctx context.Context, projectNameOrID interface{}, entityName string, query *q.Query) ([]*models.Member, error) + List(ctx context.Context, projectNameOrID any, entityName string, query *q.Query) ([]*models.Member, error) // UpdateRole update the project member role - UpdateRole(ctx context.Context, projectNameOrID interface{}, memberID int, role int) error + UpdateRole(ctx context.Context, projectNameOrID any, memberID int, role int) error // Count get the total amount of project members - Count(ctx context.Context, projectNameOrID interface{}, query *q.Query) (int, error) + Count(ctx context.Context, projectNameOrID any, query *q.Query) (int, error) // IsProjectAdmin judges if the user is a project admin of any project IsProjectAdmin(ctx context.Context, member commonmodels.User) (bool, error) } @@ -89,7 +89,7 @@ func NewController() Controller { return &controller{mgr: member.Mgr, projectMgr: pkg.ProjectMgr, userManager: user.New(), groupManager: usergroup.Mgr} } -func (c *controller) Count(ctx context.Context, projectNameOrID interface{}, query *q.Query) (int, error) { +func (c *controller) Count(ctx context.Context, projectNameOrID any, query *q.Query) (int, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return 0, err @@ -97,7 +97,7 @@ func (c *controller) Count(ctx context.Context, projectNameOrID interface{}, que return c.mgr.GetTotalOfProjectMembers(ctx, p.ProjectID, query) } -func (c *controller) UpdateRole(ctx context.Context, projectNameOrID interface{}, memberID int, role int) error { +func (c *controller) UpdateRole(ctx context.Context, projectNameOrID any, memberID int, role int) error { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return err @@ -108,7 +108,7 @@ func (c *controller) UpdateRole(ctx context.Context, projectNameOrID interface{} return c.mgr.UpdateRole(ctx, p.ProjectID, memberID, role) } -func (c *controller) Get(ctx context.Context, projectNameOrID interface{}, memberID int) (*models.Member, error) { +func (c *controller) Get(ctx context.Context, projectNameOrID any, memberID int) (*models.Member, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return nil, err @@ -119,7 +119,7 @@ func (c *controller) Get(ctx context.Context, projectNameOrID interface{}, membe return c.mgr.Get(ctx, p.ProjectID, memberID) } -func (c *controller) Create(ctx context.Context, projectNameOrID interface{}, req Request) (int, error) { +func (c *controller) Create(ctx context.Context, projectNameOrID any, req Request) (int, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return 0, err @@ -239,7 +239,7 @@ func isValidRole(role int) bool { } } -func (c *controller) List(ctx context.Context, projectNameOrID interface{}, entityName string, query *q.Query) ([]*models.Member, error) { +func (c *controller) List(ctx context.Context, projectNameOrID any, entityName string, query *q.Query) ([]*models.Member, error) { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return nil, err @@ -254,7 +254,7 @@ func (c *controller) List(ctx context.Context, projectNameOrID interface{}, enti return c.mgr.List(ctx, pm, query) } -func (c *controller) Delete(ctx context.Context, projectNameOrID interface{}, memberID int) error { +func (c *controller) Delete(ctx context.Context, projectNameOrID any, memberID int) error { p, err := c.projectMgr.Get(ctx, projectNameOrID) if err != nil { return err diff --git a/src/controller/p2p/preheat/controller.go b/src/controller/p2p/preheat/controller.go index 65f80ebf161..9eb3b61eabd 100644 --- a/src/controller/p2p/preheat/controller.go +++ b/src/controller/p2p/preheat/controller.go @@ -180,7 +180,7 @@ func (c *controller) CreateInstance(ctx context.Context, instance *providerModel // Avoid duplicated endpoint var query = &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "endpoint": instance.Endpoint, }, } @@ -208,7 +208,7 @@ func (c *controller) DeleteInstance(ctx context.Context, id int64) error { } // delete instance should check the instance whether be used by policies policies, err := c.ListPolicies(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "provider_id": id, }, }) @@ -235,7 +235,7 @@ func (c *controller) UpdateInstance(ctx context.Context, instance *providerModel if !instance.Enabled { // update instance should check the instance whether be used by policies policies, err := c.ListPolicies(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "provider_id": instance.ID, }, }) @@ -311,7 +311,7 @@ func (c *controller) CreatePolicy(ctx context.Context, schema *policyModels.Sche schema.Trigger.Type == policyModels.TriggerTypeScheduled && len(schema.Trigger.Settings.Cron) > 0 { // schedule and update policy - extras := make(map[string]interface{}) + extras := make(map[string]any) if _, err = c.scheduler.Schedule(ctx, job.P2PPreheatVendorType, id, "", schema.Trigger.Settings.Cron, SchedulerCallback, TriggerParam{PolicyID: id}, extras); err != nil { return 0, err @@ -409,7 +409,7 @@ func (c *controller) UpdatePolicy(ctx context.Context, schema *policyModels.Sche // schedule new if needSch { - extras := make(map[string]interface{}) + extras := make(map[string]any) if _, err := c.scheduler.Schedule(ctx, job.P2PPreheatVendorType, schema.ID, "", cron, SchedulerCallback, TriggerParam{PolicyID: schema.ID}, extras); err != nil { return err @@ -465,7 +465,7 @@ func (c *controller) DeletePoliciesOfProject(ctx context.Context, project int64) // deleteExecs delete executions func (c *controller) deleteExecs(ctx context.Context, vendorID int64) error { executions, err := c.executionMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.P2PPreheatVendorType, "VendorID": vendorID, }, diff --git a/src/controller/p2p/preheat/controllor_test.go b/src/controller/p2p/preheat/controllor_test.go index c57802dd980..51deed2f106 100644 --- a/src/controller/p2p/preheat/controllor_test.go +++ b/src/controller/p2p/preheat/controllor_test.go @@ -82,7 +82,7 @@ func (s *preheatSuite) SetupSuite() { }, }, nil) s.fakeInstanceMgr.On("Save", mock.Anything, mock.Anything).Return(int64(1), nil) - s.fakeInstanceMgr.On("Count", mock.Anything, &q.Query{Keywords: map[string]interface{}{ + s.fakeInstanceMgr.On("Count", mock.Anything, &q.Query{Keywords: map[string]any{ "endpoint": "http://localhost", }}).Return(int64(1), nil) s.fakeInstanceMgr.On("Count", mock.Anything, mock.Anything).Return(int64(0), nil) @@ -117,7 +117,7 @@ func (s *preheatSuite) TearDownSuite() { func (s *preheatSuite) TestGetAvailableProviders() { providers, err := s.controller.GetAvailableProviders() s.Equal(2, len(providers)) - expectProviders := map[string]interface{}{} + expectProviders := map[string]any{} expectProviders["dragonfly"] = nil expectProviders["kraken"] = nil _, ok := expectProviders[providers[0].ID] @@ -177,7 +177,7 @@ func (s *preheatSuite) TestCreateInstance() { func (s *preheatSuite) TestDeleteInstance() { // instance be used should not be deleted s.fakeInstanceMgr.On("Get", s.ctx, int64(1)).Return(&providerModel.Instance{ID: 1}, nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1)}}).Return([]*policy.Schema{ + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1)}}).Return([]*policy.Schema{ { ProviderID: 1, }, @@ -186,7 +186,7 @@ func (s *preheatSuite) TestDeleteInstance() { s.Error(err, "instance should not be deleted") s.fakeInstanceMgr.On("Get", s.ctx, int64(2)).Return(&providerModel.Instance{ID: 2}, nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(2)}}).Return([]*policy.Schema{}, nil) + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(2)}}).Return([]*policy.Schema{}, nil) s.fakeInstanceMgr.On("Delete", s.ctx, int64(2)).Return(nil) err = s.controller.DeleteInstance(s.ctx, int64(2)) s.NoError(err, "instance can be deleted") @@ -202,7 +202,7 @@ func (s *preheatSuite) TestUpdateInstance() { // disable instance should error due to with policy used s.fakeInstanceMgr.On("Get", s.ctx, int64(1001)).Return(&providerModel.Instance{ID: 1001}, nil) s.fakeInstanceMgr.On("Update", s.ctx, &providerModel.Instance{ID: 1001}).Return(nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1001)}}).Return([]*policy.Schema{ + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1001)}}).Return([]*policy.Schema{ {ProviderID: 1001}, }, nil) err = s.controller.UpdateInstance(s.ctx, &providerModel.Instance{ID: 1001}) @@ -211,14 +211,14 @@ func (s *preheatSuite) TestUpdateInstance() { // disable instance can be deleted if no policy used s.fakeInstanceMgr.On("Get", s.ctx, int64(1002)).Return(&providerModel.Instance{ID: 1002}, nil) s.fakeInstanceMgr.On("Update", s.ctx, &providerModel.Instance{ID: 1002}).Return(nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1002)}}).Return([]*policy.Schema{}, nil) + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1002)}}).Return([]*policy.Schema{}, nil) err = s.controller.UpdateInstance(s.ctx, &providerModel.Instance{ID: 1002}) s.NoError(err, "instance can be disabled") // not support change vendor type s.fakeInstanceMgr.On("Get", s.ctx, int64(1003)).Return(&providerModel.Instance{ID: 1003, Vendor: "dragonfly"}, nil) s.fakeInstanceMgr.On("Update", s.ctx, &providerModel.Instance{ID: 1003, Vendor: "kraken"}).Return(nil) - s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]interface{}{"provider_id": int64(1003)}}).Return([]*policy.Schema{}, nil) + s.fakePolicyMgr.On("ListPolicies", s.ctx, &q.Query{Keywords: map[string]any{"provider_id": int64(1003)}}).Return([]*policy.Schema{}, nil) err = s.controller.UpdateInstance(s.ctx, &providerModel.Instance{ID: 1003, Vendor: "kraken"}) s.Error(err, "provider vendor cannot be changed") } @@ -347,7 +347,7 @@ func (s *preheatSuite) TestDeletePoliciesOfProject() { for _, p := range fakePolicies { s.fakePolicyMgr.On("Get", s.ctx, p.ID).Return(p, nil) s.fakePolicyMgr.On("Delete", s.ctx, p.ID).Return(nil) - s.fakeExecutionMgr.On("List", s.ctx, &q.Query{Keywords: map[string]interface{}{"VendorID": p.ID, "VendorType": "P2P_PREHEAT"}}).Return([]*taskModel.Execution{}, nil) + s.fakeExecutionMgr.On("List", s.ctx, &q.Query{Keywords: map[string]any{"VendorID": p.ID, "VendorType": "P2P_PREHEAT"}}).Return([]*taskModel.Execution{}, nil) } err := s.controller.DeletePoliciesOfProject(s.ctx, 10) diff --git a/src/controller/p2p/preheat/enforcer.go b/src/controller/p2p/preheat/enforcer.go index 8a97b13ec5a..12bf3300c71 100644 --- a/src/controller/p2p/preheat/enforcer.go +++ b/src/controller/p2p/preheat/enforcer.go @@ -28,6 +28,7 @@ import ( "github.com/goharbor/harbor/src/controller/scan" "github.com/goharbor/harbor/src/core/service/token" "github.com/goharbor/harbor/src/jobservice/job" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/config" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" @@ -341,13 +342,18 @@ func (de *defaultEnforcer) PreheatArtifact(ctx context.Context, art *artifact.Ar // getCandidates get the initial candidates by evaluating the policy func (de *defaultEnforcer) getCandidates(ctx context.Context, ps *pol.Schema, p *proModels.Project) ([]*selector.Candidate, error) { + // Filter the candidates by supported types. + var supportedTypes []any + for _, t := range lib.SliceToUpper(pr.SupportedTypes) { + supportedTypes = append(supportedTypes, t) + } // Get the initial candidates // Here we have a hidden filter, the artifact type filter. // Only get the image type at this moment. arts, err := de.artCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": ps.ProjectID, - "Type": strings.ToUpper(pr.SupportedType), + "Type": q.NewOrList(supportedTypes), }, }, &artifact.Option{ WithLabel: true, @@ -365,7 +371,7 @@ func (de *defaultEnforcer) getCandidates(ctx context.Context, ps *pol.Schema, p // launchExecutions create execution record and launch tasks to preheat the filtered artifacts. func (de *defaultEnforcer) launchExecutions(ctx context.Context, candidates []*selector.Candidate, pl *pol.Schema, inst *provider.Instance) (int64, error) { // Create execution first anyway - attrs := map[string]interface{}{ + attrs := map[string]any{ extraAttrTotal: len(candidates), extraAttrTrigger: pl.Trigger.Type, extraAttrTriggerSetting: pl.Trigger.Settings.Cron, @@ -421,7 +427,7 @@ func (de *defaultEnforcer) launchExecutions(ctx context.Context, candidates []*s } // startTask starts the preheat task(job) for the given candidate -func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, candidate *selector.Candidate, instance string, extraAttrs map[string]interface{}) (int64, error) { +func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, candidate *selector.Candidate, instance string, extraAttrs map[string]any) (int64, error) { u, err := de.fullURLGetter(candidate) if err != nil { return -1, err @@ -433,9 +439,9 @@ func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, can } pi := &pr.PreheatImage{ - Type: pr.SupportedType, + Type: candidate.Kind, URL: u, - Headers: map[string]interface{}{ + Headers: map[string]any{ accessCredHeaderKey: cred, }, ImageName: fmt.Sprintf("%s/%s", candidate.Namespace, candidate.Repository), @@ -461,7 +467,7 @@ func (de *defaultEnforcer) startTask(ctx context.Context, executionID int64, can }, } - tid, err := de.taskMgr.Create(ctx, executionID, j, map[string]interface{}{ + tid, err := de.taskMgr.Create(ctx, executionID, j, map[string]any{ extraAttrArtifact: fmt.Sprintf("%s:%s", pi.ImageName, pi.Tag), extraAttrDigest: candidate.Digest, extraAttrKind: pi.Type, @@ -517,7 +523,7 @@ func (de *defaultEnforcer) toCandidates(ctx context.Context, p *proModels.Projec NamespaceID: p.ProjectID, Namespace: p.Name, Repository: pureRepository(p.Name, a.RepositoryName), - Kind: pr.SupportedType, + Kind: strings.ToLower(a.Type), Digest: a.Digest, Tags: []string{t.Name}, Labels: getLabels(a.Labels), @@ -590,12 +596,12 @@ func checkProviderHealthy(inst *provider.Instance) error { // Check the project security settings and override the related settings in the policy if necessary. // NOTES: if the security settings (relevant with signature and vulnerability) are set at the project configuration, // the corresponding filters of P2P preheat policy will be set using the relevant settings of project configurations. -func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]interface{} { +func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]any { if p == nil || pro == nil { return nil } - override := make([][]interface{}, 0) + override := make([][]any, 0) filters := make([]*pol.Filter, 0) for _, fl := range p.Filters { if fl.Type != pol.FilterTypeSignature && fl.Type != pol.FilterTypeVulnerability { @@ -611,7 +617,7 @@ func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]interfa }) // Record this is a override case - r1 := []interface{}{pro.Name, p.Name, pol.FilterTypeSignature, fmt.Sprintf("%v", true)} + r1 := []any{pro.Name, p.Name, pol.FilterTypeSignature, fmt.Sprintf("%v", true)} override = append(override, r1) } // Append vulnerability filter if vulnerability severity config is set at project configurations @@ -626,7 +632,7 @@ func overrideSecuritySettings(p *pol.Schema, pro *proModels.Project) [][]interfa }) // Record this is a override case - r2 := []interface{}{pro.Name, p.Name, pol.FilterTypeVulnerability, fmt.Sprintf("%v:%d", se, code)} + r2 := []any{pro.Name, p.Name, pol.FilterTypeVulnerability, fmt.Sprintf("%v:%d", se, code)} override = append(override, r2) } } diff --git a/src/controller/project/controller.go b/src/controller/project/controller.go index f068cb71a37..55ad72337e8 100644 --- a/src/controller/project/controller.go +++ b/src/controller/project/controller.go @@ -53,9 +53,9 @@ type Controller interface { // Delete delete the project by project id Delete(ctx context.Context, id int64) error // Exists returns true when the specific project exists - Exists(ctx context.Context, projectIDOrName interface{}) (bool, error) + Exists(ctx context.Context, projectIDOrName any) (bool, error) // Get get the project by project id or name - Get(ctx context.Context, projectIDOrName interface{}, options ...Option) (*models.Project, error) + Get(ctx context.Context, projectIDOrName any, options ...Option) (*models.Project, error) // GetByName get the project by project name GetByName(ctx context.Context, projectName string, options ...Option) (*models.Project, error) // List list projects @@ -144,7 +144,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { return nil } -func (c *controller) Exists(ctx context.Context, projectIDOrName interface{}) (bool, error) { +func (c *controller) Exists(ctx context.Context, projectIDOrName any) (bool, error) { _, err := c.projectMgr.Get(ctx, projectIDOrName) if err == nil { return true, nil @@ -155,7 +155,7 @@ func (c *controller) Exists(ctx context.Context, projectIDOrName interface{}) (b return false, err } -func (c *controller) Get(ctx context.Context, projectIDOrName interface{}, options ...Option) (*models.Project, error) { +func (c *controller) Get(ctx context.Context, projectIDOrName any, options ...Option) (*models.Project, error) { p, err := c.projectMgr.Get(ctx, projectIDOrName) if err != nil { return nil, err diff --git a/src/controller/proxy/controller_test.go b/src/controller/proxy/controller_test.go index a25fe959a57..4eee2020826 100644 --- a/src/controller/proxy/controller_test.go +++ b/src/controller/proxy/controller_test.go @@ -74,7 +74,8 @@ func (l *localInterfaceMock) PushManifestList(ctx context.Context, repo string, } func (l *localInterfaceMock) CheckDependencies(ctx context.Context, repo string, man distribution.Manifest) []distribution.Descriptor { - panic("implement me") + args := l.Called(ctx, repo, man) + return args.Get(0).([]distribution.Descriptor) } func (l *localInterfaceMock) DeleteManifest(repo, ref string) { diff --git a/src/controller/proxy/inflight.go b/src/controller/proxy/inflight.go index c28857c184f..3ed91e54ee5 100644 --- a/src/controller/proxy/inflight.go +++ b/src/controller/proxy/inflight.go @@ -18,11 +18,11 @@ import "sync" type inflightRequest struct { mu sync.Mutex - reqMap map[string]interface{} + reqMap map[string]any } var inflightChecker = &inflightRequest{ - reqMap: make(map[string]interface{}), + reqMap: make(map[string]any), } // addRequest if the artifact already exist in the inflightRequest, return false diff --git a/src/controller/proxy/manifestcache.go b/src/controller/proxy/manifestcache.go index c4b38e24a90..c763c80b2d3 100644 --- a/src/controller/proxy/manifestcache.go +++ b/src/controller/proxy/manifestcache.go @@ -16,6 +16,7 @@ package proxy import ( "context" + "errors" "fmt" "strings" "time" @@ -28,7 +29,7 @@ import ( "github.com/goharbor/harbor/src/lib" libCache "github.com/goharbor/harbor/src/lib/cache" - "github.com/goharbor/harbor/src/lib/errors" + libErrors "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" ) @@ -130,7 +131,7 @@ func (m *ManifestListCache) push(ctx context.Context, repo, reference string, ma // if time exceed, then push a updated manifest list which contains existing manifest var newMan distribution.Manifest var err error - for n := 0; n < maxManifestListWait; n++ { + for range maxManifestListWait { log.Debugf("waiting for the manifest ready, repo %v, tag:%v", repo, reference) time.Sleep(sleepIntervalSec * time.Second) newMan, err = m.updateManifestList(ctx, repo, man) @@ -142,7 +143,7 @@ func (m *ManifestListCache) push(ctx context.Context, repo, reference string, ma } } if len(newMan.References()) == 0 { - return errors.New("manifest list doesn't contain any pushed manifest") + return libErrors.New("manifest list doesn't contain any pushed manifest") } _, pl, err := newMan.Payload() if err != nil { @@ -176,7 +177,7 @@ type ManifestCache struct { // CacheContent ... func (m *ManifestCache) CacheContent(ctx context.Context, remoteRepo string, man distribution.Manifest, art lib.ArtifactInfo, r RemoteInterface, _ string) { var waitBlobs []distribution.Descriptor - for n := 0; n < maxManifestWait; n++ { + for n := range maxManifestWait { time.Sleep(sleepIntervalSec * time.Second) waitBlobs = m.local.CheckDependencies(ctx, art.Repository, man) if len(waitBlobs) == 0 { @@ -198,10 +199,30 @@ func (m *ManifestCache) CacheContent(ctx context.Context, remoteRepo string, man } } } - err := m.local.PushManifest(art.Repository, getReference(art), man) + + err := m.push(art, man) if err != nil { - log.Errorf("failed to push manifest, tag: %v, error %v", art.Tag, err) + log.Errorf("error occurred on manifest push to local: %v", err) + } +} + +func (m *ManifestCache) push(art lib.ArtifactInfo, man distribution.Manifest) error { + errs := []error{} + if len(art.Digest) > 0 { + err := m.local.PushManifest(art.Repository, art.Digest, man) + if err != nil { + log.Errorf("failed to push manifest referencing digest, tag: %v, digest: %v, error %v", art.Tag, art.Digest, err) + errs = append(errs, err) + } + } + if len(art.Tag) > 0 { + err := m.local.PushManifest(art.Repository, art.Tag, man) + if err != nil { + log.Errorf("failed to push manifest referencing tag, tag: %v, digest: %v, error %v", art.Tag, art.Digest, err) + errs = append(errs, err) + } } + return errors.Join(errs...) } func (m *ManifestCache) putBlobToLocal(remoteRepo string, localRepo string, desc distribution.Descriptor, r RemoteInterface) error { diff --git a/src/controller/proxy/manifestcache_test.go b/src/controller/proxy/manifestcache_test.go index ebbbf5dba1d..c4d1d209518 100644 --- a/src/controller/proxy/manifestcache_test.go +++ b/src/controller/proxy/manifestcache_test.go @@ -29,17 +29,41 @@ import ( "github.com/goharbor/harbor/src/controller/artifact" "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/testing/mock" + + v1 "github.com/opencontainers/image-spec/specs-go/v1" ) +const ociManifest = `{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.example.config.v1+json", + "digest": "sha256:5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03", + "size": 123 + }, + "layers": [ + { + "mediaType": "application/vnd.example.data.v1.tar+gzip", + "digest": "sha256:e258d248fda94c63753607f7c4494ee0fcbe92f1a76bfdac795c9d84101eb317", + "size": 1234 + } + ], + "annotations": { + "com.example.key1": "value1" + } +}` + type CacheTestSuite struct { suite.Suite - mHandler *ManifestListCache - local localInterfaceMock + mCache *ManifestCache + mListCache *ManifestListCache + local localInterfaceMock } func (suite *CacheTestSuite) SetupSuite() { suite.local = localInterfaceMock{} - suite.mHandler = &ManifestListCache{local: &suite.local} + suite.mListCache = &ManifestListCache{local: &suite.local} + suite.mCache = &ManifestCache{local: &suite.local} } func (suite *CacheTestSuite) TearDownSuite() { @@ -89,7 +113,7 @@ func (suite *CacheTestSuite) TestUpdateManifestList() { suite.local.On("GetManifest", ctx, artInfo1).Return(ar, nil) suite.local.On("GetManifest", ctx, mock.Anything).Return(nil, nil) - newMan, err := suite.mHandler.updateManifestList(ctx, "library/hello-world", manList) + newMan, err := suite.mListCache.updateManifestList(ctx, "library/hello-world", manList) suite.Require().Nil(err) suite.Assert().Equal(len(newMan.References()), 1) } @@ -147,10 +171,85 @@ func (suite *CacheTestSuite) TestPushManifestList() { suite.local.On("PushManifest", repo, originDigest, mock.Anything).Return(fmt.Errorf("wrong digest")) suite.local.On("PushManifest", repo, mock.Anything, mock.Anything).Return(nil) - err = suite.mHandler.push(ctx, "library/hello-world", string(originDigest), manList) + err = suite.mListCache.push(ctx, "library/hello-world", string(originDigest), manList) suite.Require().Nil(err) } +func (suite *CacheTestSuite) TestManifestCache_CacheContent() { + defer suite.local.AssertExpectations(suite.T()) + + manifest := ociManifest + man, desc, err := distribution.UnmarshalManifest(v1.MediaTypeImageManifest, []byte(manifest)) + suite.Require().NoError(err) + + ctx := context.Background() + repo := "library/hello-world" + + artInfo := lib.ArtifactInfo{ + Repository: repo, + Digest: string(desc.Digest), + Tag: "latest", + } + + suite.local.On("CheckDependencies", ctx, artInfo.Repository, man).Once().Return([]distribution.Descriptor{}) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Digest, man).Once().Return(nil) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Tag, man).Once().Return(nil) + + suite.mCache.CacheContent(ctx, repo, man, artInfo, nil, "") +} + +func (suite *CacheTestSuite) TestManifestCache_push_succeeds() { + defer suite.local.AssertExpectations(suite.T()) + + manifest := ociManifest + man, desc, err := distribution.UnmarshalManifest(v1.MediaTypeImageManifest, []byte(manifest)) + suite.Require().NoError(err) + + repo := "library/hello-world" + + artInfo := lib.ArtifactInfo{ + Repository: repo, + Digest: string(desc.Digest), + Tag: "latest", + } + + suite.local.On("PushManifest", artInfo.Repository, artInfo.Digest, man).Once().Return(nil) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Tag, man).Once().Return(nil) + + err = suite.mCache.push(artInfo, man) + suite.Assert().NoError(err) +} + +func (suite *CacheTestSuite) TestManifestCache_push_fails() { + defer suite.local.AssertExpectations(suite.T()) + + manifest := ociManifest + man, desc, err := distribution.UnmarshalManifest(v1.MediaTypeImageManifest, []byte(manifest)) + suite.Require().NoError(err) + + repo := "library/hello-world" + + artInfo := lib.ArtifactInfo{ + Repository: repo, + Digest: string(desc.Digest), + Tag: "latest", + } + + digestErr := fmt.Errorf("error during manifest push referencing digest") + tagErr := fmt.Errorf("error during manifest push referencing tag") + suite.local.On("PushManifest", artInfo.Repository, artInfo.Digest, man).Once().Return(digestErr) + suite.local.On("PushManifest", artInfo.Repository, artInfo.Tag, man).Once().Return(tagErr) + + err = suite.mCache.push(artInfo, man) + suite.Assert().Error(err) + wrappedErr, isWrappedErr := err.(interface{ Unwrap() []error }) + suite.Assert().True(isWrappedErr) + errs := wrappedErr.Unwrap() + suite.Assert().Len(errs, 2) + suite.Assert().Contains(errs, digestErr) + suite.Assert().Contains(errs, tagErr) +} + func TestCacheTestSuite(t *testing.T) { suite.Run(t, &CacheTestSuite{}) } diff --git a/src/controller/purge/controller.go b/src/controller/purge/controller.go index b09fca0f750..d2504a14811 100644 --- a/src/controller/purge/controller.go +++ b/src/controller/purge/controller.go @@ -68,7 +68,7 @@ func (c *controller) Stop(ctx context.Context, id int64) error { } func (c *controller) Start(ctx context.Context, policy JobPolicy, trigger string) (int64, error) { - para := make(map[string]interface{}) + para := make(map[string]any) para[common.PurgeAuditDryRun] = policy.DryRun para[common.PurgeAuditRetentionHour] = policy.RetentionHour diff --git a/src/controller/purge/model.go b/src/controller/purge/model.go index 9a2b21ba1d5..b6e2090662a 100644 --- a/src/controller/purge/model.go +++ b/src/controller/purge/model.go @@ -22,11 +22,11 @@ import ( // JobPolicy defines the purge job policy type JobPolicy struct { - Trigger *Trigger `json:"trigger"` - DryRun bool `json:"dryrun"` - RetentionHour int `json:"retention_hour"` - IncludeEventTypes string `json:"include_event_types"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` + Trigger *Trigger `json:"trigger"` + DryRun bool `json:"dryrun"` + RetentionHour int `json:"retention_hour"` + IncludeEventTypes string `json:"include_event_types"` + ExtraAttrs map[string]any `json:"extra_attrs"` } // TriggerType represents the type of trigger. @@ -44,7 +44,7 @@ type TriggerSettings struct { } // String convert map to json string -func String(extras map[string]interface{}) string { +func String(extras map[string]any) string { result, err := json.Marshal(extras) if err != nil { log.Errorf("failed to convert to json string, value %+v", extras) diff --git a/src/controller/purge/model_test.go b/src/controller/purge/model_test.go index 2b48a4b683e..65d7bae0f3f 100644 --- a/src/controller/purge/model_test.go +++ b/src/controller/purge/model_test.go @@ -18,15 +18,15 @@ import "testing" func TestString(t *testing.T) { type args struct { - extras map[string]interface{} + extras map[string]any } tests := []struct { name string args args want string }{ - {"normal", args{map[string]interface{}{"dry_run": true, "audit_log_retention_hour": 168}}, "{\"audit_log_retention_hour\":168,\"dry_run\":true}"}, - {"empty", args{map[string]interface{}{}}, "{}"}, + {"normal", args{map[string]any{"dry_run": true, "audit_log_retention_hour": 168}}, "{\"audit_log_retention_hour\":168,\"dry_run\":true}"}, + {"empty", args{map[string]any{}}, "{}"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/controller/quota/controller.go b/src/controller/quota/controller.go index e3ffc92f416..e023c74d60c 100644 --- a/src/controller/quota/controller.go +++ b/src/controller/quota/controller.go @@ -280,7 +280,7 @@ func (c *controller) updateUsageByRedis(ctx context.Context, reference, referenc // calc the quota usage in real time if no key found if err == redis.Nil { // use singleflight to prevent cache penetration and cause pressure on the database. - realQuota, err, _ := c.g.Do(key, func() (interface{}, error) { + realQuota, err, _ := c.g.Do(key, func() (any, error) { return c.calcQuota(ctx, reference, referenceID) }) if err != nil { diff --git a/src/controller/quota/controller_test.go b/src/controller/quota/controller_test.go index 037d39bb6b0..3565228dd4b 100644 --- a/src/controller/quota/controller_test.go +++ b/src/controller/quota/controller_test.go @@ -56,7 +56,7 @@ func (suite *ControllerTestSuite) SetupTest() { suite.quota = "a.Quota{Hard: hardLimits.String(), Used: types.Zero(hardLimits).String()} } -func (suite *ControllerTestSuite) PrepareForUpdate(q *quota.Quota, newUsage interface{}) { +func (suite *ControllerTestSuite) PrepareForUpdate(q *quota.Quota, newUsage any) { mock.OnAnything(suite.quotaMgr, "GetByRef").Return(q, nil) mock.OnAnything(suite.driver, "CalculateUsage").Return(newUsage, nil) diff --git a/src/controller/quota/driver/project/util.go b/src/controller/quota/driver/project/util.go index 9efaa68f033..c678f814a84 100644 --- a/src/controller/quota/driver/project/util.go +++ b/src/controller/quota/driver/project/util.go @@ -51,7 +51,7 @@ func getProjectsBatchFn(ctx context.Context, keys dataloader.Keys) []*dataloader return handleError(err) } - var ownerIDs []interface{} + var ownerIDs []any var projectsMap = make(map[int64]*proModels.Project, len(projectIDs)) for _, project := range projects { ownerIDs = append(ownerIDs, project.OwnerID) diff --git a/src/controller/quota/util.go b/src/controller/quota/util.go index 22c16f79e05..f9bd45eb221 100644 --- a/src/controller/quota/util.go +++ b/src/controller/quota/util.go @@ -30,7 +30,7 @@ const ( ) // ReferenceID returns reference id for the interface -func ReferenceID(i interface{}) string { +func ReferenceID(i any) string { switch s := i.(type) { case string: return s diff --git a/src/controller/quota/util_test.go b/src/controller/quota/util_test.go index 153aa3d9206..bbc4515eb6f 100644 --- a/src/controller/quota/util_test.go +++ b/src/controller/quota/util_test.go @@ -78,13 +78,13 @@ func (suite *RefreshForProjectsTestSuite) TestRefreshForProjects() { startProjectID := rand.Int63() var firstPageProjects, secondPageProjects []*models.Project - for i := 0; i < 50; i++ { + for i := range 50 { firstPageProjects = append(firstPageProjects, &models.Project{ ProjectID: startProjectID + int64(i), }) } - for i := 0; i < 10; i++ { + for i := range 10 { secondPageProjects = append(secondPageProjects, &models.Project{ ProjectID: startProjectID + 50 + int64(i), }) diff --git a/src/controller/registry/controller.go b/src/controller/registry/controller.go index 9b40e27e535..1c5fecdc398 100644 --- a/src/controller/registry/controller.go +++ b/src/controller/registry/controller.go @@ -128,7 +128,7 @@ func (c *controller) Update(ctx context.Context, registry *model.Registry, props func (c *controller) Delete(ctx context.Context, id int64) error { // referenced by replication policy as source registry count, err := c.repMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "src_registry_id": id, }, }) @@ -140,7 +140,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { } // referenced by replication policy as destination registry count, err = c.repMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "dest_registry_id": id, }, }) @@ -152,7 +152,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { } // referenced by proxy cache project count, err = c.proMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "registry_id": id, }, }) diff --git a/src/controller/replication/execution.go b/src/controller/replication/execution.go index 3c92250946f..efc64216bc4 100644 --- a/src/controller/replication/execution.go +++ b/src/controller/replication/execution.go @@ -105,7 +105,7 @@ func (c *controller) Start(ctx context.Context, policy *replicationmodel.Policy, WithMessagef("the policy %d is disabled", policy.ID) } // create an execution record - extra := make(map[string]interface{}) + extra := make(map[string]any) if op := operator.FromContext(ctx); op != "" { extra["operator"] = op } @@ -203,7 +203,7 @@ func (c *controller) buildExecutionQuery(query *q.Query) *q.Query { func (c *controller) GetExecution(ctx context.Context, id int64) (*Execution, error) { execs, err := c.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.ReplicationVendorType, }, @@ -240,7 +240,7 @@ func (c *controller) ListTasks(ctx context.Context, query *q.Query) ([]*Task, er func (c *controller) GetTask(ctx context.Context, id int64) (*Task, error) { tasks, err := c.taskMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": id, "VendorType": job.ReplicationVendorType, }, diff --git a/src/controller/replication/execution_test.go b/src/controller/replication/execution_test.go index de4791f09ad..06b23fda322 100644 --- a/src/controller/replication/execution_test.go +++ b/src/controller/replication/execution_test.go @@ -194,7 +194,7 @@ func (r *replicationTestSuite) TestListTasks() { ID: 1, ExecutionID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "resource_type": "artifact", "source_resource": "library/hello-world", "destination_resource": "library/hello-world", @@ -222,7 +222,7 @@ func (r *replicationTestSuite) TestGetTask() { ID: 1, ExecutionID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "resource_type": "artifact", "source_resource": "library/hello-world", "destination_resource": "library/hello-world", diff --git a/src/controller/replication/flow/copy.go b/src/controller/replication/flow/copy.go index 7c6b823bb14..b3d7f006bf8 100644 --- a/src/controller/replication/flow/copy.go +++ b/src/controller/replication/flow/copy.go @@ -136,7 +136,7 @@ func (c *copyFlow) createTasks(ctx context.Context, srcResources, dstResources [ Metadata: &job.Metadata{ JobKind: job.KindGeneric, }, - Parameters: map[string]interface{}{ + Parameters: map[string]any{ "src_resource": string(src), "dst_resource": string(dest), "speed": speed, @@ -144,7 +144,7 @@ func (c *copyFlow) createTasks(ctx context.Context, srcResources, dstResources [ }, } - if _, err = c.taskMgr.Create(ctx, c.executionID, job, map[string]interface{}{ + if _, err = c.taskMgr.Create(ctx, c.executionID, job, map[string]any{ "operation": "copy", "resource_type": string(srcResource.Type), "source_resource": getResourceName(srcResource), diff --git a/src/controller/replication/flow/deletion.go b/src/controller/replication/flow/deletion.go index 21cd7129cbf..615fb542ae8 100644 --- a/src/controller/replication/flow/deletion.go +++ b/src/controller/replication/flow/deletion.go @@ -78,7 +78,7 @@ func (d *deletionFlow) createTasks(ctx context.Context, srcResources, dstResourc Metadata: &job.Metadata{ JobKind: job.KindGeneric, }, - Parameters: map[string]interface{}{ + Parameters: map[string]any{ "src_resource": string(src), "dst_resource": string(dest), }, @@ -89,7 +89,7 @@ func (d *deletionFlow) createTasks(ctx context.Context, srcResources, dstResourc operation = "tag deletion" } - if _, err = d.taskMgr.Create(ctx, d.executionID, job, map[string]interface{}{ + if _, err = d.taskMgr.Create(ctx, d.executionID, job, map[string]any{ "operation": operation, "resource_type": string(resource.Type), "source_resource": getResourceName(resource), diff --git a/src/controller/replication/flow/mock_adapter_factory_test.go b/src/controller/replication/flow/mock_adapter_factory_test.go index fb8a6bfac3a..748d144047f 100644 --- a/src/controller/replication/flow/mock_adapter_factory_test.go +++ b/src/controller/replication/flow/mock_adapter_factory_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package flow diff --git a/src/controller/replication/flow/mock_adapter_test.go b/src/controller/replication/flow/mock_adapter_test.go index c619fec6010..cf070870373 100644 --- a/src/controller/replication/flow/mock_adapter_test.go +++ b/src/controller/replication/flow/mock_adapter_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package flow diff --git a/src/controller/replication/mock_flow_controller_test.go b/src/controller/replication/mock_flow_controller_test.go index c3c0b865272..bdf549a4535 100644 --- a/src/controller/replication/mock_flow_controller_test.go +++ b/src/controller/replication/mock_flow_controller_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package replication diff --git a/src/controller/replication/model/model.go b/src/controller/replication/model/model.go index 63202d17973..09f94326b3c 100644 --- a/src/controller/replication/model/model.go +++ b/src/controller/replication/model/model.go @@ -214,11 +214,11 @@ func (p *Policy) To() (*replicationmodel.Policy, error) { } type filter struct { - Type string `json:"type"` - Value interface{} `json:"value"` - Decoration string `json:"decoration"` - Kind string `json:"kind"` - Pattern string `json:"pattern"` + Type string `json:"type"` + Value any `json:"value"` + Decoration string `json:"decoration"` + Kind string `json:"kind"` + Pattern string `json:"pattern"` } type trigger struct { @@ -290,7 +290,7 @@ func parseFilters(str string) ([]*model.Filter, error) { } if filter.Type == model.FilterTypeLabel { labels := []string{} - for _, label := range filter.Value.([]interface{}) { + for _, label := range filter.Value.([]any) { labels = append(labels, label.(string)) } filter.Value = labels diff --git a/src/controller/replication/policy.go b/src/controller/replication/policy.go index 9496589124e..71665737224 100644 --- a/src/controller/replication/policy.go +++ b/src/controller/replication/policy.go @@ -33,7 +33,7 @@ const callbackFuncName = "REPLICATION_CALLBACK" func init() { callbackFunc := func(ctx context.Context, param string) error { - params := make(map[string]interface{}) + params := make(map[string]any) if err := json.Unmarshal([]byte(param), ¶ms); err != nil { return err } @@ -133,13 +133,13 @@ func (c *controller) CreatePolicy(ctx context.Context, policy *model.Policy) (in } // create schedule if needed if policy.IsScheduledTrigger() { - cbParams := map[string]interface{}{ + cbParams := map[string]any{ "policy_id": id, // the operator of schedule job is harbor-jobservice "operator": secret.JobserviceUser, } if _, err = c.scheduler.Schedule(ctx, job.ReplicationVendorType, id, "", policy.Trigger.Settings.Cron, - callbackFuncName, cbParams, map[string]interface{}{}); err != nil { + callbackFuncName, cbParams, map[string]any{}); err != nil { return 0, err } } @@ -165,13 +165,13 @@ func (c *controller) UpdatePolicy(ctx context.Context, policy *model.Policy, pro } // create schedule if needed if policy.IsScheduledTrigger() { - cbParams := map[string]interface{}{ + cbParams := map[string]any{ "policy_id": policy.ID, // the operator of schedule job is harbor-jobservice "operator": secret.JobserviceUser, } if _, err := c.scheduler.Schedule(ctx, job.ReplicationVendorType, policy.ID, "", policy.Trigger.Settings.Cron, - callbackFuncName, cbParams, map[string]interface{}{}); err != nil { + callbackFuncName, cbParams, map[string]any{}); err != nil { return err } } diff --git a/src/controller/replication/transfer/image/transfer.go b/src/controller/replication/transfer/image/transfer.go index 09c1bea27e9..d8982202668 100644 --- a/src/controller/replication/transfer/image/transfer.go +++ b/src/controller/replication/transfer/image/transfer.go @@ -403,11 +403,6 @@ func (t *transfer) copyBlobByMonolithic(srcRepo, dstRepo, digest string, sizeFro // copyBlobByChunk copy blob by chunk with specified start and end range. // The refers to the byte range of the chunk, and MUST be inclusive on both ends. The first chunk's range MUST begin with 0. func (t *transfer) copyBlobByChunk(srcRepo, dstRepo, digest string, sizeFromDescriptor int64, start, end *int64, location *string, speed int32) error { - // fallback to copy by monolithic if the blob size is equal or less than chunk size. - if sizeFromDescriptor <= replicationChunkSize { - return t.copyBlobByMonolithic(srcRepo, dstRepo, digest, sizeFromDescriptor, speed) - } - mounted, err := t.tryMountBlob(srcRepo, dstRepo, digest) if err != nil { return err @@ -417,16 +412,18 @@ func (t *transfer) copyBlobByChunk(srcRepo, dstRepo, digest string, sizeFromDesc return nil } + // fallback to copy by monolithic if the blob size is equal or less than chunk size. + if sizeFromDescriptor <= replicationChunkSize { + return t.copyBlobByMonolithic(srcRepo, dstRepo, digest, sizeFromDescriptor, speed) + } + // end range should equal (blobSize - 1) endRange := sizeFromDescriptor - 1 for { // update the start and end for upload *start = *end + 1 // since both ends are closed intervals, it is necessary to subtract one byte - *end = *start + replicationChunkSize - 1 - if *end >= endRange { - *end = endRange - } + *end = min(*start+replicationChunkSize-1, endRange) t.logger.Infof("copying the blob chunk: %d-%d/%d", *start, *end, sizeFromDescriptor) _, data, err := t.src.PullBlobChunk(srcRepo, digest, sizeFromDescriptor, *start, *end) diff --git a/src/controller/replication/transfer/transfer.go b/src/controller/replication/transfer/transfer.go index f279821623c..1ee756d5786 100644 --- a/src/controller/replication/transfer/transfer.go +++ b/src/controller/replication/transfer/transfer.go @@ -40,21 +40,21 @@ type Transfer interface { // Logger defines an interface for logging type Logger interface { // For debuging - Debug(v ...interface{}) + Debug(v ...any) // For debuging with format - Debugf(format string, v ...interface{}) + Debugf(format string, v ...any) // For logging info - Info(v ...interface{}) + Info(v ...any) // For logging info with format - Infof(format string, v ...interface{}) + Infof(format string, v ...any) // For warning - Warning(v ...interface{}) + Warning(v ...any) // For warning with format - Warningf(format string, v ...interface{}) + Warningf(format string, v ...any) // For logging error - Error(v ...interface{}) + Error(v ...any) // For logging error with format - Errorf(format string, v ...interface{}) + Errorf(format string, v ...any) } // StopFunc is a function used to check whether the transfer diff --git a/src/controller/repository/controller.go b/src/controller/repository/controller.go index 1ca0cf44170..91e292200fb 100644 --- a/src/controller/repository/controller.go +++ b/src/controller/repository/controller.go @@ -143,7 +143,7 @@ func (c *controller) GetByName(ctx context.Context, name string) (*model.RepoRec func (c *controller) Delete(ctx context.Context, id int64) error { candidates, err := c.artCtl.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": id, }, }, nil) @@ -155,7 +155,7 @@ func (c *controller) Delete(ctx context.Context, id int64) error { candidates = nil for _, artifact := range artifacts { parents, err := c.artMgr.ListReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ChildID": artifact.ID, }, }) diff --git a/src/controller/retention/controller.go b/src/controller/retention/controller.go index dae3bbeeafc..8b3e55eab95 100644 --- a/src/controller/retention/controller.go +++ b/src/controller/retention/controller.go @@ -116,7 +116,7 @@ func (r *defaultController) CreateRetention(ctx context.Context, p *policy.Metad if p.Trigger.Kind == policy.TriggerKindSchedule { cron, ok := p.Trigger.Settings[policy.TriggerSettingsCron] if ok && len(cron.(string)) > 0 { - extras := make(map[string]interface{}) + extras := make(map[string]any) if _, err = r.scheduler.Schedule(ctx, schedulerVendorType, id, "", cron.(string), SchedulerCallback, TriggerParam{ PolicyID: id, Trigger: retention.ExecutionTriggerSchedule, @@ -182,7 +182,7 @@ func (r *defaultController) UpdateRetention(ctx context.Context, p *policy.Metad } } if needSch { - extras := make(map[string]interface{}) + extras := make(map[string]any) _, err := r.scheduler.Schedule(ctx, schedulerVendorType, p.ID, "", p.Trigger.Settings[policy.TriggerSettingsCron].(string), SchedulerCallback, TriggerParam{ PolicyID: p.ID, Trigger: retention.ExecutionTriggerSchedule, @@ -220,7 +220,7 @@ func (r *defaultController) DeleteRetention(ctx context.Context, id int64) error // deleteExecs delete executions func (r *defaultController) deleteExecs(ctx context.Context, vendorID int64) error { executions, err := r.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.RetentionVendorType, "VendorID": vendorID, }, @@ -246,7 +246,7 @@ func (r *defaultController) TriggerRetentionExec(ctx context.Context, policyID i return 0, err } - extra := map[string]interface{}{ + extra := map[string]any{ "dry_run": dryRun, "operator": operator.FromContext(ctx), } @@ -357,7 +357,7 @@ func convertExecution(exec *task.Execution) *retention.Execution { // GetTotalOfRetentionExecs Count Retention Executions func (r *defaultController) GetTotalOfRetentionExecs(ctx context.Context, policyID int64) (int64, error) { return r.execMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.RetentionVendorType, "VendorID": policyID, }, @@ -398,7 +398,7 @@ func convertTask(t *task.Task) *retention.Task { // GetTotalOfRetentionExecTasks Count Retention Execution Histories func (r *defaultController) GetTotalOfRetentionExecTasks(ctx context.Context, executionID int64) (int64, error) { return r.taskMgr.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": job.RetentionVendorType, "ExecutionID": executionID, }, diff --git a/src/controller/retention/controller_test.go b/src/controller/retention/controller_test.go index 6261d4534d7..ccb30fb3db0 100644 --- a/src/controller/retention/controller_test.go +++ b/src/controller/retention/controller_test.go @@ -73,21 +73,21 @@ func (s *ControllerTestSuite) TestPolicy() { execMgr.On("Get", mock.Anything, mock.Anything).Return(&task.Execution{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }, nil) execMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Execution{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }}, nil) taskMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Task{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "total": 1, "retained": 1, }, @@ -160,7 +160,7 @@ func (s *ControllerTestSuite) TestPolicy() { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "0 22 11 * * *", }, }, @@ -208,7 +208,7 @@ func (s *ControllerTestSuite) TestExecution() { execMgr.On("Get", mock.Anything, mock.Anything).Return(&task.Execution{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }, nil) @@ -216,14 +216,14 @@ func (s *ControllerTestSuite) TestExecution() { execMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Execution{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "dry_run": true, }, }}, nil) taskMgr.On("List", mock.Anything, mock.Anything).Return([]*task.Task{{ ID: 1, Status: job.RunningStatus.String(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "total": 1, "retained": 1, }, @@ -272,7 +272,7 @@ func (s *ControllerTestSuite) TestExecution() { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "0 22 11 * * *", }, }, @@ -316,7 +316,7 @@ func (f *fakeRetentionScheduler) CountSchedules(ctx context.Context, query *q.Qu panic("implement me") } -func (f *fakeRetentionScheduler) Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, cron string, callbackFuncName string, params interface{}, extras map[string]interface{}) (int64, error) { +func (f *fakeRetentionScheduler) Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, cron string, callbackFuncName string, params any, extras map[string]any) (int64, error) { return 111, nil } diff --git a/src/controller/robot/controller_test.go b/src/controller/robot/controller_test.go index 0405f7f0dc4..f3b7c86eb1e 100644 --- a/src/controller/robot/controller_test.go +++ b/src/controller/robot/controller_test.go @@ -94,7 +94,7 @@ func (suite *ControllerTestSuite) TestCreate() { defer os.Remove(secretKeyPath) suite.T().Setenv("KEY_PATH", secretKeyPath) - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotTokenDuration: "30", } config.InitWithSettings(conf) @@ -170,7 +170,7 @@ func (suite *ControllerTestSuite) TestUpdate() { c := controller{robotMgr: robotMgr, rbacMgr: rbacMgr, proMgr: projectMgr} ctx := context.TODO() - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotPrefix: "robot$", } config.InitWithSettings(conf) @@ -247,7 +247,7 @@ func (suite *ControllerTestSuite) TestList() { }, nil) projectMgr.On("Get", mock.Anything, mock.Anything).Return(&proModels.Project{ProjectID: 1, Name: "library"}, nil) rs, err := c.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "test3", }, }, &Option{ diff --git a/src/controller/robot/model.go b/src/controller/robot/model.go index 32cf15c1136..7b5fae44963 100644 --- a/src/controller/robot/model.go +++ b/src/controller/robot/model.go @@ -40,7 +40,7 @@ const ( type Robot struct { model.Robot ProjectName string - ProjectNameOrID interface{} + ProjectNameOrID any Level string Editable bool `json:"editable"` Permissions []*Permission `json:"permissions"` diff --git a/src/controller/scan/base_controller.go b/src/controller/scan/base_controller.go index 448e25e278d..229a2759ace 100644 --- a/src/controller/scan/base_controller.go +++ b/src/controller/scan/base_controller.go @@ -315,18 +315,18 @@ func (bc *basicController) Scan(ctx context.Context, artifact *ar.Artifact, opti } if opts.ExecutionID == 0 { - extraAttrs := map[string]interface{}{ - artfiactKey: map[string]interface{}{ + extraAttrs := map[string]any{ + artfiactKey: map[string]any{ "id": artifact.ID, "project_id": artifact.ProjectID, "repository_name": artifact.RepositoryName, "digest": artifact.Digest, }, - registrationKey: map[string]interface{}{ + registrationKey: map[string]any{ "id": r.ID, "name": r.Name, }, - enabledCapabilities: map[string]interface{}{ + enabledCapabilities: map[string]any{ "type": opts.GetScanType(), }, } @@ -383,7 +383,7 @@ func (bc *basicController) Stop(ctx context.Context, artifact *ar.Artifact, capT } func (bc *basicController) ScanAll(ctx context.Context, trigger string, async bool) (int64, error) { - extra := make(map[string]interface{}) + extra := make(map[string]any) if op := operator.FromContext(ctx); op != "" { extra["operator"] = op } @@ -511,7 +511,7 @@ func (bc *basicController) startScanAll(ctx context.Context, executionID int64) extraAttrs := exec.ExtraAttrs if extraAttrs == nil { - extraAttrs = map[string]interface{}{"summary": summary} + extraAttrs = map[string]any{"summary": summary} } else { extraAttrs["summary"] = summary } @@ -644,7 +644,7 @@ func (bc *basicController) GetReport(ctx context.Context, artifact *ar.Artifact, } // GetSummary ... -func (bc *basicController) GetSummary(ctx context.Context, artifact *ar.Artifact, scanType string, mimeTypes []string) (map[string]interface{}, error) { +func (bc *basicController) GetSummary(ctx context.Context, artifact *ar.Artifact, scanType string, mimeTypes []string) (map[string]any, error) { handler := sca.GetScanHandler(scanType) return handler.GetSummary(ctx, artifact, mimeTypes) } @@ -663,7 +663,7 @@ func (bc *basicController) GetScanLog(ctx context.Context, artifact *ar.Artifact if err != nil { return nil, err } - artifactMap := map[int64]interface{}{} + artifactMap := map[int64]any{} for _, a := range artifacts { artifactMap[a.ID] = struct{}{} } @@ -751,7 +751,7 @@ func (bc *basicController) GetScanLog(ctx context.Context, artifact *ar.Artifact return b.Bytes(), nil } -func scanTaskForArtifacts(task *task.Task, artifactMap map[int64]interface{}) bool { +func scanTaskForArtifacts(task *task.Task, artifactMap map[int64]any) bool { if task == nil { return false } @@ -961,7 +961,7 @@ func (bc *basicController) launchScanJob(ctx context.Context, param *launchScanJ reportUUIDs[i] = report.UUID } - params := make(map[string]interface{}) + params := make(map[string]any) params[sca.JobParamRegistration] = rJSON params[sca.JobParameterAuthType] = param.Registration.GetRegistryAuthorizationType() params[sca.JobParameterRequest] = sJSON @@ -979,7 +979,7 @@ func (bc *basicController) launchScanJob(ctx context.Context, param *launchScanJ // keep the report uuids in array so that when ?| operator support by the FilterRaw method of beego's orm // we can list the tasks of the scan reports by one SQL - extraAttrs := map[string]interface{}{ + extraAttrs := map[string]any{ artifactIDKey: param.Artifact.ID, artifactTagKey: param.Tag, robotIDKey: robot.ID, @@ -1110,7 +1110,7 @@ func (bc *basicController) isAccessory(ctx context.Context, art *ar.Artifact) (b return false, nil } -func getArtifactID(extraAttrs map[string]interface{}) int64 { +func getArtifactID(extraAttrs map[string]any) int64 { var artifactID float64 if extraAttrs != nil { if v, ok := extraAttrs[artifactIDKey]; ok { @@ -1121,7 +1121,7 @@ func getArtifactID(extraAttrs map[string]interface{}) int64 { return int64(artifactID) } -func getArtifactTag(extraAttrs map[string]interface{}) string { +func getArtifactTag(extraAttrs map[string]any) string { var tag string if extraAttrs != nil { if v, ok := extraAttrs[artifactTagKey]; ok { @@ -1133,13 +1133,13 @@ func getArtifactTag(extraAttrs map[string]interface{}) string { } // GetReportUUIDs returns the report UUIDs from the extra attributes -func GetReportUUIDs(extraAttrs map[string]interface{}) []string { +func GetReportUUIDs(extraAttrs map[string]any) []string { var reportUUIDs []string if extraAttrs != nil { value, ok := extraAttrs[reportUUIDsKey] if ok { - arr, _ := value.([]interface{}) + arr, _ := value.([]any) for _, el := range arr { if s, ok := el.(string); ok { reportUUIDs = append(reportUUIDs, s) @@ -1151,7 +1151,7 @@ func GetReportUUIDs(extraAttrs map[string]interface{}) []string { return reportUUIDs } -func getRobotID(extraAttrs map[string]interface{}) int64 { +func getRobotID(extraAttrs map[string]any) int64 { var trackID float64 if extraAttrs != nil { if v, ok := extraAttrs[robotIDKey]; ok { diff --git a/src/controller/scan/base_controller_test.go b/src/controller/scan/base_controller_test.go index 4133babf67b..93235fbc717 100644 --- a/src/controller/scan/base_controller_test.go +++ b/src/controller/scan/base_controller_test.go @@ -224,7 +224,7 @@ func (suite *ControllerTestSuite) SetupSuite() { rname := fmt.Sprintf("%s-%s-%s", config.ScannerRobotPrefix(context.TODO()), suite.registration.Name, "the-uuid-123") - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotTokenDuration: "30", } config.InitWithSettings(conf) @@ -299,7 +299,7 @@ func (suite *ControllerTestSuite) SetupSuite() { robotJSON, err := rb.ToJSON() require.NoError(suite.T(), err) - params := make(map[string]interface{}) + params := make(map[string]any) params[sca.JobParamRegistration] = regJSON params[sca.JobParameterRequest] = rJSON params[sca.JobParameterMimes] = []string{v1.MimeTypeNativeReport} @@ -672,10 +672,10 @@ func (suite *ControllerTestSuite) TestStopScanAll() { suite.NoError(err) } -func (suite *ControllerTestSuite) makeExtraAttrs(artifactID int64, reportUUIDs ...string) map[string]interface{} { - b, _ := json.Marshal(map[string]interface{}{reportUUIDsKey: reportUUIDs}) +func (suite *ControllerTestSuite) makeExtraAttrs(artifactID int64, reportUUIDs ...string) map[string]any { + b, _ := json.Marshal(map[string]any{reportUUIDsKey: reportUUIDs}) - extraAttrs := map[string]interface{}{} + extraAttrs := map[string]any{} json.Unmarshal(b, &extraAttrs) extraAttrs[artifactIDKey] = float64(artifactID) diff --git a/src/controller/scan/callback.go b/src/controller/scan/callback.go index 096aa0c70a7..211b2363829 100644 --- a/src/controller/scan/callback.go +++ b/src/controller/scan/callback.go @@ -64,7 +64,7 @@ func init() { func scanAllCallback(ctx context.Context, param string) error { if param != "" { - params := make(map[string]interface{}) + params := make(map[string]any) if err := json.Unmarshal([]byte(param), ¶ms); err != nil { return err } @@ -126,7 +126,7 @@ func scanTaskStatusChange(ctx context.Context, taskID int64, status string) (err } // extract ScanType if exist in ExtraAttrs - if c, ok := exec.ExtraAttrs["enabled_capabilities"].(map[string]interface{}); ok { + if c, ok := exec.ExtraAttrs["enabled_capabilities"].(map[string]any); ok { if Type, ok := c["type"].(string); ok { e.ScanType = Type } diff --git a/src/controller/scan/callback_test.go b/src/controller/scan/callback_test.go index 3744468e622..8124c9ba805 100644 --- a/src/controller/scan/callback_test.go +++ b/src/controller/scan/callback_test.go @@ -168,10 +168,10 @@ func (suite *CallbackTestSuite) TestScanAllCallback() { } } -func (suite *CallbackTestSuite) makeExtraAttrs(artifactID, robotID int64) map[string]interface{} { - b, _ := json.Marshal(map[string]interface{}{artifactIDKey: artifactID, robotIDKey: robotID}) +func (suite *CallbackTestSuite) makeExtraAttrs(artifactID, robotID int64) map[string]any { + b, _ := json.Marshal(map[string]any{artifactIDKey: artifactID, robotIDKey: robotID}) - extraAttrs := map[string]interface{}{} + extraAttrs := map[string]any{} json.Unmarshal(b, &extraAttrs) return extraAttrs diff --git a/src/controller/scan/checker.go b/src/controller/scan/checker.go index 4b429b2bc30..2d3326b4590 100644 --- a/src/controller/scan/checker.go +++ b/src/controller/scan/checker.go @@ -16,6 +16,7 @@ package scan import ( "context" + "slices" "github.com/goharbor/harbor/src/controller/artifact" "github.com/goharbor/harbor/src/controller/artifact/processor/image" @@ -125,10 +126,8 @@ func hasCapability(r *models.Registration, a *artifact.Artifact) bool { // use allowlist here because currently only docker image is supported by the scanner // https://github.com/goharbor/pluggable-scanner-spec/issues/2 allowlist := []string{image.ArtifactTypeImage} - for _, t := range allowlist { - if a.Type == t { - return r.HasCapability(a.ManifestMediaType) - } + if slices.Contains(allowlist, a.Type) { + return r.HasCapability(a.ManifestMediaType) } return false diff --git a/src/controller/scan/controller.go b/src/controller/scan/controller.go index 3452f145430..cc82e86a8d0 100644 --- a/src/controller/scan/controller.go +++ b/src/controller/scan/controller.go @@ -81,9 +81,9 @@ type Controller interface { // mimeTypes []string : the mime types of the reports // // Returns: - // map[string]interface{} : report summaries indexed by mime types + // map[string]any : report summaries indexed by mime types // error : non nil error if any errors occurred - GetSummary(ctx context.Context, artifact *artifact.Artifact, scanType string, mimeTypes []string) (map[string]interface{}, error) + GetSummary(ctx context.Context, artifact *artifact.Artifact, scanType string, mimeTypes []string) (map[string]any, error) // Get the scan log for the specified artifact with the given digest // diff --git a/src/controller/scandataexport/execution.go b/src/controller/scandataexport/execution.go index 895ed7bed4a..ef48a35b4f1 100644 --- a/src/controller/scandataexport/execution.go +++ b/src/controller/scandataexport/execution.go @@ -57,7 +57,7 @@ type controller struct { } func (c *controller) ListExecutions(ctx context.Context, userName string) ([]*export.Execution, error) { - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["VendorType"] = job.ScanDataExportVendorType keywords[fmt.Sprintf("ExtraAttrs.%s", export.UserNameAttribute)] = userName @@ -78,7 +78,7 @@ func (c *controller) GetTask(ctx context.Context, executionID int64) (*task.Task logger := log.GetLogger(ctx) query := q2.New(q2.KeyWords{}) - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["VendorType"] = job.ScanDataExportVendorType keywords["ExecutionID"] = executionID query.Keywords = keywords @@ -125,7 +125,7 @@ func (c *controller) DeleteExecution(ctx context.Context, executionID int64) err func (c *controller) Start(ctx context.Context, request export.Request) (executionID int64, err error) { logger := log.GetLogger(ctx) vendorID := int64(ctx.Value(export.CsvJobVendorIDKey).(int)) - extraAttrs := make(map[string]interface{}) + extraAttrs := make(map[string]any) extraAttrs[export.ProjectIDsAttribute] = request.Projects extraAttrs[export.JobNameAttribute] = request.JobName extraAttrs[export.UserNameAttribute] = request.UserName @@ -137,7 +137,7 @@ func (c *controller) Start(ctx context.Context, request export.Request) (executi } // create a job object and fill with metadata and parameters - params := make(map[string]interface{}) + params := make(map[string]any) params[export.JobID] = fmt.Sprintf("%d", id) params[export.JobRequest] = request params[export.JobModeKey] = export.JobModeExport @@ -184,7 +184,7 @@ func (c *controller) convertToExportExecStatus(ctx context.Context, exec *task.E EndTime: exec.EndTime, } if pids, ok := exec.ExtraAttrs[export.ProjectIDsAttribute]; ok { - for _, pid := range pids.([]interface{}) { + for _, pid := range pids.([]any) { execStatus.ProjectIDs = append(execStatus.ProjectIDs, int64(pid.(float64))) } } diff --git a/src/controller/scandataexport/execution_test.go b/src/controller/scandataexport/execution_test.go index 8c616b08d64..0314d461d7c 100644 --- a/src/controller/scandataexport/execution_test.go +++ b/src/controller/scandataexport/execution_test.go @@ -94,7 +94,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestGetExecution() { sysArtifactMgr: suite.sysArtifactMgr, } // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" attrs[export.DigestKey] = "sha256:d04b98f48e8f8bcc15c6ae5ac050801cd6dcfd428fb5f9e65c4e16e7807340fa" @@ -154,7 +154,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestGetExecutionSysArtifactExistF sysArtifactMgr: suite.sysArtifactMgr, } // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" { @@ -194,7 +194,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestGetExecutionList() { sysArtifactMgr: suite.sysArtifactMgr, } // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" { @@ -243,7 +243,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestStart() { // execution manager and task manager return successfully { // get execution succeeds - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.ProjectIDsAttribute] = []int64{1} attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" @@ -307,7 +307,7 @@ func (suite *ScanDataExportExecutionTestSuite) TestStartWithTaskManagerError() { { ctx := context.Background() ctx = context.WithValue(ctx, export.CsvJobVendorIDKey, int(-1)) - attrs := make(map[string]interface{}) + attrs := make(map[string]any) attrs[export.ProjectIDsAttribute] = []int64{1} attrs[export.JobNameAttribute] = "test-job" attrs[export.UserNameAttribute] = "test-user" @@ -327,7 +327,7 @@ func (suite *ScanDataExportExecutionTestSuite) TearDownSuite() { func (suite *ScanDataExportExecutionTestSuite) validateExecutionManagerInvocation(ctx context.Context) { // validate that execution manager has been called with the specified - extraAttsMatcher := testifymock.MatchedBy(func(m map[string]interface{}) bool { + extraAttsMatcher := testifymock.MatchedBy(func(m map[string]any) bool { jobName, jobNamePresent := m[export.JobNameAttribute] userName, userNamePresent := m[export.UserNameAttribute] return jobNamePresent && userNamePresent && jobName == "test-job" && userName == "test-user" diff --git a/src/controller/scanner/base_controller.go b/src/controller/scanner/base_controller.go index 25ae5820d58..f421df828a2 100644 --- a/src/controller/scanner/base_controller.go +++ b/src/controller/scanner/base_controller.go @@ -17,6 +17,7 @@ package scanner import ( "context" "fmt" + "slices" "sync" "time" @@ -362,7 +363,7 @@ func (bc *basicController) getScannerAdapterMetadataWithCache(ctx context.Contex key := fmt.Sprintf("reg:%d:metadata", registration.ID) var result MetadataResult - err := cache.FetchOrSave(ctx, bc.Cache(), key, &result, func() (interface{}, error) { + err := cache.FetchOrSave(ctx, bc.Cache(), key, &result, func() (any, error) { meta, err := bc.getScannerAdapterMetadata(registration) if err != nil { return &MetadataResult{Error: err.Error()}, nil @@ -383,13 +384,7 @@ var ( ) func isReservedName(name string) bool { - for _, reservedName := range reservedNames { - if name == reservedName { - return true - } - } - - return false + return slices.Contains(reservedNames, name) } // MetadataResult metadata or error saved in cache diff --git a/src/controller/securityhub/controller.go b/src/controller/securityhub/controller.go index fe28f3b2214..fb69412b9d5 100644 --- a/src/controller/securityhub/controller.go +++ b/src/controller/securityhub/controller.go @@ -147,7 +147,7 @@ func (c *controller) attachTags(ctx context.Context, vuls []*secHubModel.Vulnera } // get tags in the artifact list - var artifactIDs []interface{} + var artifactIDs []any for k := range artifactTagMap { artifactIDs = append(artifactIDs, k) } diff --git a/src/controller/systemartifact/execution.go b/src/controller/systemartifact/execution.go index 7a575e076c0..06550cb966d 100644 --- a/src/controller/systemartifact/execution.go +++ b/src/controller/systemartifact/execution.go @@ -148,7 +148,7 @@ func scheduleSystemArtifactCleanJob(ctx context.Context) error { } func getSystemArtifactCleanupSchedule(ctx context.Context) (*scheduler.Schedule, error) { - query := q.New(map[string]interface{}{"vendor_type": job.SystemArtifactCleanupVendorType}) + query := q.New(map[string]any{"vendor_type": job.SystemArtifactCleanupVendorType}) schedules, err := sched.ListSchedules(ctx, query) if err != nil { log.Errorf("Unable to check if export data cleanup job is already scheduled : %v", err) diff --git a/src/controller/systemartifact/execution_test.go b/src/controller/systemartifact/execution_test.go index 7656fae376d..aebceba2270 100644 --- a/src/controller/systemartifact/execution_test.go +++ b/src/controller/systemartifact/execution_test.go @@ -137,7 +137,7 @@ func (suite *SystemArtifactCleanupTestSuite) TestScheduleCleanupJobNoPreviousSch makeCtx: func() context.Context { return orm.NewContext(nil, &ormtesting.FakeOrmer{}) }, } - var extraAttrs map[string]interface{} + var extraAttrs map[string]any suite.sched.On("Schedule", mock.Anything, job.SystemArtifactCleanupVendorType, int64(0), cronTypeDaily, cronSpec, SystemArtifactCleanupCallback, nil, extraAttrs).Return(int64(1), nil) suite.sched.On("ListSchedules", mock.Anything, mock.Anything).Return(make([]*scheduler2.Schedule, 0), nil) @@ -163,7 +163,7 @@ func (suite *SystemArtifactCleanupTestSuite) TestScheduleCleanupJobPreviousSched makeCtx: func() context.Context { return orm.NewContext(nil, &ormtesting.FakeOrmer{}) }, } - var extraAttrs map[string]interface{} + var extraAttrs map[string]any suite.sched.On("Schedule", mock.Anything, job.SystemArtifactCleanupVendorType, int64(0), cronTypeDaily, cronSpec, SystemArtifactCleanupCallback, nil, extraAttrs).Return(int64(1), nil) @@ -200,7 +200,7 @@ func (suite *SystemArtifactCleanupTestSuite) TestScheduleCleanupJobPreviousSched ScheduleCleanupTask(ctx) - extraAttributesMatcher := testifymock.MatchedBy(func(attrs map[string]interface{}) bool { + extraAttributesMatcher := testifymock.MatchedBy(func(attrs map[string]any) bool { return len(attrs) == 0 }) suite.sched.AssertNotCalled(suite.T(), "Schedule", mock.Anything, diff --git a/src/controller/systeminfo/controller.go b/src/controller/systeminfo/controller.go index 3f3b82c82e1..e3d40b303bd 100644 --- a/src/controller/systeminfo/controller.go +++ b/src/controller/systeminfo/controller.go @@ -139,7 +139,7 @@ func (c *controller) GetInfo(ctx context.Context, opt Options) (*Data, error) { return res, nil } -func OIDCProviderName(cfg map[string]interface{}) string { +func OIDCProviderName(cfg map[string]any) string { authMode := utils.SafeCastString(cfg[common.AUTHMode]) if authMode != common.OIDCAuth { return "" diff --git a/src/controller/systeminfo/controller_test.go b/src/controller/systeminfo/controller_test.go index 3ca08721a6e..6c3eb454615 100644 --- a/src/controller/systeminfo/controller_test.go +++ b/src/controller/systeminfo/controller_test.go @@ -23,7 +23,7 @@ func (s *sysInfoCtlTestSuite) SetupTest() { version.ReleaseVersion = "test" version.GitCommit = "fakeid" - conf := map[string]interface{}{ + conf := map[string]any{ common.AUTHMode: "db_auth", common.SelfRegistration: true, common.ExtEndpoint: "https://test.goharbor.io", @@ -107,16 +107,16 @@ func TestControllerSuite(t *testing.T) { func TestOIDCProviderName(t *testing.T) { type args struct { - cfg map[string]interface{} + cfg map[string]any } tests := []struct { name string args args want string }{ - {"normal testing", args{map[string]interface{}{common.AUTHMode: common.OIDCAuth, common.OIDCName: "test"}}, "test"}, - {"not oidc", args{map[string]interface{}{common.AUTHMode: common.DBAuth, common.OIDCName: "test"}}, ""}, - {"empty provider", args{map[string]interface{}{common.AUTHMode: common.OIDCAuth, common.OIDCName: ""}}, ""}, + {"normal testing", args{map[string]any{common.AUTHMode: common.OIDCAuth, common.OIDCName: "test"}}, "test"}, + {"not oidc", args{map[string]any{common.AUTHMode: common.DBAuth, common.OIDCName: "test"}}, ""}, + {"empty provider", args{map[string]any{common.AUTHMode: common.OIDCAuth, common.OIDCName: ""}}, ""}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/controller/tag/controller.go b/src/controller/tag/controller.go index 5e20419df4b..f00bde58475 100644 --- a/src/controller/tag/controller.go +++ b/src/controller/tag/controller.go @@ -76,7 +76,7 @@ type controller struct { // Ensure ... func (c *controller) Ensure(ctx context.Context, repositoryID, artifactID int64, name string) (int64, error) { query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "repository_id": repositoryID, "name": name, }, diff --git a/src/controller/task/sweep.go b/src/controller/task/sweep.go index b4bf023d80d..67c04294216 100644 --- a/src/controller/task/sweep.go +++ b/src/controller/task/sweep.go @@ -67,7 +67,7 @@ type sweepController struct { } func (sc *sweepController) Start(ctx context.Context, params *SweepParams, trigger string) error { - jobParams := make(map[string]interface{}) + jobParams := make(map[string]any) jobParams[task.ExecRetainCounts] = params.ExecRetainCounts execID, err := sc.execMgr.Create(ctx, job.ExecSweepVendorType, systemVendorID, trigger, jobParams) @@ -129,7 +129,7 @@ func ScheduleSweepJob(ctx context.Context) error { // getScheduledSweepJob gets sweep job which already scheduled. func getScheduledSweepJob(ctx context.Context) (*scheduler.Schedule, error) { - query := q.New(map[string]interface{}{"vendor_type": job.ExecSweepVendorType}) + query := q.New(map[string]any{"vendor_type": job.ExecSweepVendorType}) schedules, err := scheduler.Sched.ListSchedules(ctx, query) if err != nil { return nil, err diff --git a/src/controller/user/controller.go b/src/controller/user/controller.go index 928d9fa89f7..b7d71a12aa9 100644 --- a/src/controller/user/controller.go +++ b/src/controller/user/controller.go @@ -196,7 +196,7 @@ func (c *controller) Delete(ctx context.Context, id int) error { if err != nil { return errors.Wrap(err, "unable to get user information") } - params := map[string]interface{}{ + params := map[string]any{ gdpr.UserNameParam: userDb.Username, } execID, err := c.exeMgr.Create(ctx, job.AuditLogsGDPRCompliantVendorType, -1, task.ExecutionTriggerEvent, params) diff --git a/src/controller/usergroup/test/controller_test.go b/src/controller/usergroup/test/controller_test.go index 6aa443f1767..ee81cc5e07c 100644 --- a/src/controller/usergroup/test/controller_test.go +++ b/src/controller/usergroup/test/controller_test.go @@ -38,7 +38,7 @@ func (c *controllerTestSuite) SetupTest() { c.Suite.ClearTables = []string{"user_group"} } -var defaultConfigWithVerifyCert = map[string]interface{}{ +var defaultConfigWithVerifyCert = map[string]any{ common.ExtEndpoint: "https://host01.com", common.AUTHMode: common.LDAPAuth, common.DatabaseType: "postgresql", diff --git a/src/controller/webhook/controller.go b/src/controller/webhook/controller.go index 3e8f50f7fdd..8914352574c 100644 --- a/src/controller/webhook/controller.go +++ b/src/controller/webhook/controller.go @@ -31,7 +31,7 @@ var ( Ctl = NewController() // webhookJobVendors represents webhook(http) or slack. - webhookJobVendors = q.NewOrList([]interface{}{job.WebhookJobVendorType, job.SlackJobVendorType}) + webhookJobVendors = q.NewOrList([]any{job.WebhookJobVendorType, job.SlackJobVendorType}) ) type Controller interface { diff --git a/src/core/api/api_test.go b/src/core/api/api_test.go index b1d4bc1450b..dae21472334 100644 --- a/src/core/api/api_test.go +++ b/src/core/api/api_test.go @@ -73,8 +73,8 @@ type testingRequest struct { method string url string header http.Header - queryStruct interface{} - bodyJSON interface{} + queryStruct any + bodyJSON any credential *usrInfo } @@ -139,7 +139,7 @@ func handle(r *testingRequest) (*httptest.ResponseRecorder, error) { return resp, nil } -func handleAndParse(r *testingRequest, v interface{}) error { +func handleAndParse(r *testingRequest, v any) error { resp, err := handle(r) if err != nil { return err diff --git a/src/core/api/base.go b/src/core/api/base.go index 937cfb6fa7c..d804b5e5d70 100644 --- a/src/core/api/base.go +++ b/src/core/api/base.go @@ -74,7 +74,7 @@ func (b *BaseController) RequireAuthenticated() bool { } // HasProjectPermission returns true when the request has action permission on project subresource -func (b *BaseController) HasProjectPermission(projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) (bool, error) { +func (b *BaseController) HasProjectPermission(projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) (bool, error) { _, _, err := utils.ParseProjectIDOrName(projectIDOrName) if err != nil { return false, err @@ -95,7 +95,7 @@ func (b *BaseController) HasProjectPermission(projectIDOrName interface{}, actio // RequireProjectAccess returns true when the request has action access on project subresource // otherwise send UnAuthorized or Forbidden response and returns false -func (b *BaseController) RequireProjectAccess(projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) bool { +func (b *BaseController) RequireProjectAccess(projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) bool { hasPermission, err := b.HasProjectPermission(projectIDOrName, action, subresource...) if err != nil { if errors.IsNotFoundErr(err) { @@ -116,7 +116,7 @@ func (b *BaseController) RequireProjectAccess(projectIDOrName interface{}, actio // This should be called when a project is not found, if the caller is a system admin it returns 404. // If it's regular user, it will render permission error -func (b *BaseController) handleProjectNotFound(projectIDOrName interface{}) { +func (b *BaseController) handleProjectNotFound(projectIDOrName any) { if b.SecurityCtx.IsSysAdmin() { b.SendNotFoundError(fmt.Errorf("project %v not found", projectIDOrName)) } else { @@ -134,7 +134,7 @@ func (b *BaseController) SendPermissionError() { } // WriteJSONData writes the JSON data to the client. -func (b *BaseController) WriteJSONData(object interface{}) { +func (b *BaseController) WriteJSONData(object any) { b.Data["json"] = object if err := b.ServeJSON(); err != nil { log.Errorf("failed to serve json, %v", err) @@ -144,7 +144,7 @@ func (b *BaseController) WriteJSONData(object interface{}) { } // WriteYamlData writes the yaml data to the client. -func (b *BaseController) WriteYamlData(object interface{}) { +func (b *BaseController) WriteYamlData(object any) { yData, err := yaml.Marshal(object) if err != nil { b.SendInternalServerError(err) diff --git a/src/core/auth/authenticator.go b/src/core/auth/authenticator.go index 6d00d4d3d6f..7134edc69e6 100644 --- a/src/core/auth/authenticator.go +++ b/src/core/auth/authenticator.go @@ -240,10 +240,10 @@ func SearchAndOnBoardGroup(ctx context.Context, groupKey, altGroupName string) ( if userGroup == nil { return 0, ErrorGroupNotExist } - if userGroup != nil { - err = OnBoardGroup(ctx, userGroup, altGroupName) + if err := OnBoardGroup(ctx, userGroup, altGroupName); err != nil { + return 0, err } - return userGroup.ID, err + return userGroup.ID, nil } // PostAuthenticate - diff --git a/src/core/auth/authproxy/auth_test.go b/src/core/auth/authproxy/auth_test.go index 76045a559f6..6279b894249 100644 --- a/src/core/auth/authproxy/auth_test.go +++ b/src/core/auth/authproxy/auth_test.go @@ -54,7 +54,7 @@ func TestMain(m *testing.M) { userMgr: user.New(), } cfgMap := cut.GetUnitTestConfig() - conf := map[string]interface{}{ + conf := map[string]any{ common.HTTPAuthProxyEndpoint: a.Endpoint, common.HTTPAuthProxyTokenReviewEndpoint: a.TokenReviewEndpoint, common.HTTPAuthProxyVerifyCert: false, diff --git a/src/core/auth/ldap/ldap.go b/src/core/auth/ldap/ldap.go index 60d31f2b462..796eae9837c 100644 --- a/src/core/auth/ldap/ldap.go +++ b/src/core/auth/ldap/ldap.go @@ -150,7 +150,7 @@ func (l *Auth) attachGroupParallel(ctx context.Context, ldapUsers []model.User, g := new(errgroup.Group) g.SetLimit(workerCount) - for i := 0; i < workerCount; i++ { + for i := range workerCount { curIndex := i g.Go(func() error { userGroups := make([]ugModel.UserGroup, 0) diff --git a/src/core/auth/ldap/ldap_test.go b/src/core/auth/ldap/ldap_test.go index f1fa37f3e9c..00594c9a0f1 100644 --- a/src/core/auth/ldap/ldap_test.go +++ b/src/core/auth/ldap/ldap_test.go @@ -38,7 +38,7 @@ import ( ugModel "github.com/goharbor/harbor/src/pkg/usergroup/model" ) -var ldapTestConfig = map[string]interface{}{ +var ldapTestConfig = map[string]any{ common.ExtEndpoint: "host01.com", common.AUTHMode: "ldap_auth", common.DatabaseType: "postgresql", diff --git a/src/core/controllers/oidc.go b/src/core/controllers/oidc.go index 63e491eb043..f1fa57596bf 100644 --- a/src/core/controllers/oidc.go +++ b/src/core/controllers/oidc.go @@ -430,7 +430,7 @@ func getSessionType(refreshToken string) (string, error) { if err != nil { return "", errors.Errorf("failed to decode refresh token: %v", err) } - var claims map[string]interface{} + var claims map[string]any if err := json.Unmarshal(payload, &claims); err != nil { return "", errors.Errorf("failed to unmarshal refresh token: %v", err) } diff --git a/src/core/service/token/token_test.go b/src/core/service/token/token_test.go index f0881904e4a..29307011a4a 100644 --- a/src/core/service/token/token_test.go +++ b/src/core/service/token/token_test.go @@ -24,6 +24,7 @@ import ( "os" "path" "runtime" + "slices" "testing" "github.com/docker/distribution/registry/auth/token" @@ -148,7 +149,7 @@ func TestMakeToken(t *testing.T) { if err != nil { t.Errorf("Error while getting public key from cert: %s", crt) } - tok, err := jwt.ParseWithClaims(tokenString, &harborClaims{}, func(t *jwt.Token) (interface{}, error) { + tok, err := jwt.ParseWithClaims(tokenString, &harborClaims{}, func(t *jwt.Token) (any, error) { if _, ok := t.Method.(*jwt.SigningMethodRSA); !ok { return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"]) } @@ -239,10 +240,8 @@ func (f *fakeSecurityContext) IsSolutionUser() bool { } func (f *fakeSecurityContext) Can(ctx context.Context, action rbac.Action, resource rbac.Resource) bool { if actions, ok := f.rcActions[resource]; ok { - for _, a := range actions { - if a == action { - return true - } + if slices.Contains(actions, action) { + return true } } return false @@ -251,7 +250,7 @@ func (f *fakeSecurityContext) Can(ctx context.Context, action rbac.Action, resou func (f *fakeSecurityContext) GetMyProjects() ([]*proModels.Project, error) { return nil, nil } -func (f *fakeSecurityContext) GetProjectRoles(interface{}) []int { +func (f *fakeSecurityContext) GetProjectRoles(any) []int { return nil } diff --git a/src/core/session/codec.go b/src/core/session/codec.go index 4fc10c04409..408fa95cdb0 100644 --- a/src/core/session/codec.go +++ b/src/core/session/codec.go @@ -16,6 +16,7 @@ package session import ( "encoding/gob" + "maps" "github.com/beego/beego/v2/server/web/session" @@ -35,30 +36,26 @@ var ( type gobCodec struct{} -func (*gobCodec) Encode(v interface{}) ([]byte, error) { - if vm, ok := v.(map[interface{}]interface{}); ok { +func (*gobCodec) Encode(v any) ([]byte, error) { + if vm, ok := v.(map[any]any); ok { return session.EncodeGob(vm) } return nil, errors.Errorf("object type invalid, %#v", v) } -func (*gobCodec) Decode(data []byte, v interface{}) error { +func (*gobCodec) Decode(data []byte, v any) error { vm, err := session.DecodeGob(data) if err != nil { return err } switch in := v.(type) { - case map[interface{}]interface{}: - for k, v := range vm { - in[k] = v - } - case *map[interface{}]interface{}: + case map[any]any: + maps.Copy(in, vm) + case *map[any]any: m := *in - for k, v := range vm { - m[k] = v - } + maps.Copy(m, vm) default: return errors.Errorf("object type invalid, %#v", v) } diff --git a/src/core/session/codec_test.go b/src/core/session/codec_test.go index 3f15ba7460e..6cb5cb9cbac 100644 --- a/src/core/session/codec_test.go +++ b/src/core/session/codec_test.go @@ -26,12 +26,12 @@ type User struct { func TestCodec(t *testing.T) { u := &User{User: "admin", Pass: "123456"} - m := make(map[interface{}]interface{}) + m := make(map[any]any) m["user"] = u c, err := codec.Encode(m) assert.NoError(t, err, "encode should not error") - v := make(map[interface{}]interface{}) + v := make(map[any]any) err = codec.Decode(c, &v) assert.NoError(t, err, "decode should not error") diff --git a/src/core/session/session.go b/src/core/session/session.go index 448ed1a971b..2d431f5e0ae 100644 --- a/src/core/session/session.go +++ b/src/core/session/session.go @@ -41,12 +41,12 @@ type Store struct { c cache.Cache sid string lock sync.RWMutex - values map[interface{}]interface{} + values map[any]any maxlifetime int64 } // Set value in redis session -func (rs *Store) Set(_ context.Context, key, value interface{}) error { +func (rs *Store) Set(_ context.Context, key, value any) error { rs.lock.Lock() defer rs.lock.Unlock() rs.values[key] = value @@ -54,7 +54,7 @@ func (rs *Store) Set(_ context.Context, key, value interface{}) error { } // Get value in redis session -func (rs *Store) Get(_ context.Context, key interface{}) interface{} { +func (rs *Store) Get(_ context.Context, key any) any { rs.lock.RLock() defer rs.lock.RUnlock() if v, ok := rs.values[key]; ok { @@ -64,7 +64,7 @@ func (rs *Store) Get(_ context.Context, key interface{}) interface{} { } // Delete value in redis session -func (rs *Store) Delete(_ context.Context, key interface{}) error { +func (rs *Store) Delete(_ context.Context, key any) error { rs.lock.Lock() defer rs.lock.Unlock() delete(rs.values, key) @@ -75,7 +75,7 @@ func (rs *Store) Delete(_ context.Context, key interface{}) error { func (rs *Store) Flush(_ context.Context) error { rs.lock.Lock() defer rs.lock.Unlock() - rs.values = make(map[interface{}]interface{}) + rs.values = make(map[any]any) return nil } @@ -144,7 +144,7 @@ func (rp *Provider) SessionInit(ctx context.Context, maxlifetime int64, url stri // SessionRead read redis session by sid func (rp *Provider) SessionRead(ctx context.Context, sid string) (session.Store, error) { - kv := make(map[interface{}]interface{}) + kv := make(map[any]any) if ctx == nil { ctx = context.TODO() } @@ -182,7 +182,7 @@ func (rp *Provider) SessionRegenerate(ctx context.Context, oldsid, sid string) ( rdb.Rename(ctx, oldsid, sid) rdb.Expire(ctx, sid, maxlifetime) } else { - kv := make(map[interface{}]interface{}) + kv := make(map[any]any) err := rp.c.Fetch(ctx, sid, &kv) if err != nil && !errors.Is(err, cache.ErrNotFound) { return nil, err diff --git a/src/go.mod b/src/go.mod index f6adc39cf21..a7c25faa3e9 100644 --- a/src/go.mod +++ b/src/go.mod @@ -1,12 +1,12 @@ module github.com/goharbor/harbor/src -go 1.23.8 +go 1.24.3 require ( github.com/CloudNativeAI/model-spec v0.0.3 github.com/FZambia/sentinel v1.1.0 github.com/Masterminds/semver v1.5.0 - github.com/aliyun/alibaba-cloud-sdk-go v1.63.84 + github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/aws/aws-sdk-go v1.55.6 github.com/beego/beego/v2 v2.3.6 @@ -22,12 +22,12 @@ require ( github.com/go-asn1-ber/asn1-ber v1.5.7 github.com/go-ldap/ldap/v3 v3.4.10 github.com/go-openapi/errors v0.22.0 - github.com/go-openapi/loads v0.22.0 + github.com/go-openapi/loads v0.22.0 // indirect github.com/go-openapi/runtime v0.28.0 - github.com/go-openapi/spec v0.21.0 + github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/strfmt v0.23.0 github.com/go-openapi/swag v0.23.0 - github.com/go-openapi/validate v0.24.0 + github.com/go-openapi/validate v0.24.0 // indirect github.com/go-redis/redis/v8 v8.11.4 github.com/gocarina/gocsv v0.0.0-20210516172204-ca9e8a8ddea8 github.com/gocraft/work v0.5.1 @@ -47,16 +47,16 @@ require ( github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.1.0 + github.com/opencontainers/image-spec v1.1.1 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_golang v1.22.0 github.com/prometheus/client_model v0.6.1 github.com/robfig/cron/v3 v3.0.1 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible github.com/vmihailenco/msgpack/v5 v5.4.1 - github.com/volcengine/volcengine-go-sdk v1.0.185 + github.com/volcengine/volcengine-go-sdk v1.1.19 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.59.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 go.opentelemetry.io/otel v1.35.0 @@ -66,18 +66,18 @@ require ( go.opentelemetry.io/otel/trace v1.35.0 go.pinniped.dev v0.37.0 go.uber.org/ratelimit v0.3.1 - golang.org/x/crypto v0.36.0 - golang.org/x/net v0.37.0 - golang.org/x/oauth2 v0.27.0 - golang.org/x/sync v0.12.0 - golang.org/x/text v0.23.0 + golang.org/x/crypto v0.37.0 + golang.org/x/net v0.38.0 + golang.org/x/oauth2 v0.28.0 + golang.org/x/sync v0.14.0 + golang.org/x/text v0.24.0 golang.org/x/time v0.11.0 gopkg.in/h2non/gock.v1 v1.1.2 gopkg.in/yaml.v2 v2.4.0 - helm.sh/helm/v3 v3.17.2 - k8s.io/api v0.32.2 - k8s.io/apimachinery v0.32.2 - k8s.io/client-go v0.32.2 + helm.sh/helm/v3 v3.18.2 + k8s.io/api v0.33.1 + k8s.io/apimachinery v0.33.1 + k8s.io/client-go v0.33.1 sigs.k8s.io/yaml v1.4.0 ) @@ -104,7 +104,7 @@ require ( github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dnaeon/go-vcr v1.2.0 // indirect github.com/docker/cli v27.1.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.7.0 // indirect + github.com/docker/docker-credential-helpers v0.8.2 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect @@ -118,7 +118,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect @@ -136,7 +135,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -150,7 +149,7 @@ require ( github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/robfig/cron v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -162,7 +161,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.7.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -179,21 +178,22 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/term v0.30.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/term v0.31.0 // indirect google.golang.org/api v0.171.0 // indirect google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect google.golang.org/grpc v1.69.4 // indirect - google.golang.org/protobuf v1.36.3 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect ) replace ( diff --git a/src/go.sum b/src/go.sum index 3834e7601f4..55263539a0c 100644 --- a/src/go.sum +++ b/src/go.sum @@ -8,8 +8,8 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-sdk-for-go v37.2.0+incompatible h1:LTdcd2GK+cv+e7yhWCN8S7yf3eblBypKFZsPfKjCQ7E= github.com/Azure/azure-sdk-for-go v37.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= @@ -61,8 +61,8 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.84 h1:8IpC2i1mtsuUt13cbZtVCtQRSjzuMvLiDrbOJcaS+Z4= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.84/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 h1:qagvUyrgOnBIlVRQWOyCZGVKUIYbMBdGdJ104vBpRFU= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.107/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= @@ -125,8 +125,8 @@ github.com/docker/cli v27.1.1+incompatible h1:goaZxOqs4QKxznZjjBWKONQci/MywhtRv2 github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= +github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= @@ -369,8 +369,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -411,8 +411,8 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -451,8 +451,8 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= -github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= @@ -467,8 +467,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -476,8 +476,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= @@ -522,8 +522,8 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -564,8 +564,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/volcengine/volc-sdk-golang v1.0.23 h1:anOslb2Qp6ywnsbyq9jqR0ljuO63kg9PY+4OehIk5R8= github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU= -github.com/volcengine/volcengine-go-sdk v1.0.185 h1:MIH+YgdWZhO1fNg/vxLohl8ad7hlklaf46wpaTS1TN0= -github.com/volcengine/volcengine-go-sdk v1.0.185/go.mod h1:gfEDc1s7SYaGoY+WH2dRrS3qiuDJMkwqyfXWCa7+7oA= +github.com/volcengine/volcengine-go-sdk v1.1.19 h1:+jLVMqDtdtiAt8QGBk6AMiEg22Br5SZGu2FSHUrIcU0= +github.com/volcengine/volcengine-go-sdk v1.1.19/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -638,8 +638,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -693,11 +693,11 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -710,8 +710,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -746,8 +746,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -758,8 +758,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -772,8 +772,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -839,8 +839,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -874,27 +874,30 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.17.2 h1:agYQ5ew2jq5vdx2K7q5W44KyKQrnSubUMCQsjkiv3/o= -helm.sh/helm/v3 v3.17.2/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8= +helm.sh/helm/v3 v3.18.2 h1:mPQP/HHYjNEDAztAK50dD6uxTCNV1zSVU38WwSVdw9M= +helm.sh/helm/v3 v3.18.2/go.mod h1:43QHS1W97RcoFJRk36ZBhHdTfykqBlJdsWp3yhzdq8w= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= -k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= -k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= -k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= -k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/src/jobservice/README.md b/src/jobservice/README.md index 082a2d2f184..591ff121492 100644 --- a/src/jobservice/README.md +++ b/src/jobservice/README.md @@ -100,7 +100,7 @@ type Interface interface { // The related arguments will be injected by the workerpool. // // ctx Context : Job execution context. - // params map[string]interface{} : parameters with key-pair style for the job execution. + // params map[string]any : parameters with key-pair style for the job execution. // // Returns: // error if failed to run. NOTES: If job is stopped or cancelled, a specified error should be returned diff --git a/src/jobservice/api/handler.go b/src/jobservice/api/handler.go index 49df3d2fc06..425effcead0 100644 --- a/src/jobservice/api/handler.go +++ b/src/jobservice/api/handler.go @@ -271,7 +271,7 @@ func (dh *DefaultHandler) HandleGetJobsReq(w http.ResponseWriter, req *http.Requ dh.handleJSONData(w, req, http.StatusOK, jobs) } -func (dh *DefaultHandler) handleJSONData(w http.ResponseWriter, req *http.Request, code int, object interface{}) { +func (dh *DefaultHandler) handleJSONData(w http.ResponseWriter, req *http.Request, code int, object any) { data, err := json.Marshal(object) if err != nil { dh.handleError(w, req, http.StatusInternalServerError, errs.HandleJSONDataError(err)) diff --git a/src/jobservice/common/list/list.go b/src/jobservice/common/list/list.go index 9f18d6648f0..2ab55b75a4b 100644 --- a/src/jobservice/common/list/list.go +++ b/src/jobservice/common/list/list.go @@ -36,7 +36,7 @@ func New() *SyncList { } // Iterate the list -func (l *SyncList) Iterate(f func(ele interface{}) bool) { +func (l *SyncList) Iterate(f func(ele any) bool) { l.lock.RLock() defer l.lock.RUnlock() @@ -54,7 +54,7 @@ func (l *SyncList) Iterate(f func(ele interface{}) bool) { } // Push the element to the back of the list -func (l *SyncList) Push(ele interface{}) { +func (l *SyncList) Push(ele any) { if ele != nil { l.lock.Lock() defer l.lock.Unlock() diff --git a/src/jobservice/common/list/list_test.go b/src/jobservice/common/list/list_test.go index 5ecd783524e..5d1b7940cb5 100644 --- a/src/jobservice/common/list/list_test.go +++ b/src/jobservice/common/list/list_test.go @@ -43,7 +43,7 @@ func (suite *ListSuite) SetupSuite() { } func (suite *ListSuite) TestIterate() { - suite.l.Iterate(func(ele interface{}) bool { + suite.l.Iterate(func(ele any) bool { if s, ok := ele.(string); ok { if strings.HasPrefix(s, "b") { return true @@ -55,3 +55,9 @@ func (suite *ListSuite) TestIterate() { suite.Equal(3, suite.l.l.Len()) } + +func (suite *ListSuite) TestPushNil() { + initialLen := suite.l.l.Len() + suite.l.Push(nil) + suite.Equal(initialLen, suite.l.l.Len(), "pushing nil should not increase the length") +} diff --git a/src/jobservice/common/query/q.go b/src/jobservice/common/query/q.go index 3e123365ca1..33c2068455e 100644 --- a/src/jobservice/common/query/q.go +++ b/src/jobservice/common/query/q.go @@ -38,17 +38,17 @@ const ( ) // ExtraParameters to keep non pagination query parameters -type ExtraParameters map[string]interface{} +type ExtraParameters map[string]any // Set extra parameters -func (ep ExtraParameters) Set(key string, v interface{}) { +func (ep ExtraParameters) Set(key string, v any) { if len(key) > 0 { ep[key] = v } } // Get the extra parameter by key -func (ep ExtraParameters) Get(key string) (interface{}, bool) { +func (ep ExtraParameters) Get(key string) (any, bool) { v, ok := ep[key] return v, ok diff --git a/src/jobservice/common/rds/utils.go b/src/jobservice/common/rds/utils.go index d0901aa559d..f5a473264e1 100644 --- a/src/jobservice/common/rds/utils.go +++ b/src/jobservice/common/rds/utils.go @@ -29,7 +29,7 @@ import ( var ErrNoElements = errors.New("no elements got from the backend") // HmSet sets the properties of hash map -func HmSet(conn redis.Conn, key string, fieldAndValues ...interface{}) error { +func HmSet(conn redis.Conn, key string, fieldAndValues ...any) error { if conn == nil { return errors.New("nil redis connection") } @@ -42,7 +42,7 @@ func HmSet(conn redis.Conn, key string, fieldAndValues ...interface{}) error { return errors.New("no properties specified to do HMSET") } - args := make([]interface{}, 0, len(fieldAndValues)+2) + args := make([]any, 0, len(fieldAndValues)+2) args = append(args, key) args = append(args, fieldAndValues...) @@ -55,7 +55,7 @@ func HmSet(conn redis.Conn, key string, fieldAndValues ...interface{}) error { // HmGet gets values of multiple fields // Values have same order with the provided fields -func HmGet(conn redis.Conn, key string, fields ...interface{}) ([]interface{}, error) { +func HmGet(conn redis.Conn, key string, fields ...any) ([]any, error) { if conn == nil { return nil, errors.New("nil redis connection") } @@ -68,7 +68,7 @@ func HmGet(conn redis.Conn, key string, fields ...interface{}) ([]interface{}, e return nil, errors.New("no fields specified to do HMGET") } - args := make([]interface{}, 0, len(fields)+1) + args := make([]any, 0, len(fields)+1) args = append(args, key) args = append(args, fields...) @@ -111,7 +111,7 @@ func GetZsetByScore(conn redis.Conn, key string, scores []int64) ([]JobScore, er // AcquireLock acquires a redis lock with specified expired time func AcquireLock(conn redis.Conn, lockerKey string, lockerID string, expireTime int64) error { - args := []interface{}{lockerKey, lockerID, "NX", "EX", expireTime} + args := []any{lockerKey, lockerID, "NX", "EX", expireTime} res, err := conn.Do("SET", args...) if err != nil { return err diff --git a/src/jobservice/common/utils/utils_test.go b/src/jobservice/common/utils/utils_test.go index fde4dfad382..f7286376767 100644 --- a/src/jobservice/common/utils/utils_test.go +++ b/src/jobservice/common/utils/utils_test.go @@ -92,7 +92,7 @@ func (suite *UtilsTestSuite) TestJobSerializeAndDeSerialize() { Name: "test", ID: "123", EnqueuedAt: 123, - Args: map[string]interface{}{ + Args: map[string]any{ "test": "test", }, Unique: true, diff --git a/src/jobservice/config/config.go b/src/jobservice/config/config.go index 2fc974a679a..d825f3dd7c5 100644 --- a/src/jobservice/config/config.go +++ b/src/jobservice/config/config.go @@ -123,7 +123,7 @@ type MetricConfig struct { } // CustomizedSettings keeps the customized settings of logger -type CustomizedSettings map[string]interface{} +type CustomizedSettings map[string]any // LogSweeperConfig keeps settings of log sweeper type LogSweeperConfig struct { diff --git a/src/jobservice/core/controller_test.go b/src/jobservice/core/controller_test.go index 81f90141715..257abed03ea 100644 --- a/src/jobservice/core/controller_test.go +++ b/src/jobservice/core/controller_test.go @@ -235,7 +235,7 @@ func (suite *ControllerTestSuite) GetPoolID() string { return suite.worker.GetPoolID() } -func (suite *ControllerTestSuite) RegisterJobs(jobs map[string]interface{}) error { +func (suite *ControllerTestSuite) RegisterJobs(jobs map[string]any) error { return suite.worker.RegisterJobs(jobs) } @@ -255,11 +255,11 @@ func (suite *ControllerTestSuite) Stats() (*worker.Stats, error) { return suite.worker.Stats() } -func (suite *ControllerTestSuite) IsKnownJob(name string) (interface{}, bool) { +func (suite *ControllerTestSuite) IsKnownJob(name string) (any, bool) { return suite.worker.IsKnownJob(name) } -func (suite *ControllerTestSuite) ValidateJobParameters(jobType interface{}, params job.Parameters) error { +func (suite *ControllerTestSuite) ValidateJobParameters(jobType any, params job.Parameters) error { return suite.worker.ValidateJobParameters(jobType, params) } @@ -305,7 +305,7 @@ func (f *fakeWorker) GetPoolID() string { return f.Called().String() } -func (f *fakeWorker) RegisterJobs(jobs map[string]interface{}) error { +func (f *fakeWorker) RegisterJobs(jobs map[string]any) error { return f.Called(jobs).Error(0) } @@ -345,7 +345,7 @@ func (f *fakeWorker) Stats() (*worker.Stats, error) { return args.Get(0).(*worker.Stats), nil } -func (f *fakeWorker) IsKnownJob(name string) (interface{}, bool) { +func (f *fakeWorker) IsKnownJob(name string) (any, bool) { args := f.Called(name) if !args.Bool(1) { return nil, args.Bool(1) @@ -354,7 +354,7 @@ func (f *fakeWorker) IsKnownJob(name string) (interface{}, bool) { return args.Get(0), args.Bool(1) } -func (f *fakeWorker) ValidateJobParameters(jobType interface{}, params job.Parameters) error { +func (f *fakeWorker) ValidateJobParameters(jobType any, params job.Parameters) error { return f.Called(jobType, params).Error(0) } diff --git a/src/jobservice/errs/errors.go b/src/jobservice/errs/errors.go index 3ea1d609988..4e77e9bc9bf 100644 --- a/src/jobservice/errs/errors.go +++ b/src/jobservice/errs/errors.go @@ -191,7 +191,7 @@ type badRequestError struct { } // BadRequestError returns the error of handing bad request case -func BadRequestError(object interface{}) error { +func BadRequestError(object any) error { return badRequestError{ baseError{ Code: BadRequestErrorCode, diff --git a/src/jobservice/job/context.go b/src/jobservice/job/context.go index 1f699e1e0e5..2c399ce0bdc 100644 --- a/src/jobservice/job/context.go +++ b/src/jobservice/job/context.go @@ -40,7 +40,7 @@ type Context interface { // Returns: // The data of the specified context property if have // bool to indicate if the property existing - Get(prop string) (interface{}, bool) + Get(prop string) (any, bool) // SystemContext returns the system context // diff --git a/src/jobservice/job/impl/context.go b/src/jobservice/job/impl/context.go index ed4a0beb6e4..7cd38b00443 100644 --- a/src/jobservice/job/impl/context.go +++ b/src/jobservice/job/impl/context.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "maps" "math" "sync" "time" @@ -44,7 +45,7 @@ type Context struct { // Logger for job logger logger.Interface // other required information - properties map[string]interface{} + properties map[string]any // admin server client cfgMgr libCfg.Manager // job life cycle tracker @@ -58,7 +59,7 @@ func NewContext(sysCtx context.Context, cfgMgr libCfg.Manager) *Context { return &Context{ sysContext: libCfg.NewContext(sysCtx, cfgMgr), cfgMgr: cfgMgr, - properties: make(map[string]interface{}), + properties: make(map[string]any), } } @@ -110,15 +111,13 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { jContext := &Context{ sysContext: orm.NewContext(c.sysContext, o.NewOrm()), cfgMgr: c.cfgMgr, - properties: make(map[string]interface{}), + properties: make(map[string]any), tracker: tracker, } // Copy properties if len(c.properties) > 0 { - for k, v := range c.properties { - jContext.properties[k] = v - } + maps.Copy(jContext.properties, c.properties) } // Refresh config properties @@ -128,9 +127,7 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { } props := c.cfgMgr.GetAll(c.sysContext) - for k, v := range props { - jContext.properties[k] = v - } + maps.Copy(jContext.properties, props) // Set loggers for job c.lock.Lock() @@ -145,7 +142,7 @@ func (c *Context) Build(tracker job.Tracker) (job.Context, error) { } // Get implements the same method in env.JobContext interface -func (c *Context) Get(prop string) (interface{}, bool) { +func (c *Context) Get(prop string) (any, bool) { v, ok := c.properties[prop] return v, ok } @@ -192,17 +189,14 @@ func createLoggers(jobID string) (logger.Interface, error) { // For running job, the depth should be 5 if lc.Name == logger.NameFile || lc.Name == logger.NameStdOutput || lc.Name == logger.NameDB { if lc.Settings == nil { - lc.Settings = map[string]interface{}{} + lc.Settings = map[string]any{} } lc.Settings["depth"] = 5 } if lc.Name == logger.NameFile || lc.Name == logger.NameDB { // Need extra param - fSettings := map[string]interface{}{} - for k, v := range lc.Settings { - // Copy settings - fSettings[k] = v - } + fSettings := map[string]any{} + maps.Copy(fSettings, lc.Settings) if lc.Name == logger.NameFile { // Append file name param fSettings["filename"] = fmt.Sprintf("%s.log", jobID) diff --git a/src/jobservice/job/impl/context_test.go b/src/jobservice/job/impl/context_test.go index 97d1f6b5276..017604a9219 100644 --- a/src/jobservice/job/impl/context_test.go +++ b/src/jobservice/job/impl/context_test.go @@ -62,12 +62,12 @@ func (suite *ContextImplTestSuite) SetupSuite() { { Name: "FILE", Level: "INFO", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 1, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/job/impl/default_context.go b/src/jobservice/job/impl/default_context.go index 9b8da36c7b0..9381d4a4a5b 100644 --- a/src/jobservice/job/impl/default_context.go +++ b/src/jobservice/job/impl/default_context.go @@ -17,6 +17,7 @@ package impl import ( "context" "errors" + "maps" o "github.com/beego/beego/v2/client/orm" @@ -32,7 +33,7 @@ type DefaultContext struct { // Logger for job logger logger.Interface // Other required information - properties map[string]interface{} + properties map[string]any // Track the job attached with the context tracker job.Tracker } @@ -41,7 +42,7 @@ type DefaultContext struct { func NewDefaultContext(sysCtx context.Context) job.Context { return &DefaultContext{ sysContext: sysCtx, - properties: make(map[string]interface{}), + properties: make(map[string]any), } } @@ -56,14 +57,12 @@ func (dc *DefaultContext) Build(t job.Tracker) (job.Context, error) { // TODO support DB transaction sysContext: orm.NewContext(dc.sysContext, o.NewOrm()), tracker: t, - properties: make(map[string]interface{}), + properties: make(map[string]any), } // Copy properties if len(dc.properties) > 0 { - for k, v := range dc.properties { - jContext.properties[k] = v - } + maps.Copy(jContext.properties, dc.properties) } // Set loggers for job @@ -78,7 +77,7 @@ func (dc *DefaultContext) Build(t job.Tracker) (job.Context, error) { } // Get implements the same method in env.Context interface -func (dc *DefaultContext) Get(prop string) (interface{}, bool) { +func (dc *DefaultContext) Get(prop string) (any, bool) { v, ok := dc.properties[prop] return v, ok } diff --git a/src/jobservice/job/impl/gc/garbage_collection.go b/src/jobservice/job/impl/gc/garbage_collection.go index eabe9e80eb4..b63fff7da59 100644 --- a/src/jobservice/job/impl/gc/garbage_collection.go +++ b/src/jobservice/job/impl/gc/garbage_collection.go @@ -299,10 +299,7 @@ func (gc *GarbageCollector) sweep(ctx job.Context) error { blobChunkCount := (total + blobChunkSize - 1) / blobChunkSize blobChunks := make([][]*blobModels.Blob, blobChunkCount) for i, start := 0, 0; i < blobChunkCount; i, start = i+1, start+blobChunkSize { - end := start + blobChunkSize - if end > total { - end = total - } + end := min(start+blobChunkSize, total) blobChunks[i] = gc.deleteSet[start:end] } @@ -536,7 +533,7 @@ func (gc *GarbageCollector) deletedArt(ctx job.Context) (map[string][]model.Arti // handle the optional ones, and the artifact controller will move them into trash. if gc.deleteUntagged { untaggedArts, err := gc.artCtl.List(ctx.SystemContext(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Tags": "nil", }, }, &artifact.Option{WithAccessory: true}) @@ -639,7 +636,7 @@ func (gc *GarbageCollector) markOrSweepUntaggedBlobs(ctx job.Context) ([]*blobMo Min: lastBlobID, } query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "update_time": &timeRG, "projectID": p.ProjectID, "id": &blobRG, diff --git a/src/jobservice/job/impl/gc/garbage_collection_test.go b/src/jobservice/job/impl/gc/garbage_collection_test.go index 5aacd737e7d..b9446b7a705 100644 --- a/src/jobservice/job/impl/gc/garbage_collection_test.go +++ b/src/jobservice/job/impl/gc/garbage_collection_test.go @@ -157,7 +157,7 @@ func (suite *gcTestSuite) TestInit() { gc := &GarbageCollector{ registryCtlClient: suite.registryCtlClient, } - params := map[string]interface{}{ + params := map[string]any{ "delete_untagged": true, "redis_url_reg": "redis url", "time_window": 1, @@ -169,21 +169,21 @@ func (suite *gcTestSuite) TestInit() { suite.True(gc.deleteUntagged) suite.Equal(3, gc.workers) - params = map[string]interface{}{ + params = map[string]any{ "delete_untagged": "unsupported", "redis_url_reg": "redis url", } suite.Nil(gc.init(ctx, params)) suite.True(gc.deleteUntagged) - params = map[string]interface{}{ + params = map[string]any{ "delete_untagged": false, "redis_url_reg": "redis url", } suite.Nil(gc.init(ctx, params)) suite.False(gc.deleteUntagged) - params = map[string]interface{}{ + params = map[string]any{ "redis_url_reg": "redis url", } suite.Nil(gc.init(ctx, params)) @@ -281,7 +281,7 @@ func (suite *gcTestSuite) TestRun() { blobMgr: suite.blobMgr, registryCtlClient: suite.registryCtlClient, } - params := map[string]interface{}{ + params := map[string]any{ "delete_untagged": false, "redis_url_reg": tests.GetRedisURL(), "time_window": 1, diff --git a/src/jobservice/job/impl/gc/util_test.go b/src/jobservice/job/impl/gc/util_test.go index b290aac2ebd..5077a42eb85 100644 --- a/src/jobservice/job/impl/gc/util_test.go +++ b/src/jobservice/job/impl/gc/util_test.go @@ -59,7 +59,7 @@ func TestDelKeys(t *testing.T) { // helper function // mock the data in the redis mock := func(count int, prefix string) { - for i := 0; i < count; i++ { + for i := range count { err = c.Save(context.TODO(), fmt.Sprintf("%s-%d", prefix, i), "", 0) assert.NoError(t, err) } diff --git a/src/jobservice/job/impl/notification/slack_job.go b/src/jobservice/job/impl/notification/slack_job.go index d8fd4b91517..ba4b970b942 100644 --- a/src/jobservice/job/impl/notification/slack_job.go +++ b/src/jobservice/job/impl/notification/slack_job.go @@ -106,7 +106,7 @@ func (sj *SlackJob) Run(ctx job.Context, params job.Parameters) error { } // init slack job -func (sj *SlackJob) init(ctx job.Context, params map[string]interface{}) error { +func (sj *SlackJob) init(ctx job.Context, params map[string]any) error { sj.logger = ctx.GetLogger() // default use secure transport @@ -121,7 +121,7 @@ func (sj *SlackJob) init(ctx job.Context, params map[string]interface{}) error { } // execute slack job -func (sj *SlackJob) execute(params map[string]interface{}) error { +func (sj *SlackJob) execute(params map[string]any) error { payload := params["payload"].(string) address := params["address"].(string) diff --git a/src/jobservice/job/impl/notification/slack_job_test.go b/src/jobservice/job/impl/notification/slack_job_test.go index 883a2b064e4..cfb7c192fc7 100644 --- a/src/jobservice/job/impl/notification/slack_job_test.go +++ b/src/jobservice/job/impl/notification/slack_job_test.go @@ -64,7 +64,7 @@ func TestSlackJobRun(t *testing.T) { assert.Equal(t, string(body), `{"key": "value"}`) })) defer ts.Close() - params := map[string]interface{}{ + params := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": ts.URL, @@ -77,7 +77,7 @@ func TestSlackJobRun(t *testing.T) { w.WriteHeader(http.StatusUnauthorized) })) defer tsWrong.Close() - paramsWrong := map[string]interface{}{ + paramsWrong := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": tsWrong.URL, diff --git a/src/jobservice/job/impl/notification/webhook_job.go b/src/jobservice/job/impl/notification/webhook_job.go index fec8d0eb96f..32dc0c2cc48 100644 --- a/src/jobservice/job/impl/notification/webhook_job.go +++ b/src/jobservice/job/impl/notification/webhook_job.go @@ -82,7 +82,7 @@ func (wj *WebhookJob) Run(ctx job.Context, params job.Parameters) error { } // init webhook job -func (wj *WebhookJob) init(ctx job.Context, params map[string]interface{}) error { +func (wj *WebhookJob) init(ctx job.Context, params map[string]any) error { wj.logger = ctx.GetLogger() wj.ctx = ctx @@ -98,7 +98,7 @@ func (wj *WebhookJob) init(ctx job.Context, params map[string]interface{}) error } // execute webhook job -func (wj *WebhookJob) execute(_ job.Context, params map[string]interface{}) error { +func (wj *WebhookJob) execute(_ job.Context, params map[string]any) error { payload := params["payload"].(string) address := params["address"].(string) diff --git a/src/jobservice/job/impl/notification/webhook_job_test.go b/src/jobservice/job/impl/notification/webhook_job_test.go index 27296124cf0..bc20b3c43ea 100644 --- a/src/jobservice/job/impl/notification/webhook_job_test.go +++ b/src/jobservice/job/impl/notification/webhook_job_test.go @@ -59,7 +59,7 @@ func TestRun(t *testing.T) { assert.Equal(t, string(body), `{"key": "value"}`) })) defer ts.Close() - params := map[string]interface{}{ + params := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": ts.URL, @@ -73,7 +73,7 @@ func TestRun(t *testing.T) { w.WriteHeader(http.StatusUnauthorized) })) defer tsWrong.Close() - paramsWrong := map[string]interface{}{ + paramsWrong := map[string]any{ "skip_cert_verify": true, "payload": `{"key": "value"}`, "address": tsWrong.URL, diff --git a/src/jobservice/job/impl/replication/replication.go b/src/jobservice/job/impl/replication/replication.go index 453fa5e032b..2ef364df959 100644 --- a/src/jobservice/job/impl/replication/replication.go +++ b/src/jobservice/job/impl/replication/replication.go @@ -112,7 +112,7 @@ func (r *Replication) Run(ctx job.Context, params job.Parameters) error { return trans.Transfer(src, dst, opts) } -func parseParams(params map[string]interface{}) (*model.Resource, *model.Resource, *transfer.Options, error) { +func parseParams(params map[string]any) (*model.Resource, *model.Resource, *transfer.Options, error) { src := &model.Resource{} if err := parseParam(params, "src_resource", src); err != nil { return nil, nil, nil, err @@ -158,7 +158,7 @@ func parseParams(params map[string]interface{}) (*model.Resource, *model.Resourc return src, dst, opts, nil } -func parseParam(params map[string]interface{}, name string, v interface{}) error { +func parseParam(params map[string]any, name string, v any) error { value, exist := params[name] if !exist { return fmt.Errorf("param %s not found", name) diff --git a/src/jobservice/job/impl/replication/replication_test.go b/src/jobservice/job/impl/replication/replication_test.go index 90e472e53d6..f43f041d0d7 100644 --- a/src/jobservice/job/impl/replication/replication_test.go +++ b/src/jobservice/job/impl/replication/replication_test.go @@ -26,7 +26,7 @@ import ( ) func TestParseParam(t *testing.T) { - params := map[string]interface{}{} + params := map[string]any{} // not exist param err := parseParam(params, "not_exist_param", nil) assert.NotNil(t, err) @@ -80,7 +80,7 @@ func (f *fakedTransfer) Transfer(src *model.Resource, dst *model.Resource, opts func TestRun(t *testing.T) { err := transfer.RegisterFactory("art", fakedTransferFactory) require.Nil(t, err) - params := map[string]interface{}{ + params := map[string]any{ "src_resource": `{"type":"art"}`, "dst_resource": `{}`, } diff --git a/src/jobservice/job/impl/scandataexport/scan_data_export.go b/src/jobservice/job/impl/scandataexport/scan_data_export.go index 59f84d6c9cd..040593c411e 100644 --- a/src/jobservice/job/impl/scandataexport/scan_data_export.go +++ b/src/jobservice/job/impl/scandataexport/scan_data_export.go @@ -17,6 +17,7 @@ package scandataexport import ( "encoding/json" "fmt" + "maps" "os" "path/filepath" "strconv" @@ -79,7 +80,7 @@ func (sde *ScanDataExport) Validate(_ job.Parameters) error { // The related arguments will be injected by the workerpool. // // ctx Context : Job execution context. -// params map[string]interface{} : parameters with key-pair style for the job execution. +// params map[string]any : parameters with key-pair style for the job execution. // // Returns: // @@ -127,7 +128,7 @@ func (sde *ScanDataExport) Run(ctx job.Context, params job.Parameters) error { logger.Infof("Export Job Id = %s. CSV file size: %d", params[export.JobID], stat.Size()) // earlier return and update status message if the file size is 0, unnecessary to push a empty system artifact. if stat.Size() == 0 { - extra := map[string]interface{}{ + extra := map[string]any{ export.StatusMessageAttribute: "No vulnerabilities found or matched", } updateErr := sde.updateExecAttributes(ctx, params, extra) @@ -148,7 +149,7 @@ func (sde *ScanDataExport) Run(ctx job.Context, params job.Parameters) error { } logger.Infof("Export Job Id = %s. Created system artifact: %v for report file %s to persistent storage: %v", params[export.JobID], artID, fileName, err) - err = sde.updateExecAttributes(ctx, params, map[string]interface{}{export.DigestKey: hash.String()}) + err = sde.updateExecAttributes(ctx, params, map[string]any{export.DigestKey: hash.String()}) if err != nil { logger.Errorf("Export Job Id = %s. Error when updating execution record : %v", params[export.JobID], err) return err @@ -158,7 +159,7 @@ func (sde *ScanDataExport) Run(ctx job.Context, params job.Parameters) error { return nil } -func (sde *ScanDataExport) updateExecAttributes(ctx job.Context, params job.Parameters, attrs map[string]interface{}) error { +func (sde *ScanDataExport) updateExecAttributes(ctx job.Context, params job.Parameters, attrs map[string]any) error { logger := ctx.GetLogger() execID, err := strconv.ParseInt(params[export.JobID].(string), 10, 64) if err != nil { @@ -173,9 +174,8 @@ func (sde *ScanDataExport) updateExecAttributes(ctx job.Context, params job.Para } // copy old extra attrsToUpdate := exec.ExtraAttrs - for k, v := range attrs { - attrsToUpdate[k] = v - } + maps.Copy(attrsToUpdate, attrs) + return sde.execMgr.UpdateExtraAttrs(ctx.SystemContext(), execID, attrsToUpdate) } @@ -295,7 +295,7 @@ func (sde *ScanDataExport) writeCsvFile(ctx job.Context, params job.Parameters, } func (sde *ScanDataExport) extractCriteria(params job.Parameters) (*export.Request, error) { - filterMap, ok := params[export.JobRequest].(map[string]interface{}) + filterMap, ok := params[export.JobRequest].(map[string]any) if !ok { return nil, errors.Errorf("malformed criteria '%v'", params[export.JobRequest]) } diff --git a/src/jobservice/job/impl/scandataexport/scan_data_export_test.go b/src/jobservice/job/impl/scandataexport/scan_data_export_test.go index 60e31dd3c59..df45dd47062 100644 --- a/src/jobservice/job/impl/scandataexport/scan_data_export_test.go +++ b/src/jobservice/job/impl/scandataexport/scan_data_export_test.go @@ -80,7 +80,7 @@ func (suite *ScanDataExportJobTestSuite) TestRun() { mock.OnAnything(suite.filterProcessor, "ProcessTagFilter").Return([]*artifact.Artifact{{Artifact: artpkg.Artifact{ID: 1}}}, nil).Once() mock.OnAnything(suite.filterProcessor, "ProcessLabelFilter").Return([]*artifact.Artifact{{Artifact: artpkg.Artifact{ID: 1}}}, nil).Once() - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil) @@ -88,7 +88,7 @@ func (suite *ScanDataExportJobTestSuite) TestRun() { params := job.Parameters{} params[export.JobModeKey] = export.JobModeExport params["JobId"] = JobId - params["Request"] = map[string]interface{}{ + params["Request"] = map[string]any{ "projects": []int64{1}, } ctx := &mockjobservice.MockJobContext{} @@ -100,11 +100,11 @@ func (suite *ScanDataExportJobTestSuite) TestRun() { }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok && attrsMap[export.JobNameAttribute] == "test-job" && attrsMap[export.UserNameAttribute] == "test-user" }) @@ -119,7 +119,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithEmptyData() { mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil) @@ -132,7 +132,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithEmptyData() { err := suite.job.Run(ctx, params) suite.NoError(err) - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { return attrsMap["status_message"] == "No vulnerabilities found or matched" && attrsMap[export.JobNameAttribute] == "test-job" && attrsMap[export.UserNameAttribute] == "test-user" }) suite.execMgr.AssertCalled(suite.T(), "UpdateExtraAttrs", mock.Anything, ExecID, extraAttrsMatcher) @@ -147,7 +147,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunAttributeUpdateError() { mock.OnAnything(suite.filterProcessor, "ProcessLabelFilter").Return([]*artifact.Artifact{{Artifact: artpkg.Artifact{ID: 1}}}, nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(nil, errors.New("test-error")) @@ -155,7 +155,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunAttributeUpdateError() { params := job.Parameters{} params[export.JobModeKey] = export.JobModeExport params["JobId"] = JobId - params["Request"] = map[string]interface{}{ + params["Request"] = map[string]any{ "projects": []int{1}, } ctx := &mockjobservice.MockJobContext{} @@ -167,11 +167,11 @@ func (suite *ScanDataExportJobTestSuite) TestRunAttributeUpdateError() { }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok && attrsMap[export.JobNameAttribute] == "test-job" && attrsMap[export.UserNameAttribute] == "test-user" }) @@ -189,7 +189,7 @@ func (suite *ScanDataExportJobTestSuite) TestExtractCriteria() { _, err = suite.job.extractCriteria(job.Parameters{"Request": ""}) suite.Error(err) // valid request should not return error and trim space - c, err := suite.job.extractCriteria(job.Parameters{"Request": map[string]interface{}{ + c, err := suite.job.extractCriteria(job.Parameters{"Request": map[string]any{ "CVEIds": "CVE-123, CVE-456 ", "Repositories": " test-repo1 ", "Tags": "test-tag1, test-tag2", @@ -207,7 +207,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -225,7 +225,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -243,11 +243,11 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok }) @@ -271,7 +271,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -287,7 +287,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { Projects: []int64{1}, Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -304,11 +304,11 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteria() { return sa.Repository == "scandata_export_1000000" && sa.Vendor == strings.ToLower(export.Vendor) && sa.Digest == MockDigest }) suite.sysArtifactMgr.AssertCalled(suite.T(), "Create", mock.Anything, sysArtifactRecordMatcher, mock.Anything) - m := make(map[string]interface{}) + m := make(map[string]any) m[export.DigestKey] = MockDigest m[export.CreateTimestampKey] = mock.Anything - extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]interface{}) bool { + extraAttrsMatcher := testifymock.MatchedBy(func(attrsMap map[string]any) bool { _, ok := m[export.CreateTimestampKey] return attrsMap[export.DigestKey] == MockDigest && ok }) @@ -334,7 +334,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -349,7 +349,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -384,7 +384,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -399,7 +399,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdFilte Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -436,7 +436,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -451,7 +451,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} @@ -486,7 +486,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT mock.OnAnything(suite.exportMgr, "Fetch").Return(data, nil).Once() mock.OnAnything(suite.exportMgr, "Fetch").Return(make([]export.Data, 0), nil).Once() mock.OnAnything(suite.digestCalculator, "Calculate").Return(digest.Digest(MockDigest), nil) - execAttrs := make(map[string]interface{}) + execAttrs := make(map[string]any) execAttrs[export.JobNameAttribute] = "test-job" execAttrs[export.UserNameAttribute] = "test-user" mock.OnAnything(suite.execMgr, "Get").Return(&task.Execution{ID: ExecID, ExtraAttrs: execAttrs}, nil).Once() @@ -501,7 +501,7 @@ func (suite *ScanDataExportJobTestSuite) TestRunWithCriteriaForRepositoryIdWithT Repositories: "test-repo", Tags: "test-tag", } - criteriaMap := make(map[string]interface{}) + criteriaMap := make(map[string]any) bytes, _ := json.Marshal(criteria) json.Unmarshal(bytes, &criteriaMap) params := job.Parameters{} diff --git a/src/jobservice/job/interface.go b/src/jobservice/job/interface.go index 6ea1bdad474..37e1edb2bec 100644 --- a/src/jobservice/job/interface.go +++ b/src/jobservice/job/interface.go @@ -45,7 +45,7 @@ type Interface interface { // The related arguments will be injected by the workerpool. // // ctx Context : Job execution context. - // params map[string]interface{} : parameters with key-pair style for the job execution. + // params map[string]any : parameters with key-pair style for the job execution. // // Returns: // error if failed to run. NOTES: If job is stopped or cancelled, a specified error should be returned diff --git a/src/jobservice/job/known_jobs.go b/src/jobservice/job/known_jobs.go index 3572e495716..1bd0ccd7003 100644 --- a/src/jobservice/job/known_jobs.go +++ b/src/jobservice/job/known_jobs.go @@ -14,6 +14,8 @@ package job +import "github.com/goharbor/harbor/src/lib" + // Define the register name constants of known jobs const ( @@ -53,19 +55,19 @@ const ( var ( // executionSweeperCount stores the count for execution retained executionSweeperCount = map[string]int64{ - ImageScanJobVendorType: 1, - SBOMJobVendorType: 1, - ScanAllVendorType: 1, - PurgeAuditVendorType: 10, - ExecSweepVendorType: 10, - GarbageCollectionVendorType: 50, - SlackJobVendorType: 50, - WebhookJobVendorType: 50, - ReplicationVendorType: 50, - ScanDataExportVendorType: 50, - SystemArtifactCleanupVendorType: 50, - P2PPreheatVendorType: 50, - RetentionVendorType: 50, + ImageScanJobVendorType: lib.GetEnvInt64("IMAGE_SCAN_EXECUTION_RETENTION_COUNT", 1), + SBOMJobVendorType: lib.GetEnvInt64("SBOM_EXECUTION_RETENTION_COUNT", 1), + ScanAllVendorType: lib.GetEnvInt64("SCAN_ALL_EXECUTION_RETENTION_COUNT", 1), + PurgeAuditVendorType: lib.GetEnvInt64("PURGE_AUDIT_EXECUTION_RETENTION_COUNT", 10), + ExecSweepVendorType: lib.GetEnvInt64("EXECUTION_SWEEP_EXECUTION_RETENTION_COUNT", 10), + GarbageCollectionVendorType: lib.GetEnvInt64("GARBAGE_COLLECTION_EXECUTION_RETENTION_COUNT", 50), + SlackJobVendorType: lib.GetEnvInt64("SLACK_EXECUTION_RETENTION_COUNT", 50), + WebhookJobVendorType: lib.GetEnvInt64("WEBHOOK_EXECUTION_RETENTION_COUNT", 50), + ReplicationVendorType: lib.GetEnvInt64("REPLICATION_EXECUTION_RETENTION_COUNT", 50), + ScanDataExportVendorType: lib.GetEnvInt64("SCAN_DATA_EXPORT_EXECUTION_RETENTION_COUNT", 50), + SystemArtifactCleanupVendorType: lib.GetEnvInt64("SYSTEM_ARTIFACT_CLEANUP_EXECUTION_RETENTION_COUNT", 50), + P2PPreheatVendorType: lib.GetEnvInt64("P2P_PREHEAT_EXECUTION_RETENTION_COUNT", 50), + RetentionVendorType: lib.GetEnvInt64("RETENTION_EXECUTION_RETENTION_COUNT", 50), } ) diff --git a/src/jobservice/job/models.go b/src/jobservice/job/models.go index 2cd2eb0bc4c..ac633986af3 100644 --- a/src/jobservice/job/models.go +++ b/src/jobservice/job/models.go @@ -24,7 +24,7 @@ import ( ) // Parameters for job execution. -type Parameters map[string]interface{} +type Parameters map[string]any // Request is the request of launching a job. type Request struct { diff --git a/src/jobservice/job/status_test.go b/src/jobservice/job/status_test.go index 22254488397..94f4063a490 100644 --- a/src/jobservice/job/status_test.go +++ b/src/jobservice/job/status_test.go @@ -291,14 +291,14 @@ func TestStatus_Validate(t *testing.T) { { name: "Error status checksum failure", s: Status("error"), - wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + wantErr: func(t assert.TestingT, err error, i ...any) bool { return false }, }, { name: "SuccessStatus check success", s: SuccessStatus, - wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + wantErr: func(t assert.TestingT, err error, i ...any) bool { return true }, }, diff --git a/src/jobservice/job/tracker.go b/src/jobservice/job/tracker.go index c2eeddd4151..7de01e19356 100644 --- a/src/jobservice/job/tracker.go +++ b/src/jobservice/job/tracker.go @@ -61,11 +61,11 @@ type Tracker interface { // Update the properties of the job stats // - // fieldAndValues ...interface{} : One or more properties being updated + // fieldAndValues ...any : One or more properties being updated // // Returns: // error if update failed - Update(fieldAndValues ...interface{}) error + Update(fieldAndValues ...any) error // NumericID returns the numeric ID of periodic job. // Please pay attention, this only for periodic job. @@ -164,7 +164,7 @@ func (bt *basicTracker) Job() *Stats { } // Update the properties of the job stats -func (bt *basicTracker) Update(fieldAndValues ...interface{}) error { +func (bt *basicTracker) Update(fieldAndValues ...any) error { if len(fieldAndValues) == 0 { return errors.New("no properties specified to update") } @@ -175,7 +175,7 @@ func (bt *basicTracker) Update(fieldAndValues ...interface{}) error { }() key := rds.KeyJobStats(bt.namespace, bt.jobID) - args := []interface{}{"update_time", time.Now().Unix()} // update timestamp + args := []any{"update_time", time.Now().Unix()} // update timestamp args = append(args, fieldAndValues...) return rds.HmSet(conn, key, args...) @@ -215,7 +215,7 @@ func (bt *basicTracker) PeriodicExecutionDone() error { _ = conn.Close() }() - args := []interface{}{key, "XX", -1, bt.jobID} + args := []any{key, "XX", -1, bt.jobID} _, err := conn.Do("ZADD", args...) return err @@ -302,7 +302,7 @@ func (bt *basicTracker) Save() (err error) { stats := bt.jobStats key := rds.KeyJobStats(bt.namespace, stats.Info.JobID) - args := make([]interface{}, 0) + args := make([]any, 0) args = append(args, key) args = append(args, "id", stats.Info.JobID, @@ -362,7 +362,7 @@ func (bt *basicTracker) Save() (err error) { // Link with its upstream job if upstream job ID exists for future querying if !utils.IsEmptyStr(stats.Info.UpstreamJobID) { k := rds.KeyUpstreamJobAndExecutions(bt.namespace, stats.Info.UpstreamJobID) - zargs := []interface{}{k, "NX", stats.Info.RunAt, stats.Info.JobID} + zargs := []any{k, "NX", stats.Info.RunAt, stats.Info.JobID} err = conn.Send("ZADD", zargs...) } diff --git a/src/jobservice/lcm/controller.go b/src/jobservice/lcm/controller.go index 0045772e041..9661d44777d 100644 --- a/src/jobservice/lcm/controller.go +++ b/src/jobservice/lcm/controller.go @@ -154,7 +154,7 @@ func (bc *basicController) retryLoop() { }() // Check the list - bc.retryList.Iterate(func(ele interface{}) bool { + bc.retryList.Iterate(func(ele any) bool { if change, ok := ele.(job.SimpleStatusChange); ok { err := retry(conn, bc.namespace, change) if err != nil { diff --git a/src/jobservice/logger/backend/db_logger.go b/src/jobservice/logger/backend/db_logger.go index 3778e6ba4da..162c565c131 100644 --- a/src/jobservice/logger/backend/db_logger.go +++ b/src/jobservice/logger/backend/db_logger.go @@ -71,51 +71,51 @@ func (dbl *DBLogger) Close() error { } // Debug ... -func (dbl *DBLogger) Debug(v ...interface{}) { +func (dbl *DBLogger) Debug(v ...any) { dbl.backendLogger.Debug(v...) } // Debugf with format -func (dbl *DBLogger) Debugf(format string, v ...interface{}) { +func (dbl *DBLogger) Debugf(format string, v ...any) { dbl.backendLogger.Debugf(format, v...) } // Info ... -func (dbl *DBLogger) Info(v ...interface{}) { +func (dbl *DBLogger) Info(v ...any) { dbl.backendLogger.Info(v...) } // Infof with format -func (dbl *DBLogger) Infof(format string, v ...interface{}) { +func (dbl *DBLogger) Infof(format string, v ...any) { dbl.backendLogger.Infof(format, v...) } // Warning ... -func (dbl *DBLogger) Warning(v ...interface{}) { +func (dbl *DBLogger) Warning(v ...any) { dbl.backendLogger.Warning(v...) } // Warningf with format -func (dbl *DBLogger) Warningf(format string, v ...interface{}) { +func (dbl *DBLogger) Warningf(format string, v ...any) { dbl.backendLogger.Warningf(format, v...) } // Error ... -func (dbl *DBLogger) Error(v ...interface{}) { +func (dbl *DBLogger) Error(v ...any) { dbl.backendLogger.Error(v...) } // Errorf with format -func (dbl *DBLogger) Errorf(format string, v ...interface{}) { +func (dbl *DBLogger) Errorf(format string, v ...any) { dbl.backendLogger.Errorf(format, v...) } // Fatal error -func (dbl *DBLogger) Fatal(v ...interface{}) { +func (dbl *DBLogger) Fatal(v ...any) { dbl.backendLogger.Fatal(v...) } // Fatalf error -func (dbl *DBLogger) Fatalf(format string, v ...interface{}) { +func (dbl *DBLogger) Fatalf(format string, v ...any) { dbl.backendLogger.Fatalf(format, v...) } diff --git a/src/jobservice/logger/backend/file_logger.go b/src/jobservice/logger/backend/file_logger.go index bdfcebb5508..af9cd9601ce 100644 --- a/src/jobservice/logger/backend/file_logger.go +++ b/src/jobservice/logger/backend/file_logger.go @@ -54,51 +54,51 @@ func (fl *FileLogger) Close() error { } // Debug ... -func (fl *FileLogger) Debug(v ...interface{}) { +func (fl *FileLogger) Debug(v ...any) { fl.backendLogger.Debug(v...) } // Debugf with format -func (fl *FileLogger) Debugf(format string, v ...interface{}) { +func (fl *FileLogger) Debugf(format string, v ...any) { fl.backendLogger.Debugf(format, v...) } // Info ... -func (fl *FileLogger) Info(v ...interface{}) { +func (fl *FileLogger) Info(v ...any) { fl.backendLogger.Info(v...) } // Infof with format -func (fl *FileLogger) Infof(format string, v ...interface{}) { +func (fl *FileLogger) Infof(format string, v ...any) { fl.backendLogger.Infof(format, v...) } // Warning ... -func (fl *FileLogger) Warning(v ...interface{}) { +func (fl *FileLogger) Warning(v ...any) { fl.backendLogger.Warning(v...) } // Warningf with format -func (fl *FileLogger) Warningf(format string, v ...interface{}) { +func (fl *FileLogger) Warningf(format string, v ...any) { fl.backendLogger.Warningf(format, v...) } // Error ... -func (fl *FileLogger) Error(v ...interface{}) { +func (fl *FileLogger) Error(v ...any) { fl.backendLogger.Error(v...) } // Errorf with format -func (fl *FileLogger) Errorf(format string, v ...interface{}) { +func (fl *FileLogger) Errorf(format string, v ...any) { fl.backendLogger.Errorf(format, v...) } // Fatal error -func (fl *FileLogger) Fatal(v ...interface{}) { +func (fl *FileLogger) Fatal(v ...any) { fl.backendLogger.Fatal(v...) } // Fatalf error -func (fl *FileLogger) Fatalf(format string, v ...interface{}) { +func (fl *FileLogger) Fatalf(format string, v ...any) { fl.backendLogger.Fatalf(format, v...) } diff --git a/src/jobservice/logger/backend/std_logger.go b/src/jobservice/logger/backend/std_logger.go index bbcc1eca49d..6a631b83155 100644 --- a/src/jobservice/logger/backend/std_logger.go +++ b/src/jobservice/logger/backend/std_logger.go @@ -48,51 +48,51 @@ func NewStdOutputLogger(level string, output string, depth int) *StdOutputLogger } // Debug ... -func (sl *StdOutputLogger) Debug(v ...interface{}) { +func (sl *StdOutputLogger) Debug(v ...any) { sl.backendLogger.Debug(v...) } // Debugf with format -func (sl *StdOutputLogger) Debugf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Debugf(format string, v ...any) { sl.backendLogger.Debugf(format, v...) } // Info ... -func (sl *StdOutputLogger) Info(v ...interface{}) { +func (sl *StdOutputLogger) Info(v ...any) { sl.backendLogger.Info(v...) } // Infof with format -func (sl *StdOutputLogger) Infof(format string, v ...interface{}) { +func (sl *StdOutputLogger) Infof(format string, v ...any) { sl.backendLogger.Infof(format, v...) } // Warning ... -func (sl *StdOutputLogger) Warning(v ...interface{}) { +func (sl *StdOutputLogger) Warning(v ...any) { sl.backendLogger.Warning(v...) } // Warningf with format -func (sl *StdOutputLogger) Warningf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Warningf(format string, v ...any) { sl.backendLogger.Warningf(format, v...) } // Error ... -func (sl *StdOutputLogger) Error(v ...interface{}) { +func (sl *StdOutputLogger) Error(v ...any) { sl.backendLogger.Error(v...) } // Errorf with format -func (sl *StdOutputLogger) Errorf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Errorf(format string, v ...any) { sl.backendLogger.Errorf(format, v...) } // Fatal error -func (sl *StdOutputLogger) Fatal(v ...interface{}) { +func (sl *StdOutputLogger) Fatal(v ...any) { sl.backendLogger.Fatal(v...) } // Fatalf error -func (sl *StdOutputLogger) Fatalf(format string, v ...interface{}) { +func (sl *StdOutputLogger) Fatalf(format string, v ...any) { sl.backendLogger.Fatalf(format, v...) } diff --git a/src/jobservice/logger/base.go b/src/jobservice/logger/base.go index 040a435a97f..62be729af5e 100644 --- a/src/jobservice/logger/base.go +++ b/src/jobservice/logger/base.go @@ -71,7 +71,7 @@ func GetLogger(loggerOptions ...Option) (Interface, error) { // Singleton if d.Singleton { - var li interface{} + var li any li, ok = singletons.Load(name) if ok { l = li.(Interface) @@ -200,7 +200,7 @@ func Init(ctx context.Context) error { // For logger of job service itself, the depth should be 6 if lc.Name == NameFile || lc.Name == NameStdOutput { if lc.Settings == nil { - lc.Settings = map[string]interface{}{} + lc.Settings = map[string]any{} } lc.Settings["depth"] = 6 } diff --git a/src/jobservice/logger/base_test.go b/src/jobservice/logger/base_test.go index fd9ddf2895c..6dfea69779b 100644 --- a/src/jobservice/logger/base_test.go +++ b/src/jobservice/logger/base_test.go @@ -1,7 +1,6 @@ package logger import ( - "context" "fmt" "os" "path" @@ -27,7 +26,7 @@ func TestGetLoggerSingleStd(t *testing.T) { l.Debugf("Verify logger testing: %s", "case_1") - lSettings := map[string]interface{}{} + lSettings := map[string]any{} lSettings["output"] = backend.StdErr l, err = GetLogger(BackendOption("STD_OUTPUT", "ERROR", lSettings)) if err != nil { @@ -52,7 +51,7 @@ func TestGetLoggerSingleFile(t *testing.T) { t.Fatalf("expect non nil error when creating file logger with empty settings but got nil error: %s", "case_4") } - lSettings := map[string]interface{}{} + lSettings := map[string]any{} lSettings["base_dir"] = os.TempDir() lSettings["filename"] = fmt.Sprintf("%s.log", fakeJobID) defer func() { @@ -71,7 +70,7 @@ func TestGetLoggerSingleFile(t *testing.T) { // Test getting multi loggers func TestGetLoggersMulti(t *testing.T) { - lSettings := map[string]interface{}{} + lSettings := map[string]any{} lSettings["base_dir"] = os.TempDir() lSettings["filename"] = fmt.Sprintf("%s.log", fakeJobID2) defer func() { @@ -97,8 +96,7 @@ func TestGetLoggersMulti(t *testing.T) { // Test getting sweepers func TestGetSweeper(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() _, err := GetSweeper(ctx) if err == nil { @@ -110,7 +108,7 @@ func TestGetSweeper(t *testing.T) { t.Fatalf("expect non nil error but got nil error when getting sweeper with name 'STD_OUTPUT': %s", "case_8") } - sSettings := map[string]interface{}{} + sSettings := map[string]any{} sSettings["work_dir"] = os.TempDir() s, err := GetSweeper(ctx, SweeperOption("FILE", 5, sSettings)) if err != nil { @@ -136,7 +134,7 @@ func TestGetGetter(t *testing.T) { t.Fatalf("nil interface with nil error should be returned if no log data getter configured: %s", "case_11") } - lSettings := map[string]interface{}{} + lSettings := map[string]any{} _, err = GetLogDataGetter(GetterOption("FILE", lSettings)) if err == nil { t.Fatalf("expect non nil error but got nil one: %s", "case_12") @@ -170,8 +168,7 @@ func TestGetGetter(t *testing.T) { // Test init func TestLoggerInit(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() oldJobLoggerCfg := config.DefaultConfig.JobLoggerConfigs oldLoggerCfg := config.DefaultConfig.LoggerConfigs @@ -184,19 +181,19 @@ func TestLoggerInit(t *testing.T) { { Name: "STD_OUTPUT", Level: "DEBUG", - Settings: map[string]interface{}{ + Settings: map[string]any{ "output": backend.StdErr, }, }, { Name: "FILE", Level: "ERROR", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 5, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/logger/entry.go b/src/jobservice/logger/entry.go index c1f24ff315e..28b18c49a0f 100644 --- a/src/jobservice/logger/entry.go +++ b/src/jobservice/logger/entry.go @@ -33,70 +33,70 @@ func NewEntry(loggers []Interface) *Entry { } // Debug ... -func (e *Entry) Debug(v ...interface{}) { +func (e *Entry) Debug(v ...any) { for _, l := range e.loggers { l.Debug(v...) } } // Debugf with format -func (e *Entry) Debugf(format string, v ...interface{}) { +func (e *Entry) Debugf(format string, v ...any) { for _, l := range e.loggers { l.Debugf(format, v...) } } // Info ... -func (e *Entry) Info(v ...interface{}) { +func (e *Entry) Info(v ...any) { for _, l := range e.loggers { l.Info(v...) } } // Infof with format -func (e *Entry) Infof(format string, v ...interface{}) { +func (e *Entry) Infof(format string, v ...any) { for _, l := range e.loggers { l.Infof(format, v...) } } // Warning ... -func (e *Entry) Warning(v ...interface{}) { +func (e *Entry) Warning(v ...any) { for _, l := range e.loggers { l.Warning(v...) } } // Warningf with format -func (e *Entry) Warningf(format string, v ...interface{}) { +func (e *Entry) Warningf(format string, v ...any) { for _, l := range e.loggers { l.Warningf(format, v...) } } // Error ... -func (e *Entry) Error(v ...interface{}) { +func (e *Entry) Error(v ...any) { for _, l := range e.loggers { l.Error(v...) } } // Errorf with format -func (e *Entry) Errorf(format string, v ...interface{}) { +func (e *Entry) Errorf(format string, v ...any) { for _, l := range e.loggers { l.Errorf(format, v...) } } // Fatal error -func (e *Entry) Fatal(v ...interface{}) { +func (e *Entry) Fatal(v ...any) { for _, l := range e.loggers { l.Fatal(v...) } } // Fatalf error -func (e *Entry) Fatalf(format string, v ...interface{}) { +func (e *Entry) Fatalf(format string, v ...any) { for _, l := range e.loggers { l.Fatalf(format, v...) } diff --git a/src/jobservice/logger/getter/file_getter.go b/src/jobservice/logger/getter/file_getter.go index 1c224de7f26..35763f22890 100644 --- a/src/jobservice/logger/getter/file_getter.go +++ b/src/jobservice/logger/getter/file_getter.go @@ -99,10 +99,8 @@ func tailLogFile(filename string, limit int64) ([]byte, error) { } defer fi.Close() - pos := size - sizeToRead - if pos < 0 { - pos = 0 - } + pos := max(size-sizeToRead, 0) + if pos != 0 { _, err = fi.Seek(pos, 0) if err != nil { diff --git a/src/jobservice/logger/interface.go b/src/jobservice/logger/interface.go index 489db269c31..efc86767187 100644 --- a/src/jobservice/logger/interface.go +++ b/src/jobservice/logger/interface.go @@ -17,32 +17,32 @@ package logger // Interface for logger. type Interface interface { // For debuging - Debug(v ...interface{}) + Debug(v ...any) // For debuging with format - Debugf(format string, v ...interface{}) + Debugf(format string, v ...any) // For logging info - Info(v ...interface{}) + Info(v ...any) // For logging info with format - Infof(format string, v ...interface{}) + Infof(format string, v ...any) // For warning - Warning(v ...interface{}) + Warning(v ...any) // For warning with format - Warningf(format string, v ...interface{}) + Warningf(format string, v ...any) // For logging error - Error(v ...interface{}) + Error(v ...any) // For logging error with format - Errorf(format string, v ...interface{}) + Errorf(format string, v ...any) // For fatal error - Fatal(v ...interface{}) + Fatal(v ...any) // For fatal error with error - Fatalf(format string, v ...interface{}) + Fatalf(format string, v ...any) } diff --git a/src/jobservice/logger/known_loggers.go b/src/jobservice/logger/known_loggers.go index 78e0d575d20..c4d1f57084b 100644 --- a/src/jobservice/logger/known_loggers.go +++ b/src/jobservice/logger/known_loggers.go @@ -16,6 +16,7 @@ package logger import ( "reflect" + "slices" "strings" "github.com/goharbor/harbor/src/jobservice/logger/backend" @@ -89,13 +90,7 @@ func IsKnownLevel(level string) bool { return false } - for _, lvl := range debugLevels { - if lvl == strings.ToUpper(level) { - return true - } - } - - return false + return slices.Contains(debugLevels, strings.ToUpper(level)) } // GetLoggerName return a logger name by Interface diff --git a/src/jobservice/logger/log_data_handler_test.go b/src/jobservice/logger/log_data_handler_test.go index 93665aa0623..0c794815cc6 100644 --- a/src/jobservice/logger/log_data_handler_test.go +++ b/src/jobservice/logger/log_data_handler_test.go @@ -33,12 +33,12 @@ func TestRetrieve(t *testing.T) { { Name: "FILE", Level: "INFO", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 1, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/logger/options.go b/src/jobservice/logger/options.go index e11c1ac29c7..6c2f180e8a4 100644 --- a/src/jobservice/logger/options.go +++ b/src/jobservice/logger/options.go @@ -27,7 +27,7 @@ type Option struct { } // BackendOption creates option for the specified backend. -func BackendOption(name string, level string, settings map[string]interface{}) Option { +func BackendOption(name string, level string, settings map[string]any) Option { return Option{func(op *options) { vals := make([]OptionItem, 0) vals = append(vals, OptionItem{"level", level}) @@ -45,7 +45,7 @@ func BackendOption(name string, level string, settings map[string]interface{}) O } // SweeperOption creates option for the sweeper. -func SweeperOption(name string, duration int, settings map[string]interface{}) Option { +func SweeperOption(name string, duration int, settings map[string]any) Option { return Option{func(op *options) { vals := make([]OptionItem, 0) vals = append(vals, OptionItem{"duration", duration}) @@ -63,7 +63,7 @@ func SweeperOption(name string, duration int, settings map[string]interface{}) O } // GetterOption creates option for the getter. -func GetterOption(name string, settings map[string]interface{}) Option { +func GetterOption(name string, settings map[string]any) Option { return Option{func(op *options) { vals := make([]OptionItem, 0) // Append settings if existing @@ -81,7 +81,7 @@ func GetterOption(name string, settings map[string]interface{}) Option { // OptionItem is a simple wrapper of property and value type OptionItem struct { field string - val interface{} + val any } // Field returns name of the option @@ -108,6 +108,6 @@ func (o *OptionItem) String() string { } // Raw returns the raw value -func (o *OptionItem) Raw() interface{} { +func (o *OptionItem) Raw() any { return o.val } diff --git a/src/jobservice/logger/service.go b/src/jobservice/logger/service.go index e194ad90bd7..17dbf6959eb 100644 --- a/src/jobservice/logger/service.go +++ b/src/jobservice/logger/service.go @@ -29,7 +29,7 @@ func jobServiceLogger() (Interface, bool) { } // Debug ... -func Debug(v ...interface{}) { +func Debug(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Debug(v...) } else { @@ -38,7 +38,7 @@ func Debug(v ...interface{}) { } // Debugf for debuging with format -func Debugf(format string, v ...interface{}) { +func Debugf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Debugf(format, v...) } else { @@ -47,7 +47,7 @@ func Debugf(format string, v ...interface{}) { } // Info ... -func Info(v ...interface{}) { +func Info(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Info(v...) } else { @@ -56,7 +56,7 @@ func Info(v ...interface{}) { } // Infof for logging info with format -func Infof(format string, v ...interface{}) { +func Infof(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Infof(format, v...) } else { @@ -65,7 +65,7 @@ func Infof(format string, v ...interface{}) { } // Warning ... -func Warning(v ...interface{}) { +func Warning(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Warning(v...) } else { @@ -74,7 +74,7 @@ func Warning(v ...interface{}) { } // Warningf for warning with format -func Warningf(format string, v ...interface{}) { +func Warningf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Warningf(format, v...) } else { @@ -83,7 +83,7 @@ func Warningf(format string, v ...interface{}) { } // Error for logging error -func Error(v ...interface{}) { +func Error(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Error(v...) } else { @@ -92,7 +92,7 @@ func Error(v ...interface{}) { } // Errorf for logging error with format -func Errorf(format string, v ...interface{}) { +func Errorf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Errorf(format, v...) } else { @@ -101,7 +101,7 @@ func Errorf(format string, v ...interface{}) { } // Fatal ... -func Fatal(v ...interface{}) { +func Fatal(v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Fatal(v...) } else { @@ -110,7 +110,7 @@ func Fatal(v ...interface{}) { } // Fatalf for fatal error with error -func Fatalf(format string, v ...interface{}) { +func Fatalf(format string, v ...any) { if jLogger, ok := jobServiceLogger(); ok { jLogger.Fatalf(format, v...) } else { diff --git a/src/jobservice/mgt/manager.go b/src/jobservice/mgt/manager.go index e28b8bf5057..a3bfdde25a7 100644 --- a/src/jobservice/mgt/manager.go +++ b/src/jobservice/mgt/manager.go @@ -129,7 +129,7 @@ func (bm *basicManager) GetJobs(q *query.Parameter) ([]*job.Stats, int64, error) } pattern := rds.KeyJobStats(bm.namespace, "*") - args := []interface{}{cursor, "MATCH", pattern, "COUNT", count} + args := []any{cursor, "MATCH", pattern, "COUNT", count} conn := bm.pool.Get() defer func() { @@ -148,7 +148,7 @@ func (bm *basicManager) GetJobs(q *query.Parameter) ([]*job.Stats, int64, error) if err != nil { return nil, 0, err } - list := values[1].([]interface{}) + list := values[1].([]any) results := make([]*job.Stats, 0) for _, v := range list { @@ -226,8 +226,8 @@ func (bm *basicManager) GetPeriodicExecution(pID string, q *query.Parameter) (re return results, total, nil } - min, max := (pageNumber-1)*pageSize, pageNumber*pageSize-1 - args := []interface{}{key, min, max} + minVal, maxVal := (pageNumber-1)*pageSize, pageNumber*pageSize-1 + args := []any{key, minVal, maxVal} list, err := redis.Values(conn.Do("ZREVRANGE", args...)) if err != nil { return nil, 0, err @@ -334,7 +334,7 @@ func queryExecutions(conn redis.Conn, dataKey string, q *query.Parameter) ([]str } offset := (pageNumber - 1) * pageSize - args := []interface{}{dataKey, "+inf", 0, "LIMIT", offset, pageSize} + args := []any{dataKey, "+inf", 0, "LIMIT", offset, pageSize} eIDs, err := redis.Values(conn.Do("ZREVRANGEBYSCORE", args...)) if err != nil { diff --git a/src/jobservice/mgt/manager_test.go b/src/jobservice/mgt/manager_test.go index 0f67f1adc52..10e705c8e23 100644 --- a/src/jobservice/mgt/manager_test.go +++ b/src/jobservice/mgt/manager_test.go @@ -138,7 +138,7 @@ func (suite *BasicManagerTestSuite) TestGetPeriodicExecutions() { // TestGetScheduledJobs tests get scheduled jobs func (suite *BasicManagerTestSuite) TestGetScheduledJobs() { enqueuer := work.NewEnqueuer(suite.namespace, suite.pool) - scheduledJob, err := enqueuer.EnqueueIn(job.SampleJob, 1000, make(map[string]interface{})) + scheduledJob, err := enqueuer.EnqueueIn(job.SampleJob, 1000, make(map[string]any)) require.NoError(suite.T(), err) stats := &job.Stats{ Info: &job.StatsInfo{ diff --git a/src/jobservice/mgt/mock_manager.go b/src/jobservice/mgt/mock_manager.go index c8834f44d24..13774e57bf5 100644 --- a/src/jobservice/mgt/mock_manager.go +++ b/src/jobservice/mgt/mock_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package mgt diff --git a/src/jobservice/migration/manager_test.go b/src/jobservice/migration/manager_test.go index 62021786b2b..3517ea2b734 100644 --- a/src/jobservice/migration/manager_test.go +++ b/src/jobservice/migration/manager_test.go @@ -69,7 +69,7 @@ func (suite *ManagerTestSuite) SetupTest() { id := utils.MakeIdentifier() suite.jobID = id // Mock stats of periodic job - args := []interface{}{ + args := []any{ rds.KeyJobStats(suite.namespace, id), "status_hook", "http://core:8080/hook", @@ -101,10 +101,10 @@ func (suite *ManagerTestSuite) SetupTest() { require.Equal(suite.T(), "ok", strings.ToLower(reply), "ok expected") // Mock periodic job policy object - params := make(map[string]interface{}) + params := make(map[string]any) params["redis_url_reg"] = "redis://redis:6379/1" - policy := make(map[string]interface{}) + policy := make(map[string]any) policy["job_name"] = jobNameGarbageCollection policy["job_params"] = params policy["cron_spec"] = "0 0 17 * * *" @@ -118,7 +118,7 @@ func (suite *ManagerTestSuite) SetupTest() { score := time.Now().Unix() suite.numbericID = score - zaddArgs := []interface{}{ + zaddArgs := []any{ rds.KeyPeriodicPolicy(suite.namespace), score, rawJSON, @@ -130,7 +130,7 @@ func (suite *ManagerTestSuite) SetupTest() { require.Equal(suite.T(), 2, count) // Mock key score mapping - keyScoreArgs := []interface{}{ + keyScoreArgs := []any{ fmt.Sprintf("%s%s", rds.KeyNamespacePrefix(suite.namespace), "period:key_score"), score, id, @@ -181,7 +181,7 @@ func (suite *ManagerTestSuite) TestManager() { assert.NoError(suite.T(), err, "check existence of key score mapping error") assert.Equal(suite.T(), 0, count) - hmGetArgs := []interface{}{ + hmGetArgs := []any{ rds.KeyJobStats(suite.namespace, suite.jobID), "id", "status", diff --git a/src/jobservice/migration/migrator_v180.go b/src/jobservice/migration/migrator_v180.go index 2d935001707..1a1f4f56150 100644 --- a/src/jobservice/migration/migrator_v180.go +++ b/src/jobservice/migration/migrator_v180.go @@ -84,7 +84,7 @@ func (pm *PolicyMigrator) Migrate() error { return errors.Wrap(err, "get job stats list error") } - args := []interface{}{ + args := []any{ "id_placeholder", "id", "kind", @@ -126,7 +126,7 @@ func (pm *PolicyMigrator) Migrate() error { logger.Errorf("send command MULTI failed with error: %s", err) continue } - setArgs := []interface{}{ + setArgs := []any{ fullID, "status", job.ScheduledStatus.String(), // make sure the status of periodic job is "Scheduled" @@ -146,7 +146,7 @@ func (pm *PolicyMigrator) Migrate() error { } // Remove useless fields - rmArgs := []interface{}{ + rmArgs := []any{ fullID, "status_hook", "multiple_executions", @@ -210,7 +210,7 @@ func (pm *PolicyMigrator) Migrate() error { // getAllJobStatsIDs get all the IDs of the existing jobs func getAllJobStatsIDs(conn redis.Conn, ns string) ([]string, error) { pattern := rds.KeyJobStats(ns, "*") - args := []interface{}{ + args := []any{ 0, "MATCH", pattern, @@ -218,7 +218,7 @@ func getAllJobStatsIDs(conn redis.Conn, ns string) ([]string, error) { 100, } - allFullIDs := make([]interface{}, 0) + allFullIDs := make([]any, 0) for { // Use SCAN to iterate the IDs @@ -232,7 +232,7 @@ func getAllJobStatsIDs(conn redis.Conn, ns string) ([]string, error) { return nil, errors.Errorf("Invalid result returned for the SCAN command: %#v", values) } - if fullIDs, ok := values[1].([]interface{}); ok { + if fullIDs, ok := values[1].([]any); ok { allFullIDs = append(allFullIDs, fullIDs...) } @@ -301,7 +301,7 @@ func getPeriodicPolicy(numericID int64, conn redis.Conn, ns string) (*period.Pol // Clear the duplicated policy entries for the job "IMAGE_GC" and "IMAGE_SCAN_ALL" func clearDuplicatedPolicies(conn redis.Conn, ns string) error { - hash := make(map[string]interface{}) + hash := make(map[string]any) bytes, err := redis.Values(conn.Do("ZREVRANGE", rds.KeyPeriodicPolicy(ns), 0, -1, "WITHSCORES")) if err != nil { @@ -362,7 +362,7 @@ func delScoreZset(conn redis.Conn, ns string) { } } -func toString(v interface{}) string { +func toString(v any) string { if v == nil { return "" } @@ -374,7 +374,7 @@ func toString(v interface{}) string { return "" } -func toInt(v interface{}) int64 { +func toInt(v any) int64 { if v == nil { return -1 } diff --git a/src/jobservice/period/basic_scheduler.go b/src/jobservice/period/basic_scheduler.go index c3190c35444..d3be53756c8 100644 --- a/src/jobservice/period/basic_scheduler.go +++ b/src/jobservice/period/basic_scheduler.go @@ -241,7 +241,7 @@ func (bs *basicScheduler) clearDirtyJobs() { // Get relevant executions for the periodic job func getPeriodicExecutions(conn redis.Conn, key string) ([]string, error) { - args := []interface{}{key, 0, "+inf"} + args := []any{key, 0, "+inf"} list, err := redis.Values(conn.Do("ZRANGEBYSCORE", args...)) if err != nil { diff --git a/src/jobservice/period/basic_scheduler_test.go b/src/jobservice/period/basic_scheduler_test.go index c983d4d6ffa..af47473d209 100644 --- a/src/jobservice/period/basic_scheduler_test.go +++ b/src/jobservice/period/basic_scheduler_test.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -154,7 +154,7 @@ func (suite *BasicSchedulerTestSuite) setupDirtyJobs() { ID: "jid", // Already expired EnqueuedAt: time.Now().Unix() - 86400, - Args: map[string]interface{}{"image": "sample:latest"}, + Args: map[string]any{"image": "sample:latest"}, } rawJSON, err := utils.SerializeJob(j) diff --git a/src/jobservice/period/enqueuer.go b/src/jobservice/period/enqueuer.go index ff53f017fb6..ee2f9f87533 100644 --- a/src/jobservice/period/enqueuer.go +++ b/src/jobservice/period/enqueuer.go @@ -17,6 +17,7 @@ package period import ( "context" "fmt" + "maps" "math/rand" "time" @@ -303,9 +304,7 @@ func cloneParameters(params job.Parameters, epoch int64) job.Parameters { p := make(job.Parameters) // Clone parameters to a new param map - for k, v := range params { - p[k] = v - } + maps.Copy(p, params) p[PeriodicExecutionMark] = fmt.Sprintf("%d", epoch) diff --git a/src/jobservice/period/mock_scheduler.go b/src/jobservice/period/mock_scheduler.go index 4452ae43896..990c03d2313 100644 --- a/src/jobservice/period/mock_scheduler.go +++ b/src/jobservice/period/mock_scheduler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package period diff --git a/src/jobservice/period/policy_store.go b/src/jobservice/period/policy_store.go index 37ced53579b..f4790e2fcc5 100644 --- a/src/jobservice/period/policy_store.go +++ b/src/jobservice/period/policy_store.go @@ -31,12 +31,12 @@ import ( type Policy struct { // Policy can be treated as job template of periodic job. // The info of policy will be copied into the scheduled job executions for the periodic job. - ID string `json:"id"` - JobName string `json:"job_name"` - CronSpec string `json:"cron_spec"` - JobParameters map[string]interface{} `json:"job_params,omitempty"` - WebHookURL string `json:"web_hook_url,omitempty"` - NumericID int64 `json:"numeric_id,omitempty"` + ID string `json:"id"` + JobName string `json:"job_name"` + CronSpec string `json:"cron_spec"` + JobParameters map[string]any `json:"job_params,omitempty"` + WebHookURL string `json:"web_hook_url,omitempty"` + NumericID int64 `json:"numeric_id,omitempty"` } // Serialize the policy to raw data. diff --git a/src/jobservice/runner/redis.go b/src/jobservice/runner/redis.go index 5237e634843..3520610639f 100644 --- a/src/jobservice/runner/redis.go +++ b/src/jobservice/runner/redis.go @@ -42,13 +42,13 @@ const ( // RedisJob is a job wrapper to wrap the job.Interface to the style which can be recognized by the redis worker. type RedisJob struct { - job interface{} // the real job implementation + job any // the real job implementation context *env.Context // context ctl lcm.Controller // life cycle controller } // NewRedisJob is constructor of RedisJob -func NewRedisJob(job interface{}, ctx *env.Context, ctl lcm.Controller) *RedisJob { +func NewRedisJob(job any, ctx *env.Context, ctl lcm.Controller) *RedisJob { return &RedisJob{ job: job, context: ctx, diff --git a/src/jobservice/runner/redis_test.go b/src/jobservice/runner/redis_test.go index 21e79538a1b..f1bf419c204 100644 --- a/src/jobservice/runner/redis_test.go +++ b/src/jobservice/runner/redis_test.go @@ -120,19 +120,19 @@ func (suite *RedisRunnerTestSuite) TestJobWrapper() { { Name: "STD_OUTPUT", Level: "DEBUG", - Settings: map[string]interface{}{ + Settings: map[string]any{ "output": backend.StdErr, }, }, { Name: "FILE", Level: "ERROR", - Settings: map[string]interface{}{ + Settings: map[string]any{ "base_dir": os.TempDir(), }, Sweeper: &config.LogSweeperConfig{ Duration: 5, - Settings: map[string]interface{}{ + Settings: map[string]any{ "work_dir": os.TempDir(), }, }, diff --git a/src/jobservice/runner/wrapper.go b/src/jobservice/runner/wrapper.go index a076fbffee2..ebdf1dd5634 100644 --- a/src/jobservice/runner/wrapper.go +++ b/src/jobservice/runner/wrapper.go @@ -21,7 +21,7 @@ import ( ) // Wrap returns a new job.Interface based on the wrapped job handler reference. -func Wrap(j interface{}) job.Interface { +func Wrap(j any) job.Interface { theType := reflect.TypeOf(j) if theType.Kind() == reflect.Ptr { diff --git a/src/jobservice/runtime/bootstrap.go b/src/jobservice/runtime/bootstrap.go index 4e356523f43..1ff97a4ef75 100644 --- a/src/jobservice/runtime/bootstrap.go +++ b/src/jobservice/runtime/bootstrap.go @@ -312,7 +312,7 @@ func (bs *Bootstrap) loadAndRunRedisWorkerPool( // Register jobs here if err := redisWorker.RegisterJobs( - map[string]interface{}{ + map[string]any{ // Only for debugging and testing purpose job.SampleJob: (*sample.Job)(nil), // Functional jobs diff --git a/src/jobservice/sync/schedule.go b/src/jobservice/sync/schedule.go index 67ef3ede94f..8a87ff5ff4d 100644 --- a/src/jobservice/sync/schedule.go +++ b/src/jobservice/sync/schedule.go @@ -362,7 +362,7 @@ func (w *Worker) validate() error { func (w *Worker) getTask(ctx context.Context, schedule *scheduler.Schedule) (*task.Task, error) { // Get associated execution first. executions, err := w.coreExecutionManager.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "vendor_type": scheduler.JobNameScheduler, "vendor_id": schedule.ID, }, @@ -379,7 +379,7 @@ func (w *Worker) getTask(ctx context.Context, schedule *scheduler.Schedule) (*ta theOne := executions[0] // Now get the execution. tasks, err := w.coreTaskManager.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "execution_id": theOne.ID, }, }) diff --git a/src/jobservice/sync/schedule_test.go b/src/jobservice/sync/schedule_test.go index fae1d6611bc..23610aeb8cf 100644 --- a/src/jobservice/sync/schedule_test.go +++ b/src/jobservice/sync/schedule_test.go @@ -81,7 +81,7 @@ func (suite *WorkerTestSuite) SetupSuite() { // The missing schedule in database. tte := &tt.ExecutionManager{} tte.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "vendor_type": scheduler.JobNameScheduler, "vendor_id": (int64)(550), }, @@ -93,7 +93,7 @@ func (suite *WorkerTestSuite) SetupSuite() { ttm := &tt.Manager{} ttm.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "execution_id": (int64)(1550), }, }).Return([]*task.Task{ diff --git a/src/jobservice/worker/cworker/c_worker.go b/src/jobservice/worker/cworker/c_worker.go index 130cd099ea9..b87071a6c73 100644 --- a/src/jobservice/worker/cworker/c_worker.go +++ b/src/jobservice/worker/cworker/c_worker.go @@ -154,7 +154,7 @@ func (w *basicWorker) Start() error { logger.Infof("Basic worker is started") // Start the reaper - w.knownJobs.Range(func(k interface{}, _ interface{}) bool { + w.knownJobs.Range(func(k any, _ any) bool { w.reaper.jobTypes = append(w.reaper.jobTypes, k.(string)) return true @@ -171,7 +171,7 @@ func (w *basicWorker) GetPoolID() string { } // RegisterJobs is used to register multiple jobs to worker. -func (w *basicWorker) RegisterJobs(jobs map[string]interface{}) error { +func (w *basicWorker) RegisterJobs(jobs map[string]any) error { if len(jobs) == 0 { // Do nothing return nil @@ -374,12 +374,12 @@ func (w *basicWorker) RetryJob(_ string) error { } // IsKnownJob ... -func (w *basicWorker) IsKnownJob(name string) (interface{}, bool) { +func (w *basicWorker) IsKnownJob(name string) (any, bool) { return w.knownJobs.Load(name) } // ValidateJobParameters ... -func (w *basicWorker) ValidateJobParameters(jobType interface{}, params job.Parameters) error { +func (w *basicWorker) ValidateJobParameters(jobType any, params job.Parameters) error { if jobType == nil { return errors.New("nil job type") } @@ -390,7 +390,7 @@ func (w *basicWorker) ValidateJobParameters(jobType interface{}, params job.Para // RegisterJob is used to register the job to the worker. // j is the type of job -func (w *basicWorker) registerJob(name string, j interface{}) (err error) { +func (w *basicWorker) registerJob(name string, j any) (err error) { if utils.IsEmptyStr(name) || j == nil { return errors.New("job can not be registered with empty name or nil interface") } @@ -406,7 +406,7 @@ func (w *basicWorker) registerJob(name string, j interface{}) (err error) { } // Same job implementation can be only registered with one name - w.knownJobs.Range(func(jName interface{}, jInList interface{}) bool { + w.knownJobs.Range(func(jName any, jInList any) bool { jobImpl := reflect.TypeOf(j).String() if reflect.TypeOf(jInList).String() == jobImpl { err = errors.Errorf("job %s has been already registered with name %s", jobImpl, jName) diff --git a/src/jobservice/worker/cworker/c_worker_test.go b/src/jobservice/worker/cworker/c_worker_test.go index c1faa7acd23..488679a7f54 100644 --- a/src/jobservice/worker/cworker/c_worker_test.go +++ b/src/jobservice/worker/cworker/c_worker_test.go @@ -78,7 +78,7 @@ func (suite *CWorkerTestSuite) SetupSuite() { ) suite.cWorker = NewWorker(envCtx, suite.namespace, 5, suite.pool, suite.lcmCtl) - err := suite.cWorker.RegisterJobs(map[string]interface{}{ + err := suite.cWorker.RegisterJobs(map[string]any{ "fake_job": (*fakeJob)(nil), "fake_long_run_job": (*fakeLongRunJob)(nil), }) @@ -110,7 +110,7 @@ func (suite *CWorkerTestSuite) TestRegisterJobs() { _, ok := suite.cWorker.IsKnownJob("fake_job") assert.EqualValues(suite.T(), true, ok, "expected known job but registering 'fake_job' appears to have failed") - params := make(map[string]interface{}) + params := make(map[string]any) params["name"] = "testing:v1" err := suite.cWorker.ValidateJobParameters((*fakeJob)(nil), params) assert.NoError(suite.T(), err, "validate parameters: nil error expected but got %s", err) @@ -184,7 +184,7 @@ func (suite *CWorkerTestSuite) TestWorkerStats() { // TestStopJob test stop job func (suite *CWorkerTestSuite) TestStopJob() { // Stop generic job - params := make(map[string]interface{}) + params := make(map[string]any) params["name"] = "testing:v1" genericJob, err := suite.cWorker.Enqueue("fake_long_run_job", params, false, "") diff --git a/src/jobservice/worker/cworker/de_duplicator.go b/src/jobservice/worker/cworker/de_duplicator.go index b02fe2b0079..091ee55594a 100644 --- a/src/jobservice/worker/cworker/de_duplicator.go +++ b/src/jobservice/worker/cworker/de_duplicator.go @@ -83,7 +83,7 @@ func (rdd *redisDeDuplicator) MustUnique(jobName string, params job.Parameters) _ = conn.Close() }() - args := []interface{}{ + args := []any{ uniqueKey, 1, "NX", @@ -127,7 +127,7 @@ func (rdd *redisDeDuplicator) DelUniqueSign(jobName string, params job.Parameter } // Same key with upstream framework -func redisKeyUniqueJob(namespace, jobName string, args map[string]interface{}) (string, error) { +func redisKeyUniqueJob(namespace, jobName string, args map[string]any) (string, error) { var buf bytes.Buffer buf.WriteString(rds.KeyNamespacePrefix(namespace)) diff --git a/src/jobservice/worker/cworker/de_duplicator_test.go b/src/jobservice/worker/cworker/de_duplicator_test.go index f91b08b1d01..ec6ec468d0a 100644 --- a/src/jobservice/worker/cworker/de_duplicator_test.go +++ b/src/jobservice/worker/cworker/de_duplicator_test.go @@ -23,7 +23,7 @@ func TestDeDuplicatorTestSuite(t *testing.T) { // TestDeDuplicator ... func (suite *DeDuplicatorTestSuite) TestDeDuplicator() { jobName := "fake_job" - jobParams := map[string]interface{}{ + jobParams := map[string]any{ "image": "ubuntu:latest", } diff --git a/src/jobservice/worker/cworker/reaper.go b/src/jobservice/worker/cworker/reaper.go index 601a9e6d021..8a6102b775e 100644 --- a/src/jobservice/worker/cworker/reaper.go +++ b/src/jobservice/worker/cworker/reaper.go @@ -250,7 +250,7 @@ func (r *reaper) scanLocks(key string, handler func(k string, v int64) error) er return errors.Wrap(err, "scan locks") } - if values, ok := reply[1].([]interface{}); ok { + if values, ok := reply[1].([]any); ok { for i := 0; i < len(values); i += 2 { k := string(values[i].([]uint8)) lc, err := strconv.ParseInt(string(values[i+1].([]uint8)), 10, 64) @@ -317,7 +317,7 @@ func (r *reaper) getCurrentWorkerPools() (map[string]bool, error) { func (r *reaper) requeueInProgressJobs(poolID string, jobTypes []string) error { numKeys := len(jobTypes) redisRequeueScript := rds.RedisLuaReenqueueScript(numKeys) - var scriptArgs = make([]interface{}, 0, numKeys+1) + var scriptArgs = make([]any, 0, numKeys+1) for _, jobType := range jobTypes { // pops from in progress, push into job queue and decrement the queue lock diff --git a/src/jobservice/worker/cworker/reaper_test.go b/src/jobservice/worker/cworker/reaper_test.go index 873a0bd38d4..51e939832f2 100644 --- a/src/jobservice/worker/cworker/reaper_test.go +++ b/src/jobservice/worker/cworker/reaper_test.go @@ -163,11 +163,11 @@ func (suite *ReaperTestSuite) TestSyncOutdatedStats() { } func mockJobData() (string, error) { - j := make(map[string]interface{}) + j := make(map[string]any) j["name"] = job.SampleJob j["id"] = utils.MakeIdentifier() j["t"] = time.Now().Unix() - args := make(map[string]interface{}) + args := make(map[string]any) j["args"] = args args["image"] = "test suite" @@ -193,7 +193,7 @@ func mockJobStats(conn redis.Conn, ns string, jid string) error { return err } - args := []interface{}{ + args := []any{ sk, "id", jid, "status", job.RunningStatus.String(), diff --git a/src/jobservice/worker/interface.go b/src/jobservice/worker/interface.go index 064b3ca9dbc..cf7a7cce982 100644 --- a/src/jobservice/worker/interface.go +++ b/src/jobservice/worker/interface.go @@ -26,11 +26,11 @@ type Interface interface { // Register multiple jobs. // - // jobs map[string]interface{}: job map, key is job name and value is job handler. + // jobs map[string]any: job map, key is job name and value is job handler. // // Return: // error if failed to register - RegisterJobs(jobs map[string]interface{}) error + RegisterJobs(jobs map[string]any) error // Get the worker pool ID // @@ -88,19 +88,19 @@ type Interface interface { // name string : name of job // // Returns: - // interface{} : the job type of the known job if it's existing + // any : the job type of the known job if it's existing // bool : if the known job requires parameters - IsKnownJob(name string) (interface{}, bool) + IsKnownJob(name string) (any, bool) // Validate the parameters of the known job // - // jobType interface{} : type of known job - // params map[string]interface{} : parameters of known job + // jobType any : type of known job + // params map[string]any : parameters of known job // // Return: // error if parameters are not valid - ValidateJobParameters(jobType interface{}, params job.Parameters) error + ValidateJobParameters(jobType any, params job.Parameters) error // Stop the job // diff --git a/src/lib/cache/cache.go b/src/lib/cache/cache.go index 910d2edd965..d1780757e37 100644 --- a/src/lib/cache/cache.go +++ b/src/lib/cache/cache.go @@ -60,13 +60,13 @@ type Cache interface { Delete(ctx context.Context, key string) error // Fetch retrieve the cached key value - Fetch(ctx context.Context, key string, value interface{}) error + Fetch(ctx context.Context, key string, value any) error // Ping ping the cache Ping(ctx context.Context) error // Save cache the value by key - Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error + Save(ctx context.Context, key string, value any, expiration ...time.Duration) error // Scan scans the keys matched by match string // NOTICE: memory cache does not support use wildcard, compared by strings.Contains diff --git a/src/lib/cache/codec.go b/src/lib/cache/codec.go index 3a5d34a2239..1abb15bd91a 100644 --- a/src/lib/cache/codec.go +++ b/src/lib/cache/codec.go @@ -21,10 +21,10 @@ import ( // Codec codec interface for cache type Codec interface { // Encode returns the encoded byte array of v. - Encode(v interface{}) ([]byte, error) + Encode(v any) ([]byte, error) // Decode analyzes the encoded data and stores the result into the v. - Decode(data []byte, v interface{}) error + Decode(data []byte, v any) error } var ( @@ -34,11 +34,11 @@ var ( type msgpackCodec struct{} -func (*msgpackCodec) Encode(v interface{}) ([]byte, error) { +func (*msgpackCodec) Encode(v any) ([]byte, error) { return msgpack.Marshal(v) } -func (*msgpackCodec) Decode(data []byte, v interface{}) error { +func (*msgpackCodec) Decode(data []byte, v any) error { return msgpack.Unmarshal(data, v) } diff --git a/src/lib/cache/codec_test.go b/src/lib/cache/codec_test.go index 3d2fae29df9..37fc07bcc76 100644 --- a/src/lib/cache/codec_test.go +++ b/src/lib/cache/codec_test.go @@ -19,7 +19,7 @@ import ( ) func BenchmarkDefaultCodecEncode(b *testing.B) { - for i := 0; i < b.N; i++ { + for b.Loop() { codec.Encode("abcdefghigklmopqrztuvwxyz") } } @@ -27,7 +27,7 @@ func BenchmarkDefaultCodecEncode(b *testing.B) { func BenchmarkDefaultCodecDecode(b *testing.B) { data := []byte("abcdefghigklmopqrztuvwxyz") - for i := 0; i < b.N; i++ { + for b.Loop() { var str string codec.Decode(data, &str) } diff --git a/src/lib/cache/helper.go b/src/lib/cache/helper.go index 4ff7eb4d051..b0f6b143f12 100644 --- a/src/lib/cache/helper.go +++ b/src/lib/cache/helper.go @@ -30,7 +30,7 @@ var ( // FetchOrSave retrieves the value for the key if present in the cache. // Otherwise, it saves the value from the builder and retrieves the value for the key again. -func FetchOrSave(ctx context.Context, c Cache, key string, value interface{}, builder func() (interface{}, error), expiration ...time.Duration) error { +func FetchOrSave(ctx context.Context, c Cache, key string, value any, builder func() (any, error), expiration ...time.Duration) error { err := c.Fetch(ctx, key, value) // value found from the cache if err == nil { diff --git a/src/lib/cache/helper_test.go b/src/lib/cache/helper_test.go index 1aed1d719c6..bc903c75608 100644 --- a/src/lib/cache/helper_test.go +++ b/src/lib/cache/helper_test.go @@ -46,7 +46,7 @@ func (suite *FetchOrSaveTestSuite) TestFetchInternalError() { mock.OnAnything(c, "Fetch").Return(fmt.Errorf("oops")) var str string - err := FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + err := FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return "str", nil }) @@ -59,7 +59,7 @@ func (suite *FetchOrSaveTestSuite) TestBuildError() { mock.OnAnything(c, "Fetch").Return(ErrNotFound) var str string - err := FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + err := FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return nil, fmt.Errorf("oops") }) @@ -73,7 +73,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveError() { mock.OnAnything(c, "Save").Return(fmt.Errorf("oops")) var str string - err := FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + err := FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return "str", nil }) @@ -86,7 +86,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { var data sync.Map - mock.OnAnything(c, "Fetch").Return(func(ctx context.Context, key string, value interface{}) error { + mock.OnAnything(c, "Fetch").Return(func(ctx context.Context, key string, value any) error { _, ok := data.Load(key) if ok { return nil @@ -95,7 +95,7 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { return ErrNotFound }) - mock.OnAnything(c, "Save").Return(func(ctx context.Context, key string, value interface{}, exp ...time.Duration) error { + mock.OnAnything(c, "Save").Return(func(ctx context.Context, key string, value any, exp ...time.Duration) error { data.Store(key, value) return nil @@ -103,14 +103,14 @@ func (suite *FetchOrSaveTestSuite) TestSaveCalledOnlyOneTime() { var wg sync.WaitGroup - for i := 0; i < 1000; i++ { + for range 1000 { wg.Add(1) go func() { defer wg.Done() var str string - FetchOrSave(suite.ctx, c, "key", &str, func() (interface{}, error) { + FetchOrSave(suite.ctx, c, "key", &str, func() (any, error) { return "str", nil }) }() diff --git a/src/lib/cache/memory/memory.go b/src/lib/cache/memory/memory.go index 6af6d9f060f..85979cb3e39 100644 --- a/src/lib/cache/memory/memory.go +++ b/src/lib/cache/memory/memory.go @@ -66,7 +66,7 @@ func (c *Cache) Delete(_ context.Context, key string) error { } // Fetch retrieve the cached key value -func (c *Cache) Fetch(ctx context.Context, key string, value interface{}) error { +func (c *Cache) Fetch(ctx context.Context, key string, value any) error { v, ok := c.storage.Load(c.opts.Key(key)) if !ok { return cache.ErrNotFound @@ -94,7 +94,7 @@ func (c *Cache) Ping(_ context.Context) error { } // Save cache the value by key -func (c *Cache) Save(_ context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (c *Cache) Save(_ context.Context, key string, value any, expiration ...time.Duration) error { data, err := c.opts.Codec.Encode(value) if err != nil { return fmt.Errorf("failed to encode value, key %s, error: %v", key, err) @@ -120,7 +120,7 @@ func (c *Cache) Save(_ context.Context, key string, value interface{}, expiratio // Scan scans the keys matched by match string func (c *Cache) Scan(_ context.Context, match string) (cache.Iterator, error) { var keys []string - c.storage.Range(func(k, v interface{}) bool { + c.storage.Range(func(k, v any) bool { matched := true if match != "" { matched = strings.Contains(k.(string), match) diff --git a/src/lib/cache/memory/memory_test.go b/src/lib/cache/memory/memory_test.go index 883045b5cc6..1d665293b7b 100644 --- a/src/lib/cache/memory/memory_test.go +++ b/src/lib/cache/memory/memory_test.go @@ -66,9 +66,9 @@ func (suite *CacheTestSuite) TestDelete() { func (suite *CacheTestSuite) TestFetch() { key := "fetch" - suite.cache.Save(suite.ctx, key, map[string]interface{}{"name": "harbor", "version": "1.10"}) + suite.cache.Save(suite.ctx, key, map[string]any{"name": "harbor", "version": "1.10"}) - mp := map[string]interface{}{} + mp := map[string]any{} suite.cache.Fetch(suite.ctx, key, &mp) suite.Len(mp, 2) suite.Equal("harbor", mp["name"]) @@ -112,14 +112,14 @@ func (suite *CacheTestSuite) TestPing() { func (suite *CacheTestSuite) TestScan() { seed := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Save(suite.ctx, key, "") suite.NoError(err) } } clean := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Delete(suite.ctx, key) suite.NoError(err) diff --git a/src/lib/cache/mock_cache_test.go b/src/lib/cache/mock_cache_test.go index 0d81418841e..32be255f6d4 100644 --- a/src/lib/cache/mock_cache_test.go +++ b/src/lib/cache/mock_cache_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cache diff --git a/src/lib/cache/redis/redis.go b/src/lib/cache/redis/redis.go index b2f7f7a4774..cadd44b7725 100644 --- a/src/lib/cache/redis/redis.go +++ b/src/lib/cache/redis/redis.go @@ -52,7 +52,7 @@ func (c *Cache) Delete(ctx context.Context, key string) error { } // Fetch retrieve the cached key value -func (c *Cache) Fetch(ctx context.Context, key string, value interface{}) error { +func (c *Cache) Fetch(ctx context.Context, key string, value any) error { data, err := c.Client.Get(ctx, c.opts.Key(key)).Bytes() if err != nil { // convert internal or Timeout error to be ErrNotFound @@ -78,7 +78,7 @@ func (c *Cache) Ping(ctx context.Context) error { } // Save cache the value by key -func (c *Cache) Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (c *Cache) Save(ctx context.Context, key string, value any, expiration ...time.Duration) error { data, err := c.opts.Codec.Encode(value) if err != nil { return errors.Errorf("failed to encode value, key %s, error: %v", key, err) diff --git a/src/lib/cache/redis/redis_test.go b/src/lib/cache/redis/redis_test.go index 17b6616ef37..c4e35befb9a 100644 --- a/src/lib/cache/redis/redis_test.go +++ b/src/lib/cache/redis/redis_test.go @@ -66,9 +66,9 @@ func (suite *CacheTestSuite) TestDelete() { func (suite *CacheTestSuite) TestFetch() { key := "fetch" - suite.cache.Save(suite.ctx, key, map[string]interface{}{"name": "harbor", "version": "1.10"}) + suite.cache.Save(suite.ctx, key, map[string]any{"name": "harbor", "version": "1.10"}) - mp := map[string]interface{}{} + mp := map[string]any{} suite.cache.Fetch(suite.ctx, key, &mp) suite.Len(mp, 2) suite.Equal("harbor", mp["name"]) @@ -112,14 +112,14 @@ func (suite *CacheTestSuite) TestPing() { func (suite *CacheTestSuite) TestScan() { seed := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Save(suite.ctx, key, "") suite.NoError(err) } } clean := func(n int) { - for i := 0; i < n; i++ { + for i := range n { key := fmt.Sprintf("test-scan-%d", i) err := suite.cache.Delete(suite.ctx, key) suite.NoError(err) diff --git a/src/lib/cache/util.go b/src/lib/cache/util.go index 412bfde514d..c66b9ca35da 100644 --- a/src/lib/cache/util.go +++ b/src/lib/cache/util.go @@ -22,7 +22,7 @@ type keyMutex struct { m *sync.Map } -func (km keyMutex) Lock(key interface{}) { +func (km keyMutex) Lock(key any) { m := sync.Mutex{} act, _ := km.m.LoadOrStore(key, &m) @@ -34,7 +34,7 @@ func (km keyMutex) Lock(key interface{}) { } } -func (km keyMutex) Unlock(key interface{}) { +func (km keyMutex) Unlock(key any) { act, exist := km.m.Load(key) if !exist { panic("unlock of unlocked mutex") diff --git a/src/lib/cache/util_test.go b/src/lib/cache/util_test.go index f3e046b99aa..aa09582d4da 100644 --- a/src/lib/cache/util_test.go +++ b/src/lib/cache/util_test.go @@ -26,7 +26,7 @@ func TestKeyMutex(t *testing.T) { key := "key" var wg sync.WaitGroup - for i := 0; i < 100; i++ { + for range 100 { wg.Add(1) go func() { diff --git a/src/lib/config/config.go b/src/lib/config/config.go index 0755b597392..ce1d5766a1e 100644 --- a/src/lib/config/config.go +++ b/src/lib/config/config.go @@ -45,13 +45,13 @@ var ( // Manager defines the operation for config type Manager interface { Load(ctx context.Context) error - Set(ctx context.Context, key string, value interface{}) + Set(ctx context.Context, key string, value any) Save(ctx context.Context) error Get(ctx context.Context, key string) *metadata.ConfigureValue - UpdateConfig(ctx context.Context, cfgs map[string]interface{}) error - GetUserCfgs(ctx context.Context) map[string]interface{} - ValidateCfg(ctx context.Context, cfgs map[string]interface{}) error - GetAll(ctx context.Context) map[string]interface{} + UpdateConfig(ctx context.Context, cfgs map[string]any) error + GetUserCfgs(ctx context.Context) map[string]any + ValidateCfg(ctx context.Context, cfgs map[string]any) error + GetAll(ctx context.Context) map[string]any GetDatabaseCfg() *comModels.Database } @@ -98,7 +98,7 @@ func Init() { // InitWithSettings init config with predefined configs, and optionally overwrite the keyprovider // need to import following package before calling it // _ "github.com/goharbor/harbor/src/pkg/config/inmemory" -func InitWithSettings(cfgs map[string]interface{}, kp ...encrypt.KeyProvider) { +func InitWithSettings(cfgs map[string]any, kp ...encrypt.KeyProvider) { Init() DefaultCfgManager = common.InMemoryCfgManager mgr := DefaultMgr() @@ -122,6 +122,6 @@ func Load(ctx context.Context) error { } // Upload save all configurations, used by testing -func Upload(cfg map[string]interface{}) error { +func Upload(cfg map[string]any) error { return DefaultMgr().UpdateConfig(orm.Context(), cfg) } diff --git a/src/lib/config/metadata/type.go b/src/lib/config/metadata/type.go index 1bb6ea28b32..d43a481ae82 100644 --- a/src/lib/config/metadata/type.go +++ b/src/lib/config/metadata/type.go @@ -31,7 +31,7 @@ type Type interface { // validate the configure value validate(str string) error // get the real type of current value, if it is int, return int, if it is string return string etc. - get(str string) (interface{}, error) + get(str string) (any, error) } // StringType ... @@ -42,7 +42,7 @@ func (t *StringType) validate(_ string) error { return nil } -func (t *StringType) get(str string) (interface{}, error) { +func (t *StringType) get(str string) (any, error) { return str, nil } @@ -95,7 +95,7 @@ func (t *IntType) validate(str string) error { return err } -func (t *IntType) get(str string) (interface{}, error) { +func (t *IntType) get(str string) (any, error) { return parseInt(str) } @@ -145,7 +145,7 @@ func (t *Int64Type) validate(str string) error { return err } -func (t *Int64Type) get(str string) (interface{}, error) { +func (t *Int64Type) get(str string) (any, error) { return parseInt64(str) } @@ -156,7 +156,7 @@ func (f *Float64Type) validate(str string) error { return err } -func (f *Float64Type) get(str string) (interface{}, error) { +func (f *Float64Type) get(str string) (any, error) { return parseFloat64(str) } @@ -169,7 +169,7 @@ func (t *BoolType) validate(str string) error { return err } -func (t *BoolType) get(str string) (interface{}, error) { +func (t *BoolType) get(str string) (any, error) { return strconv.ParseBool(str) } @@ -181,7 +181,7 @@ func (t *PasswordType) validate(_ string) error { return nil } -func (t *PasswordType) get(str string) (interface{}, error) { +func (t *PasswordType) get(str string) (any, error) { return str, nil } @@ -190,13 +190,13 @@ type MapType struct { } func (t *MapType) validate(str string) error { - result := map[string]interface{}{} + result := map[string]any{} err := json.Unmarshal([]byte(str), &result) return err } -func (t *MapType) get(str string) (interface{}, error) { - result := map[string]interface{}{} +func (t *MapType) get(str string) (any, error) { + result := map[string]any{} err := json.Unmarshal([]byte(str), &result) return result, err } @@ -211,7 +211,7 @@ func (t *StringToStringMapType) validate(str string) error { return err } -func (t *StringToStringMapType) get(str string) (interface{}, error) { +func (t *StringToStringMapType) get(str string) (any, error) { result := map[string]string{} err := json.Unmarshal([]byte(str), &result) return result, err @@ -244,7 +244,7 @@ func (t *DurationType) validate(str string) error { return err } -func (t *DurationType) get(str string) (interface{}, error) { +func (t *DurationType) get(str string) (any, error) { // should not parse the duration to avoid duplicate parse. return str, nil } diff --git a/src/lib/config/metadata/type_test.go b/src/lib/config/metadata/type_test.go index a96f7b8452e..285e103efb1 100644 --- a/src/lib/config/metadata/type_test.go +++ b/src/lib/config/metadata/type_test.go @@ -95,7 +95,7 @@ func TestMapType_validate(t *testing.T) { func TestMapType_get(t *testing.T) { test := &MapType{} result, _ := test.get(`{"sample":"abc", "another":"welcome"}`) - assert.Equal(t, map[string]interface{}{"sample": "abc", "another": "welcome"}, result) + assert.Equal(t, map[string]any{"sample": "abc", "another": "welcome"}, result) } func TestStringToStringMapType_validate(t *testing.T) { diff --git a/src/lib/config/metadata/value.go b/src/lib/config/metadata/value.go index 82876d5bacd..0677b95b343 100644 --- a/src/lib/config/metadata/value.go +++ b/src/lib/config/metadata/value.go @@ -169,8 +169,8 @@ func (c *ConfigureValue) GetDuration() time.Duration { return 0 } -// GetAnyType get the interface{} of current value -func (c *ConfigureValue) GetAnyType() (interface{}, error) { +// GetAnyType get the any of current value +func (c *ConfigureValue) GetAnyType() (any, error) { if item, ok := Instance().GetByName(c.Name); ok { return item.ItemType.get(c.Value) } diff --git a/src/lib/config/metadata/value_test.go b/src/lib/config/metadata/value_test.go index 2f2c745714e..26d9c2af49d 100644 --- a/src/lib/config/metadata/value_test.go +++ b/src/lib/config/metadata/value_test.go @@ -58,7 +58,7 @@ func TestConfigureValue_GetStringToStringMap(t *testing.T) { if err != nil { t.Error(err) } - assert.Equal(t, val, map[string]interface{}{"sample": "abc"}) + assert.Equal(t, val, map[string]any{"sample": "abc"}) Instance().init() } diff --git a/src/lib/config/models/model.go b/src/lib/config/models/model.go index e1a7c9c64b6..d913ad34e8c 100644 --- a/src/lib/config/models/model.go +++ b/src/lib/config/models/model.go @@ -70,8 +70,8 @@ func (ce *ConfigEntry) TableName() string { // Value ... type Value struct { - Val interface{} `json:"value"` - Editable bool `json:"editable"` + Val any `json:"value"` + Editable bool `json:"editable"` } // LdapConf holds information about ldap configuration diff --git a/src/lib/config/test/userconfig_test.go b/src/lib/config/test/userconfig_test.go index d7922ea6d2e..4fcc5f268d4 100644 --- a/src/lib/config/test/userconfig_test.go +++ b/src/lib/config/test/userconfig_test.go @@ -41,7 +41,7 @@ func TestConfig(t *testing.T) { test.InitDatabaseFromEnv() dao.PrepareTestData([]string{"delete from properties where k='scan_all_policy'"}, []string{}) defaultCACertPath = path.Join(currPath(), "test", "ca.crt") - c := map[string]interface{}{ + c := map[string]any{ common.WithTrivy: false, } Init() @@ -68,7 +68,7 @@ func TestConfig(t *testing.T) { t.Fatalf("failed to load configurations: %v", err) } - if err := Upload(map[string]interface{}{}); err != nil { + if err := Upload(map[string]any{}); err != nil { t.Fatalf("failed to upload configurations: %v", err) } @@ -225,7 +225,7 @@ pkgODrJUf0p5dhcnLyA2nZolRV1rtwlgJstnEV4JpG1MwtmAZYZUilLvnfpVxTtA y1bQusZMygQezfCuEzsewF+OpANFovCTUEs6s5vyoVNP8lk= -----END CERTIFICATE----- ` - m := map[string]interface{}{ + m := map[string]any{ common.HTTPAuthProxySkipSearch: "true", common.HTTPAuthProxyVerifyCert: "true", common.HTTPAuthProxyAdminGroups: "group1, group2", @@ -246,7 +246,7 @@ y1bQusZMygQezfCuEzsewF+OpANFovCTUEs6s5vyoVNP8lk= } func TestOIDCSetting(t *testing.T) { - m := map[string]interface{}{ + m := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://oidc.test", common.OIDCVerifyCert: "true", diff --git a/src/lib/config/userconfig.go b/src/lib/config/userconfig.go index 93806999ef4..99f41658ef9 100644 --- a/src/lib/config/userconfig.go +++ b/src/lib/config/userconfig.go @@ -28,7 +28,7 @@ import ( // It contains all user related configurations, each of user related settings requires a context provided // GetSystemCfg returns the all configurations -func GetSystemCfg(ctx context.Context) (map[string]interface{}, error) { +func GetSystemCfg(ctx context.Context) (map[string]any, error) { sysCfg := DefaultMgr().GetAll(ctx) if len(sysCfg) == 0 { return nil, errors.New("can not load system config, the database might be down") @@ -220,7 +220,7 @@ func RobotPrefix(ctx context.Context) string { // SplitAndTrim ... func SplitAndTrim(s, sep string) []string { res := make([]string, 0) - for _, s := range strings.Split(s, sep) { + for s := range strings.SplitSeq(s, sep) { if e := strings.TrimSpace(s); len(e) > 0 { res = append(res, e) } @@ -269,8 +269,7 @@ func AuditLogEventEnabled(ctx context.Context, eventType string) bool { return true } disableListStr := DefaultMgr().Get(ctx, common.AuditLogEventsDisabled).GetString() - disableList := strings.Split(disableListStr, ",") - for _, t := range disableList { + for t := range strings.SplitSeq(disableListStr, ",") { tName := strings.TrimSpace(t) if strings.EqualFold(tName, eventType) { return false diff --git a/src/lib/context.go b/src/lib/context.go index 24ef00451c6..3a241a88f59 100644 --- a/src/lib/context.go +++ b/src/lib/context.go @@ -41,14 +41,14 @@ type ArtifactInfo struct { BlobMountDigest string } -func setToContext(ctx context.Context, key contextKey, value interface{}) context.Context { +func setToContext(ctx context.Context, key contextKey, value any) context.Context { if ctx == nil { ctx = context.Background() } return context.WithValue(ctx, key, value) } -func getFromContext(ctx context.Context, key contextKey) interface{} { +func getFromContext(ctx context.Context, key contextKey) any { if ctx == nil { return nil } diff --git a/src/lib/convert_types.go b/src/lib/convert_types.go index 994a998b085..24a8b513043 100644 --- a/src/lib/convert_types.go +++ b/src/lib/convert_types.go @@ -43,7 +43,7 @@ func StringValue(v *string) string { } // ToBool convert interface to bool -func ToBool(v interface{}) bool { +func ToBool(v any) bool { switch b := v.(type) { case bool: return b diff --git a/src/lib/convert_types_test.go b/src/lib/convert_types_test.go index 08a9e9f2d44..c75f0c90721 100644 --- a/src/lib/convert_types_test.go +++ b/src/lib/convert_types_test.go @@ -20,7 +20,7 @@ import ( func TestToBool(t *testing.T) { type args struct { - v interface{} + v any } tests := []struct { name string diff --git a/src/lib/encrypt/encrypt.go b/src/lib/encrypt/encrypt.go index f8e7beaf734..58babd3b595 100644 --- a/src/lib/encrypt/encrypt.go +++ b/src/lib/encrypt/encrypt.go @@ -37,7 +37,7 @@ type Encryptor interface { // AESEncryptor uses AES to encrypt or decrypt string type AESEncryptor struct { keyProvider KeyProvider - keyParams map[string]interface{} + keyParams map[string]any } // NewAESEncryptor returns an instance of an AESEncryptor diff --git a/src/lib/encrypt/keyprovider.go b/src/lib/encrypt/keyprovider.go index da938a7fb50..b7c3303df92 100644 --- a/src/lib/encrypt/keyprovider.go +++ b/src/lib/encrypt/keyprovider.go @@ -20,7 +20,7 @@ import "os" type KeyProvider interface { // Get returns the key // params can be used to pass parameters in different implements - Get(params map[string]interface{}) (string, error) + Get(params map[string]any) (string, error) } // FileKeyProvider reads key from file @@ -37,7 +37,7 @@ func NewFileKeyProvider(path string) KeyProvider { } // Get returns the key read from file -func (f *FileKeyProvider) Get(_ map[string]interface{}) (string, error) { +func (f *FileKeyProvider) Get(_ map[string]any) (string, error) { b, err := os.ReadFile(f.path) if err != nil { return "", err @@ -51,6 +51,6 @@ type PresetKeyProvider struct { } // Get ... -func (p *PresetKeyProvider) Get(_ map[string]interface{}) (string, error) { +func (p *PresetKeyProvider) Get(_ map[string]any) (string, error) { return p.Key, nil } diff --git a/src/lib/env.go b/src/lib/env.go new file mode 100644 index 00000000000..1c3b2f53092 --- /dev/null +++ b/src/lib/env.go @@ -0,0 +1,35 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package lib + +import ( + "os" + "strconv" +) + +// GetEnvInt64 reads an environment variable and converts it to an int64, returning the default value if not set or invalid. +func GetEnvInt64(envKey string, defaultValue int64) int64 { + value := os.Getenv(envKey) + if value == "" { + return defaultValue + } + + intValue, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return defaultValue + } + + return intValue +} diff --git a/src/lib/env_test.go b/src/lib/env_test.go new file mode 100644 index 00000000000..45b772cb068 --- /dev/null +++ b/src/lib/env_test.go @@ -0,0 +1,83 @@ +package lib + +import ( + "os" + "testing" +) + +func TestGetEnvInt64(t *testing.T) { + tests := []struct { + name string + envKey string + envValue string + defaultValue int64 + setEnv bool + expectedValue int64 + }{ + { + name: "env set with valid value", + envKey: "TEST_ENV", + envValue: "100", + defaultValue: 50, + setEnv: true, + expectedValue: 100, + }, + { + name: "env not set", + envKey: "UNSET_ENV", + envValue: "", + defaultValue: 50, + setEnv: false, + expectedValue: 50, + }, + { + name: "env set with invalid value", + envKey: "INVALID_ENV", + envValue: "not_a_number", + defaultValue: 50, + setEnv: true, + expectedValue: 50, + }, + { + name: "env set with zero", + envKey: "ZERO_ENV", + envValue: "0", + defaultValue: 50, + setEnv: true, + expectedValue: 0, + }, + { + name: "env set with negative value", + envKey: "NEGATIVE_ENV", + envValue: "-10", + defaultValue: 50, + setEnv: true, + expectedValue: -10, + }, + { + name: "env set with large value", + envKey: "LARGE_ENV", + envValue: "9223372036854775807", + defaultValue: 50, + setEnv: true, + expectedValue: 9223372036854775807, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.setEnv { + os.Setenv(tt.envKey, tt.envValue) + } else { + os.Unsetenv(tt.envKey) + } + + result := GetEnvInt64(tt.envKey, tt.defaultValue) + if result != tt.expectedValue { + t.Errorf("GetEnvInt64(%q, %d) = %d; want %d", tt.envKey, tt.defaultValue, result, tt.expectedValue) + } + + os.Unsetenv(tt.envKey) + }) + } +} diff --git a/src/lib/errors/errors.go b/src/lib/errors/errors.go index 71d1074b258..dbf100d2a20 100644 --- a/src/lib/errors/errors.go +++ b/src/lib/errors/errors.go @@ -64,7 +64,7 @@ func (e *Error) MarshalJSON() ([]byte, error) { } // WithMessagef ... -func (e *Error) WithMessagef(format string, v ...interface{}) *Error { +func (e *Error) WithMessagef(format string, v ...any) *Error { e.Message = fmt.Sprintf(format, v...) return e } @@ -132,7 +132,7 @@ func NewErrs(err error) Errors { } // New ... -func New(in interface{}) *Error { +func New(in any) *Error { var err error switch in := in.(type) { case error: @@ -161,7 +161,7 @@ func Wrap(err error, message string) *Error { } // Wrapf ... -func Wrapf(err error, format string, args ...interface{}) *Error { +func Wrapf(err error, format string, args ...any) *Error { if err == nil { return nil } @@ -174,7 +174,7 @@ func Wrapf(err error, format string, args ...interface{}) *Error { } // Errorf ... -func Errorf(format string, args ...interface{}) *Error { +func Errorf(format string, args ...any) *Error { return &Error{ Message: fmt.Sprintf(format, args...), Stack: newStack(), diff --git a/src/lib/gtask/pool_test.go b/src/lib/gtask/pool_test.go index be9b857c22c..7f8944499ed 100644 --- a/src/lib/gtask/pool_test.go +++ b/src/lib/gtask/pool_test.go @@ -27,7 +27,7 @@ func TestAddTask(t *testing.T) { taskNum := 3 taskInterval := time.Duration(0) - for i := 0; i < taskNum; i++ { + for i := range taskNum { fn := func(ctx context.Context) { t.Logf("Task %d is running...", i) } @@ -64,8 +64,7 @@ func TestStartAndStop(t *testing.T) { pool.tasks = []*task{t1, t2} - ctx1, cancel1 := context.WithCancel(context.Background()) - defer cancel1() + ctx1 := t.Context() pool.Start(ctx1) // Let it run for a bit diff --git a/src/lib/json_copy.go b/src/lib/json_copy.go index b7cf4a57fc4..9b6e22ef369 100644 --- a/src/lib/json_copy.go +++ b/src/lib/json_copy.go @@ -21,7 +21,7 @@ import ( // JSONCopy copy from src to dst with json marshal and unmarshal. // NOTE: copy from one struct to another struct may miss some values depend on // the json tag in the fields, you should know what will happened when call this function. -func JSONCopy(dst, src interface{}) error { +func JSONCopy(dst, src any) error { data, err := json.Marshal(src) if err != nil { return err diff --git a/src/lib/json_copy_test.go b/src/lib/json_copy_test.go index 4ada47dfee4..c3e15eb80cf 100644 --- a/src/lib/json_copy_test.go +++ b/src/lib/json_copy_test.go @@ -29,7 +29,7 @@ func TestJSONCopy(t *testing.T) { assert := assert.New(t) { - var m map[string]interface{} + var m map[string]any foo := &jsonCopyFoo{ Name: "foo", Age: 1, @@ -42,7 +42,7 @@ func TestJSONCopy(t *testing.T) { } { - var m map[string]interface{} + var m map[string]any var foo *jsonCopyFoo assert.Nil(m) @@ -51,7 +51,7 @@ func TestJSONCopy(t *testing.T) { } { - m := map[string]interface{}{ + m := map[string]any{ "name": "foo", "age": 1, } diff --git a/src/lib/link.go b/src/lib/link.go index 450f2e6683b..b97b2081574 100644 --- a/src/lib/link.go +++ b/src/lib/link.go @@ -54,11 +54,11 @@ func (l Links) String() string { // e.g. ; rel="previous"; title="previous chapter" , ; rel="next"; title="next chapter" func ParseLinks(str string) Links { var links Links - for _, lk := range strings.Split(str, ",") { + for lk := range strings.SplitSeq(str, ",") { link := &Link{ Attrs: map[string]string{}, } - for _, attr := range strings.Split(lk, ";") { + for attr := range strings.SplitSeq(lk, ";") { attr = strings.TrimSpace(attr) if len(attr) == 0 { continue diff --git a/src/lib/log/logger.go b/src/lib/log/logger.go index 88a52e198e6..b36c47a16e7 100644 --- a/src/lib/log/logger.go +++ b/src/lib/log/logger.go @@ -17,6 +17,7 @@ package log import ( "fmt" "io" + "maps" "os" "runtime" "sort" @@ -46,8 +47,8 @@ func init() { logger.setLevel(level) } -// Fields type alias to map[string]interface{} -type Fields = map[string]interface{} +// Fields type alias to map[string]any +type Fields = map[string]any // Logger provides a struct with fields that describe the details of logger. type Logger struct { @@ -56,14 +57,14 @@ type Logger struct { lvl Level callDepth int skipLine bool - fields map[string]interface{} + fields map[string]any fieldsStr string mu *sync.Mutex // ptr here to share one sync.Mutex for clone method fallback *Logger // fallback logger when current out fail } // New returns a customized Logger -func New(out io.Writer, fmtter Formatter, lvl Level, options ...interface{}) *Logger { +func New(out io.Writer, fmtter Formatter, lvl Level, options ...any) *Logger { // Default set to be 3 depth := 3 // If passed in as option, then reset depth @@ -80,7 +81,7 @@ func New(out io.Writer, fmtter Formatter, lvl Level, options ...interface{}) *Lo fmtter: fmtter, lvl: lvl, callDepth: depth, - fields: map[string]interface{}{}, + fields: map[string]any{}, mu: &sync.Mutex{}, } } @@ -121,13 +122,9 @@ func (l *Logger) WithFields(fields Fields) *Logger { r := l.clone() if len(fields) > 0 { - copyFields := make(map[string]interface{}, len(l.fields)+len(fields)) - for key, value := range l.fields { - copyFields[key] = value - } - for key, value := range fields { - copyFields[key] = value - } + copyFields := make(map[string]any, len(l.fields)+len(fields)) + maps.Copy(copyFields, l.fields) + maps.Copy(copyFields, fields) sortedKeys := make([]string, 0, len(copyFields)) for key := range copyFields { @@ -148,7 +145,7 @@ func (l *Logger) WithFields(fields Fields) *Logger { } // WithField returns cloned logger which fields merged with field key=value -func (l *Logger) WithField(key string, value interface{}) *Logger { +func (l *Logger) WithField(key string, value any) *Logger { return l.WithFields(Fields{key: value}) } @@ -196,7 +193,7 @@ func (l *Logger) output(record *Record) (err error) { } // Debug ... -func (l *Logger) Debug(v ...interface{}) { +func (l *Logger) Debug(v ...any) { if l.lvl <= DebugLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), DebugLevel) _ = l.output(record) @@ -204,7 +201,7 @@ func (l *Logger) Debug(v ...interface{}) { } // Debugf ... -func (l *Logger) Debugf(format string, v ...interface{}) { +func (l *Logger) Debugf(format string, v ...any) { if l.lvl <= DebugLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), DebugLevel) _ = l.output(record) @@ -212,7 +209,7 @@ func (l *Logger) Debugf(format string, v ...interface{}) { } // Info ... -func (l *Logger) Info(v ...interface{}) { +func (l *Logger) Info(v ...any) { if l.lvl <= InfoLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), InfoLevel) _ = l.output(record) @@ -220,7 +217,7 @@ func (l *Logger) Info(v ...interface{}) { } // Infof ... -func (l *Logger) Infof(format string, v ...interface{}) { +func (l *Logger) Infof(format string, v ...any) { if l.lvl <= InfoLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), InfoLevel) _ = l.output(record) @@ -228,7 +225,7 @@ func (l *Logger) Infof(format string, v ...interface{}) { } // Warning ... -func (l *Logger) Warning(v ...interface{}) { +func (l *Logger) Warning(v ...any) { if l.lvl <= WarningLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), WarningLevel) _ = l.output(record) @@ -236,7 +233,7 @@ func (l *Logger) Warning(v ...interface{}) { } // Warningf ... -func (l *Logger) Warningf(format string, v ...interface{}) { +func (l *Logger) Warningf(format string, v ...any) { if l.lvl <= WarningLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), WarningLevel) _ = l.output(record) @@ -244,7 +241,7 @@ func (l *Logger) Warningf(format string, v ...interface{}) { } // Error ... -func (l *Logger) Error(v ...interface{}) { +func (l *Logger) Error(v ...any) { if l.lvl <= ErrorLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), ErrorLevel) _ = l.output(record) @@ -252,7 +249,7 @@ func (l *Logger) Error(v ...interface{}) { } // Errorf ... -func (l *Logger) Errorf(format string, v ...interface{}) { +func (l *Logger) Errorf(format string, v ...any) { if l.lvl <= ErrorLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), ErrorLevel) _ = l.output(record) @@ -260,7 +257,7 @@ func (l *Logger) Errorf(format string, v ...interface{}) { } // Fatal ... -func (l *Logger) Fatal(v ...interface{}) { +func (l *Logger) Fatal(v ...any) { if l.lvl <= FatalLevel { record := NewRecord(time.Now(), fmt.Sprint(v...), l.getLine(), FatalLevel) _ = l.output(record) @@ -269,7 +266,7 @@ func (l *Logger) Fatal(v ...interface{}) { } // Fatalf ... -func (l *Logger) Fatalf(format string, v ...interface{}) { +func (l *Logger) Fatalf(format string, v ...any) { if l.lvl <= FatalLevel { record := NewRecord(time.Now(), fmt.Sprintf(format, v...), l.getLine(), FatalLevel) _ = l.output(record) @@ -298,52 +295,52 @@ func (l *Logger) getLine() string { } // Debug ... -func Debug(v ...interface{}) { +func Debug(v ...any) { logger.WithDepth(4).Debug(v...) } // Debugf ... -func Debugf(format string, v ...interface{}) { +func Debugf(format string, v ...any) { logger.WithDepth(4).Debugf(format, v...) } // Info ... -func Info(v ...interface{}) { +func Info(v ...any) { logger.WithDepth(4).Info(v...) } // Infof ... -func Infof(format string, v ...interface{}) { +func Infof(format string, v ...any) { logger.WithDepth(4).Infof(format, v...) } // Warning ... -func Warning(v ...interface{}) { +func Warning(v ...any) { logger.WithDepth(4).Warning(v...) } // Warningf ... -func Warningf(format string, v ...interface{}) { +func Warningf(format string, v ...any) { logger.WithDepth(4).Warningf(format, v...) } // Error ... -func Error(v ...interface{}) { +func Error(v ...any) { logger.WithDepth(4).Error(v...) } // Errorf ... -func Errorf(format string, v ...interface{}) { +func Errorf(format string, v ...any) { logger.WithDepth(4).Errorf(format, v...) } // Fatal ... -func Fatal(v ...interface{}) { +func Fatal(v ...any) { logger.WithDepth(4).Fatal(v...) } // Fatalf ... -func Fatalf(format string, v ...interface{}) { +func Fatalf(format string, v ...any) { logger.WithDepth(4).Fatalf(format, v...) } diff --git a/src/lib/orm/error.go b/src/lib/orm/error.go index 315a413271f..ceaab192b5b 100644 --- a/src/lib/orm/error.go +++ b/src/lib/orm/error.go @@ -30,7 +30,7 @@ var ( ) // WrapNotFoundError wrap error as NotFoundError when it is orm.ErrNoRows otherwise return err -func WrapNotFoundError(err error, format string, args ...interface{}) error { +func WrapNotFoundError(err error, format string, args ...any) error { if e := AsNotFoundError(err, format, args...); e != nil { return e } @@ -39,7 +39,7 @@ func WrapNotFoundError(err error, format string, args ...interface{}) error { } // WrapConflictError wrap error as ConflictError when it is duplicate key error otherwise return err -func WrapConflictError(err error, format string, args ...interface{}) error { +func WrapConflictError(err error, format string, args ...any) error { if e := AsConflictError(err, format, args...); e != nil { return e } @@ -49,7 +49,7 @@ func WrapConflictError(err error, format string, args ...interface{}) error { // AsNotFoundError checks whether the err is orm.ErrNoRows. If it it, wrap it // as a src/internal/error.Error with not found error code, else return nil -func AsNotFoundError(err error, messageFormat string, args ...interface{}) *errors.Error { +func AsNotFoundError(err error, messageFormat string, args ...any) *errors.Error { if errors.Is(err, orm.ErrNoRows) { e := errors.NotFoundError(nil) if len(messageFormat) > 0 { @@ -62,7 +62,7 @@ func AsNotFoundError(err error, messageFormat string, args ...interface{}) *erro // AsConflictError checks whether the err is duplicate key error. If it is, wrap it // as a src/internal/error.Error with conflict error code, else return nil -func AsConflictError(err error, messageFormat string, args ...interface{}) *errors.Error { +func AsConflictError(err error, messageFormat string, args ...any) *errors.Error { if IsDuplicateKeyError(err) { e := errors.New(err). WithCode(errors.ConflictCode). @@ -74,7 +74,7 @@ func AsConflictError(err error, messageFormat string, args ...interface{}) *erro // AsForeignKeyError checks whether the err is violating foreign key constraint error. If it it, wrap it // as a src/internal/error.Error with violating foreign key constraint error code, else return nil -func AsForeignKeyError(err error, messageFormat string, args ...interface{}) *errors.Error { +func AsForeignKeyError(err error, messageFormat string, args ...any) *errors.Error { if isViolatingForeignKeyConstraintError(err) { e := errors.New(err). WithCode(errors.ViolateForeignKeyConstraintCode). diff --git a/src/lib/orm/error_test.go b/src/lib/orm/error_test.go index 826678ccf1d..17e274263ec 100644 --- a/src/lib/orm/error_test.go +++ b/src/lib/orm/error_test.go @@ -36,7 +36,7 @@ func TestIsNotFoundError(t *testing.T) { // pass message := "message" - err = AsNotFoundError(orm.ErrNoRows, message) + err = AsNotFoundError(orm.ErrNoRows, "%s", "message") require.NotNil(t, err) assert.Equal(t, errors.NotFoundCode, err.Code) assert.Equal(t, message, err.Message) @@ -55,7 +55,7 @@ func TestIsConflictError(t *testing.T) { message := "message" err = AsConflictError(&pgconn.PgError{ Code: "23505", - }, message) + }, "%s", message) require.NotNil(t, err) assert.Equal(t, errors.ConflictCode, err.Code) assert.Equal(t, message, err.Message) @@ -74,7 +74,7 @@ func TestIsForeignKeyError(t *testing.T) { message := "message" err = AsForeignKeyError(&pgconn.PgError{ Code: "23503", - }, message) + }, "%s", message) require.NotNil(t, err) assert.Equal(t, errors.ViolateForeignKeyConstraintCode, err.Code) assert.Equal(t, message, err.Message) diff --git a/src/lib/orm/metadata.go b/src/lib/orm/metadata.go index f4144266780..f0523e9c85f 100644 --- a/src/lib/orm/metadata.go +++ b/src/lib/orm/metadata.go @@ -34,7 +34,7 @@ var ( type key struct { Name string Filterable bool - FilterFunc func(context.Context, orm.QuerySeter, string, interface{}) orm.QuerySeter + FilterFunc func(context.Context, orm.QuerySeter, string, any) orm.QuerySeter Sortable bool } @@ -60,7 +60,7 @@ func (m *metadata) Sortable(key string) bool { } // parse the definition of the provided model(fields/methods/annotations) and return the parsed metadata -func parseModel(model interface{}) *metadata { +func parseModel(model any) *metadata { // pointer type ptr := reflect.TypeOf(model) // struct type @@ -79,7 +79,7 @@ func parseModel(model interface{}) *metadata { Keys: map[string]*key{}, } // parse fields of the provided model - for i := 0; i < t.NumField(); i++ { + for i := range t.NumField() { field := t.Field(i) orm := field.Tag.Get("orm") // isn't the database column, skip @@ -107,7 +107,7 @@ func parseModel(model interface{}) *metadata { } // parse filter methods of the provided model - for i := 0; i < ptr.NumMethod(); i++ { + for i := range ptr.NumMethod() { methodName := ptr.Method(i).Name if !strings.HasPrefix(methodName, "FilterBy") { continue @@ -116,7 +116,7 @@ func parseModel(model interface{}) *metadata { if !methodValue.IsValid() { continue } - filterFunc, ok := methodValue.Interface().(func(context.Context, orm.QuerySeter, string, interface{}) orm.QuerySeter) + filterFunc, ok := methodValue.Interface().(func(context.Context, orm.QuerySeter, string, any) orm.QuerySeter) if !ok { continue } @@ -173,7 +173,7 @@ func parseFilterable(field reflect.StructField) bool { // } func parseSortable(field reflect.StructField) (*q.Sort, bool) { var defaultSort *q.Sort - for _, item := range strings.Split(field.Tag.Get("sort"), ";") { + for item := range strings.SplitSeq(field.Tag.Get("sort"), ";") { // isn't sortable, return directly if item == "false" { return nil, false @@ -202,7 +202,7 @@ func parseSortable(field reflect.StructField) (*q.Sort, bool) { // It returns "customized_field1" for "Field1" and returns "field2" for "Field2" func parseColumn(field reflect.StructField) string { column := "" - for _, item := range strings.Split(field.Tag.Get("orm"), ";") { + for item := range strings.SplitSeq(field.Tag.Get("orm"), ";") { if !strings.HasPrefix(item, "column") { continue } @@ -224,7 +224,7 @@ func snakeCase(str string) string { runes := []rune(str) var out []rune - for i := 0; i < len(runes); i++ { + for i := range len(runes) { if i > 0 && (unicode.IsUpper(runes[i])) && ((i+1 < len(runes) && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) { diff --git a/src/lib/orm/metadata_test.go b/src/lib/orm/metadata_test.go index a6bc72e758d..dcdae710700 100644 --- a/src/lib/orm/metadata_test.go +++ b/src/lib/orm/metadata_test.go @@ -32,7 +32,7 @@ type foo struct { Field4 string `sort:"default:desc"` } -func (f *foo) FilterByField5(context.Context, orm.QuerySeter, string, interface{}) orm.QuerySeter { +func (f *foo) FilterByField5(context.Context, orm.QuerySeter, string, any) orm.QuerySeter { return nil } diff --git a/src/lib/orm/orm.go b/src/lib/orm/orm.go index a04d4831979..a7c95ea6531 100644 --- a/src/lib/orm/orm.go +++ b/src/lib/orm/orm.go @@ -45,7 +45,7 @@ type ParamsList = orm.ParamsList type QuerySeter = orm.QuerySeter // RegisterModel ... -func RegisterModel(models ...interface{}) { +func RegisterModel(models ...any) { orm.RegisterModel(models...) } @@ -176,7 +176,7 @@ func WithTransaction(f func(ctx context.Context) error) func(ctx context.Context } // ReadOrCreate read or create instance to database, retry to read when met a duplicate key error after the creating -func ReadOrCreate(ctx context.Context, md interface{}, col1 string, cols ...string) (created bool, id int64, err error) { +func ReadOrCreate(ctx context.Context, md any, col1 string, cols ...string) (created bool, id int64, err error) { getter, ok := md.(interface { GetID() int64 }) @@ -237,7 +237,7 @@ func ReadOrCreate(ctx context.Context, md interface{}, col1 string, cols ...stri // The sql should return the ID list with the specific condition(e.g. select id from table1 where column1=?) // The sql runs as a prepare statement with the "?" be populated rather than concat string directly // The returning in clause is a string like "IN (id1, id2, id3, ...)" -func CreateInClause(ctx context.Context, sql string, args ...interface{}) (string, error) { +func CreateInClause(ctx context.Context, sql string, args ...any) (string, error) { ormer, err := FromContext(ctx) if err != nil { return "", err @@ -271,7 +271,7 @@ func Escape(str string) string { // e.g. n=3, returns "?,?,?" func ParamPlaceholderForIn(n int) string { placeholders := []string{} - for i := 0; i < n; i++ { + for range n { placeholders = append(placeholders, "?") } return strings.Join(placeholders, ",") diff --git a/src/lib/orm/query.go b/src/lib/orm/query.go index a51a3ca35d9..77271030ab1 100644 --- a/src/lib/orm/query.go +++ b/src/lib/orm/query.go @@ -22,6 +22,7 @@ import ( "github.com/beego/beego/v2/client/orm" + "github.com/goharbor/harbor/src/lib/log" "github.com/goharbor/harbor/src/lib/q" ) @@ -38,7 +39,7 @@ import ( // // // support filter by "Field6", "field6" // -// func (f *Foo) FilterByField6(ctx context.Context, qs orm.QuerySetter, key string, value interface{}) orm.QuerySetter { +// func (f *Foo) FilterByField6(ctx context.Context, qs orm.QuerySetter, key string, value any) orm.QuerySetter { // ... // return qs // } @@ -71,7 +72,7 @@ type Config struct { type Option func(*Config) -func QuerySetter(ctx context.Context, model interface{}, query *q.Query, options ...Option) (orm.QuerySeter, error) { +func QuerySetter(ctx context.Context, model any, query *q.Query, options ...Option) (orm.QuerySeter, error) { t := reflect.TypeOf(model) if t.Kind() != reflect.Ptr { return nil, fmt.Errorf(" cannot use non-ptr model struct `%s`", getFullName(t.Elem())) @@ -127,7 +128,7 @@ func newConfig(opts ...Option) *Config { // select a, b, c from mytable order by a limit ? offset ? // it appends the " limit ? offset ? " to sql, // and appends the limit value and offset value to the params of this query -func PaginationOnRawSQL(query *q.Query, sql string, params []interface{}) (string, []interface{}) { +func PaginationOnRawSQL(query *q.Query, sql string, params []any) (string, []any) { if query != nil && query.PageSize > 0 { sql += ` limit ?` params = append(params, query.PageSize) @@ -141,7 +142,7 @@ func PaginationOnRawSQL(query *q.Query, sql string, params []interface{}) (strin } // QuerySetterForCount creates the query setter used for count with the sort and pagination information ignored -func QuerySetterForCount(ctx context.Context, model interface{}, query *q.Query, _ ...string) (orm.QuerySeter, error) { +func QuerySetterForCount(ctx context.Context, model any, query *q.Query, _ ...string) (orm.QuerySeter, error) { query = q.MustClone(query) query.Sorts = nil query.PageSize = 0 @@ -155,7 +156,12 @@ func setFilters(ctx context.Context, qs orm.QuerySeter, query *q.Query, meta *me // The "strings.SplitN()" here is a workaround for the incorrect usage of query which should be avoided // e.g. use the query with the knowledge of underlying ORM implementation, the "OrList" should be used instead: // https://github.com/goharbor/harbor/blob/v2.2.0/src/controller/project/controller.go#L348 - k := strings.SplitN(key, orm.ExprSep, 2)[0] + keyPieces := strings.Split(key, orm.ExprSep) + if len(keyPieces) > 2 { + log.Warningf("The separator '%s' is not valid in the query parameter '%s__%s'. Please use the correct field name.", orm.ExprSep, keyPieces[0], keyPieces[1]) + continue + } + k := keyPieces[0] mk, filterable := meta.Filterable(k) if !filterable { // This is a workaround for the unsuitable usage of query, the keyword format for field and method should be consistent diff --git a/src/lib/orm/test/orm_test.go b/src/lib/orm/test/orm_test.go index b9046c931e4..128d0b434b9 100644 --- a/src/lib/orm/test/orm_test.go +++ b/src/lib/orm/test/orm_test.go @@ -387,7 +387,7 @@ func (suite *OrmSuite) TestReadOrCreateParallel() { arr := make([]int, count) var wg sync.WaitGroup - for i := 0; i < count; i++ { + for i := range count { wg.Add(1) go func(i int) { defer wg.Done() @@ -418,7 +418,7 @@ func (suite *OrmSuite) TestPaginationOnRawSQL() { PageSize: 10, } sql := "select * from harbor_user where user_id > ? order by user_name " - params := []interface{}{2} + params := []any{2} sql, params = PaginationOnRawSQL(query, sql, params) suite.Equal("select * from harbor_user where user_id > ? order by user_name limit ? offset ?", sql) suite.Equal(int64(10), params[1]) diff --git a/src/lib/q/builder.go b/src/lib/q/builder.go index 98a885ead16..66e625e2e6f 100644 --- a/src/lib/q/builder.go +++ b/src/lib/q/builder.go @@ -47,8 +47,8 @@ func Build(q, sort string, pageNumber, pageSize int64) (*Query, error) { }, nil } -func parseKeywords(q string) (map[string]interface{}, error) { - keywords := map[string]interface{}{} +func parseKeywords(q string) (map[string]any, error) { + keywords := map[string]any{} if len(q) == 0 { return keywords, nil } @@ -58,8 +58,8 @@ func parseKeywords(q string) (map[string]interface{}, error) { } else { log.Errorf("failed to unescape the query %s: %v", q, err) } - params := strings.Split(q, ",") - for _, param := range params { + + for param := range strings.SplitSeq(q, ",") { strs := strings.SplitN(param, "=", 2) if len(strs) != 2 || len(strs[0]) == 0 || len(strs[1]) == 0 { return nil, errors.New(nil). @@ -82,7 +82,7 @@ func ParseSorting(sort string) []*Sort { return []*Sort{} } var sorts []*Sort - for _, sorting := range strings.Split(sort, ",") { + for sorting := range strings.SplitSeq(sort, ",") { key := sorting desc := false if strings.HasPrefix(sorting, "-") { @@ -97,7 +97,7 @@ func ParseSorting(sort string) []*Sort { return sorts } -func parsePattern(value string) (interface{}, error) { +func parsePattern(value string) (any, error) { // empty string if len(value) == 0 { return value, nil @@ -132,17 +132,17 @@ func parseRange(value string) (*Range, error) { return nil, fmt.Errorf(`range must start with "[", end with "]" and contains only one "~"`) } strs := strings.SplitN(value[1:length-1], "~", 2) - min := strings.TrimSpace(strs[0]) - max := strings.TrimSpace(strs[1]) - if len(min) == 0 && len(max) == 0 { + minVal := strings.TrimSpace(strs[0]) + maxVal := strings.TrimSpace(strs[1]) + if len(minVal) == 0 && len(maxVal) == 0 { return nil, fmt.Errorf(`min and max at least one should be set in range'`) } r := &Range{} - if len(min) > 0 { - r.Min = parseValue(min) + if len(minVal) > 0 { + r.Min = parseValue(minVal) } - if len(max) > 0 { - r.Max = parseValue(max) + if len(maxVal) > 0 { + r.Max = parseValue(maxVal) } return r, nil } @@ -167,7 +167,7 @@ func parseAndList(value string) (*AndList, error) { return al, nil } -func parseList(value string, c rune) ([]interface{}, error) { +func parseList(value string, c rune) ([]any, error) { length := len(value) if c == '{' && value[length-1] != '}' { return nil, fmt.Errorf(`or list must start with "{" and end with "}"`) @@ -175,9 +175,9 @@ func parseList(value string, c rune) ([]interface{}, error) { if c == '(' && value[length-1] != ')' { return nil, fmt.Errorf(`and list must start with "(" and end with ")"`) } - var vs []interface{} - strs := strings.Split(value[1:length-1], " ") - for _, str := range strs { + var vs []any + + for str := range strings.SplitSeq(value[1:length-1], " ") { v := parseValue(str) if s, ok := v.(string); ok && len(s) == 0 { continue @@ -188,7 +188,7 @@ func parseList(value string, c rune) ([]interface{}, error) { } // try to parse value as time first, then integer, and last string -func parseValue(value string) interface{} { +func parseValue(value string) any { value = strings.TrimSpace(value) // try to parse time time, err := time.Parse("2006-01-02T15:04:05", value) diff --git a/src/lib/q/query.go b/src/lib/q/query.go index 8910a0e40e9..a29b3fd878f 100644 --- a/src/lib/q/query.go +++ b/src/lib/q/query.go @@ -14,8 +14,10 @@ package q +import "maps" + // KeyWords ... -type KeyWords = map[string]interface{} +type KeyWords = map[string]any // Query parameters type Query struct { @@ -51,14 +53,13 @@ func New(kw KeyWords) *Query { // or returns a new Query instance func MustClone(query *Query) *Query { q := &Query{ - Keywords: map[string]interface{}{}, + Keywords: map[string]any{}, } if query != nil { q.PageNumber = query.PageNumber q.PageSize = query.PageSize - for k, v := range query.Keywords { - q.Keywords[k] = v - } + maps.Copy(q.Keywords, query.Keywords) + for _, sort := range query.Sorts { q.Sorts = append(q.Sorts, &Sort{ Key: sort.Key, @@ -77,18 +78,18 @@ type Sort struct { // Range query type Range struct { - Min interface{} - Max interface{} + Min any + Max any } // AndList query type AndList struct { - Values []interface{} + Values []any } // OrList query type OrList struct { - Values []interface{} + Values []any } // FuzzyMatchValue query @@ -105,22 +106,22 @@ func NewSort(key string, desc bool) *Sort { } // NewRange creates a new range -func NewRange(min, max interface{}) *Range { +func NewRange(minVal, maxVal any) *Range { return &Range{ - Min: min, - Max: max, + Min: minVal, + Max: maxVal, } } // NewAndList creates a new and list -func NewAndList(values []interface{}) *AndList { +func NewAndList(values []any) *AndList { return &AndList{ Values: values, } } // NewOrList creates a new or list -func NewOrList(values []interface{}) *OrList { +func NewOrList(values []any) *OrList { return &OrList{ Values: values, } diff --git a/src/pkg/reg/adapter/tencentcr/ratelimiter.go b/src/lib/rate_limiter_transport.go similarity index 76% rename from src/pkg/reg/adapter/tencentcr/ratelimiter.go rename to src/lib/rate_limiter_transport.go index 23e35ddfae0..adb454e709d 100644 --- a/src/pkg/reg/adapter/tencentcr/ratelimiter.go +++ b/src/lib/rate_limiter_transport.go @@ -12,11 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tencentcr +package lib import ( "net/http" - "sync" "go.uber.org/ratelimit" ) @@ -33,19 +32,9 @@ func (t limitTransport) RoundTrip(req *http.Request) (*http.Response, error) { return t.RoundTripper.RoundTrip(req) } -var limiterOnce sync.Once -var limiter ratelimit.Limiter - -func newLimiter(rate int) ratelimit.Limiter { - limiterOnce.Do(func() { - limiter = ratelimit.New(rate) - }) - return limiter -} - -func newRateLimitedTransport(rate int, transport http.RoundTripper) http.RoundTripper { +func NewRateLimitedTransport(rate int, transport http.RoundTripper) http.RoundTripper { return &limitTransport{ RoundTripper: transport, - limiter: newLimiter(rate), + limiter: ratelimit.New(rate), } } diff --git a/src/lib/rate_limiter_transport_test.go b/src/lib/rate_limiter_transport_test.go new file mode 100644 index 00000000000..386ff4500ed --- /dev/null +++ b/src/lib/rate_limiter_transport_test.go @@ -0,0 +1,45 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package lib + +import ( + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func Test_newRateLimitedTransport(t *testing.T) { + tests := []struct { + name string + rate int + transport http.RoundTripper + }{ + {"1qps", 1, http.DefaultTransport}, + } + var req = &http.Request{} + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewRateLimitedTransport(tt.rate, tt.transport) + start := time.Now() + for i := 0; i <= tt.rate; i++ { + got.RoundTrip(req) + } + used := int64(time.Since(start).Milliseconds()) / int64(tt.rate) + assert.GreaterOrEqualf(t, used/int64(tt.rate), int64(1e3/tt.rate), "used %d ms per req", used/int64(tt.rate)) + }) + } +} diff --git a/src/lib/redis/client_test.go b/src/lib/redis/client_test.go index 189d0f8eecd..e2f7446a66d 100644 --- a/src/lib/redis/client_test.go +++ b/src/lib/redis/client_test.go @@ -34,7 +34,7 @@ func TestGetRegistryClient(t *testing.T) { assert.NotNil(t, client) // multiple calls should return the same client - for i := 0; i < 10; i++ { + for range 10 { newClient, err := GetRegistryClient() assert.NoError(t, err) assert.Equal(t, client, newClient) @@ -55,7 +55,7 @@ func TestGetHarborClient(t *testing.T) { assert.NotNil(t, client) // multiple calls should return the same client - for i := 0; i < 10; i++ { + for range 10 { newClient, err := GetHarborClient() assert.NoError(t, err) assert.Equal(t, client, newClient) diff --git a/src/lib/retry/retry.go b/src/lib/retry/retry.go index e22a81599dd..ed907af8c9e 100644 --- a/src/lib/retry/retry.go +++ b/src/lib/retry/retry.go @@ -70,9 +70,9 @@ func InitialInterval(initial time.Duration) Option { } // MaxInterval set max interval -func MaxInterval(max time.Duration) Option { +func MaxInterval(maxInterval time.Duration) Option { return func(opts *Options) { - opts.MaxInterval = max + opts.MaxInterval = maxInterval } } diff --git a/src/lib/selector/selector.go b/src/lib/selector/selector.go index 68e07aef8eb..f258bf4ed43 100644 --- a/src/lib/selector/selector.go +++ b/src/lib/selector/selector.go @@ -28,5 +28,5 @@ type Selector interface { // Factory is factory method to return a selector implementation // Pattern can be any type of data. -// TODO: 'extras' can also be an optional interface{} to accept more complicated data. -type Factory func(decoration string, pattern interface{}, extras string) Selector +// TODO: 'extras' can also be an optional any to accept more complicated data. +type Factory func(decoration string, pattern any, extras string) Selector diff --git a/src/lib/selector/selectors/doublestar/selector.go b/src/lib/selector/selectors/doublestar/selector.go index 2e3c2853478..669839bd65f 100644 --- a/src/lib/selector/selectors/doublestar/selector.go +++ b/src/lib/selector/selectors/doublestar/selector.go @@ -134,7 +134,7 @@ func (s *selector) tagSelectExclude(artifact *iselector.Candidate) (selected boo } // New is factory method for doublestar selector -func New(decoration string, pattern interface{}, extras string) iselector.Selector { +func New(decoration string, pattern any, extras string) iselector.Selector { untagged := true // default behavior for upgrade, active keep the untagged images if decoration == Excludes { untagged = false diff --git a/src/lib/selector/selectors/index/index.go b/src/lib/selector/selectors/index/index.go index 5e786462405..ad7aaf955a0 100644 --- a/src/lib/selector/selectors/index/index.go +++ b/src/lib/selector/selectors/index/index.go @@ -15,6 +15,7 @@ package index import ( + "slices" "sync" "github.com/goharbor/harbor/src/lib/errors" @@ -80,11 +81,9 @@ func Get(kind, decoration, pattern, extras string) (selector.Selector, error) { } item := v.(*indexedItem) - for _, dec := range item.Meta.Decorations { - if dec == decoration { - factory := item.Factory - return factory(decoration, pattern, extras), nil - } + if slices.Contains(item.Meta.Decorations, decoration) { + factory := item.Factory + return factory(decoration, pattern, extras), nil } return nil, errors.Errorf("decoration %s of selector %s is not supported", decoration, kind) @@ -94,7 +93,7 @@ func Get(kind, decoration, pattern, extras string) (selector.Selector, error) { func Index() []*IndexedMeta { all := make([]*IndexedMeta, 0) - index.Range(func(_, v interface{}) bool { + index.Range(func(_, v any) bool { if item, ok := v.(*indexedItem); ok { all = append(all, item.Meta) return true diff --git a/src/lib/selector/selectors/label/selector.go b/src/lib/selector/selectors/label/selector.go index fcea7df7f2f..a06cd9fcce9 100644 --- a/src/lib/selector/selectors/label/selector.go +++ b/src/lib/selector/selectors/label/selector.go @@ -50,7 +50,7 @@ func (s *selector) Select(artifacts []*iselector.Candidate) (selected []*iselect } // New is factory method for label selector -func New(decoration string, pattern interface{}, _ string) iselector.Selector { +func New(decoration string, pattern any, _ string) iselector.Selector { labels := make([]string, 0) if pattern != nil { diff --git a/src/lib/selector/selectors/severity/selector.go b/src/lib/selector/selectors/severity/selector.go index 8a81acf1f0d..22291c01c0b 100644 --- a/src/lib/selector/selectors/severity/selector.go +++ b/src/lib/selector/selectors/severity/selector.go @@ -82,7 +82,7 @@ func (s *selector) Select(artifacts []*sl.Candidate) (selected []*sl.Candidate, } // New is factory method for vulnerability severity selector -func New(decoration string, pattern interface{}, _ string) sl.Selector { +func New(decoration string, pattern any, _ string) sl.Selector { var sev int if pattern != nil { sev, _ = pattern.(int) diff --git a/src/lib/selector/selectors/signature/selector.go b/src/lib/selector/selectors/signature/selector.go index 27c3b3fb457..07a5f634654 100644 --- a/src/lib/selector/selectors/signature/selector.go +++ b/src/lib/selector/selectors/signature/selector.go @@ -64,7 +64,7 @@ func (s *selector) Select(artifacts []*sl.Candidate) (selected []*sl.Candidate, } // New is factory method for signature selector -func New(decoration string, pattern interface{}, _ string) sl.Selector { +func New(decoration string, pattern any, _ string) sl.Selector { var e bool if pattern != nil { e, _ = pattern.(bool) diff --git a/src/lib/set.go b/src/lib/set.go index fb1b4b923ef..9667220baa8 100644 --- a/src/lib/set.go +++ b/src/lib/set.go @@ -17,23 +17,23 @@ package lib type void = struct{} // Set a simple set -type Set map[interface{}]void +type Set map[any]void // Add add item to set -func (s Set) Add(item interface{}) { +func (s Set) Add(item any) { s[item] = void{} } // Exists returns true when item in the set -func (s Set) Exists(item interface{}) bool { +func (s Set) Exists(item any) bool { _, ok := s[item] return ok } // Items returns the items in the set -func (s Set) Items() []interface{} { - var items []interface{} +func (s Set) Items() []any { + var items []any for item := range s { items = append(items, item) } diff --git a/src/lib/strings.go b/src/lib/strings.go index 9b6bbb8090f..a35b910af8e 100644 --- a/src/lib/strings.go +++ b/src/lib/strings.go @@ -33,3 +33,13 @@ func Title(s string) string { title := cases.Title(language.Und) return title.String(strings.ToLower(s)) } + +// SliceToUpper converts a slice of strings to uppercase. +func SliceToUpper(s []string) []string { + result := make([]string, len(s)) + for i, str := range s { + result[i] = strings.ToUpper(str) + } + + return result +} diff --git a/src/lib/strings_test.go b/src/lib/strings_test.go index bcb4bfa48aa..a2bf61325d4 100644 --- a/src/lib/strings_test.go +++ b/src/lib/strings_test.go @@ -15,6 +15,7 @@ package lib import ( + "reflect" "testing" "github.com/stretchr/testify/assert" @@ -52,3 +53,56 @@ func TestTitle(t *testing.T) { }) } } + +func TestSliceToUpper(t *testing.T) { + tests := []struct { + name string + input []string + expected []string + }{ + { + name: "Empty slice", + input: []string{}, + expected: []string{}, + }, + { + name: "Single element", + input: []string{"hello"}, + expected: []string{"HELLO"}, + }, + { + name: "Multiple elements", + input: []string{"hello", "world", "go"}, + expected: []string{"HELLO", "WORLD", "GO"}, + }, + { + name: "Already uppercase", + input: []string{"HELLO", "WORLD"}, + expected: []string{"HELLO", "WORLD"}, + }, + { + name: "Mixed case", + input: []string{"Hello", "World", "Go"}, + expected: []string{"HELLO", "WORLD", "GO"}, + }, + { + name: "With special characters", + input: []string{"hello!", "world?", "go#"}, + expected: []string{"HELLO!", "WORLD?", "GO#"}, + }, + { + name: "With numbers", + input: []string{"hello123", "world456"}, + expected: []string{"HELLO123", "WORLD456"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := SliceToUpper(tt.input) + if !reflect.DeepEqual(result, tt.expected) { + t.Errorf("SliceToUpper() = %v, want %v", result, tt.expected) + } + }) + } +} diff --git a/src/pkg/accessory/dao/dao_test.go b/src/pkg/accessory/dao/dao_test.go index 06e9ae2cccf..8a9967d8b05 100644 --- a/src/pkg/accessory/dao/dao_test.go +++ b/src/pkg/accessory/dao/dao_test.go @@ -110,7 +110,7 @@ func (d *daoTestSuite) TestCount() { d.Require().Nil(err) d.True(total > 0) total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": d.subArtifactDigest, }, }) @@ -132,7 +132,7 @@ func (d *daoTestSuite) TestList() { d.True(found) accs, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": d.subArtifactDigest, }, }) @@ -254,7 +254,7 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Nil(err) accs, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": art.Digest, }, }) @@ -265,14 +265,14 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Len(accs, 2) _, err = d.dao.DeleteAccessories(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": art.Digest, "SubjectArtifactRepo": art.RepositoryName, }, }) d.Require().Nil(err) accs, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": art.Digest, "SubjectArtifactRepo": art.RepositoryName, }, }) diff --git a/src/pkg/allowlist/dao/dao_test.go b/src/pkg/allowlist/dao/dao_test.go index fc8f86070c2..33fe19aefd6 100644 --- a/src/pkg/allowlist/dao/dao_test.go +++ b/src/pkg/allowlist/dao/dao_test.go @@ -28,7 +28,7 @@ func (s *testSuite) TestSetAndGet() { s.Nil(err) s.Nil(l) var longList []models.CVEAllowlistItem - for i := 0; i < 50; i++ { + for range 50 { longList = append(longList, models.CVEAllowlistItem{CVEID: "CVE-1999-0067"}) } diff --git a/src/pkg/allowlist/validator.go b/src/pkg/allowlist/validator.go index e7171242311..f4f81fec101 100644 --- a/src/pkg/allowlist/validator.go +++ b/src/pkg/allowlist/validator.go @@ -16,6 +16,7 @@ package allowlist import ( "fmt" + "strings" models2 "github.com/goharbor/harbor/src/pkg/allowlist/models" ) @@ -45,6 +46,13 @@ func IsInvalidErr(err error) bool { func Validate(wl models2.CVEAllowlist) error { m := map[string]struct{}{} for _, it := range wl.Items { + cveID := strings.TrimSpace(it.CVEID) + // Check for empty or whitespace-only CVE IDs + if cveID == "" { + return &invalidErr{fmt.Sprintf("empty or whitespace-only CVE ID in allowlist")} + } + + // Check for duplicates if _, ok := m[it.CVEID]; ok { return &invalidErr{fmt.Sprintf("duplicate CVE ID in allowlist: %s", it.CVEID)} } diff --git a/src/pkg/allowlist/validator_test.go b/src/pkg/allowlist/validator_test.go index 747de740a79..834fe6722d4 100644 --- a/src/pkg/allowlist/validator_test.go +++ b/src/pkg/allowlist/validator_test.go @@ -53,6 +53,22 @@ func TestValidate(t *testing.T) { l models2.CVEAllowlist noError bool }{ + { + l: models2.CVEAllowlist{ + Items: []models2.CVEAllowlistItem{ + {CVEID: ""}, + }, + }, + noError: false, + }, + { + l: models2.CVEAllowlist{ + Items: []models2.CVEAllowlistItem{ + {CVEID: " "}, + }, + }, + noError: false, + }, { l: models2.CVEAllowlist{ Items: nil, diff --git a/src/pkg/artifact/dao/dao.go b/src/pkg/artifact/dao/dao.go index e22e23091a5..9faa47958a7 100644 --- a/src/pkg/artifact/dao/dao.go +++ b/src/pkg/artifact/dao/dao.go @@ -132,7 +132,7 @@ func (d *dao) Get(ctx context.Context, id int64) (*Artifact, error) { func (d *dao) GetByDigest(ctx context.Context, repository, digest string) (*Artifact, error) { qs, err := orm.QuerySetter(ctx, &Artifact{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryName": repository, "Digest": digest, }, @@ -212,7 +212,7 @@ func (d *dao) UpdatePullTime(ctx context.Context, id int64, pullTime time.Time) formatPullTime := pullTime.Format("2006-01-02 15:04:05.999999") // update db only if pull_time is null or pull_time < (in-coming)pullTime sql := "UPDATE artifact SET pull_time = ? WHERE id = ? AND (pull_time IS NULL OR pull_time < ?)" - args := []interface{}{formatPullTime, id, formatPullTime} + args := []any{formatPullTime, id, formatPullTime} _, err = ormer.Raw(sql, args...).Exec() if err != nil { @@ -273,7 +273,7 @@ func (d *dao) DeleteReferences(ctx context.Context, parentID int64) error { return err } qs, err := orm.QuerySetter(ctx, &ArtifactReference{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "parent_id": parentID, }, }) @@ -299,16 +299,16 @@ func (d *dao) ListWithLatest(ctx context.Context, query *q.Query) (artifacts []* GROUP BY repository_name ) latest ON a.repository_name = latest.repository_name AND a.push_time = latest.latest_push_time` - queryParam := make([]interface{}, 0) + queryParam := make([]any, 0) var ok bool - var pid interface{} + var pid any if pid, ok = query.Keywords["ProjectID"]; !ok { return nil, errors.New(nil).WithCode(errors.BadRequestCode). WithMessage(`the value of "ProjectID" must be set`) } queryParam = append(queryParam, pid) - var attributionValue interface{} + var attributionValue any if attributionValue, ok = query.Keywords["media_type"]; ok { sql = fmt.Sprintf(sql, "media_type") } else if attributionValue, ok = query.Keywords["artifact_type"]; ok { diff --git a/src/pkg/artifact/dao/dao_test.go b/src/pkg/artifact/dao/dao_test.go index 08b448fba83..abd612c6cf1 100644 --- a/src/pkg/artifact/dao/dao_test.go +++ b/src/pkg/artifact/dao/dao_test.go @@ -144,7 +144,7 @@ func (d *daoTestSuite) TearDownTest() { func (d *daoTestSuite) TestCount() { // query by repository ID: both tagged and untagged artifacts totalOfAll, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, }) @@ -153,7 +153,7 @@ func (d *daoTestSuite) TestCount() { // only query tagged artifacts totalOfTagged, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "*", }, @@ -163,7 +163,7 @@ func (d *daoTestSuite) TestCount() { // only query untagged artifacts totalOfUnTagged, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "nil", }, @@ -173,7 +173,7 @@ func (d *daoTestSuite) TestCount() { // specific tag value total, err := d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "latest", }, @@ -183,7 +183,7 @@ func (d *daoTestSuite) TestCount() { // query by repository ID and digest total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Digest": "parent_digest", }, @@ -193,7 +193,7 @@ func (d *daoTestSuite) TestCount() { // set pagination in query total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, PageNumber: 1, @@ -206,7 +206,7 @@ func (d *daoTestSuite) TestCount() { func (d *daoTestSuite) TestList() { // query by repository ID: both tagged and untagged artifacts artifacts, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, }) @@ -235,7 +235,7 @@ func (d *daoTestSuite) TestList() { // only query tagged artifacts artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "*", }, @@ -264,7 +264,7 @@ func (d *daoTestSuite) TestList() { // only query untagged artifacts artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Tags": "nil", }, @@ -293,7 +293,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and digest artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, "Digest": "parent_digest", }, @@ -304,7 +304,7 @@ func (d *daoTestSuite) TestList() { // set pagination in query artifacts, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": 1, }, PageNumber: 1, @@ -446,7 +446,7 @@ func (d *daoTestSuite) TestCreateReference() { func (d *daoTestSuite) TestListReferences() { references, err := d.dao.ListReferences(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ParentID": d.parentArtID, "ChildID": d.childArt01ID, }, @@ -526,7 +526,7 @@ func (d *daoTestSuite) TestListWithLatest() { d.Require().Nil(err) latest, err := d.dao.ListWithLatest(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": 1234, "media_type": v1.MediaTypeImageConfig, }, diff --git a/src/pkg/artifact/model.go b/src/pkg/artifact/model.go index cdf187e627f..7a2d84f45f0 100644 --- a/src/pkg/artifact/model.go +++ b/src/pkg/artifact/model.go @@ -30,22 +30,22 @@ import ( // underlying concrete detail and provides an unified artifact view // for all users. type Artifact struct { - ID int64 `json:"id"` - Type string `json:"type"` // image, chart or other OCI compatible - MediaType string `json:"media_type"` // the media type of artifact. Mostly, it's the value of `manifest.config.mediatype` - ManifestMediaType string `json:"manifest_media_type"` // the media type of manifest/index - ArtifactType string `json:"artifact_type"` // the artifactType of manifest/index - ProjectID int64 `json:"project_id"` - RepositoryID int64 `json:"repository_id"` - RepositoryName string `json:"repository_name"` - Digest string `json:"digest"` - Size int64 `json:"size"` - Icon string `json:"icon"` - PushTime time.Time `json:"push_time"` - PullTime time.Time `json:"pull_time"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` // only contains the simple attributes specific for the different artifact type, most of them should come from the config layer - Annotations map[string]string `json:"annotations"` - References []*Reference `json:"references"` // child artifacts referenced by the parent artifact if the artifact is an index + ID int64 `json:"id"` + Type string `json:"type"` // image, chart or other OCI compatible + MediaType string `json:"media_type"` // the media type of artifact. Mostly, it's the value of `manifest.config.mediatype` + ManifestMediaType string `json:"manifest_media_type"` // the media type of manifest/index + ArtifactType string `json:"artifact_type"` // the artifactType of manifest/index + ProjectID int64 `json:"project_id"` + RepositoryID int64 `json:"repository_id"` + RepositoryName string `json:"repository_name"` + Digest string `json:"digest"` + Size int64 `json:"size"` + Icon string `json:"icon"` + PushTime time.Time `json:"push_time"` + PullTime time.Time `json:"pull_time"` + ExtraAttrs map[string]any `json:"extra_attrs"` // only contains the simple attributes specific for the different artifact type, most of them should come from the config layer + Annotations map[string]string `json:"annotations"` + References []*Reference `json:"references"` // child artifacts referenced by the parent artifact if the artifact is an index } // ResolveArtifactType returns the artifact type of the artifact, prefer ArtifactType, use MediaType if ArtifactType is empty. @@ -82,7 +82,7 @@ func (a *Artifact) From(art *dao.Artifact) { a.Icon = art.Icon a.PushTime = art.PushTime a.PullTime = art.PullTime - a.ExtraAttrs = map[string]interface{}{} + a.ExtraAttrs = map[string]any{} a.Annotations = map[string]string{} if len(art.ExtraAttrs) > 0 { if err := json.Unmarshal([]byte(art.ExtraAttrs), &a.ExtraAttrs); err != nil { diff --git a/src/pkg/artifact/model_test.go b/src/pkg/artifact/model_test.go index 24bd77eba07..02aecdab6ac 100644 --- a/src/pkg/artifact/model_test.go +++ b/src/pkg/artifact/model_test.go @@ -78,7 +78,7 @@ func (m *modelTestSuite) TestArtifactTo() { Size: 1024, PushTime: time.Now(), PullTime: time.Now(), - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "attr1": "value1", }, Annotations: map[string]string{ diff --git a/src/pkg/audit/dao/dao.go b/src/pkg/audit/dao/dao.go index 09e87c5ee7e..21828621c56 100644 --- a/src/pkg/audit/dao/dao.go +++ b/src/pkg/audit/dao/dao.go @@ -51,7 +51,7 @@ func New() DAO { return &dao{} } -var allowedMaps = map[string]interface{}{ +var allowedMaps = map[string]any{ strings.ToLower(rbac.ActionPull.String()): struct{}{}, strings.ToLower(rbac.ActionCreate.String()): struct{}{}, strings.ToLower(rbac.ActionDelete.String()): struct{}{}, diff --git a/src/pkg/audit/dao/dao_test.go b/src/pkg/audit/dao/dao_test.go index b1103adb493..ee3a01ccab1 100644 --- a/src/pkg/audit/dao/dao_test.go +++ b/src/pkg/audit/dao/dao_test.go @@ -65,7 +65,7 @@ func (d *daoTestSuite) TestCount() { d.Require().Nil(err) d.True(total > 0) total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "library/test-audit", }, }) @@ -80,7 +80,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and name audits, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "library/test-audit", }, }) @@ -134,7 +134,7 @@ func (d *daoTestSuite) TestListPIDs() { ol.Values = append(ol.Values, item) } audits, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": ol, }, }) diff --git a/src/pkg/auditext/dao/dao.go b/src/pkg/auditext/dao/dao.go index ad0e25421f3..07794dd002a 100644 --- a/src/pkg/auditext/dao/dao.go +++ b/src/pkg/auditext/dao/dao.go @@ -16,11 +16,11 @@ package dao import ( "context" + "slices" "strings" beegorm "github.com/beego/beego/v2/client/orm" - "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" "github.com/goharbor/harbor/src/lib/orm" @@ -197,7 +197,7 @@ func permitEventTypes(includeEventTypes []string) []string { var filterEvents []string for _, e := range includeEventTypes { event := strings.ToLower(e) - if utils.StringInSlice(event, model.EventTypes) { + if slices.Contains(model.EventTypes, event) { filterEvents = append(filterEvents, e) } else if event == model.OtherEvents { // include all other events filterEvents = append(filterEvents, model.OtherEventTypes...) diff --git a/src/pkg/auditext/dao/dao_test.go b/src/pkg/auditext/dao/dao_test.go index 76ada028496..f1387ec178b 100644 --- a/src/pkg/auditext/dao/dao_test.go +++ b/src/pkg/auditext/dao/dao_test.go @@ -68,7 +68,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and name audits, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "user01", }, }) @@ -94,7 +94,7 @@ func (d *daoTestSuite) TestCount() { d.Require().Nil(err) d.True(total > 0) total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Resource": "user01", }, }) @@ -135,7 +135,7 @@ func (d *daoTestSuite) TestListPIDs() { ol.Values = append(ol.Values, item) } audits, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": ol, }, }) diff --git a/src/pkg/auditext/event/utils.go b/src/pkg/auditext/event/utils.go index 5f3406c0623..e79c67ff43d 100644 --- a/src/pkg/auditext/event/utils.go +++ b/src/pkg/auditext/event/utils.go @@ -26,7 +26,7 @@ func Redact(payload string, sensitiveAttributes []string) string { if len(payload) == 0 { return "" } - var jsonData map[string]interface{} + var jsonData map[string]any if err := json.Unmarshal([]byte(payload), &jsonData); err != nil { log.Fatalf("Error parsing JSON: %v", err) return "" @@ -42,15 +42,15 @@ func Redact(payload string, sensitiveAttributes []string) string { } // replacePassword recursively replaces attribute in maskAttributes's value with "***" -func replacePassword(data map[string]interface{}, maskAttributes []string) { +func replacePassword(data map[string]any, maskAttributes []string) { for key, value := range data { if slices.Contains(maskAttributes, key) { data[key] = "***" - } else if nestedMap, ok := value.(map[string]interface{}); ok { + } else if nestedMap, ok := value.(map[string]any); ok { replacePassword(nestedMap, maskAttributes) - } else if nestedArray, ok := value.([]interface{}); ok { + } else if nestedArray, ok := value.([]any); ok { for _, item := range nestedArray { - if itemMap, ok := item.(map[string]interface{}); ok { + if itemMap, ok := item.(map[string]any); ok { replacePassword(itemMap, maskAttributes) } } diff --git a/src/pkg/auditext/event/utils_test.go b/src/pkg/auditext/event/utils_test.go index a46e268fa86..872ea430a8f 100644 --- a/src/pkg/auditext/event/utils_test.go +++ b/src/pkg/auditext/event/utils_test.go @@ -44,15 +44,15 @@ func TestRedact(t *testing.T) { func Test_replacePassword(t *testing.T) { type args struct { - data map[string]interface{} + data map[string]any maskAttributes []string } tests := []struct { name string args args }{ - {"normal case", args{map[string]interface{}{"password": "123456"}, []string{"password"}}}, - {"nested case", args{map[string]interface{}{"master": map[string]interface{}{"password": "123456"}}, []string{"password"}}}, + {"normal case", args{map[string]any{"password": "123456"}, []string{"password"}}}, + {"nested case", args{map[string]any{"master": map[string]any{"password": "123456"}}, []string{"password"}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -60,8 +60,8 @@ func Test_replacePassword(t *testing.T) { if val, ok := tt.args.data["password"]; ok && val != nil && tt.args.data["password"] != "***" { t.Errorf("replacePassword() = %v, want %v", tt.args.data["password"], "***") } - if val, ok := tt.args.data["master"]; ok && val != nil && tt.args.data["master"].(map[string]interface{})["password"] != "***" { - t.Errorf("replacePassword() = %v, want %v", tt.args.data["master"].(map[string]interface{})["password"], "***") + if val, ok := tt.args.data["master"]; ok && val != nil && tt.args.data["master"].(map[string]any)["password"] != "***" { + t.Errorf("replacePassword() = %v, want %v", tt.args.data["master"].(map[string]any)["password"], "***") } }) } diff --git a/src/pkg/blob/dao/dao.go b/src/pkg/blob/dao/dao.go index ba5aa67a1fa..efac1ea70b1 100644 --- a/src/pkg/blob/dao/dao.go +++ b/src/pkg/blob/dao/dao.go @@ -195,7 +195,7 @@ func (d *dao) UpdateBlobStatus(ctx context.Context, blob *models.Blob) (int64, e } var newVersion int64 - params := []interface{}{time.Now(), blob.Status, blob.ID, blob.Version} + params := []any{time.Now(), blob.Status, blob.ID, blob.Version} stats := models.StatusMap[blob.Status] for _, stat := range stats { params = append(params, stat) @@ -247,7 +247,7 @@ func (d *dao) FindBlobsShouldUnassociatedWithProject(ctx context.Context, projec } sql := `SELECT b.digest_blob FROM artifact a, artifact_blob b WHERE a.digest = b.digest_af AND a.project_id = ? AND b.digest_blob IN (%s)` - params := []interface{}{projectID} + params := []any{projectID} for _, blob := range blobs { params = append(params, blob.Digest) } @@ -279,10 +279,10 @@ func (d *dao) SumBlobsSizeByProject(ctx context.Context, projectID int64, exclud return 0, err } - params := []interface{}{projectID} + params := []any{projectID} sql := `SELECT SUM(size) FROM blob JOIN project_blob ON blob.id = project_blob.blob_id AND project_id = ?` if excludeForeignLayer { - foreignLayerTypes := []interface{}{ + foreignLayerTypes := []any{ schema2.MediaTypeForeignLayer, } @@ -305,10 +305,10 @@ func (d *dao) SumBlobsSize(ctx context.Context, excludeForeignLayer bool) (int64 return 0, err } - params := []interface{}{} + params := []any{} sql := `SELECT SUM(size) FROM blob` if excludeForeignLayer { - foreignLayerTypes := []interface{}{ + foreignLayerTypes := []any{ schema2.MediaTypeForeignLayer, } sql = fmt.Sprintf(`%s Where content_type NOT IN (%s)`, sql, orm.ParamPlaceholderForIn(len(foreignLayerTypes))) diff --git a/src/pkg/blob/dao/dao_test.go b/src/pkg/blob/dao/dao_test.go index 69771a89fa2..8c7d2b668c7 100644 --- a/src/pkg/blob/dao/dao_test.go +++ b/src/pkg/blob/dao/dao_test.go @@ -206,7 +206,7 @@ func (suite *DaoTestSuite) TestListBlobs() { suite.dao.CreateBlob(ctx, &models.Blob{Digest: digest2}) ol := q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, }, } @@ -216,7 +216,7 @@ func (suite *DaoTestSuite) TestListBlobs() { } ol = q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, digest2, }, diff --git a/src/pkg/blob/manager_test.go b/src/pkg/blob/manager_test.go index 8ed541970f3..59a03602283 100644 --- a/src/pkg/blob/manager_test.go +++ b/src/pkg/blob/manager_test.go @@ -38,7 +38,7 @@ func (suite *ManagerTestSuite) SetupSuite() { func (suite *ManagerTestSuite) isAssociatedWithArtifact(ctx context.Context, blobDigest, artifactDigest string) (bool, error) { ol := q.OrList{ - Values: []interface{}{ + Values: []any{ blobDigest, }, } @@ -52,7 +52,7 @@ func (suite *ManagerTestSuite) isAssociatedWithArtifact(ctx context.Context, blo func (suite *ManagerTestSuite) isAssociatedWithProject(ctx context.Context, blobDigest string, projectID int64) (bool, error) { ol := q.OrList{ - Values: []interface{}{ + Values: []any{ blobDigest, }, } @@ -304,7 +304,7 @@ func (suite *ManagerTestSuite) TestList() { digest2 := suite.DigestString() ol := q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, digest2, }, @@ -317,7 +317,7 @@ func (suite *ManagerTestSuite) TestList() { Mgr.Create(ctx, digest2, "media type", 100) ol = q.OrList{ - Values: []interface{}{ + Values: []any{ digest1, digest2, }, diff --git a/src/pkg/blob/models/blob.go b/src/pkg/blob/models/blob.go index 541b5eed5b3..3f5a0a2f39c 100644 --- a/src/pkg/blob/models/blob.go +++ b/src/pkg/blob/models/blob.go @@ -123,7 +123,7 @@ func (b *Blob) IsManifest() bool { } // FilterByArtifactDigest returns orm.QuerySeter with artifact digest filter -func (b *Blob) FilterByArtifactDigest(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (b *Blob) FilterByArtifactDigest(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { v, ok := value.(string) if !ok { return qs @@ -133,7 +133,7 @@ func (b *Blob) FilterByArtifactDigest(_ context.Context, qs orm.QuerySeter, _ st } // FilterByArtifactDigests returns orm.QuerySeter with artifact digests filter -func (b *Blob) FilterByArtifactDigests(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (b *Blob) FilterByArtifactDigests(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { artifactDigests, ok := value.([]string) if !ok { return qs @@ -148,7 +148,7 @@ func (b *Blob) FilterByArtifactDigests(_ context.Context, qs orm.QuerySeter, _ s } // FilterByProjectID returns orm.QuerySeter with project id filter -func (b *Blob) FilterByProjectID(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (b *Blob) FilterByProjectID(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { projectID, ok := value.(int64) if !ok { return qs diff --git a/src/pkg/cached/base_manager.go b/src/pkg/cached/base_manager.go index e98c11dbd98..fda307aba9b 100644 --- a/src/pkg/cached/base_manager.go +++ b/src/pkg/cached/base_manager.go @@ -39,7 +39,7 @@ func (*cacheClient) Delete(ctx context.Context, key string) error { return cache.LayerCache().Delete(ctx, key) } -func (*cacheClient) Fetch(ctx context.Context, key string, value interface{}) error { +func (*cacheClient) Fetch(ctx context.Context, key string, value any) error { return cache.LayerCache().Fetch(ctx, key, value) } @@ -47,7 +47,7 @@ func (*cacheClient) Ping(ctx context.Context) error { return cache.LayerCache().Ping(ctx) } -func (*cacheClient) Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (*cacheClient) Save(ctx context.Context, key string, value any, expiration ...time.Duration) error { // intercept here // it should ignore save cache if this request is wrapped by orm.Transaction, // because if tx rollback, we can not rollback cache, diff --git a/src/pkg/cached/base_manager_test.go b/src/pkg/cached/base_manager_test.go index 5db2613f9ea..c0c89d012c6 100644 --- a/src/pkg/cached/base_manager_test.go +++ b/src/pkg/cached/base_manager_test.go @@ -33,7 +33,7 @@ type testCache struct { iterator *testcache.Iterator } -func (tc *testCache) Save(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error { +func (tc *testCache) Save(ctx context.Context, key string, value any, expiration ...time.Duration) error { if orm.HasCommittedKey(ctx) { return nil } diff --git a/src/pkg/cached/manager.go b/src/pkg/cached/manager.go index d2a0b714023..affd2bbbf96 100644 --- a/src/pkg/cached/manager.go +++ b/src/pkg/cached/manager.go @@ -68,14 +68,14 @@ func NewObjectKey(ns string) *ObjectKey { // Format formats fields to string. // eg. namespace: 'artifact' // Format("id", 100, "digest", "aaa"): "artifact:id:100:digest:aaa" -func (ok *ObjectKey) Format(keysAndValues ...interface{}) (string, error) { +func (ok *ObjectKey) Format(keysAndValues ...any) (string, error) { // keysAndValues must be paired. if len(keysAndValues)%2 != 0 { return "", errors.Errorf("invalid keysAndValues: %v", keysAndValues...) } s := ok.namespace - for i := 0; i < len(keysAndValues); i++ { + for i := range len(keysAndValues) { // even is key if i%2 == 0 { key, match := keysAndValues[i].(string) diff --git a/src/pkg/cached/project/redis/manager.go b/src/pkg/cached/project/redis/manager.go index da945b817d2..6cb611142ba 100644 --- a/src/pkg/cached/project/redis/manager.go +++ b/src/pkg/cached/project/redis/manager.go @@ -95,7 +95,7 @@ func (m *Manager) Delete(ctx context.Context, id int64) error { return nil } -func (m *Manager) Get(ctx context.Context, idOrName interface{}) (*models.Project, error) { +func (m *Manager) Get(ctx context.Context, idOrName any) (*models.Project, error) { var ( key string err error diff --git a/src/pkg/chart/model.go b/src/pkg/chart/model.go index 9454f086db0..3229f78b65a 100644 --- a/src/pkg/chart/model.go +++ b/src/pkg/chart/model.go @@ -23,7 +23,7 @@ import ( // VersionDetails keeps the detailed data info of the chart version type VersionDetails struct { Dependencies []*helm_chart.Dependency `json:"dependencies"` - Values map[string]interface{} `json:"values"` + Values map[string]any `json:"values"` Files map[string]string `json:"files"` Security *SecurityReport `json:"security"` } diff --git a/src/pkg/chart/operator.go b/src/pkg/chart/operator.go index d3ce0fc6a37..8e8176912ba 100644 --- a/src/pkg/chart/operator.go +++ b/src/pkg/chart/operator.go @@ -70,7 +70,7 @@ func (cho *operator) GetDetails(content []byte) (*VersionDetails, error) { depts = chartData.Metadata.Dependencies } - var values map[string]interface{} + var values map[string]any files := make(map[string]string) // Parse values if chartData.Values != nil { @@ -130,14 +130,14 @@ func (cho *operator) GetData(content []byte) (*helm_chart.Chart, error) { } // Recursively read value -func readValue(values map[string]interface{}, keyPrefix string, valueMap map[string]interface{}) { +func readValue(values map[string]any, keyPrefix string, valueMap map[string]any) { for key, value := range values { longKey := key if keyPrefix != "" { longKey = fmt.Sprintf("%s.%s", keyPrefix, key) } - if subValues, ok := value.(map[string]interface{}); ok { + if subValues, ok := value.(map[string]any); ok { readValue(subValues, longKey, valueMap) } else { valueMap[longKey] = value diff --git a/src/pkg/config/db/cache.go b/src/pkg/config/db/cache.go index 2c69f4c9feb..902b85eaf8b 100644 --- a/src/pkg/config/db/cache.go +++ b/src/pkg/config/db/cache.go @@ -32,12 +32,12 @@ type Cache struct { } // Load - load config from database, only user setting will be load from database. -func (d *Cache) Load(ctx context.Context) (map[string]interface{}, error) { - f := func() (interface{}, error) { +func (d *Cache) Load(ctx context.Context) (map[string]any, error) { + f := func() (any, error) { return d.driver.Load(ctx) } - result := map[string]interface{}{} + result := map[string]any{} // let the cache expired after one minute // because the there no way to rollback the config items been saved when invalidate the cache failed @@ -49,7 +49,7 @@ func (d *Cache) Load(ctx context.Context) (map[string]interface{}, error) { } // Save - Only save user config items in the cfgs map -func (d *Cache) Save(ctx context.Context, cfg map[string]interface{}) error { +func (d *Cache) Save(ctx context.Context, cfg map[string]any) error { if err := d.driver.Save(ctx, cfg); err != nil { return err } diff --git a/src/pkg/config/db/cache_test.go b/src/pkg/config/db/cache_test.go index 50ab312dce0..0f151caa001 100644 --- a/src/pkg/config/db/cache_test.go +++ b/src/pkg/config/db/cache_test.go @@ -33,7 +33,7 @@ func TestCacheLoadAndSave(t *testing.T) { cache, _ := cache.New("redis") driver := NewCacheDriver(cache, &Database{cfgDAO: dao.New()}) - cfgs := map[string]interface{}{ + cfgs := map[string]any{ common.AUTHMode: "db_auth", common.LDAPURL: "ldap://ldap.vmware.com", } @@ -50,7 +50,7 @@ func TestCacheLoadAndSave(t *testing.T) { func BenchmarkCacheLoad(b *testing.B) { ctx := orm.Context() - cfgs := map[string]interface{}{} + cfgs := map[string]any{} for _, item := range metadata.Instance().GetAll() { cfgs[item.Name] = item.DefaultValue } diff --git a/src/pkg/config/db/dao/dao.go b/src/pkg/config/db/dao/dao.go index 8ab731ad76a..809d56ee3de 100644 --- a/src/pkg/config/db/dao/dao.go +++ b/src/pkg/config/db/dao/dao.go @@ -47,7 +47,7 @@ func (d *dao) GetConfigEntries(ctx context.Context) ([]*models.ConfigEntry, erro } var p []*models.ConfigEntry sql := "select * from properties" - n, err := o.Raw(sql, []interface{}{}).QueryRows(&p) + n, err := o.Raw(sql, []any{}).QueryRows(&p) if err != nil { return nil, err diff --git a/src/pkg/config/db/db.go b/src/pkg/config/db/db.go index f0c7e6e3ea5..8be70311eb5 100644 --- a/src/pkg/config/db/db.go +++ b/src/pkg/config/db/db.go @@ -32,8 +32,8 @@ type Database struct { } // Load - load config from database, only user setting will be load from database. -func (d *Database) Load(ctx context.Context) (map[string]interface{}, error) { - resultMap := map[string]interface{}{} +func (d *Database) Load(ctx context.Context) (map[string]any, error) { + resultMap := map[string]any{} configEntries, err := d.cfgDAO.GetConfigEntries(ctx) if err != nil { return resultMap, err @@ -60,7 +60,7 @@ func (d *Database) Load(ctx context.Context) (map[string]interface{}, error) { } // Save - Only save user config items in the cfgs map -func (d *Database) Save(ctx context.Context, cfgs map[string]interface{}) error { +func (d *Database) Save(ctx context.Context, cfgs map[string]any) error { var configEntries []models.ConfigEntry for key, value := range cfgs { if item, ok := metadata.Instance().GetByName(key); ok { diff --git a/src/pkg/config/db/db_test.go b/src/pkg/config/db/db_test.go index 99a9e3871ef..7a561e4f199 100644 --- a/src/pkg/config/db/db_test.go +++ b/src/pkg/config/db/db_test.go @@ -26,7 +26,7 @@ import ( func TestDatabase_Load(t *testing.T) { - cfgs := map[string]interface{}{ + cfgs := map[string]any{ common.AUTHMode: "db_auth", common.LDAPURL: "ldap://ldap.vmware.com", } @@ -50,7 +50,7 @@ func TestDatabase_Save(t *testing.T) { if err != nil { t.Errorf("failed to load config %v", err) } - cfgMap := map[string]interface{}{"ldap_url": ldapURL} + cfgMap := map[string]any{"ldap_url": ldapURL} driver.Save(testCtx, cfgMap) updatedMap, err := driver.Load(testCtx) if err != nil { @@ -62,7 +62,7 @@ func TestDatabase_Save(t *testing.T) { } func BenchmarkDatabaseLoad(b *testing.B) { - cfgs := map[string]interface{}{} + cfgs := map[string]any{} for _, item := range metadata.Instance().GetAll() { cfgs[item.Name] = item.DefaultValue } diff --git a/src/pkg/config/db/manager_test.go b/src/pkg/config/db/manager_test.go index 24ef30acdd1..219d4132694 100644 --- a/src/pkg/config/db/manager_test.go +++ b/src/pkg/config/db/manager_test.go @@ -30,7 +30,7 @@ import ( "github.com/goharbor/harbor/src/pkg/config/store" ) -var TestDBConfig = map[string]interface{}{ +var TestDBConfig = map[string]any{ "postgresql_host": "localhost", "postgresql_database": "registry", "postgresql_password": "root123", @@ -72,7 +72,7 @@ func TestSaveToDatabase(t *testing.T) { } func TestUpdateCfg(t *testing.T) { - testConfig := map[string]interface{}{ + testConfig := map[string]any{ "ldap_url": "ldaps://ldap.vmware.com", "ldap_search_dn": "cn=admin,dc=example,dc=com", "ldap_timeout": 10, @@ -99,7 +99,7 @@ func TestCfgManager_loadDefaultValues(t *testing.T) { func TestCfgManger_loadSystemValues(t *testing.T) { configManager.LoadDefault() configManager.LoadSystemConfigFromEnv() - configManager.UpdateConfig(testCtx, map[string]interface{}{ + configManager.UpdateConfig(testCtx, map[string]any{ "postgresql_host": "127.0.0.1", }) if configManager.Get(testCtx, "postgresql_host").GetString() != "127.0.0.1" { @@ -107,7 +107,7 @@ func TestCfgManger_loadSystemValues(t *testing.T) { } } func TestCfgManager_GetDatabaseCfg(t *testing.T) { - configManager.UpdateConfig(testCtx, map[string]interface{}{ + configManager.UpdateConfig(testCtx, map[string]any{ "postgresql_host": "localhost", "postgresql_database": "registry", "postgresql_password": "root123", @@ -155,7 +155,7 @@ func TestConfigStore_Load(t *testing.T) { func TestToString(t *testing.T) { cases := []struct { name string - value interface{} + value any expect string }{ { diff --git a/src/pkg/config/inmemory/manager.go b/src/pkg/config/inmemory/manager.go index 025166f0df0..3cbfaf3316c 100644 --- a/src/pkg/config/inmemory/manager.go +++ b/src/pkg/config/inmemory/manager.go @@ -16,6 +16,7 @@ package inmemory import ( "context" + "maps" "sync" "github.com/goharbor/harbor/src/common" @@ -31,35 +32,31 @@ func init() { // Driver driver for unit testing type Driver struct { sync.Mutex - cfgMap map[string]interface{} + cfgMap map[string]any } // Load load data from driver, for example load from database, // it should be invoked before get any user scope config // for system scope config, because it is immutable, no need to call this method -func (d *Driver) Load(context.Context) (map[string]interface{}, error) { +func (d *Driver) Load(context.Context) (map[string]any, error) { d.Lock() defer d.Unlock() - res := make(map[string]interface{}) - for k, v := range d.cfgMap { - res[k] = v - } + res := make(map[string]any) + maps.Copy(res, d.cfgMap) return res, nil } // Save only save user config setting to driver, for example: database, REST -func (d *Driver) Save(_ context.Context, cfg map[string]interface{}) error { +func (d *Driver) Save(_ context.Context, cfg map[string]any) error { d.Lock() defer d.Unlock() - for k, v := range cfg { - d.cfgMap[k] = v - } + maps.Copy(d.cfgMap, cfg) return nil } // NewInMemoryManager create a manager for unit testing, doesn't involve database or REST func NewInMemoryManager() *config.CfgManager { - manager := &config.CfgManager{Store: store.NewConfigStore(&Driver{cfgMap: map[string]interface{}{}})} + manager := &config.CfgManager{Store: store.NewConfigStore(&Driver{cfgMap: map[string]any{}})} // load default Value manager.LoadDefault() // load system config from env diff --git a/src/pkg/config/inmemory/manager_test.go b/src/pkg/config/inmemory/manager_test.go index ee0bb7ff0b0..b57589b9b99 100644 --- a/src/pkg/config/inmemory/manager_test.go +++ b/src/pkg/config/inmemory/manager_test.go @@ -24,7 +24,7 @@ import ( func TestNewInMemoryManager(t *testing.T) { ctx := context.Background() inMemoryManager := NewInMemoryManager() - inMemoryManager.UpdateConfig(ctx, map[string]interface{}{ + inMemoryManager.UpdateConfig(ctx, map[string]any{ "ldap_url": "ldaps://ldap.vmware.com", "ldap_timeout": 5, "ldap_verify_cert": true, diff --git a/src/pkg/config/manager.go b/src/pkg/config/manager.go index 75215af1c11..c4628c7a37d 100644 --- a/src/pkg/config/manager.go +++ b/src/pkg/config/manager.go @@ -75,8 +75,8 @@ func (c *CfgManager) LoadSystemConfigFromEnv() { } // GetAll get all settings. -func (c *CfgManager) GetAll(ctx context.Context) map[string]interface{} { - resultMap := map[string]interface{}{} +func (c *CfgManager) GetAll(ctx context.Context) map[string]any { + resultMap := map[string]any{} if err := c.Store.Load(ctx); err != nil { log.Errorf("AllConfigs failed, error %v", err) return resultMap @@ -96,8 +96,8 @@ func (c *CfgManager) GetAll(ctx context.Context) map[string]interface{} { } // GetUserCfgs retrieve all user configs -func (c *CfgManager) GetUserCfgs(ctx context.Context) map[string]interface{} { - resultMap := map[string]interface{}{} +func (c *CfgManager) GetUserCfgs(ctx context.Context) map[string]any { + resultMap := map[string]any{} if err := c.Store.Load(ctx); err != nil { log.Errorf("UserConfigs failed, error %v", err) return resultMap @@ -146,7 +146,7 @@ func (c *CfgManager) Get(_ context.Context, key string) *metadata.ConfigureValue } // Set ... -func (c *CfgManager) Set(_ context.Context, key string, value interface{}) { +func (c *CfgManager) Set(_ context.Context, key string, value any) { configValue, err := metadata.NewCfgValue(key, utils.GetStrValueOfAnyType(value)) if err != nil { log.Errorf("error when setting key: %v, error %v", key, err) @@ -176,12 +176,12 @@ func (c *CfgManager) GetDatabaseCfg() *models.Database { } // UpdateConfig - Update config Store with a specified configuration and also save updated configure. -func (c *CfgManager) UpdateConfig(ctx context.Context, cfgs map[string]interface{}) error { +func (c *CfgManager) UpdateConfig(ctx context.Context, cfgs map[string]any) error { return c.Store.Update(ctx, cfgs) } // ValidateCfg validate config by metadata. return the first error if exist. -func (c *CfgManager) ValidateCfg(ctx context.Context, cfgs map[string]interface{}) error { +func (c *CfgManager) ValidateCfg(ctx context.Context, cfgs map[string]any) error { for key, value := range cfgs { item, exist := metadata.Instance().GetByName(key) if !exist { diff --git a/src/pkg/config/rest/rest.go b/src/pkg/config/rest/rest.go index c7368c4c051..138e91af9bc 100644 --- a/src/pkg/config/rest/rest.go +++ b/src/pkg/config/rest/rest.go @@ -36,13 +36,13 @@ func NewRESTDriver(configRESTURL string, modifiers ...modifier.Modifier) *Driver // Value ... type Value struct { - Val interface{} `json:"value"` - Editable bool `json:"editable"` + Val any `json:"value"` + Editable bool `json:"editable"` } // Load - load config data from REST server -func (h *Driver) Load(_ context.Context) (map[string]interface{}, error) { - cfgMap := map[string]interface{}{} +func (h *Driver) Load(_ context.Context) (map[string]any, error) { + cfgMap := map[string]any{} origMap := map[string]*Value{} log.Infof("get configuration from url: %+v", h.configRESTURL) err := h.client.Get(h.configRESTURL, &origMap) @@ -59,6 +59,6 @@ func (h *Driver) Load(_ context.Context) (map[string]interface{}, error) { } // Save - Save config data to REST server by PUT method -func (h *Driver) Save(_ context.Context, cfg map[string]interface{}) error { +func (h *Driver) Save(_ context.Context, cfg map[string]any) error { return h.client.Put(h.configRESTURL, cfg) } diff --git a/src/pkg/config/rest/rest_test.go b/src/pkg/config/rest/rest_test.go index f1940010bdd..663c4bcd6c4 100644 --- a/src/pkg/config/rest/rest_test.go +++ b/src/pkg/config/rest/rest_test.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "io" + "maps" "net/http" "net/http/httptest" "testing" @@ -28,7 +29,7 @@ import ( ) func ConfigGetHandler(w http.ResponseWriter, r *http.Request) { - cfgs := map[string]interface{}{ + cfgs := map[string]any{ "ldap_url": &Value{Val: "ldaps://ldap.vmware.com", Editable: true}, "ldap_scope": &Value{Val: 5, Editable: true}, "ldap_verify_cert": &Value{Val: true, Editable: true}, @@ -54,10 +55,10 @@ func TestHTTPDriver_Load(t *testing.T) { assert.Equal(t, true, configMap["ldap_verify_cert"]) } -var configMapForTest = map[string]interface{}{} +var configMapForTest = map[string]any{} func ConfigPutHandler(w http.ResponseWriter, r *http.Request) { - cfgs := map[string]interface{}{} + cfgs := map[string]any{} content, err := io.ReadAll(r.Body) if err != nil { log.Fatal(err) @@ -66,16 +67,14 @@ func ConfigPutHandler(w http.ResponseWriter, r *http.Request) { if err != nil { log.Fatal(err) } - for k, v := range cfgs { - configMapForTest[k] = v - } + maps.Copy(configMapForTest, cfgs) } func TestHTTPDriver_Save(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(ConfigPutHandler)) defer server.Close() httpDriver := NewRESTDriver(server.URL) - configMap := map[string]interface{}{ + configMap := map[string]any{ "ldap_url": "ldap://www.example.com", "ldap_timeout": 10, "ldap_verify_cert": false, diff --git a/src/pkg/config/store/driver.go b/src/pkg/config/store/driver.go index 4b3cb7b0537..853fab6f667 100644 --- a/src/pkg/config/store/driver.go +++ b/src/pkg/config/store/driver.go @@ -20,7 +20,7 @@ import "context" // Driver the interface to save/load config type Driver interface { // Load - load config item from config driver - Load(ctx context.Context) (map[string]interface{}, error) + Load(ctx context.Context) (map[string]any, error) // Save - save config item into config driver - Save(ctx context.Context, cfg map[string]interface{}) error + Save(ctx context.Context, cfg map[string]any) error } diff --git a/src/pkg/config/store/store.go b/src/pkg/config/store/store.go index 846e7a34f8e..6c1e61b6519 100644 --- a/src/pkg/config/store/store.go +++ b/src/pkg/config/store/store.go @@ -51,8 +51,8 @@ func (c *ConfigStore) Get(key string) (*metadata.ConfigureValue, error) { return nil, metadata.ErrValueNotSet } -// GetAnyType get interface{} type for config items -func (c *ConfigStore) GetAnyType(key string) (interface{}, error) { +// GetAnyType get any type for config items +func (c *ConfigStore) GetAnyType(key string) (any, error) { if value, ok := c.cfgValues.Load(key); ok { if result, ok := value.(metadata.ConfigureValue); ok { return result.GetAnyType() @@ -96,8 +96,8 @@ func (c *ConfigStore) Load(ctx context.Context) error { // Save - Save all data in current store func (c *ConfigStore) Save(ctx context.Context) error { - cfgMap := map[string]interface{}{} - c.cfgValues.Range(func(key, value interface{}) bool { + cfgMap := map[string]any{} + c.cfgValues.Range(func(key, value any) bool { keyStr := fmt.Sprintf("%v", key) if configValue, ok := value.(metadata.ConfigureValue); ok { valueStr := configValue.Value @@ -118,7 +118,7 @@ func (c *ConfigStore) Save(ctx context.Context) error { } // Update - Only update specified settings in cfgMap in store and driver -func (c *ConfigStore) Update(ctx context.Context, cfgMap map[string]interface{}) error { +func (c *ConfigStore) Update(ctx context.Context, cfgMap map[string]any) error { // Update to store for key, value := range cfgMap { configValue, err := metadata.NewCfgValue(key, utils.GetStrValueOfAnyType(value)) @@ -137,7 +137,7 @@ func (c *ConfigStore) Update(ctx context.Context, cfgMap map[string]interface{}) } // ToString ... -func ToString(value interface{}) (string, error) { +func ToString(value any) (string, error) { if value == nil { return "nil", nil } diff --git a/src/pkg/config/validate/ldapgroup.go b/src/pkg/config/validate/ldapgroup.go index e9f9af879ac..b1dc852e44d 100644 --- a/src/pkg/config/validate/ldapgroup.go +++ b/src/pkg/config/validate/ldapgroup.go @@ -28,7 +28,7 @@ type LdapGroupValidateRule struct { } // Validate validate the ldap group config settings, cfgs is the config items need to be updated, the final config should be merged with the cfgMgr -func (l LdapGroupValidateRule) Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]interface{}) error { +func (l LdapGroupValidateRule) Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]any) error { cfg := &cfgModels.GroupConf{ Filter: cfgMgr.Get(ctx, common.LDAPGroupSearchFilter).GetString(), NameAttribute: cfgMgr.Get(ctx, common.LDAPGroupAttributeName).GetString(), diff --git a/src/pkg/config/validate/test/ldapgroup_test.go b/src/pkg/config/validate/test/ldapgroup_test.go index 1ff938369b1..d639e03627a 100644 --- a/src/pkg/config/validate/test/ldapgroup_test.go +++ b/src/pkg/config/validate/test/ldapgroup_test.go @@ -30,7 +30,7 @@ import ( func TestMain(m *testing.M) { test.InitDatabaseFromEnv() - config.InitWithSettings(map[string]interface{}{ + config.InitWithSettings(map[string]any{ "ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_attribute_name": "", "ldap_group_membership_attribute": "memberof", @@ -47,7 +47,7 @@ func TestLdapGroupValidateRule_Validate(t *testing.T) { type args struct { ctx context.Context cfgMgr config.Manager - cfgs map[string]interface{} + cfgs map[string]any } cases := []struct { name string @@ -56,17 +56,17 @@ func TestLdapGroupValidateRule_Validate(t *testing.T) { }{ { name: `nothing updated, no error`, - in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]interface{}{}}, + in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]any{}}, want: nil, }, { name: `empty ldap group membership attribute, update all`, - in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]interface{}{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_attribute_name": "cn", "ldap_group_membership_attribute": ""}}, + in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]any{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_attribute_name": "cn", "ldap_group_membership_attribute": ""}}, want: errors.New("ldap group membership attribute can not be empty"), }, { name: `empty ldap group attribute name, update partially`, - in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]interface{}{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_membership_attribute": "memberof"}}, + in: args{ctx: orm.Context(), cfgMgr: mgr, cfgs: map[string]any{"ldap_group_search_filter": "objectClass=groupOfNames", "ldap_group_membership_attribute": "memberof"}}, want: errors.New("ldap group name attribute can not be empty"), }, } diff --git a/src/pkg/config/validate/validate.go b/src/pkg/config/validate/validate.go index 4173efd4d02..b0dc2f4faac 100644 --- a/src/pkg/config/validate/validate.go +++ b/src/pkg/config/validate/validate.go @@ -27,5 +27,5 @@ import ( // 3. Add the rule to validateRules in pkg/config/manager.go type Rule interface { // Validate validates a specific group of configuration items, cfgs contains the config need to be updated, the final config should merged with the cfgMgr - Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]interface{}) error + Validate(ctx context.Context, cfgMgr config.Manager, cfgs map[string]any) error } diff --git a/src/pkg/exporter/cache.go b/src/pkg/exporter/cache.go index 10a4d6c10b7..9dc41df8de6 100644 --- a/src/pkg/exporter/cache.go +++ b/src/pkg/exporter/cache.go @@ -24,7 +24,7 @@ var c *cache const defaultCacheCleanInterval = 10 type cachedValue struct { - Value interface{} + Value any Expiration int64 } @@ -35,7 +35,7 @@ type cache struct { } // CacheGet get a value from cache -func CacheGet(key string) (value interface{}, ok bool) { +func CacheGet(key string) (value any, ok bool) { c.RLock() v, ok := c.store[key] c.RUnlock() @@ -52,7 +52,7 @@ func CacheGet(key string) (value interface{}, ok bool) { } // CachePut put a value to cache with key -func CachePut(key, value interface{}) { +func CachePut(key, value any) { c.Lock() defer c.Unlock() c.store[key.(string)] = cachedValue{ diff --git a/src/pkg/exporter/statistics_collector.go b/src/pkg/exporter/statistics_collector.go index eb36c63736d..695c17f547d 100644 --- a/src/pkg/exporter/statistics_collector.go +++ b/src/pkg/exporter/statistics_collector.go @@ -119,12 +119,12 @@ func (g StatisticsCollector) getPublicProjectsAndRepositories(ctx context.Contex if pubProjectsAmount == 0 { return pubProjectsAmount, 0 } - var ids []interface{} + var ids []any for _, p := range pubProjects { ids = append(ids, p.ProjectID) } n, err := g.repoCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": q.NewOrList(ids), }, }) diff --git a/src/pkg/jobmonitor/redis.go b/src/pkg/jobmonitor/redis.go index 7886673e4b5..63ab35bb762 100644 --- a/src/pkg/jobmonitor/redis.go +++ b/src/pkg/jobmonitor/redis.go @@ -88,10 +88,7 @@ func (r *redisClientImpl) StopPendingJobs(ctx context.Context, jobType string) ( // use batch to list the job in queue, because the too many object load from a list might cause the redis crash for startIndex := int64(0); startIndex < int64(size); startIndex += batchSize { - endIndex := startIndex + batchSize - if endIndex > int64(size) { - endIndex = int64(size) - } + endIndex := min(startIndex+batchSize, int64(size)) jobs, err := redis.Strings(conn.Do("LRANGE", redisKeyJobQueue, startIndex, endIndex)) if err != nil { return []string{}, err diff --git a/src/pkg/jobmonitor/redis_test.go b/src/pkg/jobmonitor/redis_test.go index 4eae1a49a3b..a2aefba813c 100644 --- a/src/pkg/jobmonitor/redis_test.go +++ b/src/pkg/jobmonitor/redis_test.go @@ -59,7 +59,7 @@ func (s *RedisClientTestSuite) TestUntrackJobStatusInBatch() { jobIDs := make([]string, 0) conn := s.redisClient.redisPool.Get() defer conn.Close() - for i := 0; i < 100; i++ { + for range 100 { k := utils.GenerateRandomStringWithLen(10) jobIDs = append(jobIDs, k) key := rds.KeyJobStats(fmt.Sprintf("{%s}", s.redisClient.namespace), k) @@ -92,7 +92,7 @@ func (s *RedisClientTestSuite) TestStopPendingJobs() { } conn := s.redisClient.redisPool.Get() defer conn.Close() - for i := 0; i < 100; i++ { + for range 100 { job := jobInfo{ ID: utils.GenerateRandomStringWithLen(10), Params: utils.GenerateRandomStringWithLen(10), @@ -107,7 +107,7 @@ func (s *RedisClientTestSuite) TestStopPendingJobs() { } } // job without id - for i := 0; i < 10; i++ { + for range 10 { job := jobInfo{ Params: utils.GenerateRandomStringWithLen(10), } diff --git a/src/pkg/label/dao/dao_test.go b/src/pkg/label/dao/dao_test.go index 7049f0db1a4..881d92495c6 100644 --- a/src/pkg/label/dao/dao_test.go +++ b/src/pkg/label/dao/dao_test.go @@ -164,7 +164,7 @@ func (l *labelDaoTestSuite) DeleteReference() { func (l *labelDaoTestSuite) DeleteReferences() { n, err := l.dao.DeleteReferences(l.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "LabelID": 1000, }, }) diff --git a/src/pkg/label/manager.go b/src/pkg/label/manager.go index 224a47e56b6..994ade5eabb 100644 --- a/src/pkg/label/manager.go +++ b/src/pkg/label/manager.go @@ -105,7 +105,7 @@ func (m *manager) AddTo(ctx context.Context, labelID int64, artifactID int64) er } func (m *manager) RemoveFrom(ctx context.Context, labelID int64, artifactID int64) error { n, err := m.dao.DeleteReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "LabelID": labelID, "ArtifactID": artifactID, }, @@ -121,7 +121,7 @@ func (m *manager) RemoveFrom(ctx context.Context, labelID int64, artifactID int6 func (m *manager) RemoveAllFrom(ctx context.Context, artifactID int64) error { _, err := m.dao.DeleteReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) @@ -130,7 +130,7 @@ func (m *manager) RemoveAllFrom(ctx context.Context, artifactID int64) error { func (m *manager) RemoveFromAllArtifacts(ctx context.Context, labelID int64) error { _, err := m.dao.DeleteReferences(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "LabelID": labelID, }, }) diff --git a/src/pkg/member/dao/dao.go b/src/pkg/member/dao/dao.go index 1b4b9e4119c..22655d1083e 100644 --- a/src/pkg/member/dao/dao.go +++ b/src/pkg/member/dao/dao.go @@ -79,7 +79,7 @@ func (d *dao) GetProjectMember(ctx context.Context, queryMember models.Member, q on pm.project_id = ? and u.user_id = pm.entity_id join role r on pm.role = r.role_id where pm.entity_type = 'u') as a where a.project_id = ? ` - queryParam := make([]interface{}, 1) + queryParam := make([]any, 1) // used ProjectID already queryParam = append(queryParam, queryMember.ProjectID) queryParam = append(queryParam, queryMember.ProjectID) @@ -119,7 +119,7 @@ func (d *dao) GetTotalOfProjectMembers(ctx context.Context, projectID int64, _ * sql := "SELECT COUNT(1) FROM project_member WHERE project_id = ?" - queryParam := []interface{}{projectID} + queryParam := []any{projectID} if len(roles) > 0 { sql += " AND role = ?" @@ -223,7 +223,7 @@ func (d *dao) SearchMemberByName(ctx context.Context, projectID int64, entityNam left join role r on pm.role = r.role_id where pm.project_id = ? and ug.group_name like ? order by entity_name ` - queryParam := make([]interface{}, 4) + queryParam := make([]any, 4) queryParam = append(queryParam, projectID) queryParam = append(queryParam, "%"+orm.Escape(entityName)+"%") queryParam = append(queryParam, projectID) @@ -238,7 +238,7 @@ func (d *dao) ListRoles(ctx context.Context, user *models.User, projectID int64) if user == nil { return nil, nil } - var params []interface{} + var params []any sql := ` select role from project_member diff --git a/src/pkg/notification/hook/hook.go b/src/pkg/notification/hook/hook.go index 690e69b4cc6..643431714ff 100644 --- a/src/pkg/notification/hook/hook.go +++ b/src/pkg/notification/hook/hook.go @@ -58,7 +58,7 @@ func (hm *DefaultManager) StartHook(ctx context.Context, event *model.HookEvent, return errors.Errorf("invalid event target type: %s", event.Target.Type) } - extraAttrs := map[string]interface{}{ + extraAttrs := map[string]any{ "event_type": event.EventType, "payload": data.Parameters["payload"], } @@ -73,7 +73,7 @@ func (hm *DefaultManager) StartHook(ctx context.Context, event *model.HookEvent, Metadata: &job.Metadata{ JobKind: data.Metadata.JobKind, }, - Parameters: map[string]interface{}(data.Parameters), + Parameters: map[string]any(data.Parameters), }) if err != nil { return errors.Errorf("failed to create task for webhook based on policy %d: %v", event.PolicyID, err) diff --git a/src/pkg/notification/policy/dao/dao_test.go b/src/pkg/notification/policy/dao/dao_test.go index 2cf9f3d023c..5e31eded745 100644 --- a/src/pkg/notification/policy/dao/dao_test.go +++ b/src/pkg/notification/policy/dao/dao_test.go @@ -99,7 +99,7 @@ func (suite *DaoTestSuite) TestDelete() { func (suite *DaoTestSuite) TestList() { jobs, err := suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": 333, }, }) @@ -151,7 +151,7 @@ func (suite *DaoTestSuite) TestCount() { suite.True(total > 0) total, err = suite.dao.Count(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": 111, }, }) diff --git a/src/pkg/notifier/event/event.go b/src/pkg/notifier/event/event.go index bed42902ed3..68cae60a2e9 100644 --- a/src/pkg/notifier/event/event.go +++ b/src/pkg/notifier/event/event.go @@ -27,7 +27,7 @@ import ( // Event to publish type Event struct { Topic string - Data interface{} + Data any } // TopicEvent - Events that contains topic information diff --git a/src/pkg/notifier/handler/notification/http_handler.go b/src/pkg/notifier/handler/notification/http_handler.go index 4c62c378fa1..53546d3f920 100644 --- a/src/pkg/notifier/handler/notification/http_handler.go +++ b/src/pkg/notifier/handler/notification/http_handler.go @@ -36,7 +36,7 @@ func (h *HTTPHandler) Name() string { } // Handle handles http event -func (h *HTTPHandler) Handle(ctx context.Context, value interface{}) error { +func (h *HTTPHandler) Handle(ctx context.Context, value any) error { if value == nil { return errors.New("HTTPHandler cannot handle nil value") } @@ -84,7 +84,7 @@ func (h *HTTPHandler) process(ctx context.Context, event *model.HookEvent) error return errors.Wrap(err, "error to marshal header") } - j.Parameters = map[string]interface{}{ + j.Parameters = map[string]any{ "payload": string(payload), "address": event.Target.Address, "header": string(headerBytes), diff --git a/src/pkg/notifier/handler/notification/slack_handler.go b/src/pkg/notifier/handler/notification/slack_handler.go index b447c909e49..c5152d7476c 100644 --- a/src/pkg/notifier/handler/notification/slack_handler.go +++ b/src/pkg/notifier/handler/notification/slack_handler.go @@ -85,7 +85,7 @@ func (s *SlackHandler) Name() string { } // Handle handles event to slack -func (s *SlackHandler) Handle(ctx context.Context, value interface{}) error { +func (s *SlackHandler) Handle(ctx context.Context, value any) error { if value == nil { return errors.New("SlackHandler cannot handle nil value") } @@ -118,7 +118,7 @@ func (s *SlackHandler) process(ctx context.Context, event *model.HookEvent) erro return fmt.Errorf("convert payload to slack body failed: %v", err) } - j.Parameters = map[string]interface{}{ + j.Parameters = map[string]any{ "payload": payload, "address": event.Target.Address, "skip_cert_verify": event.Target.SkipCertVerify, @@ -127,7 +127,7 @@ func (s *SlackHandler) process(ctx context.Context, event *model.HookEvent) erro } func (s *SlackHandler) convert(payLoad *model.Payload) (string, error) { - data := make(map[string]interface{}) + data := make(map[string]any) data["Type"] = payLoad.Type data["OccurAt"] = payLoad.OccurAt data["Operator"] = payLoad.Operator diff --git a/src/pkg/notifier/model/event.go b/src/pkg/notifier/model/event.go index 4bf852df0a0..3969982d9b7 100644 --- a/src/pkg/notifier/model/event.go +++ b/src/pkg/notifier/model/event.go @@ -48,11 +48,11 @@ type EventData struct { // Resource describe infos of resource triggered notification type Resource struct { - Digest string `json:"digest,omitempty"` - Tag string `json:"tag,omitempty"` - ResourceURL string `json:"resource_url,omitempty"` - ScanOverview map[string]interface{} `json:"scan_overview,omitempty"` - SBOMOverview map[string]interface{} `json:"sbom_overview,omitempty"` + Digest string `json:"digest,omitempty"` + Tag string `json:"tag,omitempty"` + ResourceURL string `json:"resource_url,omitempty"` + ScanOverview map[string]any `json:"scan_overview,omitempty"` + SBOMOverview map[string]any `json:"sbom_overview,omitempty"` } // Repository info of notification event diff --git a/src/pkg/notifier/notification_handler.go b/src/pkg/notifier/notification_handler.go index 70769139651..4130b696509 100644 --- a/src/pkg/notifier/notification_handler.go +++ b/src/pkg/notifier/notification_handler.go @@ -24,7 +24,7 @@ type NotificationHandler interface { // Handle the event when it coming. // value might be optional, it depends on usages. - Handle(ctx context.Context, value interface{}) error + Handle(ctx context.Context, value any) error // IsStateful returns whether the handler is stateful or not. // If handler is stateful, it will not be triggered in parallel. diff --git a/src/pkg/notifier/notifier.go b/src/pkg/notifier/notifier.go index b8f2a2c36c9..6666482e952 100644 --- a/src/pkg/notifier/notifier.go +++ b/src/pkg/notifier/notifier.go @@ -38,7 +38,7 @@ type Notification struct { // Value of notification. // Optional - Value interface{} + Value any } // HandlerChannel provides not only the chan itself but also the count of @@ -237,7 +237,7 @@ func UnSubscribe(topic string, handler string) error { } // Publish is a wrapper utility method for NotificationWatcher.notify() -func Publish(ctx context.Context, topic string, value interface{}) error { +func Publish(ctx context.Context, topic string, value any) error { return notificationWatcher.Notify(ctx, Notification{ Topic: topic, Value: value, diff --git a/src/pkg/notifier/notifier_test.go b/src/pkg/notifier/notifier_test.go index ba1ceb63c53..856ed344d34 100644 --- a/src/pkg/notifier/notifier_test.go +++ b/src/pkg/notifier/notifier_test.go @@ -24,7 +24,7 @@ func (fsh *fakeStatefulHandler) IsStateful() bool { return true } -func (fsh *fakeStatefulHandler) Handle(ctx context.Context, v interface{}) error { +func (fsh *fakeStatefulHandler) Handle(ctx context.Context, v any) error { increment := 0 if v != nil && reflect.TypeOf(v).Kind() == reflect.Int { increment = v.(int) @@ -43,7 +43,7 @@ func (fsh *fakeStatelessHandler) Name() string { return "fakeStateless" } -func (fsh *fakeStatelessHandler) Handle(ctx context.Context, v interface{}) error { +func (fsh *fakeStatelessHandler) Handle(ctx context.Context, v any) error { return nil } @@ -173,7 +173,7 @@ func TestConcurrentPublish(t *testing.T) { } // Publish in a short interval. - for i := 0; i < 10; i++ { + for range 10 { Publish(context.TODO(), "topic1", 100) } diff --git a/src/pkg/oidc/helper.go b/src/pkg/oidc/helper.go index 3ce329fada0..9d619f4fbed 100644 --- a/src/pkg/oidc/helper.go +++ b/src/pkg/oidc/helper.go @@ -22,6 +22,7 @@ import ( "net/http" "net/url" "regexp" + "slices" "strings" "sync" "sync/atomic" @@ -48,7 +49,7 @@ const ( ) type claimsProvider interface { - Claims(v interface{}) error + Claims(v any) error } type providerHelper struct { @@ -376,7 +377,7 @@ func userInfoFromClaims(c claimsProvider, setting cfgModels.OIDCSetting) (*UserI return nil, err } if setting.UserClaim != "" { - allClaims := make(map[string]interface{}) + allClaims := make(map[string]any) if err := c.Claims(&allClaims); err != nil { return nil, err } @@ -392,11 +393,8 @@ func userInfoFromClaims(c claimsProvider, setting cfgModels.OIDCSetting) (*UserI } res.Groups, res.hasGroupClaim = groupsFromClaims(c, setting.GroupsClaim) if len(setting.AdminGroup) > 0 { - for _, g := range res.Groups { - if g == setting.AdminGroup { - res.AdminGroupMember = true - break - } + if slices.Contains(res.Groups, setting.AdminGroup) { + res.AdminGroupMember = true } } return res, nil @@ -406,12 +404,12 @@ func userInfoFromClaims(c claimsProvider, setting cfgModels.OIDCSetting) (*UserI // If the claims does not have the claim defined as k, the second return value will be false, otherwise true func groupsFromClaims(gp claimsProvider, k string) ([]string, bool) { res := make([]string, 0) - claimMap := make(map[string]interface{}) + claimMap := make(map[string]any) if err := gp.Claims(&claimMap); err != nil { log.Errorf("failed to fetch claims, error: %v", err) return res, false } - g, ok := claimMap[k].([]interface{}) + g, ok := claimMap[k].([]any) if !ok { if len(strings.TrimSpace(k)) > 0 { log.Warningf("Unable to get groups from claims, claims: %+v, groups claims key: %s", claimMap, k) diff --git a/src/pkg/oidc/helper_test.go b/src/pkg/oidc/helper_test.go index c79a7c2269d..315340a0047 100644 --- a/src/pkg/oidc/helper_test.go +++ b/src/pkg/oidc/helper_test.go @@ -37,7 +37,7 @@ import ( func TestMain(m *testing.M) { test.InitDatabaseFromEnv() - conf := map[string]interface{}{ + conf := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://accounts.google.com", common.OIDCVerifyCert: "true", @@ -72,7 +72,7 @@ func TestHelperGet(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "https://oauth2.googleapis.com/token", p.Endpoint().TokenURL) - update := map[string]interface{}{ + update := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://accounts.google.com", common.OIDCVerifyCert: "true", @@ -91,7 +91,7 @@ func TestHelperGet(t *testing.T) { } func TestAuthCodeURL(t *testing.T) { - conf := map[string]interface{}{ + conf := map[string]any{ common.OIDCName: "test", common.OIDCEndpoint: "https://accounts.google.com", common.OIDCVerifyCert: "true", @@ -130,10 +130,10 @@ func TestTestEndpoint(t *testing.T) { } type fakeClaims struct { - claims map[string]interface{} + claims map[string]any } -func (fc *fakeClaims) Claims(n interface{}) error { +func (fc *fakeClaims) Claims(n any) error { b, err := json.Marshal(fc.claims) if err != nil { return err @@ -142,14 +142,14 @@ func (fc *fakeClaims) Claims(n interface{}) error { } func TestGroupsFromClaim(t *testing.T) { - in := map[string]interface{}{ + in := map[string]any{ "user": "user1", - "groups": []interface{}{"group1", "group2"}, - "groups_2": []interface{}{"group1", "group2", 2}, + "groups": []any{"group1", "group2"}, + "groups_2": []any{"group1", "group2", 2}, } m := []struct { - input map[string]interface{} + input map[string]any key string expect []string ok bool @@ -190,15 +190,15 @@ func TestGroupsFromClaim(t *testing.T) { func TestUserInfoFromClaims(t *testing.T) { s := []struct { - input map[string]interface{} + input map[string]any setting cfgModels.OIDCSetting expect *UserInfo }{ { - input: map[string]interface{}{ + input: map[string]any{ "name": "Daniel", "email": "daniel@gmail.com", - "groups": []interface{}{"g1", "g2"}, + "groups": []any{"g1", "g2"}, }, setting: cfgModels.OIDCSetting{ Name: "t1", @@ -217,10 +217,10 @@ func TestUserInfoFromClaims(t *testing.T) { }, }, { - input: map[string]interface{}{ + input: map[string]any{ "name": "Daniel", "email": "daniel@gmail.com", - "groups": []interface{}{"g1", "g2"}, + "groups": []any{"g1", "g2"}, }, setting: cfgModels.OIDCSetting{ Name: "t2", @@ -240,12 +240,12 @@ func TestUserInfoFromClaims(t *testing.T) { }, }, { - input: map[string]interface{}{ + input: map[string]any{ "iss": "issuer", "sub": "subject000", "name": "jack", "email": "jack@gmail.com", - "groupclaim": []interface{}{}, + "groupclaim": []any{}, }, setting: cfgModels.OIDCSetting{ Name: "t3", @@ -265,10 +265,10 @@ func TestUserInfoFromClaims(t *testing.T) { }, }, { - input: map[string]interface{}{ + input: map[string]any{ "name": "Alvaro", "email": "airadier@gmail.com", - "groups": []interface{}{"g1", "g2"}, + "groups": []any{"g1", "g2"}, }, setting: cfgModels.OIDCSetting{ Name: "t4", diff --git a/src/pkg/p2p/preheat/dao/instance/dao_test.go b/src/pkg/p2p/preheat/dao/instance/dao_test.go index cc2b6e4caa6..f2a25dbdebf 100644 --- a/src/pkg/p2p/preheat/dao/instance/dao_test.go +++ b/src/pkg/p2p/preheat/dao/instance/dao_test.go @@ -149,7 +149,7 @@ func (is *instanceSuite) TestList() { assert.Equal(t, defaultInstance.ID, instances[0].ID) // keyword search - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["name"] = "kraken-us-1" instances, err = is.dao.List(is.ctx, &q.Query{Keywords: keywords}) assert.Nil(t, err) diff --git a/src/pkg/p2p/preheat/dao/policy/dao_test.go b/src/pkg/p2p/preheat/dao/policy/dao_test.go index fb6161bc4da..1498801ffbd 100644 --- a/src/pkg/p2p/preheat/dao/policy/dao_test.go +++ b/src/pkg/p2p/preheat/dao/policy/dao_test.go @@ -182,7 +182,7 @@ func (d *daoTestSuite) TestList() { // list policy filter by project query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "project_id": 1, }, } diff --git a/src/pkg/p2p/preheat/job_test.go b/src/pkg/p2p/preheat/job_test.go index d561558ba48..de54164d1dc 100644 --- a/src/pkg/p2p/preheat/job_test.go +++ b/src/pkg/p2p/preheat/job_test.go @@ -58,7 +58,7 @@ func (suite *JobTestSuite) SetupSuite() { ImageName: "busybox", Tag: "latest", URL: "https://harbor.com", - Headers: map[string]interface{}{ + Headers: map[string]any{ "robot$my": "jwt-token", }, } diff --git a/src/pkg/p2p/preheat/models/policy/policy.go b/src/pkg/p2p/preheat/models/policy/policy.go index 65c50f30243..789038be092 100644 --- a/src/pkg/p2p/preheat/models/policy/policy.go +++ b/src/pkg/p2p/preheat/models/policy/policy.go @@ -73,10 +73,10 @@ type Schema struct { TriggerStr string `orm:"column(trigger)" json:"-"` Enabled bool `orm:"column(enabled)" json:"enabled"` // ExtraAttrs is used to store extra attributes provided by vendor. - ExtraAttrsStr string `orm:"column(extra_attrs)" json:"-"` - ExtraAttrs map[string]interface{} `orm:"-" json:"extra_attrs"` - CreatedAt time.Time `orm:"column(creation_time)" json:"creation_time"` - UpdatedTime time.Time `orm:"column(update_time)" json:"update_time"` + ExtraAttrsStr string `orm:"column(extra_attrs)" json:"-"` + ExtraAttrs map[string]any `orm:"-" json:"extra_attrs"` + CreatedAt time.Time `orm:"column(creation_time)" json:"creation_time"` + UpdatedTime time.Time `orm:"column(update_time)" json:"update_time"` } // TableName specifies the policy schema table name. @@ -102,8 +102,8 @@ type FilterType = string // Filter holds the info of the filter type Filter struct { - Type FilterType `json:"type"` - Value interface{} `json:"value"` + Type FilterType `json:"type"` + Value any `json:"value"` } // TriggerType represents the type of trigger. @@ -235,12 +235,12 @@ func decodeTrigger(triggerStr string) (*Trigger, error) { } // decodeExtraAttrs parse extraAttrsStr to extraAttrs. -func decodeExtraAttrs(extraAttrsStr string) (map[string]interface{}, error) { +func decodeExtraAttrs(extraAttrsStr string) (map[string]any, error) { if len(extraAttrsStr) == 0 { return nil, nil } - extraAttrs := make(map[string]interface{}) + extraAttrs := make(map[string]any) if err := json.Unmarshal([]byte(extraAttrsStr), &extraAttrs); err != nil { return nil, err } diff --git a/src/pkg/p2p/preheat/models/policy/policy_test.go b/src/pkg/p2p/preheat/models/policy/policy_test.go index 1637501d2e1..c36f7082d39 100644 --- a/src/pkg/p2p/preheat/models/policy/policy_test.go +++ b/src/pkg/p2p/preheat/models/policy/policy_test.go @@ -85,7 +85,7 @@ func (p *PolicyTestSuite) TestDecode() { p.Len(s.Filters, 3) p.NotNil(s.Trigger) - p.Equal(map[string]interface{}{"key": "value"}, s.ExtraAttrs) + p.Equal(map[string]any{"key": "value"}, s.ExtraAttrs) // invalid filter or trigger s.FiltersStr = "" @@ -125,7 +125,7 @@ func (p *PolicyTestSuite) TestEncode() { }, TriggerStr: "", Enabled: false, - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "key": "value", }, } diff --git a/src/pkg/p2p/preheat/policy/manager.go b/src/pkg/p2p/preheat/policy/manager.go index b8f84588eb2..ab301447402 100644 --- a/src/pkg/p2p/preheat/policy/manager.go +++ b/src/pkg/p2p/preheat/policy/manager.go @@ -125,7 +125,7 @@ func (m *manager) ListPoliciesByProject(ctx context.Context, project int64, quer } if query.Keywords == nil { - query.Keywords = make(map[string]interface{}) + query.Keywords = make(map[string]any) } // set project filter query.Keywords["project_id"] = project diff --git a/src/pkg/p2p/preheat/provider/client/http_client.go b/src/pkg/p2p/preheat/provider/client/http_client.go index 0c367286f77..d3acbfdead1 100644 --- a/src/pkg/p2p/preheat/provider/client/http_client.go +++ b/src/pkg/p2p/preheat/provider/client/http_client.go @@ -147,7 +147,7 @@ func (hc *HTTPClient) get(url string, cred *auth.Credential, parmas map[string]s } // Post content to the service specified by the url -func (hc *HTTPClient) Post(url string, cred *auth.Credential, body interface{}, options map[string]string) ([]byte, error) { +func (hc *HTTPClient) Post(url string, cred *auth.Credential, body any, options map[string]string) ([]byte, error) { bytes, err := hc.post(url, cred, body, options) logMsg := fmt.Sprintf("Post %s with cred=%v, options=%v", url, cred, options) if err != nil { @@ -159,7 +159,7 @@ func (hc *HTTPClient) Post(url string, cred *auth.Credential, body interface{}, return bytes, err } -func (hc *HTTPClient) post(url string, cred *auth.Credential, body interface{}, options map[string]string) ([]byte, error) { +func (hc *HTTPClient) post(url string, cred *auth.Credential, body any, options map[string]string) ([]byte, error) { if len(url) == 0 { return nil, errors.New("empty url") } diff --git a/src/pkg/p2p/preheat/provider/dragonfly.go b/src/pkg/p2p/preheat/provider/dragonfly.go index bbf6e905593..ebfb429e713 100644 --- a/src/pkg/p2p/preheat/provider/dragonfly.go +++ b/src/pkg/p2p/preheat/provider/dragonfly.go @@ -36,7 +36,17 @@ const ( // dragonflyJobPath is the job path for dragonfly openapi. dragonflyJobPath = "/oapi/v1/jobs" +) + +const ( + // preheatTypeImage represents the image to the dragonfly cluster. + preheatTypeImage = "image" + // preheatTypeFile represents the file to the dragonfly cluster. + preheatTypeFile = "file" +) + +const ( // scopeTypeSingleSeedPeer represents preheat image to single seed peer in p2p cluster. scopeTypeSingleSeedPeer = "single_seed_peer" @@ -233,9 +243,9 @@ func (dd *DragonflyDriver) Preheat(preheatingImage *PreheatImage) (*PreheatingSt // Construct the preheat job request by the given parameters of the preheating image . req := &dragonflyCreateJobRequest{ Type: "preheat", - // TODO: Support set SchedulerClusterIDs, FilteredQueryParam, ConcurrentCount and Timeout. + // TODO: Support set FilteredQueryParam, ConcurrentCount and Timeout. Args: dragonflyCreateJobRequestArgs{ - Type: preheatingImage.Type, + Type: preheatTypeImage, URL: preheatingImage.URL, Headers: headerToMapString(preheatingImage.Headers), }, @@ -358,7 +368,7 @@ func (dd *DragonflyDriver) getCred() *auth.Credential { } } -func headerToMapString(header map[string]interface{}) map[string]string { +func headerToMapString(header map[string]any) map[string]string { m := make(map[string]string) for k, v := range header { if s, ok := v.(string); ok { diff --git a/src/pkg/p2p/preheat/provider/dragonfly_test.go b/src/pkg/p2p/preheat/provider/dragonfly_test.go index 06d26f5949c..35c18f762ad 100644 --- a/src/pkg/p2p/preheat/provider/dragonfly_test.go +++ b/src/pkg/p2p/preheat/provider/dragonfly_test.go @@ -85,7 +85,7 @@ func (suite *DragonflyTestSuite) TestPreheat() { Tag: "latest", URL: "https://harbor.com", Digest: "sha256:f3c97e3bd1e27393eb853a5c90b1132f2cda84336d5ba5d100c720dc98524c82", - ExtraAttrs: map[string]interface{}{ + ExtraAttrs: map[string]any{ "scope": "all_peers", "cluster_ids": []uint{1, 2, 3}, }, diff --git a/src/pkg/p2p/preheat/provider/preheat_image.go b/src/pkg/p2p/preheat/provider/preheat_image.go index 56e81a629fb..ebabd19a85a 100644 --- a/src/pkg/p2p/preheat/provider/preheat_image.go +++ b/src/pkg/p2p/preheat/provider/preheat_image.go @@ -17,13 +17,17 @@ package provider import ( "encoding/json" "net/url" + "slices" "github.com/pkg/errors" ) -const ( - // SupportedType indicates the supported preheating type 'image'. - SupportedType = "image" +var ( + // SupportedTypes indicates the supported preheating types. + SupportedTypes = []string{ + "image", + "cnai", + } ) // PreheatImage contains related information which can help providers to get/pull the images. @@ -35,7 +39,7 @@ type PreheatImage struct { URL string `json:"url"` // The headers which will be sent to the above URL of preheating image - Headers map[string]interface{} `json:"headers"` + Headers map[string]any `json:"headers"` // The image name ImageName string `json:"image,omitempty"` @@ -47,7 +51,7 @@ type PreheatImage struct { Digest string `json:"digest"` // ExtraAttrs contains extra attributes for the preheating image. - ExtraAttrs map[string]interface{} `json:"extra_attrs,omitempty"` + ExtraAttrs map[string]any `json:"extra_attrs,omitempty"` } // FromJSON build preheating image from the given data. @@ -75,7 +79,7 @@ func (img *PreheatImage) ToJSON() (string, error) { // Validate PreheatImage func (img *PreheatImage) Validate() error { - if img.Type != SupportedType { + if !slices.Contains(SupportedTypes, img.Type) { return errors.Errorf("unsupported type '%s'", img.Type) } diff --git a/src/pkg/permission/evaluator/rbac/casbin_match.go b/src/pkg/permission/evaluator/rbac/casbin_match.go index 543512b469f..36a3a115e8e 100644 --- a/src/pkg/permission/evaluator/rbac/casbin_match.go +++ b/src/pkg/permission/evaluator/rbac/casbin_match.go @@ -39,8 +39,8 @@ func (s *regexpStore) Get(key string, build func(string) *regexp.Regexp) *regexp } func (s *regexpStore) Purge() { - var keys []interface{} - s.entries.Range(func(key, _ interface{}) bool { + var keys []any + s.entries.Range(func(key, _ any) bool { keys = append(keys, key) return true }) @@ -94,7 +94,7 @@ func keyMatch2(key1 string, key2 string) bool { return store.Get(key2, keyMatch2Build).MatchString(key1) } -func keyMatch2Func(args ...interface{}) (interface{}, error) { +func keyMatch2Func(args ...any) (any, error) { name1 := args[0].(string) name2 := args[1].(string) diff --git a/src/pkg/permission/evaluator/rbac/casbin_match_test.go b/src/pkg/permission/evaluator/rbac/casbin_match_test.go index da2562ff9b9..911eda4513c 100644 --- a/src/pkg/permission/evaluator/rbac/casbin_match_test.go +++ b/src/pkg/permission/evaluator/rbac/casbin_match_test.go @@ -67,7 +67,7 @@ func TestRegexpStore(t *testing.T) { sLen := func() int { var l int - s.entries.Range(func(key, value interface{}) bool { + s.entries.Range(func(key, value any) bool { l++ return true diff --git a/src/pkg/permission/types/namespace.go b/src/pkg/permission/types/namespace.go index e76c44b5e31..e17ed86b23e 100644 --- a/src/pkg/permission/types/namespace.go +++ b/src/pkg/permission/types/namespace.go @@ -33,7 +33,7 @@ type Namespace interface { // Resource returns new resource for subresources with the namespace Resource(subresources ...Resource) Resource // Identity returns identity attached with namespace - Identity() interface{} + Identity() any // GetPolicies returns all policies of the namespace GetPolicies() []*Policy } diff --git a/src/pkg/project/dao/dao.go b/src/pkg/project/dao/dao.go index 05d9f193bce..f0ecf79ac47 100644 --- a/src/pkg/project/dao/dao.go +++ b/src/pkg/project/dao/dao.go @@ -218,7 +218,7 @@ func (d *dao) ListAdminRolesOfUser(ctx context.Context, user commonmodels.User) var membersG []models.Member if len(user.GroupIDs) > 0 { - var params []interface{} + var params []any params = append(params, user.GroupIDs) sqlG := fmt.Sprintf(`select b.* from project as a left join project_member as b on a.project_id = b.project_id diff --git a/src/pkg/project/manager.go b/src/pkg/project/manager.go index b030061afdd..24c97559656 100644 --- a/src/pkg/project/manager.go +++ b/src/pkg/project/manager.go @@ -39,7 +39,7 @@ type Manager interface { Delete(ctx context.Context, id int64) error // Get the project specified by the ID or name - Get(ctx context.Context, idOrName interface{}) (*models.Project, error) + Get(ctx context.Context, idOrName any) (*models.Project, error) // List projects according to the query List(ctx context.Context, query *q.Query) ([]*models.Project, error) @@ -98,7 +98,7 @@ func (m *manager) Delete(ctx context.Context, id int64) error { } // Get the project specified by the ID -func (m *manager) Get(ctx context.Context, idOrName interface{}) (*models.Project, error) { +func (m *manager) Get(ctx context.Context, idOrName any) (*models.Project, error) { id, ok := idOrName.(int64) if ok { return m.dao.Get(ctx, id) diff --git a/src/pkg/project/models/project.go b/src/pkg/project/models/project.go index 80318aa21a4..ae8256a7d79 100644 --- a/src/pkg/project/models/project.go +++ b/src/pkg/project/models/project.go @@ -170,7 +170,7 @@ func (p *Project) ProxyCacheSpeed() int32 { } // FilterByPublic returns orm.QuerySeter with public filter -func (p *Project) FilterByPublic(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByPublic(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { subQuery := `SELECT project_id FROM project_metadata WHERE name = 'public' AND value = '%s'` if isTrue(value) { subQuery = fmt.Sprintf(subQuery, "true") @@ -181,7 +181,7 @@ func (p *Project) FilterByPublic(_ context.Context, qs orm.QuerySeter, _ string, } // FilterByOwner returns orm.QuerySeter with owner filter -func (p *Project) FilterByOwner(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByOwner(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { username, ok := value.(string) if !ok { return qs @@ -191,7 +191,7 @@ func (p *Project) FilterByOwner(_ context.Context, qs orm.QuerySeter, _ string, } // FilterByMember returns orm.QuerySeter with member filter -func (p *Project) FilterByMember(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByMember(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { query, ok := value.(*MemberQuery) if !ok { return qs @@ -219,7 +219,7 @@ func (p *Project) FilterByMember(_ context.Context, qs orm.QuerySeter, _ string, } // FilterByNames returns orm.QuerySeter with name filter -func (p *Project) FilterByNames(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (p *Project) FilterByNames(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { query, ok := value.(*NamesQuery) if !ok { return qs @@ -242,7 +242,7 @@ func (p *Project) FilterByNames(_ context.Context, qs orm.QuerySeter, _ string, return qs.FilterRaw("project_id", fmt.Sprintf("IN (%s)", subQuery)) } -func isTrue(i interface{}) bool { +func isTrue(i any) bool { switch value := i.(type) { case bool: return value diff --git a/src/pkg/proxy/secret/manager.go b/src/pkg/proxy/secret/manager.go index ac98fc6562d..a461e67ed1b 100644 --- a/src/pkg/proxy/secret/manager.go +++ b/src/pkg/proxy/secret/manager.go @@ -129,7 +129,7 @@ func (man *mgr) gc() { return } log.Debugf("Running GC on secret map...") - man.m.Range(func(k, v interface{}) bool { + man.m.Range(func(k, v any) bool { repoV, ok := v.(targetRepository) if ok && repoV.expiresAt.Before(time.Now()) { log.Debugf("Removed expire secret: %s, repo: %s", k, repoV.name) diff --git a/src/pkg/proxy/secret/manager_test.go b/src/pkg/proxy/secret/manager_test.go index 0e07ee0f221..cbb532477f1 100644 --- a/src/pkg/proxy/secret/manager_test.go +++ b/src/pkg/proxy/secret/manager_test.go @@ -36,13 +36,13 @@ func TestExpiration(t *testing.T) { func TestGC(t *testing.T) { manager := createManager(1*time.Second, 10, 1*time.Second).(*mgr) - for i := 0; i < 10; i++ { + for i := range 10 { rn := fmt.Sprintf("project%d/golang", i) manager.Generate(rn) } time.Sleep(2 * time.Second) assert.Equal(t, uint64(10), manager.size) - for i := 0; i < 1000; i++ { + for i := range 1000 { rn := fmt.Sprintf("project%d/redis", i) manager.Generate(rn) } diff --git a/src/pkg/quota/dao/dao.go b/src/pkg/quota/dao/dao.go index 1a93443c40b..4053f7e1763 100644 --- a/src/pkg/quota/dao/dao.go +++ b/src/pkg/quota/dao/dao.go @@ -186,12 +186,12 @@ func (d *dao) Update(ctx context.Context, quota *models.Quota) error { var ( sql string - params []interface{} + params []any ) if quota.UsedChanged { sql = "UPDATE quota_usage SET used = ?, update_time = ?, version = ? WHERE id = ? AND version = ?" - params = []interface{}{ + params = []any{ quota.Used, time.Now(), getVersion(quota.UsedVersion), @@ -200,7 +200,7 @@ func (d *dao) Update(ctx context.Context, quota *models.Quota) error { } } else { sql = "UPDATE quota SET hard = ?, update_time = ?, version = ? WHERE id = ? AND version = ?" - params = []interface{}{ + params = []any{ quota.Hard, time.Now(), getVersion(quota.HardVersion), diff --git a/src/pkg/quota/dao/util.go b/src/pkg/quota/dao/util.go index 60c8c9c2df9..01d55eae064 100644 --- a/src/pkg/quota/dao/util.go +++ b/src/pkg/quota/dao/util.go @@ -42,8 +42,8 @@ type listQuery struct { ReferenceIDs []string `json:"reference_ids"` } -func listConditions(query *q.Query) (string, []interface{}) { - params := []interface{}{} +func listConditions(query *q.Query) (string, []any) { + params := []any{} sql := "" if query == nil { return sql, params diff --git a/src/pkg/quota/driver/driver.go b/src/pkg/quota/driver/driver.go index 854c60f74ec..309d837b599 100644 --- a/src/pkg/quota/driver/driver.go +++ b/src/pkg/quota/driver/driver.go @@ -27,7 +27,7 @@ var ( ) // QuotaRefObject type for quota ref object -type QuotaRefObject map[string]interface{} +type QuotaRefObject map[string]any // Driver the driver for quota type Driver interface { diff --git a/src/pkg/rbac/dao/dao.go b/src/pkg/rbac/dao/dao.go index 0c05b8388a5..dc827065043 100644 --- a/src/pkg/rbac/dao/dao.go +++ b/src/pkg/rbac/dao/dao.go @@ -93,7 +93,7 @@ func (d *dao) ListPermissions(ctx context.Context, query *q.Query) ([]*model.Rol func (d *dao) DeletePermissionsByRole(ctx context.Context, roleType string, roleID int64) error { qs, err := orm.QuerySetter(ctx, &model.RolePermission{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "role_type": roleType, "role_id": roleID, }, diff --git a/src/pkg/rbac/dao/dao_test.go b/src/pkg/rbac/dao/dao_test.go index e709554ea19..44213607fcb 100644 --- a/src/pkg/rbac/dao/dao_test.go +++ b/src/pkg/rbac/dao/dao_test.go @@ -126,7 +126,7 @@ func (suite *DaoTestSuite) TestDeletePermission() { func (suite *DaoTestSuite) TestListPermissions() { rps, err := suite.dao.ListPermissions(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "role_type": "robot", "role_id": 1, "permission_policy_id": 4, @@ -141,7 +141,7 @@ func (suite *DaoTestSuite) TestDeletePermissionsByRole() { suite.Require().Nil(err) rps, err := suite.dao.ListPermissions(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "role_type": "serviceaccount", "role_id": 2, }, @@ -172,7 +172,7 @@ func (suite *DaoTestSuite) TestDeleteRbacPolicy() { func (suite *DaoTestSuite) TestListRbacPolicies() { rps, err := suite.dao.ListRbacPolicies(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "scope": "/project/1", "resource": "repository", "action": "pull", diff --git a/src/pkg/reg/adapter/aliacr/adapter.go b/src/pkg/reg/adapter/aliacr/adapter.go index 94e366de986..7ed17b84972 100644 --- a/src/pkg/reg/adapter/aliacr/adapter.go +++ b/src/pkg/reg/adapter/aliacr/adapter.go @@ -17,12 +17,16 @@ package aliacr import ( "errors" "fmt" + "net/http" + "os" "path/filepath" "regexp" + "strconv" "strings" commonhttp "github.com/goharbor/harbor/src/common/http" "github.com/goharbor/harbor/src/common/utils" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/log" adp "github.com/goharbor/harbor/src/pkg/reg/adapter" "github.com/goharbor/harbor/src/pkg/reg/adapter/native" @@ -32,7 +36,17 @@ import ( "github.com/goharbor/harbor/src/pkg/registry/auth/bearer" ) +var rateLimiterTransport http.RoundTripper + +const acrQPSLimit = 15 + func init() { + var envAcrQPSLimit, _ = strconv.Atoi(os.Getenv("REG_ADAPTER_ACR_QPS_LIMIT")) + if envAcrQPSLimit > acrQPSLimit || envAcrQPSLimit < 1 { + envAcrQPSLimit = acrQPSLimit + } + rateLimiterTransport = lib.NewRateLimitedTransport(envAcrQPSLimit, commonhttp.NewTransport()) + if err := adp.RegisterFactory(model.RegistryTypeAliAcr, new(factory)); err != nil { log.Errorf("failed to register factory for %s: %v", model.RegistryTypeAliAcr, err) return @@ -101,12 +115,12 @@ func newAdapter(registry *model.Registry) (*adapter, error) { var acrAPI openapi if !info.IsACREE { - acrAPI, err = newAcrOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID) + acrAPI, err = newAcrOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID, rateLimiterTransport) if err != nil { return nil, err } } else { - acrAPI, err = newAcreeOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID, info.InstanceID) + acrAPI, err = newAcreeOpenapi(registry.Credential.AccessKey, registry.Credential.AccessSecret, info.RegionID, info.InstanceID, rateLimiterTransport) if err != nil { return nil, err } diff --git a/src/pkg/reg/adapter/aliacr/openapi.go b/src/pkg/reg/adapter/aliacr/openapi.go index 4a46c8fa087..3599d992581 100644 --- a/src/pkg/reg/adapter/aliacr/openapi.go +++ b/src/pkg/reg/adapter/aliacr/openapi.go @@ -17,12 +17,17 @@ package aliacr import ( "encoding/json" "fmt" + "net/http" "strconv" "time" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/cr" "github.com/aliyun/alibaba-cloud-sdk-go/services/cr_ee" + + "github.com/goharbor/harbor/src/pkg/registry" ) type repository struct { @@ -57,8 +62,13 @@ type acrOpenapi struct { var _ openapi = &acrOpenapi{} // newAcrOpenapi creates a new acrOpenapi instance. -func newAcrOpenapi(accessKeyID string, accessKeySecret string, regionID string) (openapi, error) { - client, err := cr.NewClientWithAccessKey(regionID, accessKeyID, accessKeySecret) +func newAcrOpenapi(accessKeyID string, accessKeySecret string, regionID string, rateLimiter http.RoundTripper) (openapi, error) { + config := sdk.NewConfig(). + WithUserAgent(registry.UserAgent). + WithAutoRetry(true) + config.Transport = rateLimiter + + client, err := cr.NewClientWithOptions(regionID, config, credentials.NewAccessKeyCredential(accessKeyID, accessKeySecret)) if err != nil { return nil, err } @@ -182,8 +192,13 @@ type acreeOpenapi struct { var _ openapi = &acreeOpenapi{} // newAcreeOpenapi creates a new acreeOpenapi instance. -func newAcreeOpenapi(accessKeyID string, accessKeySecret string, regionID string, instanceID string) (openapi, error) { - client, err := cr_ee.NewClientWithAccessKey(regionID, accessKeyID, accessKeySecret) +func newAcreeOpenapi(accessKeyID string, accessKeySecret string, regionID string, instanceID string, rateLimiter http.RoundTripper) (openapi, error) { + config := sdk.NewConfig(). + WithUserAgent(registry.UserAgent). + WithAutoRetry(true) + config.Transport = rateLimiter + + client, err := cr_ee.NewClientWithOptions(regionID, config, credentials.NewAccessKeyCredential(accessKeyID, accessKeySecret)) if err != nil { return nil, err } diff --git a/src/pkg/reg/adapter/awsecr/adapter_test.go b/src/pkg/reg/adapter/awsecr/adapter_test.go index 8d910b840ce..f9590b2cc65 100644 --- a/src/pkg/reg/adapter/awsecr/adapter_test.go +++ b/src/pkg/reg/adapter/awsecr/adapter_test.go @@ -329,7 +329,7 @@ func compileRegexpEveryTime(url string) (string, string, error) { } func BenchmarkGetAccountRegion(b *testing.B) { - for i := 0; i < b.N; i++ { + for b.Loop() { for _, url := range urlForBenchmark { parseAccountRegion(url) } @@ -337,7 +337,7 @@ func BenchmarkGetAccountRegion(b *testing.B) { } func BenchmarkCompileRegexpEveryTime(b *testing.B) { - for i := 0; i < b.N; i++ { + for b.Loop() { for _, url := range urlForBenchmark { compileRegexpEveryTime(url) } diff --git a/src/pkg/reg/adapter/dtr/client.go b/src/pkg/reg/adapter/dtr/client.go index 3a135686ee8..f037562e826 100644 --- a/src/pkg/reg/adapter/dtr/client.go +++ b/src/pkg/reg/adapter/dtr/client.go @@ -53,7 +53,7 @@ func NewClient(registry *model.Registry) *Client { } // getAndIteratePagination will iterator over a paginated response from DTR -func (c *Client) getAndIteratePagination(endpoint string, v interface{}) error { +func (c *Client) getAndIteratePagination(endpoint string, v any) error { urlAPI, err := url.Parse(endpoint) if err != nil { return err diff --git a/src/pkg/reg/adapter/gitlab/adapter.go b/src/pkg/reg/adapter/gitlab/adapter.go index f5545448422..8b5aa72e31c 100644 --- a/src/pkg/reg/adapter/gitlab/adapter.go +++ b/src/pkg/reg/adapter/gitlab/adapter.go @@ -165,7 +165,7 @@ func (a *adapter) FetchArtifacts(filters []*model.Filter) ([]*model.Resource, er } tags = append(tags, vTag.Name) } - info := make(map[string]interface{}) + info := make(map[string]any) info["location"] = repository.Location info["path"] = repository.Path diff --git a/src/pkg/reg/adapter/gitlab/client.go b/src/pkg/reg/adapter/gitlab/client.go index af268da62d8..ad08e18c308 100644 --- a/src/pkg/reg/adapter/gitlab/client.go +++ b/src/pkg/reg/adapter/gitlab/client.go @@ -111,7 +111,7 @@ func (c *Client) getTags(projectID int64, repositoryID int64) ([]*Tag, error) { // GetAndIteratePagination iterates the pagination header and returns all resources // The parameter "v" must be a pointer to a slice -func (c *Client) GetAndIteratePagination(endpoint string, v interface{}) error { +func (c *Client) GetAndIteratePagination(endpoint string, v any) error { urlAPI, err := url.Parse(endpoint) if err != nil { return err diff --git a/src/pkg/reg/adapter/googlegcr/adapter.go b/src/pkg/reg/adapter/googlegcr/adapter.go index 75a33665c9f..ecfcb64654a 100644 --- a/src/pkg/reg/adapter/googlegcr/adapter.go +++ b/src/pkg/reg/adapter/googlegcr/adapter.go @@ -19,6 +19,7 @@ import ( "fmt" "io" "net/http" + "slices" "github.com/opencontainers/go-digest" @@ -195,10 +196,8 @@ func (a adapter) listGcrTagsByRef(repository, reference string) ([]string, strin } // for tag as reference for d, m := range tgs.Manifest { - for _, t := range m.Tag { - if t == reference { - return m.Tag, d, nil - } + if slices.Contains(m.Tag, reference) { + return m.Tag, d, nil } } return nil, "", nil diff --git a/src/pkg/reg/adapter/harbor/base/adapter.go b/src/pkg/reg/adapter/harbor/base/adapter.go index 9e2c5ec1a3b..c65f232e7b8 100644 --- a/src/pkg/reg/adapter/harbor/base/adapter.go +++ b/src/pkg/reg/adapter/harbor/base/adapter.go @@ -256,7 +256,7 @@ func (a *Adapter) ListProjects(filters []*model.Filter) ([]*Project, error) { return a.Client.ListProjects("") } -func abstractPublicMetadata(metadata map[string]interface{}) map[string]interface{} { +func abstractPublicMetadata(metadata map[string]any) map[string]any { if metadata == nil { return nil } @@ -264,20 +264,20 @@ func abstractPublicMetadata(metadata map[string]interface{}) map[string]interfac if !exist { return nil } - return map[string]interface{}{ + return map[string]any{ "public": public, } } // currently, mergeMetadata only handles the public metadata -func mergeMetadata(metadata1, metadata2 map[string]interface{}) map[string]interface{} { +func mergeMetadata(metadata1, metadata2 map[string]any) map[string]any { public := parsePublic(metadata1) && parsePublic(metadata2) - return map[string]interface{}{ + return map[string]any{ "public": strconv.FormatBool(public), } } -func parsePublic(metadata map[string]interface{}) bool { +func parsePublic(metadata map[string]any) bool { if metadata == nil { return false } @@ -303,10 +303,10 @@ func parsePublic(metadata map[string]interface{}) bool { // Project model type Project struct { - ID int64 `json:"project_id"` - Name string `json:"name"` - Metadata map[string]interface{} `json:"metadata"` - RegistryID int64 `json:"registry_id"` + ID int64 `json:"project_id"` + Name string `json:"name"` + Metadata map[string]any `json:"metadata"` + RegistryID int64 `json:"registry_id"` } func isLocalHarbor(url string) bool { diff --git a/src/pkg/reg/adapter/harbor/base/adapter_test.go b/src/pkg/reg/adapter/harbor/base/adapter_test.go index dc692c5ab25..9866e764dad 100644 --- a/src/pkg/reg/adapter/harbor/base/adapter_test.go +++ b/src/pkg/reg/adapter/harbor/base/adapter_test.go @@ -194,15 +194,15 @@ func TestPrepareForPush(t *testing.T) { func TestParsePublic(t *testing.T) { cases := []struct { - metadata map[string]interface{} + metadata map[string]any result bool }{ {nil, false}, - {map[string]interface{}{}, false}, - {map[string]interface{}{"public": true}, true}, - {map[string]interface{}{"public": "not_bool"}, false}, - {map[string]interface{}{"public": "true"}, true}, - {map[string]interface{}{"public": struct{}{}}, false}, + {map[string]any{}, false}, + {map[string]any{"public": true}, true}, + {map[string]any{"public": "not_bool"}, false}, + {map[string]any{"public": "true"}, true}, + {map[string]any{"public": struct{}{}}, false}, } for _, c := range cases { assert.Equal(t, c.result, parsePublic(c.metadata)) @@ -211,33 +211,33 @@ func TestParsePublic(t *testing.T) { func TestMergeMetadata(t *testing.T) { cases := []struct { - m1 map[string]interface{} - m2 map[string]interface{} + m1 map[string]any + m2 map[string]any public bool }{ { - m1: map[string]interface{}{ + m1: map[string]any{ "public": "true", }, - m2: map[string]interface{}{ + m2: map[string]any{ "public": "true", }, public: true, }, { - m1: map[string]interface{}{ + m1: map[string]any{ "public": "false", }, - m2: map[string]interface{}{ + m2: map[string]any{ "public": "true", }, public: false, }, { - m1: map[string]interface{}{ + m1: map[string]any{ "public": "false", }, - m2: map[string]interface{}{ + m2: map[string]any{ "public": "false", }, public: false, @@ -255,14 +255,14 @@ func TestAbstractPublicMetadata(t *testing.T) { assert.Nil(t, meta) // contains no public metadata - metadata := map[string]interface{}{ + metadata := map[string]any{ "other": "test", } meta = abstractPublicMetadata(metadata) assert.Nil(t, meta) // contains public metadata - metadata = map[string]interface{}{ + metadata = map[string]any{ "other": "test", "public": "true", } diff --git a/src/pkg/reg/adapter/harbor/base/client.go b/src/pkg/reg/adapter/harbor/base/client.go index 64f98cfad55..73c21552926 100644 --- a/src/pkg/reg/adapter/harbor/base/client.go +++ b/src/pkg/reg/adapter/harbor/base/client.go @@ -81,10 +81,10 @@ func (c *Client) ListLabels() ([]string, error) { } // CreateProject creates project -func (c *Client) CreateProject(name string, metadata map[string]interface{}) error { +func (c *Client) CreateProject(name string, metadata map[string]any) error { project := struct { - Name string `json:"project_name"` - Metadata map[string]interface{} `json:"metadata"` + Name string `json:"project_name"` + Metadata map[string]any `json:"metadata"` }{ Name: name, Metadata: metadata, diff --git a/src/pkg/reg/adapter/huawei/huawei_adapter.go b/src/pkg/reg/adapter/huawei/huawei_adapter.go index f75710ea864..2ab71536f01 100644 --- a/src/pkg/reg/adapter/huawei/huawei_adapter.go +++ b/src/pkg/reg/adapter/huawei/huawei_adapter.go @@ -212,7 +212,7 @@ func (a *adapter) PrepareForPush(resources []*model.Resource) error { func (a *adapter) GetNamespace(namespaceStr string) (*model.Namespace, error) { var namespace = &model.Namespace{ Name: "", - Metadata: make(map[string]interface{}), + Metadata: make(map[string]any), } urls := fmt.Sprintf("%s/dockyard/v2/namespaces/%s", a.registry.URL, namespaceStr) @@ -299,8 +299,8 @@ type hwNamespace struct { ImageCount int64 `json:"image_count"` } -func (ns hwNamespace) metadata() map[string]interface{} { - var metadata = make(map[string]interface{}) +func (ns hwNamespace) metadata() map[string]any { + var metadata = make(map[string]any) metadata["id"] = ns.ID metadata["creator_name"] = ns.CreatorName metadata["domain_public"] = ns.DomainPublic diff --git a/src/pkg/reg/adapter/huawei/huawei_adapter_test.go b/src/pkg/reg/adapter/huawei/huawei_adapter_test.go index cffcb0fca13..290bc2754aa 100644 --- a/src/pkg/reg/adapter/huawei/huawei_adapter_test.go +++ b/src/pkg/reg/adapter/huawei/huawei_adapter_test.go @@ -71,7 +71,7 @@ func TestAdapter_PrepareForPush(t *testing.T) { repository := &model.Repository{ Name: "domain_repo_new", - Metadata: make(map[string]interface{}), + Metadata: make(map[string]any), } resource := &model.Resource{} metadata := &model.ResourceMetadata{ diff --git a/src/pkg/reg/adapter/huawei/image_registry.go b/src/pkg/reg/adapter/huawei/image_registry.go index 2037aedc650..1650665df95 100644 --- a/src/pkg/reg/adapter/huawei/image_registry.go +++ b/src/pkg/reg/adapter/huawei/image_registry.go @@ -149,7 +149,7 @@ func (a *adapter) DeleteManifest(repository, reference string) error { func parseRepoQueryResultToResource(repo hwRepoQueryResult) *model.Resource { var resource model.Resource - info := make(map[string]interface{}) + info := make(map[string]any) info["category"] = repo.Category info["description"] = repo.Description info["size"] = repo.Size diff --git a/src/pkg/reg/adapter/tencentcr/adapter.go b/src/pkg/reg/adapter/tencentcr/adapter.go index ba0207d3962..4e251f61ae7 100644 --- a/src/pkg/reg/adapter/tencentcr/adapter.go +++ b/src/pkg/reg/adapter/tencentcr/adapter.go @@ -30,6 +30,7 @@ import ( tcr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tcr/v20190924" commonhttp "github.com/goharbor/harbor/src/common/http" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/log" adp "github.com/goharbor/harbor/src/pkg/reg/adapter" "github.com/goharbor/harbor/src/pkg/reg/adapter/native" @@ -40,13 +41,15 @@ import ( var ( errInvalidTcrEndpoint = errors.New("[tencent-tcr.newAdapter] Invalid TCR instance endpoint") + rateLimiterTransport http.RoundTripper ) func init() { - var envTcrQPSLimit, _ = strconv.Atoi(os.Getenv("TCR_QPS_LIMIT")) - if envTcrQPSLimit > 1 && envTcrQPSLimit < tcrQPSLimit { - tcrQPSLimit = envTcrQPSLimit + var envTcrQPSLimit, _ = strconv.Atoi(os.Getenv("REG_ADAPTER_TCR_QPS_LIMIT")) + if envTcrQPSLimit > tcrQPSLimit || envTcrQPSLimit < 1 { + envTcrQPSLimit = tcrQPSLimit } + rateLimiterTransport = lib.NewRateLimitedTransport(envTcrQPSLimit, commonhttp.NewTransport()) if err := adp.RegisterFactory(model.RegistryTypeTencentTcr, new(factory)); err != nil { log.Errorf("failed to register factory for %s: %v", model.RegistryTypeTencentTcr, err) @@ -154,10 +157,7 @@ func newAdapter(registry *model.Registry) (a *adapter, err error) { client.Init(*instanceInfo.RegionName). WithCredential(tcrCredential). WithProfile(cfp). - WithHttpTransport(newRateLimitedTransport(tcrQPSLimit, http.DefaultTransport)) - if err != nil { - return - } + WithHttpTransport(rateLimiterTransport) var credential = NewAuth(instanceInfo.RegistryId, client) var transport = commonhttp.GetHTTPTransport(commonhttp.WithInsecure(registry.Insecure)) diff --git a/src/pkg/reg/adapter/tencentcr/artifact_registry.go b/src/pkg/reg/adapter/tencentcr/artifact_registry.go index 23b9e141a09..10b423b30fe 100644 --- a/src/pkg/reg/adapter/tencentcr/artifact_registry.go +++ b/src/pkg/reg/adapter/tencentcr/artifact_registry.go @@ -26,7 +26,7 @@ import ( "github.com/goharbor/harbor/src/pkg/reg/util" ) -var ( +const ( tcrQPSLimit = 10 ) diff --git a/src/pkg/reg/adapter/tencentcr/ratelimiter_test.go b/src/pkg/reg/adapter/tencentcr/ratelimiter_test.go deleted file mode 100644 index 743e6737ef8..00000000000 --- a/src/pkg/reg/adapter/tencentcr/ratelimiter_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package tencentcr - -import ( - "net/http" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func Test_newRateLimitedTransport(t *testing.T) { - tests := []struct { - name string - rate int - transport http.RoundTripper - }{ - {"1qps", 1, http.DefaultTransport}, - } - var req = &http.Request{} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got := newRateLimitedTransport(tt.rate, tt.transport) - start := time.Now() - for i := 0; i <= tt.rate; i++ { - got.RoundTrip(req) - } - used := int64(time.Since(start).Milliseconds()) / int64(tt.rate) - assert.GreaterOrEqualf(t, used/int64(tt.rate), int64(1e3/tt.rate), "used %d ms per req", used/int64(tt.rate)) - }) - } -} diff --git a/src/pkg/reg/adapter/volcenginecr/consts.go b/src/pkg/reg/adapter/volcenginecr/consts.go index d519d2bb0b8..d4844fed773 100644 --- a/src/pkg/reg/adapter/volcenginecr/consts.go +++ b/src/pkg/reg/adapter/volcenginecr/consts.go @@ -17,7 +17,7 @@ package volcenginecr import "errors" var ( - regionRegs = map[string]interface{}{ + regionRegs = map[string]any{ "(.*)-(cn-.*)": nil, } errListNamespaceResp = errors.New("[VolcengineCR adapt] ListNamespaces resp nil") diff --git a/src/pkg/reg/dao/dao_test.go b/src/pkg/reg/dao/dao_test.go index fa357e56a51..e723cb1fc8f 100644 --- a/src/pkg/reg/dao/dao_test.go +++ b/src/pkg/reg/dao/dao_test.go @@ -66,7 +66,7 @@ func (d *daoTestSuite) TestCount() { // query by name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "harbor", }, }) @@ -89,7 +89,7 @@ func (d *daoTestSuite) TestList() { // query by name registries, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "harbor", }, }) diff --git a/src/pkg/reg/model/namespace.go b/src/pkg/reg/model/namespace.go index 87ae11b60ef..754cc6536df 100644 --- a/src/pkg/reg/model/namespace.go +++ b/src/pkg/reg/model/namespace.go @@ -20,8 +20,8 @@ package model // if the namespace has hierarchical structure, e.g organization->team, // it should be converted to organization.team type Namespace struct { - Name string `json:"name"` - Metadata map[string]interface{} `json:"metadata"` + Name string `json:"name"` + Metadata map[string]any `json:"metadata"` } // GetStringMetadata get a string value metadata from the namespace, if not found, return the default value. diff --git a/src/pkg/reg/model/policy.go b/src/pkg/reg/model/policy.go index 3b7260b77dc..6242f6b71f5 100644 --- a/src/pkg/reg/model/policy.go +++ b/src/pkg/reg/model/policy.go @@ -35,9 +35,9 @@ const ( // Filter holds the info of the filter type Filter struct { - Type string `json:"type"` - Value interface{} `json:"value"` - Decoration string `json:"decoration,omitempty"` + Type string `json:"type"` + Value any `json:"value"` + Decoration string `json:"decoration,omitempty"` } func (f *Filter) Validate() error { @@ -62,7 +62,7 @@ func (f *Filter) Validate() error { } } case FilterTypeLabel: - labels, ok := f.Value.([]interface{}) + labels, ok := f.Value.([]any) if !ok { return errors.New(nil).WithCode(errors.BadRequestCode). WithMessage("the type of label filter value isn't string slice") diff --git a/src/pkg/reg/model/resource.go b/src/pkg/reg/model/resource.go index 6cc5a0d2993..aa164db5789 100644 --- a/src/pkg/reg/model/resource.go +++ b/src/pkg/reg/model/resource.go @@ -27,10 +27,10 @@ const ( // Resource represents the general replicating content type Resource struct { - Type string `json:"type"` - Metadata *ResourceMetadata `json:"metadata"` - Registry *Registry `json:"registry"` - ExtendedInfo map[string]interface{} `json:"extended_info"` + Type string `json:"type"` + Metadata *ResourceMetadata `json:"metadata"` + Registry *Registry `json:"registry"` + ExtendedInfo map[string]any `json:"extended_info"` // Indicate if the resource is a deleted resource Deleted bool `json:"deleted"` // indicate the resource is a tag deletion @@ -51,8 +51,8 @@ type ResourceMetadata struct { // Repository info of the resource type Repository struct { - Name string `json:"name"` - Metadata map[string]interface{} `json:"metadata"` + Name string `json:"name"` + Metadata map[string]any `json:"metadata"` } // Artifact is the individual unit that can be replicated diff --git a/src/pkg/reg/util/pattern.go b/src/pkg/reg/util/pattern.go index b0c15e6e367..63c11ce58f7 100644 --- a/src/pkg/reg/util/pattern.go +++ b/src/pkg/reg/util/pattern.go @@ -40,7 +40,7 @@ func IsSpecificPath(path string) ([]string, bool) { return nil, false } components := [][]string{} - for _, component := range strings.Split(path, "/") { + for component := range strings.SplitSeq(path, "/") { strs, ok := IsSpecificPathComponent(component) if !ok { return nil, false @@ -113,8 +113,7 @@ func IsSpecificPathComponent(component string) ([]string, bool) { suffix = component[j+1:] } components := []string{} - strs := strings.Split(component[i+1:j], ",") - for _, str := range strs { + for str := range strings.SplitSeq(component[i+1:j], ",") { components = append(components, prefix+str+suffix) } return components, true diff --git a/src/pkg/registry/interceptor/readonly/interceptor_test.go b/src/pkg/registry/interceptor/readonly/interceptor_test.go index f588b08239d..c8cdf02ddbe 100644 --- a/src/pkg/registry/interceptor/readonly/interceptor_test.go +++ b/src/pkg/registry/interceptor/readonly/interceptor_test.go @@ -53,7 +53,7 @@ func TestIntercept(t *testing.T) { // method: DELETE // read only enable: true req, _ = http.NewRequest(http.MethodDelete, "", nil) - err := config.DefaultMgr().UpdateConfig(context.Background(), map[string]interface{}{common.ReadOnly: true}) + err := config.DefaultMgr().UpdateConfig(context.Background(), map[string]any{common.ReadOnly: true}) require.Nil(t, err) time.Sleep(1 * time.Nanosecond) // make sure the cached key is expired assert.Equal(t, Err, interceptor.Intercept(req)) diff --git a/src/pkg/replication/dao/dao_test.go b/src/pkg/replication/dao/dao_test.go index e8c061d33c9..a0145e78274 100644 --- a/src/pkg/replication/dao/dao_test.go +++ b/src/pkg/replication/dao/dao_test.go @@ -63,7 +63,7 @@ func (d *daoTestSuite) TestCount() { // query by name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "test-rule", }, }) @@ -86,7 +86,7 @@ func (d *daoTestSuite) TestList() { // query by name policies, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": "test-rule", }, }) diff --git a/src/pkg/repository/dao/dao_test.go b/src/pkg/repository/dao/dao_test.go index ed630dcc674..cb649d1a6ab 100644 --- a/src/pkg/repository/dao/dao_test.go +++ b/src/pkg/repository/dao/dao_test.go @@ -79,7 +79,7 @@ func (d *daoTestSuite) TestCount() { // query by name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": repository, }, }) @@ -102,7 +102,7 @@ func (d *daoTestSuite) TestList() { // query by name repositories, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": repository, }, }) diff --git a/src/pkg/repository/manager.go b/src/pkg/repository/manager.go index 4e36821dc0d..4d7115b5aa4 100644 --- a/src/pkg/repository/manager.go +++ b/src/pkg/repository/manager.go @@ -74,7 +74,7 @@ func (m *manager) Get(ctx context.Context, id int64) (*model.RepoRecord, error) func (m *manager) GetByName(ctx context.Context, name string) (repository *model.RepoRecord, err error) { repositories, err := m.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "Name": name, }, }) diff --git a/src/pkg/repository/model/model.go b/src/pkg/repository/model/model.go index 6b1a44a0cc8..0e7616aecc8 100644 --- a/src/pkg/repository/model/model.go +++ b/src/pkg/repository/model/model.go @@ -42,7 +42,7 @@ type RepoRecord struct { } // FilterByBlobDigest filters the repositories by the blob digest -func (r *RepoRecord) FilterByBlobDigest(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (r *RepoRecord) FilterByBlobDigest(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { digest, ok := value.(string) if !ok || len(digest) == 0 { return qs diff --git a/src/pkg/retention/dao/retention_test.go b/src/pkg/retention/dao/retention_test.go index 18c89a55195..950eeb42289 100644 --- a/src/pkg/retention/dao/retention_test.go +++ b/src/pkg/retention/dao/retention_test.go @@ -54,7 +54,7 @@ func TestPolicy(t *testing.T) { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, diff --git a/src/pkg/retention/job_test.go b/src/pkg/retention/job_test.go index 3656d7aa06d..da856765b75 100644 --- a/src/pkg/retention/job_test.go +++ b/src/pkg/retention/job_test.go @@ -153,41 +153,41 @@ func (frc *fakeRetentionClient) DeleteRepository(repo *selector.Repository) erro type fakeLogger struct{} // For debuging -func (l *fakeLogger) Debug(v ...interface{}) {} +func (l *fakeLogger) Debug(v ...any) {} // For debuging with format -func (l *fakeLogger) Debugf(format string, v ...interface{}) {} +func (l *fakeLogger) Debugf(format string, v ...any) {} // For logging info -func (l *fakeLogger) Info(v ...interface{}) { +func (l *fakeLogger) Info(v ...any) { fmt.Println(v...) } // For logging info with format -func (l *fakeLogger) Infof(format string, v ...interface{}) { +func (l *fakeLogger) Infof(format string, v ...any) { fmt.Printf(format+"\n", v...) } // For warning -func (l *fakeLogger) Warning(v ...interface{}) {} +func (l *fakeLogger) Warning(v ...any) {} // For warning with format -func (l *fakeLogger) Warningf(format string, v ...interface{}) {} +func (l *fakeLogger) Warningf(format string, v ...any) {} // For logging error -func (l *fakeLogger) Error(v ...interface{}) { +func (l *fakeLogger) Error(v ...any) { fmt.Println(v...) } // For logging error with format -func (l *fakeLogger) Errorf(format string, v ...interface{}) { +func (l *fakeLogger) Errorf(format string, v ...any) { } // For fatal error -func (l *fakeLogger) Fatal(v ...interface{}) {} +func (l *fakeLogger) Fatal(v ...any) {} // For fatal error with error -func (l *fakeLogger) Fatalf(format string, v ...interface{}) {} +func (l *fakeLogger) Fatalf(format string, v ...any) {} type fakeJobContext struct{} @@ -195,7 +195,7 @@ func (c *fakeJobContext) Build(tracker job.Tracker) (job.Context, error) { return nil, nil } -func (c *fakeJobContext) Get(prop string) (interface{}, bool) { +func (c *fakeJobContext) Get(prop string) (any, bool) { return nil, false } diff --git a/src/pkg/retention/launcher.go b/src/pkg/retention/launcher.go index 766b67568da..968d839f849 100644 --- a/src/pkg/retention/launcher.go +++ b/src/pkg/retention/launcher.go @@ -83,7 +83,7 @@ type jobData struct { TaskID int64 Repository selector.Repository JobName string - JobParams map[string]interface{} + JobParams map[string]any } type launcher struct { @@ -211,7 +211,7 @@ func createJobs(repositoryRules map[selector.Repository]*lwp.Metadata, isDryRun jobData := &jobData{ Repository: repository, JobName: job.RetentionVendorType, - JobParams: make(map[string]interface{}, 3), + JobParams: make(map[string]any, 3), } // set dry run jobData.JobParams[ParamDryRun] = isDryRun @@ -241,7 +241,7 @@ func (l *launcher) submitTasks(ctx context.Context, executionID int64, jobDatas JobKind: job.KindGeneric, }, }, - map[string]interface{}{ + map[string]any{ "repository": jobData.Repository.Name, "dry_run": jobData.JobParams[ParamDryRun], }) @@ -288,7 +288,7 @@ func getRepositories(ctx context.Context, _ project.Manager, repositoryMgr repos */ // get image repositories imageRepositories, err := repositoryMgr.List(ctx, &pq.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": projectID, }, }) diff --git a/src/pkg/retention/manager_test.go b/src/pkg/retention/manager_test.go index 26edc51439d..e4e36c8946b 100644 --- a/src/pkg/retention/manager_test.go +++ b/src/pkg/retention/manager_test.go @@ -50,7 +50,7 @@ func TestPolicy(t *testing.T) { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, @@ -118,7 +118,7 @@ func TestExecution(t *testing.T) { }, Trigger: &policy.Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, diff --git a/src/pkg/retention/policy/action/index/index.go b/src/pkg/retention/policy/action/index/index.go index 693bdba7326..d706ada3e8e 100644 --- a/src/pkg/retention/policy/action/index/index.go +++ b/src/pkg/retention/policy/action/index/index.go @@ -40,7 +40,7 @@ func Register(action string, factory action.PerformerFactory) { } // Get performer with the provided action -func Get(act string, params interface{}, isDryRun bool) (action.Performer, error) { +func Get(act string, params any, isDryRun bool) (action.Performer, error) { if len(act) == 0 { return nil, errors.New("empty action") } diff --git a/src/pkg/retention/policy/action/index/index_test.go b/src/pkg/retention/policy/action/index/index_test.go index d7e43bd0a26..76d73d871ea 100644 --- a/src/pkg/retention/policy/action/index/index_test.go +++ b/src/pkg/retention/policy/action/index/index_test.go @@ -74,7 +74,7 @@ func (suite *IndexTestSuite) TestGet() { } type fakePerformer struct { - parameters interface{} + parameters any isDryRun bool } @@ -89,7 +89,7 @@ func (p *fakePerformer) Perform(ctx context.Context, candidates []*selector.Cand return } -func newFakePerformer(params interface{}, isDryRun bool) action.Performer { +func newFakePerformer(params any, isDryRun bool) action.Performer { return &fakePerformer{ parameters: params, isDryRun: isDryRun, diff --git a/src/pkg/retention/policy/action/performer.go b/src/pkg/retention/policy/action/performer.go index 2d2497c31dd..4d90eaddd23 100644 --- a/src/pkg/retention/policy/action/performer.go +++ b/src/pkg/retention/policy/action/performer.go @@ -43,7 +43,7 @@ type Performer interface { } // PerformerFactory is factory method for creating Performer -type PerformerFactory func(params interface{}, isDryRun bool) Performer +type PerformerFactory func(params any, isDryRun bool) Performer // retainAction make sure all the candidates will be retained and others will be cleared type retainAction struct { @@ -110,7 +110,7 @@ func isImmutable(ctx context.Context, c *selector.Candidate) bool { } // NewRetainAction is factory method for RetainAction -func NewRetainAction(params interface{}, isDryRun bool) Performer { +func NewRetainAction(params any, isDryRun bool) Performer { if params != nil { if all, ok := params.([]*selector.Candidate); ok { return &retainAction{ diff --git a/src/pkg/retention/policy/models.go b/src/pkg/retention/policy/models.go index 7e5e8d0b9fc..e41e079e711 100644 --- a/src/pkg/retention/policy/models.go +++ b/src/pkg/retention/policy/models.go @@ -117,7 +117,7 @@ type Trigger struct { // Settings for the specified trigger // '[cron]="* 22 11 * * *"' for the 'Schedule' - Settings map[string]interface{} `json:"settings" valid:"Required"` + Settings map[string]any `json:"settings" valid:"Required"` } // Scope definition @@ -164,7 +164,7 @@ func WithNDaysSinceLastPull(projID int64, n int) *Metadata { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "0 0 0 * * *", }, }, diff --git a/src/pkg/retention/policy/models_test.go b/src/pkg/retention/policy/models_test.go index 78daa1d4e30..ea551d30af7 100644 --- a/src/pkg/retention/policy/models_test.go +++ b/src/pkg/retention/policy/models_test.go @@ -65,15 +65,15 @@ func (p *PolicyTestSuite) TestValidateRetentionPolicy() { p.NoError(p.policy.ValidateRetentionPolicy()) // cron value is an empty string - p.policy.Trigger.Settings = map[string]interface{}{"cron": ""} + p.policy.Trigger.Settings = map[string]any{"cron": ""} p.NoError(p.policy.ValidateRetentionPolicy()) // the 1st field of cron value is not 0 - p.policy.Trigger.Settings = map[string]interface{}{"cron": "1 0 0 1 1 *"} + p.policy.Trigger.Settings = map[string]any{"cron": "1 0 0 1 1 *"} p.Error(p.policy.ValidateRetentionPolicy()) // valid cron value - p.policy.Trigger.Settings = map[string]interface{}{"cron": "0 0 0 1 1 *"} + p.policy.Trigger.Settings = map[string]any{"cron": "0 0 0 1 1 *"} p.NoError(p.policy.ValidateRetentionPolicy()) } @@ -109,7 +109,7 @@ func TestRule(t *testing.T) { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, @@ -162,7 +162,7 @@ func TestParamValid(t *testing.T) { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, @@ -209,7 +209,7 @@ func TestParamValid(t *testing.T) { }, Trigger: &Trigger{ Kind: "Schedule", - Settings: map[string]interface{}{ + Settings: map[string]any{ "cron": "* 22 11 * * *", }, }, diff --git a/src/pkg/retention/policy/rule/index/index.go b/src/pkg/retention/policy/rule/index/index.go index 1555aedd662..7f7941dd136 100644 --- a/src/pkg/retention/policy/rule/index/index.go +++ b/src/pkg/retention/policy/rule/index/index.go @@ -253,7 +253,7 @@ func Get(templateID string, parameters rule.Parameters) (rule.Evaluator, error) func Index() []*Metadata { res := make([]*Metadata, 0) - index.Range(func(_, v interface{}) bool { + index.Range(func(_, v any) bool { if item, ok := v.(*indexedItem); ok { res = append(res, item.Meta) return true diff --git a/src/pkg/retention/policy/rule/latestk/evaluator.go b/src/pkg/retention/policy/rule/latestk/evaluator.go index 72cc87a4220..6d84ac0212d 100644 --- a/src/pkg/retention/policy/rule/latestk/evaluator.go +++ b/src/pkg/retention/policy/rule/latestk/evaluator.go @@ -49,11 +49,7 @@ func (e *evaluator) Process(artifacts []*selector.Candidate) ([]*selector.Candid return activeTime(artifacts[i]) > activeTime(artifacts[j]) }) - i := e.k - if i > len(artifacts) { - i = len(artifacts) - } - + i := min(e.k, len(artifacts)) return artifacts[:i], nil } diff --git a/src/pkg/retention/policy/rule/latestpl/evaluator.go b/src/pkg/retention/policy/rule/latestpl/evaluator.go index c550874eda7..65cb5869e00 100644 --- a/src/pkg/retention/policy/rule/latestpl/evaluator.go +++ b/src/pkg/retention/policy/rule/latestpl/evaluator.go @@ -46,11 +46,7 @@ func (e *evaluator) Process(artifacts []*selector.Candidate) ([]*selector.Candid return artifacts[i].PulledTime > artifacts[j].PulledTime }) - i := e.n - if i > len(artifacts) { - i = len(artifacts) - } - + i := min(e.n, len(artifacts)) return artifacts[:i], nil } diff --git a/src/pkg/retention/policy/rule/latestps/evaluator.go b/src/pkg/retention/policy/rule/latestps/evaluator.go index 61682dc593a..3f0c37f77b5 100644 --- a/src/pkg/retention/policy/rule/latestps/evaluator.go +++ b/src/pkg/retention/policy/rule/latestps/evaluator.go @@ -48,11 +48,7 @@ func (e *evaluator) Process(artifacts []*selector.Candidate) ([]*selector.Candid return artifacts[i].PushedTime > artifacts[j].PushedTime }) - i := e.k - if i > len(artifacts) { - i = len(artifacts) - } - + i := min(e.k, len(artifacts)) return artifacts[:i], nil } diff --git a/src/pkg/retention/policy/rule/models.go b/src/pkg/retention/policy/rule/models.go index 0c55abe5271..35566f450eb 100644 --- a/src/pkg/retention/policy/rule/models.go +++ b/src/pkg/retention/policy/rule/models.go @@ -84,4 +84,4 @@ type Selector struct { type Parameters map[string]Parameter // Parameter of rule -type Parameter interface{} +type Parameter any diff --git a/src/pkg/robot/dao/dao_test.go b/src/pkg/robot/dao/dao_test.go index 1a04434f458..d42a1ff9ca8 100644 --- a/src/pkg/robot/dao/dao_test.go +++ b/src/pkg/robot/dao/dao_test.go @@ -89,7 +89,7 @@ func (suite *DaoTestSuite) TestDelete() { func (suite *DaoTestSuite) TestList() { robots, err := suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "test3", }, }) @@ -106,7 +106,7 @@ func (suite *DaoTestSuite) TestList() { _, err = suite.dao.Create(orm.Context(), r) suite.Nil(err) robots, err = suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "testvisible", "visible": true, }, @@ -133,7 +133,7 @@ func (suite *DaoTestSuite) TestCount() { // query by name total, err = suite.dao.Count(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name": "test3", }, }) @@ -156,7 +156,7 @@ func (suite *DaoTestSuite) TestUpdate() { func (suite *DaoTestSuite) TestDeleteByProjectID() { robots, err := suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "project_id": 2, }, }) @@ -166,7 +166,7 @@ func (suite *DaoTestSuite) TestDeleteByProjectID() { suite.Nil(err) robots, err = suite.dao.List(orm.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "project_id": 2, }, }) diff --git a/src/pkg/scan/dao/scan/report_test.go b/src/pkg/scan/dao/scan/report_test.go index 6f6b81d1464..7aa2ab2d5c7 100644 --- a/src/pkg/scan/dao/scan/report_test.go +++ b/src/pkg/scan/dao/scan/report_test.go @@ -69,7 +69,7 @@ func (suite *ReportTestSuite) TestReportList() { query1 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "digest": "digest1001", "registration_uuid": "ruuid", "mime_type": v1.MimeTypeNativeReport, @@ -82,7 +82,7 @@ func (suite *ReportTestSuite) TestReportList() { query2 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "digest": "digest1002", }, } diff --git a/src/pkg/scan/dao/scan/vulnerability_test.go b/src/pkg/scan/dao/scan/vulnerability_test.go index 9b56ffd672d..e1a828b1487 100644 --- a/src/pkg/scan/dao/scan/vulnerability_test.go +++ b/src/pkg/scan/dao/scan/vulnerability_test.go @@ -240,7 +240,7 @@ func (suite *VulnerabilityTestSuite) TestDeleteVulnerabilityRecord() { // TestListVulnerabilityRecord gets vulnerability records for scanner func (suite *VulnerabilityTestSuite) TestListVulnerabilityRecord() { - vulns, err := suite.vulnerabilityRecordDao.List(suite.Context(), &q.Query{Keywords: map[string]interface{}{"CVEID": "CVE-ID1"}}) + vulns, err := suite.vulnerabilityRecordDao.List(suite.Context(), &q.Query{Keywords: map[string]any{"CVEID": "CVE-ID1"}}) suite.NoError(err, "Error when fetching vulnerability records for report") suite.True(len(vulns) > 0) } diff --git a/src/pkg/scan/dao/scanner/model.go b/src/pkg/scan/dao/scanner/model.go index cc418e624f9..8ef1de1e4bb 100644 --- a/src/pkg/scan/dao/scanner/model.go +++ b/src/pkg/scan/dao/scanner/model.go @@ -16,6 +16,7 @@ package scanner import ( "encoding/json" + "slices" "time" "github.com/goharbor/harbor/src/lib" @@ -66,9 +67,9 @@ type Registration struct { Metadata *v1.ScannerAdapterMetadata `orm:"-" json:"-"` // Timestamps - CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"` - UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"update_time"` - Capabilities map[string]interface{} `orm:"-" json:"capabilities,omitempty"` + CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"` + UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"update_time"` + Capabilities map[string]any `orm:"-" json:"capabilities,omitempty"` } // TableName for Endpoint @@ -140,15 +141,9 @@ func (r *Registration) HasCapability(manifestMimeType string) bool { return false } - for _, capability := range r.Metadata.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == manifestMimeType { - return true - } - } - } - - return false + return slices.ContainsFunc(r.Metadata.Capabilities, func(c *v1.ScannerCapability) bool { + return slices.Contains(c.ConsumesMimeTypes, manifestMimeType) + }) } // GetProducesMimeTypes returns produces mime types for the artifact @@ -162,10 +157,8 @@ func (r *Registration) GetProducesMimeTypes(mimeType string, scanType string) [] capType = v1.ScanTypeVulnerability } if scanType == capType { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return capability.ProducesMimeTypes - } + if slices.Contains(capability.ConsumesMimeTypes, mimeType) { + return capability.ProducesMimeTypes } } } @@ -180,10 +173,8 @@ func (r *Registration) GetCapability(mimeType string) *v1.ScannerCapability { } for _, capability := range r.Metadata.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return capability - } + if slices.Contains(capability.ConsumesMimeTypes, mimeType) { + return capability } } diff --git a/src/pkg/scan/dao/scanner/registration_test.go b/src/pkg/scan/dao/scanner/registration_test.go index 0dd6b0f1f86..f6f8f2b22fc 100644 --- a/src/pkg/scan/dao/scanner/registration_test.go +++ b/src/pkg/scan/dao/scanner/registration_test.go @@ -108,7 +108,7 @@ func (suite *RegistrationDAOTestSuite) TestList() { require.Equal(suite.T(), 1, len(l)) // with query and found items - keywords := make(map[string]interface{}) + keywords := make(map[string]any) keywords["description"] = &q.FuzzyMatchValue{Value: "sample"} l, err = ListRegistrations(suite.Context(), &q.Query{ PageSize: 5, @@ -127,7 +127,7 @@ func (suite *RegistrationDAOTestSuite) TestList() { require.Equal(suite.T(), 0, len(l)) // Exact match - exactKeywords := make(map[string]interface{}) + exactKeywords := make(map[string]any) exactKeywords["name"] = "forUT" l, err = ListRegistrations(suite.Context(), &q.Query{ Keywords: exactKeywords, diff --git a/src/pkg/scan/export/filter_processor.go b/src/pkg/scan/export/filter_processor.go index 4353e847971..8281dda53f5 100644 --- a/src/pkg/scan/export/filter_processor.go +++ b/src/pkg/scan/export/filter_processor.go @@ -16,6 +16,7 @@ package export import ( "context" + "slices" "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/controller/artifact" @@ -170,10 +171,8 @@ func (dfp *DefaultFilterProcessor) ProcessLabelFilter(_ context.Context, labelID // TODO (as now there should not have many labels, so here just use // for^2, we can convert to use map to reduce the time complex if needed. ) for _, label := range art.Labels { - for _, labelID := range labelIDs { - if labelID == label.ID { - return true - } + if slices.Contains(labelIDs, label.ID) { + return true } } return false diff --git a/src/pkg/scan/export/manager.go b/src/pkg/scan/export/manager.go index b145265ed5d..ed0d886fef2 100644 --- a/src/pkg/scan/export/manager.go +++ b/src/pkg/scan/export/manager.go @@ -164,7 +164,7 @@ func (em *exportManager) buildQuery(ctx context.Context, params Params) (beego_o PageSize: pageSize, Sorting: "", } - paginationParams := make([]interface{}, 0) + paginationParams := make([]any, 0) query, pageLimits := orm.PaginationOnRawSQL(q, sql, paginationParams) // user can open ORM_DEBUG for log the sql return ormer.Raw(query, pageLimits), nil diff --git a/src/pkg/scan/export/manager_test.go b/src/pkg/scan/export/manager_test.go index 45c288a1167..c2e31f44dcd 100644 --- a/src/pkg/scan/export/manager_test.go +++ b/src/pkg/scan/export/manager_test.go @@ -174,8 +174,8 @@ func (suite *ExportManagerSuite) generateVulnerabilityRecordsForReport(registrat } else { vulnV2.Severity = "Low" } - var vendorAttributes = make(map[string]interface{}) - vendorAttributes["CVSS"] = map[string]interface{}{"nvd": map[string]interface{}{"V2Score": "4.3"}} + var vendorAttributes = make(map[string]any) + vendorAttributes["CVSS"] = map[string]any{"nvd": map[string]any{"V2Score": "4.3"}} data, _ := json.Marshal(vendorAttributes) vulnV2.VendorAttributes = string(data) vulns = append(vulns, vulnV2) diff --git a/src/pkg/scan/handler.go b/src/pkg/scan/handler.go index 2844769ac5c..c26640d8c32 100644 --- a/src/pkg/scan/handler.go +++ b/src/pkg/scan/handler.go @@ -46,7 +46,7 @@ type Handler interface { // RequiredPermissions defines the permission used by the scan robot account RequiredPermissions() []*types.Policy // RequestParameters defines the parameters for scan request - RequestParameters() map[string]interface{} + RequestParameters() map[string]any // PostScan defines the operation after scan PostScan(ctx job.Context, sr *v1.ScanRequest, rp *scan.Report, rawReport string, startTime time.Time, robot *model.Robot) (string, error) ReportHandler @@ -65,5 +65,5 @@ type ReportHandler interface { // GetPlaceHolder get the the report place holder GetPlaceHolder(ctx context.Context, artRepo string, artDigest string, scannerUUID string, mimeType string) (rp *scan.Report, err error) // GetSummary get the summary of the report - GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]interface{}, error) + GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]any, error) } diff --git a/src/pkg/scan/init_test.go b/src/pkg/scan/init_test.go index 5904e7d233f..ce474817594 100644 --- a/src/pkg/scan/init_test.go +++ b/src/pkg/scan/init_test.go @@ -39,7 +39,7 @@ func TestEnsureScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name__in": []string{"scanner"}, }, }).Return(nil, errors.New("DB error")) @@ -57,7 +57,7 @@ func TestEnsureScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name__in": []string{ "trivy", }, @@ -81,7 +81,7 @@ func TestEnsureScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "name__in": []string{ "trivy", }, @@ -136,7 +136,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return(nil, errors.New("DB error")) err := EnsureDefaultScanner(context.TODO(), "trivy") @@ -150,7 +150,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return([]*scanner.Registration{ {Name: "trivy"}, {Name: "trivy"}, @@ -167,7 +167,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return([]*scanner.Registration{ { Name: "trivy", @@ -188,7 +188,7 @@ func TestEnsureDefaultScanner(t *testing.T) { mgr.On("GetDefault", mock.Anything).Return(nil, nil) mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{"name": "trivy"}, + Keywords: map[string]any{"name": "trivy"}, }).Return([]*scanner.Registration{ { Name: "trivy", @@ -221,7 +221,7 @@ func TestRemoveImmutableScanners(t *testing.T) { scannerManager = mgr mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "immutable": true, "name__in": []string{"scanner"}, }, @@ -249,7 +249,7 @@ func TestRemoveImmutableScanners(t *testing.T) { }} mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "immutable": true, "name__in": []string{ "scanner-1", @@ -285,7 +285,7 @@ func TestRemoveImmutableScanners(t *testing.T) { }} mgr.On("List", mock.Anything, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "immutable": true, "name__in": []string{ "scanner-1", diff --git a/src/pkg/scan/job.go b/src/pkg/scan/job.go index e485a143dd1..c0e106e13b4 100644 --- a/src/pkg/scan/job.go +++ b/src/pkg/scan/job.go @@ -501,10 +501,10 @@ func extractMimeTypes(params job.Parameters) ([]string, error) { return nil, errors.Errorf("missing job parameter '%s'", JobParameterMimes) } - l, ok := v.([]interface{}) + l, ok := v.([]any) if !ok { return nil, errors.Errorf( - "malformed job parameter '%s', expecting []interface{} but got %s", + "malformed job parameter '%s', expecting []any but got %s", JobParameterMimes, reflect.TypeOf(v).String(), ) diff --git a/src/pkg/scan/postprocessors/report_converters.go b/src/pkg/scan/postprocessors/report_converters.go index c2603220151..a9a1082f968 100644 --- a/src/pkg/scan/postprocessors/report_converters.go +++ b/src/pkg/scan/postprocessors/report_converters.go @@ -105,7 +105,7 @@ func (c *nativeToRelationalSchemaConverter) toSchema(ctx context.Context, report return err } - var cveIDs []interface{} + var cveIDs []any for _, v := range vulnReport.Vulnerabilities { v.Severity = vuln.ParseSeverityVersion3(v.Severity.String()) cveIDs = append(cveIDs, v.ID) @@ -143,8 +143,8 @@ func (c *nativeToRelationalSchemaConverter) toSchema(ctx context.Context, report } for _, record := range outOfDateRecords { - // Update the severity of the record when it's changed in the scanner, closes #14745 - if err := c.dao.Update(ctx, record, "severity"); err != nil { + // Update the severity, fixed_version, and cvss_score_v3 of the record when it's changed in the scanner, closes #14745 #21463 + if err := c.dao.Update(ctx, record, "severity", "fixed_version", "cvss_score_v3"); err != nil { return err } } @@ -226,7 +226,7 @@ func (c *nativeToRelationalSchemaConverter) fromSchema(_ context.Context, _ stri // GetNativeV1ReportFromResolvedData returns the native V1 scan report from the resolved // interface data. -func (c *nativeToRelationalSchemaConverter) getNativeV1ReportFromResolvedData(ctx job.Context, rp interface{}) (*vuln.Report, error) { +func (c *nativeToRelationalSchemaConverter) getNativeV1ReportFromResolvedData(ctx job.Context, rp any) (*vuln.Report, error) { report, ok := rp.(*vuln.Report) if !ok { return nil, errors.New("Data cannot be converted to v1 report format") @@ -295,7 +295,7 @@ func toVulnerabilityItem(record *scan.VulnerabilityRecord, artifactDigest string item.Links = append(item.Links, urls...) item.Severity = vuln.ParseSeverityVersion3(record.Severity) item.Package = record.Package - var vendorAttributes map[string]interface{} + var vendorAttributes map[string]any _ = json.Unmarshal([]byte(record.VendorAttributes), &vendorAttributes) item.VendorAttributes = vendorAttributes @@ -356,7 +356,7 @@ func (c *nativeToRelationalSchemaConverter) updateReport(ctx context.Context, vu // CVS ... type CVS struct { - CVSS map[string]map[string]interface{} `json:"CVSS"` + CVSS map[string]map[string]any `json:"CVSS"` } func parseScoreFromVendorAttribute(ctx context.Context, vendorAttribute string) float64 { diff --git a/src/pkg/scan/report/manager.go b/src/pkg/scan/report/manager.go index 3bc2de1f112..becfdf3ecd6 100644 --- a/src/pkg/scan/report/manager.go +++ b/src/pkg/scan/report/manager.go @@ -167,7 +167,7 @@ func (bm *basicManager) GetBy(ctx context.Context, digest string, registrationUU return nil, errors.New("empty digest to get report data") } - kws := make(map[string]interface{}) + kws := make(map[string]any) kws["digest"] = digest if len(registrationUUID) > 0 { kws["registration_uuid"] = registrationUUID diff --git a/src/pkg/scan/report/report.go b/src/pkg/scan/report/report.go index 33c25da3be3..d9fa6fb8120 100644 --- a/src/pkg/scan/report/report.go +++ b/src/pkg/scan/report/report.go @@ -22,7 +22,7 @@ import ( ) // Merger is a helper function to merge report together -type Merger func(r1, r2 interface{}) (interface{}, error) +type Merger func(r1, r2 any) (any, error) // SupportedMergers declares mappings between mime type and report merger func. var SupportedMergers = map[string]Merger{ @@ -31,7 +31,7 @@ var SupportedMergers = map[string]Merger{ } // Merge merge report r1 and r2 -func Merge(mimeType string, r1, r2 interface{}) (interface{}, error) { +func Merge(mimeType string, r1, r2 any) (any, error) { m, ok := SupportedMergers[mimeType] if !ok { return nil, errors.Errorf("no report merger bound with mime type %s", mimeType) @@ -41,7 +41,7 @@ func Merge(mimeType string, r1, r2 interface{}) (interface{}, error) { } // MergeNativeReport merge report r1 and r2 -func MergeNativeReport(r1, r2 interface{}) (interface{}, error) { +func MergeNativeReport(r1, r2 any) (any, error) { nr1, ok := r1.(*vuln.Report) if !ok { return nil, errors.New("native report required") @@ -59,8 +59,8 @@ func MergeNativeReport(r1, r2 interface{}) (interface{}, error) { type Reports []*scan.Report // ResolveData resolve the data from the reports and merge them together -func (l Reports) ResolveData(mimeType string) (interface{}, error) { - var result interface{} +func (l Reports) ResolveData(mimeType string) (any, error) { + var result any for _, rp := range l { // Resolve scan report data only when it is ready and its mime type equal the given one diff --git a/src/pkg/scan/report/summary.go b/src/pkg/scan/report/summary.go index 252a61921b0..8513ee1fd34 100644 --- a/src/pkg/scan/report/summary.go +++ b/src/pkg/scan/report/summary.go @@ -41,7 +41,7 @@ func WithArtifactDigest(artifactDigest string) Option { } // SummaryMerger is a helper function to merge summary together -type SummaryMerger func(s1, s2 interface{}) (interface{}, error) +type SummaryMerger func(s1, s2 any) (any, error) // SupportedSummaryMergers declares mappings between mime type and summary merger func. var SupportedSummaryMergers = map[string]SummaryMerger{ @@ -50,7 +50,7 @@ var SupportedSummaryMergers = map[string]SummaryMerger{ } // MergeSummary merge summary s1 and s2 -func MergeSummary(mimeType string, s1, s2 interface{}) (interface{}, error) { +func MergeSummary(mimeType string, s1, s2 any) (any, error) { m, ok := SupportedSummaryMergers[mimeType] if !ok { return nil, errors.Errorf("no summary merger bound with mime type %s", mimeType) @@ -60,7 +60,7 @@ func MergeSummary(mimeType string, s1, s2 interface{}) (interface{}, error) { } // MergeNativeSummary merge vuln.NativeReportSummary together -func MergeNativeSummary(s1, s2 interface{}) (interface{}, error) { +func MergeNativeSummary(s1, s2 any) (any, error) { nrs1, ok := s1.(*vuln.NativeReportSummary) if !ok { return nil, errors.New("native report summary required") @@ -82,7 +82,7 @@ var SupportedGenerators = map[string]SummaryGenerator{ // GenerateSummary is a helper function to generate report // summary based on the given report. -func GenerateSummary(r *scan.Report, options ...Option) (interface{}, error) { +func GenerateSummary(r *scan.Report, options ...Option) (any, error) { g, ok := SupportedGenerators[r.MimeType] if !ok { return nil, errors.Errorf("no generator bound with mime type %s", r.MimeType) @@ -93,18 +93,15 @@ func GenerateSummary(r *scan.Report, options ...Option) (interface{}, error) { // SummaryGenerator is a func template which used to generated report // summary for relevant mime type. -type SummaryGenerator func(r *scan.Report, options ...Option) (interface{}, error) +type SummaryGenerator func(r *scan.Report, options ...Option) (any, error) // GenerateNativeSummary generates the report summary for the native report. -func GenerateNativeSummary(r *scan.Report, _ ...Option) (interface{}, error) { +func GenerateNativeSummary(r *scan.Report, _ ...Option) (any, error) { sum := &vuln.NativeReportSummary{} sum.ReportID = r.UUID sum.StartTime = r.StartTime sum.EndTime = r.EndTime - sum.Duration = r.EndTime.Unix() - r.StartTime.Unix() - if sum.Duration < 0 { - sum.Duration = 0 - } + sum.Duration = max(r.EndTime.Unix()-r.StartTime.Unix(), 0) sum.ScanStatus = job.ErrorStatus.String() if job.Status(r.Status).Code() != -1 { diff --git a/src/pkg/scan/report/supported_mimes.go b/src/pkg/scan/report/supported_mimes.go index 7ab8d13eb78..da5e04a4b18 100644 --- a/src/pkg/scan/report/supported_mimes.go +++ b/src/pkg/scan/report/supported_mimes.go @@ -24,14 +24,14 @@ import ( ) // SupportedMimes indicates what mime types are supported to render at UI end. -var SupportedMimes = map[string]interface{}{ +var SupportedMimes = map[string]any{ // The native report type v1.MimeTypeNativeReport: (*vuln.Report)(nil), v1.MimeTypeGenericVulnerabilityReport: (*vuln.Report)(nil), } // ResolveData is a helper func to parse the JSON data with the given mime type. -func ResolveData(mime string, jsonData []byte, options ...Option) (interface{}, error) { +func ResolveData(mime string, jsonData []byte, options ...Option) (any, error) { // If no resolver defined for the given mime types, directly ignore it. // The raw data will be used. t, ok := SupportedMimes[mime] diff --git a/src/pkg/scan/rest/v1/client.go b/src/pkg/scan/rest/v1/client.go index a5ae04075f5..b9238e53cae 100644 --- a/src/pkg/scan/rest/v1/client.go +++ b/src/pkg/scan/rest/v1/client.go @@ -59,7 +59,7 @@ type Client interface { // GetScanReport gets the scan result for the corresponding ScanRequest identifier. // Note that this is a blocking method which either returns a non `nil` scan report or error. - // A caller is supposed to cast the returned interface{} to a structure that corresponds + // A caller is supposed to cast the returned any to a structure that corresponds // to the specified MIME type. // // Arguments: diff --git a/src/pkg/scan/rest/v1/models.go b/src/pkg/scan/rest/v1/models.go index 06e6fb0a1c7..30a8e27610f 100644 --- a/src/pkg/scan/rest/v1/models.go +++ b/src/pkg/scan/rest/v1/models.go @@ -17,6 +17,7 @@ package v1 import ( "encoding/json" "fmt" + "slices" "github.com/goharbor/harbor/src/lib/errors" ) @@ -95,26 +96,15 @@ func (md *ScannerAdapterMetadata) Validate() error { for _, ca := range md.Capabilities { // v1.MimeTypeDockerArtifact is required now - found := false - for _, cm := range ca.ConsumesMimeTypes { - if cm == MimeTypeDockerArtifact { - found = true - break - } - } + found := slices.Contains(ca.ConsumesMimeTypes, MimeTypeDockerArtifact) if !found { return errors.Errorf("missing %s in consumes_mime_types", MimeTypeDockerArtifact) } // either of v1.MimeTypeNativeReport OR v1.MimeTypeGenericVulnerabilityReport is required - found = false - for _, pm := range ca.ProducesMimeTypes { - if isSupportedMimeType(pm) { - found = true - break - } - } - + found = slices.ContainsFunc(ca.ProducesMimeTypes, func(pm string) bool { + return isSupportedMimeType(pm) + }) if !found { return errors.Errorf("missing %s or %s in produces_mime_types", MimeTypeNativeReport, MimeTypeGenericVulnerabilityReport) } @@ -124,34 +114,21 @@ func (md *ScannerAdapterMetadata) Validate() error { } func isSupportedMimeType(mimeType string) bool { - for _, mt := range supportedMimeTypes { - if mt == mimeType { - return true - } - } - return false + return slices.Contains(supportedMimeTypes, mimeType) } // HasCapability returns true when mine type of the artifact support by the scanner func (md *ScannerAdapterMetadata) HasCapability(mimeType string) bool { - for _, capability := range md.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return true - } - } - } - - return false + return slices.ContainsFunc(md.Capabilities, func(c *ScannerCapability) bool { + return slices.Contains(c.ConsumesMimeTypes, mimeType) + }) } // GetCapability returns capability for the mime type func (md *ScannerAdapterMetadata) GetCapability(mimeType string) *ScannerCapability { for _, capability := range md.Capabilities { - for _, mt := range capability.ConsumesMimeTypes { - if mt == mimeType { - return capability - } + if slices.Contains(capability.ConsumesMimeTypes, mimeType) { + return capability } } @@ -159,8 +136,8 @@ func (md *ScannerAdapterMetadata) GetCapability(mimeType string) *ScannerCapabil } // ConvertCapability converts the capability to map, used in get scanner API -func (md *ScannerAdapterMetadata) ConvertCapability() map[string]interface{} { - capabilities := make(map[string]interface{}) +func (md *ScannerAdapterMetadata) ConvertCapability() map[string]any { + capabilities := make(map[string]any) oldScanner := true for _, c := range md.Capabilities { if len(c.Type) > 0 { @@ -228,7 +205,7 @@ type ScanType struct { // ProducesMimeTypes defines scanreport should be ProducesMimeTypes []string `json:"produces_mime_types"` // Parameters extra parameters - Parameters map[string]interface{} `json:"parameters"` + Parameters map[string]any `json:"parameters"` } // FromJSON parses ScanRequest from json data diff --git a/src/pkg/scan/sbom/dao/dao_test.go b/src/pkg/scan/sbom/dao/dao_test.go index 2fcb7a3b0e3..b8b6f5ae846 100644 --- a/src/pkg/scan/sbom/dao/dao_test.go +++ b/src/pkg/scan/sbom/dao/dao_test.go @@ -94,7 +94,7 @@ func (suite *ReportTestSuite) TestUpdate() { query1 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": 111, "registration_uuid": "ruuid", "mime_type": v1.MimeTypeSBOMReport, @@ -110,7 +110,7 @@ func (suite *ReportTestSuite) TestReportList() { query1 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": 111, "registration_uuid": "ruuid", "mime_type": v1.MimeTypeSBOMReport, @@ -123,7 +123,7 @@ func (suite *ReportTestSuite) TestReportList() { query2 := &q.Query{ PageSize: 1, PageNumber: 1, - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "artifact_id": 222, }, } diff --git a/src/pkg/scan/sbom/manager.go b/src/pkg/scan/sbom/manager.go index 75ccad1abd1..57545b76550 100644 --- a/src/pkg/scan/sbom/manager.go +++ b/src/pkg/scan/sbom/manager.go @@ -152,7 +152,7 @@ func (bm *basicManager) GetBy(ctx context.Context, artifactID int64, registratio return nil, errors.New("no artifact id to get sbom report data") } - kws := make(map[string]interface{}) + kws := make(map[string]any) kws["artifact_id"] = artifactID if len(registrationUUID) > 0 { kws["registration_uuid"] = registrationUUID diff --git a/src/pkg/scan/sbom/model/report.go b/src/pkg/scan/sbom/model/report.go index 6d1424b1ac3..7620731ab6d 100644 --- a/src/pkg/scan/sbom/model/report.go +++ b/src/pkg/scan/sbom/model/report.go @@ -42,5 +42,5 @@ type RawSBOMReport struct { // MediaType the media type of the report, e.g. application/spdx+json MediaType string `json:"media_type"` // SBOM sbom content - SBOM map[string]interface{} `json:"sbom,omitempty"` + SBOM map[string]any `json:"sbom,omitempty"` } diff --git a/src/pkg/scan/sbom/model/summary.go b/src/pkg/scan/sbom/model/summary.go index 0d7e6a2ef29..139375fa59f 100644 --- a/src/pkg/scan/sbom/model/summary.go +++ b/src/pkg/scan/sbom/model/summary.go @@ -34,7 +34,7 @@ const ( ) // Summary includes the sbom summary information -type Summary map[string]interface{} +type Summary map[string]any // SBOMAccArt returns the repository and digest of the SBOM func (s Summary) SBOMAccArt() (repo, digest string) { diff --git a/src/pkg/scan/sbom/sbom.go b/src/pkg/scan/sbom/sbom.go index b58057f9e32..f1707a28f14 100644 --- a/src/pkg/scan/sbom/sbom.go +++ b/src/pkg/scan/sbom/sbom.go @@ -78,8 +78,8 @@ func (h *scanHandler) RequestProducesMineTypes() []string { } // RequestParameters defines the parameters for scan request -func (h *scanHandler) RequestParameters() map[string]interface{} { - return map[string]interface{}{"sbom_media_types": []string{sbomMediaTypeSpdx}} +func (h *scanHandler) RequestParameters() map[string]any { + return map[string]any{"sbom_media_types": []string{sbomMediaTypeSpdx}} } // PostScan defines task specific operations after the scan is complete @@ -295,7 +295,7 @@ func (h *scanHandler) GetPlaceHolder(ctx context.Context, artRepo string, artDig }, nil } -func (h *scanHandler) GetSummary(ctx context.Context, art *artifact.Artifact, mimeTypes []string) (map[string]interface{}, error) { +func (h *scanHandler) GetSummary(ctx context.Context, art *artifact.Artifact, mimeTypes []string) (map[string]any, error) { if len(mimeTypes) == 0 { return nil, errors.New("no mime types to get report summaries") } @@ -312,10 +312,10 @@ func (h *scanHandler) GetSummary(ctx context.Context, art *artifact.Artifact, mi return nil, err } if len(reports) == 0 { - return map[string]interface{}{}, nil + return map[string]any{}, nil } reportContent := reports[0].ReportSummary - result := map[string]interface{}{} + result := map[string]any{} if len(reportContent) == 0 { status := h.TaskMgrFunc().RetrieveStatusFromTask(ctx, reports[0].UUID) if len(status) > 0 { diff --git a/src/pkg/scan/scanner/manager_test.go b/src/pkg/scan/scanner/manager_test.go index 742aae302bb..8338d32f4d1 100644 --- a/src/pkg/scan/scanner/manager_test.go +++ b/src/pkg/scan/scanner/manager_test.go @@ -64,7 +64,7 @@ func (suite *BasicManagerTestSuite) TearDownSuite() { // TestList tests list registrations func (suite *BasicManagerTestSuite) TestList() { - m := make(map[string]interface{}, 1) + m := make(map[string]any, 1) m["name"] = "forUT" l, err := suite.mgr.List(suite.Context(), &q.Query{ diff --git a/src/pkg/scan/vuln/report.go b/src/pkg/scan/vuln/report.go index fbc119f6443..71585bb51e7 100644 --- a/src/pkg/scan/vuln/report.go +++ b/src/pkg/scan/vuln/report.go @@ -35,7 +35,7 @@ type Report struct { vulnerabilityItemList *VulnerabilityItemList // SBOM sbom content - SBOM map[string]interface{} `json:"sbom,omitempty"` + SBOM map[string]any `json:"sbom,omitempty"` } // GetVulnerabilityItemList returns VulnerabilityItemList from the Vulnerabilities of report @@ -225,7 +225,7 @@ type VulnerabilityItem struct { CWEIds []string `json:"cwe_ids"` // A collection of vendor specific attributes for the vulnerability item // with each attribute represented as a key-value pair. - VendorAttributes map[string]interface{} `json:"vendor_attributes"` + VendorAttributes map[string]any `json:"vendor_attributes"` } // Key returns the uniq key for the item diff --git a/src/pkg/scan/vulnerability/vul.go b/src/pkg/scan/vulnerability/vul.go index 26fe7ab1ae1..518fd2229ef 100644 --- a/src/pkg/scan/vulnerability/vul.go +++ b/src/pkg/scan/vulnerability/vul.go @@ -230,7 +230,7 @@ func (h *scanHandler) RequestProducesMineTypes() []string { } // RequestParameters defines the parameters for scan request -func (h *scanHandler) RequestParameters() map[string]interface{} { +func (h *scanHandler) RequestParameters() map[string]any { return nil } @@ -270,7 +270,7 @@ func (h *scanHandler) Update(ctx context.Context, uuid string, rpt string) error return nil } -func (h *scanHandler) GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]interface{}, error) { +func (h *scanHandler) GetSummary(ctx context.Context, ar *artifact.Artifact, mimeTypes []string) (map[string]any, error) { bc := h.ScanControllerFunc() if ar == nil { return nil, errors.New("no way to get report summaries for nil artifact") @@ -280,7 +280,7 @@ func (h *scanHandler) GetSummary(ctx context.Context, ar *artifact.Artifact, mim if err != nil { return nil, err } - summaries := make(map[string]interface{}, len(rps)) + summaries := make(map[string]any, len(rps)) for _, rp := range rps { sum, err := report.GenerateSummary(rp) if err != nil { diff --git a/src/pkg/scheduler/dao_test.go b/src/pkg/scheduler/dao_test.go index e2503e8a74a..e44c276abfb 100644 --- a/src/pkg/scheduler/dao_test.go +++ b/src/pkg/scheduler/dao_test.go @@ -76,7 +76,7 @@ func (d *daoTestSuite) TestCreate() { func (d *daoTestSuite) TestList() { schedules, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "CallbackFuncName": "callback_func_01", }, }) diff --git a/src/pkg/scheduler/mock_dao_test.go b/src/pkg/scheduler/mock_dao_test.go index 251fafd3140..4760482911a 100644 --- a/src/pkg/scheduler/mock_dao_test.go +++ b/src/pkg/scheduler/mock_dao_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scheduler diff --git a/src/pkg/scheduler/scheduler.go b/src/pkg/scheduler/scheduler.go index be065e6d6ab..accdd82624e 100644 --- a/src/pkg/scheduler/scheduler.go +++ b/src/pkg/scheduler/scheduler.go @@ -36,15 +36,15 @@ var ( // Schedule describes the detail information about the created schedule type Schedule struct { - ID int64 `json:"id"` - VendorType string `json:"vendor_type"` - VendorID int64 `json:"vendor_id"` - CRONType string `json:"cron_type"` - CRON string `json:"cron"` - ExtraAttrs map[string]interface{} `json:"extra_attrs"` - Status string `json:"status"` // status of the underlying task(jobservice job) - CreationTime time.Time `json:"creation_time"` - UpdateTime time.Time `json:"update_time"` + ID int64 `json:"id"` + VendorType string `json:"vendor_type"` + VendorID int64 `json:"vendor_id"` + CRONType string `json:"cron_type"` + CRON string `json:"cron"` + ExtraAttrs map[string]any `json:"extra_attrs"` + Status string `json:"status"` // status of the underlying task(jobservice job) + CreationTime time.Time `json:"creation_time"` + UpdateTime time.Time `json:"update_time"` // we can extend this model to include more information(e.g. how many times the schedule already // runs; when will the schedule runs next time) } @@ -60,7 +60,7 @@ type Scheduler interface { // function must decode it before using // The customized attributes can be put into the "extraAttrs" Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, - cron string, callbackFuncName string, callbackFuncParams interface{}, extraAttrs map[string]interface{}) (int64, error) + cron string, callbackFuncName string, callbackFuncParams any, extraAttrs map[string]any) (int64, error) // UnScheduleByID the schedule specified by ID UnScheduleByID(ctx context.Context, id int64) error // UnScheduleByVendor the schedule specified by vendor @@ -93,7 +93,7 @@ func (s *scheduler) CountSchedules(ctx context.Context, query *q.Query) (int64, } func (s *scheduler) Schedule(ctx context.Context, vendorType string, vendorID int64, cronType string, - cron string, callbackFuncName string, callbackFuncParams interface{}, extraAttrs map[string]interface{}) (int64, error) { + cron string, callbackFuncName string, callbackFuncParams any, extraAttrs map[string]any) (int64, error) { if len(vendorType) == 0 { return 0, fmt.Errorf("empty vendor type") } @@ -121,7 +121,7 @@ func (s *scheduler) Schedule(ctx context.Context, vendorType string, vendorID in return 0, err } sched.CallbackFuncParam = string(paramsData) - params := map[string]interface{}{} + params := map[string]any{} if len(paramsData) > 0 { err = json.Unmarshal(paramsData, ¶ms) if err != nil { @@ -196,7 +196,7 @@ func (s *scheduler) Schedule(ctx context.Context, vendorType string, vendorID in func (s *scheduler) UnScheduleByID(ctx context.Context, id int64) error { executions, err := s.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": JobNameScheduler, "VendorID": id, }, @@ -228,7 +228,7 @@ func (s *scheduler) UnScheduleByID(ctx context.Context, id int64) error { func (s *scheduler) UnScheduleByVendor(ctx context.Context, vendorType string, vendorID int64) error { q := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": vendorType, }, } @@ -282,7 +282,7 @@ func (s *scheduler) convertSchedule(ctx context.Context, schedule *schedule) (*S UpdateTime: schedule.UpdateTime, } if len(schedule.ExtraAttrs) > 0 { - extras := map[string]interface{}{} + extras := map[string]any{} if err := json.Unmarshal([]byte(schedule.ExtraAttrs), &extras); err != nil { log.Errorf("failed to unmarshal the extra attributes of schedule %d: %v", schedule.ID, err) return nil, err @@ -291,7 +291,7 @@ func (s *scheduler) convertSchedule(ctx context.Context, schedule *schedule) (*S } executions, err := s.execMgr.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": JobNameScheduler, "VendorID": schedule.ID, }, diff --git a/src/pkg/scheduler/scheduler_test.go b/src/pkg/scheduler/scheduler_test.go index 3eed26f9141..5177041678d 100644 --- a/src/pkg/scheduler/scheduler_test.go +++ b/src/pkg/scheduler/scheduler_test.go @@ -57,7 +57,7 @@ func (s *schedulerTestSuite) SetupTest() { func (s *schedulerTestSuite) TestSchedule() { // empty vendor type - extras := make(map[string]interface{}) + extras := make(map[string]any) id, err := s.scheduler.Schedule(s.ctx, "", 0, "", "0 * * * * *", "callback", nil, extras) s.NotNil(err) diff --git a/src/pkg/securityhub/dao/security.go b/src/pkg/securityhub/dao/security.go index 03506d28a2f..557b10a0fbe 100644 --- a/src/pkg/securityhub/dao/security.go +++ b/src/pkg/securityhub/dao/security.go @@ -105,7 +105,7 @@ type filterMetaData struct { // ColumnName is the column name in the database, if it is empty, the key will be used as the column name ColumnName string // FilterFunc is the function to generate the filter sql, default is exactMatchFilter - FilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) + FilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []any) } // filterMap define the query condition @@ -120,9 +120,9 @@ var filterMap = map[string]*filterMetaData{ "digest": &filterMetaData{DataType: stringType, ColumnName: "a.digest"}, } -var applyFilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) +var applyFilterFunc func(ctx context.Context, key string, query *q.Query) (sqlStr string, params []any) -func exactMatchFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) { +func exactMatchFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []any) { if query == nil { return } @@ -138,7 +138,7 @@ func exactMatchFilter(_ context.Context, key string, query *q.Query) (sqlStr str return } -func rangeFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []interface{}) { +func rangeFilter(_ context.Context, key string, query *q.Query) (sqlStr string, params []any) { if query == nil { return } @@ -151,7 +151,7 @@ func rangeFilter(_ context.Context, key string, query *q.Query) (sqlStr string, return } -func tagFilter(ctx context.Context, _ string, query *q.Query) (sqlStr string, params []interface{}) { +func tagFilter(ctx context.Context, _ string, query *q.Query) (sqlStr string, params []any) { if query == nil { return } @@ -272,7 +272,7 @@ func (d *dao) CountVulnerabilities(ctx context.Context, registrationUUID string, return 0, err } sqlStr := vulnerabilitySQL - params := []interface{}{registrationUUID} + params := []any{registrationUUID} if err := checkQFilter(query, filterMap); err != nil { return 0, err } @@ -293,7 +293,7 @@ func (d *dao) CountVulnerabilities(ctx context.Context, registrationUUID string, } // countExceedLimit check if the count is exceed to limit 1000, avoid count all record for large table -func (d *dao) countExceedLimit(ctx context.Context, sqlStr string, params []interface{}) (bool, error) { +func (d *dao) countExceedLimit(ctx context.Context, sqlStr string, params []any) (bool, error) { o, err := orm.FromContext(ctx) if err != nil { return false, err @@ -313,7 +313,7 @@ func (d *dao) ListVulnerabilities(ctx context.Context, registrationUUID string, return nil, err } sqlStr := vulnerabilitySQL - params := []interface{}{registrationUUID} + params := []any{registrationUUID} if err := checkQFilter(query, filterMap); err != nil { return nil, err } @@ -324,7 +324,7 @@ func (d *dao) ListVulnerabilities(ctx context.Context, registrationUUID string, return vulnRecs, err } -func applyVulFilter(ctx context.Context, sqlStr string, query *q.Query, params []interface{}) (queryStr string, newParam []interface{}) { +func applyVulFilter(ctx context.Context, sqlStr string, query *q.Query, params []any) (queryStr string, newParam []any) { if query == nil { return sqlStr, params } @@ -342,7 +342,7 @@ func applyVulFilter(ctx context.Context, sqlStr string, query *q.Query, params [ } // applyVulPagination apply pagination to the query and sort by cvss_score_v3 desc -func applyVulPagination(sqlStr string, query *q.Query, params []interface{}) (string, []interface{}) { +func applyVulPagination(sqlStr string, query *q.Query, params []any) (string, []any) { offSet := int64(0) pageSize := int64(15) if query != nil && query.PageNumber > 1 { diff --git a/src/pkg/securityhub/dao/security_test.go b/src/pkg/securityhub/dao/security_test.go index ae6025b3088..00b522c48b0 100644 --- a/src/pkg/securityhub/dao/security_test.go +++ b/src/pkg/securityhub/dao/security_test.go @@ -159,10 +159,10 @@ func (suite *SecurityDaoTestSuite) TestExactMatchFilter() { name string args args wantSQLStr string - wantParams []interface{} + wantParams []any }{ - {"normal", args{suite.Context(), "cve_id", q.New(q.KeyWords{"cve_id": "CVE-2023-2345"})}, " and cve_id = ?", []interface{}{"CVE-2023-2345"}}, - {"digest", args{suite.Context(), "digest", q.New(q.KeyWords{"digest": "digest123"})}, " and a.digest = ?", []interface{}{"digest123"}}, + {"normal", args{suite.Context(), "cve_id", q.New(q.KeyWords{"cve_id": "CVE-2023-2345"})}, " and cve_id = ?", []any{"CVE-2023-2345"}}, + {"digest", args{suite.Context(), "digest", q.New(q.KeyWords{"digest": "digest123"})}, " and a.digest = ?", []any{"digest123"}}, } for _, tt := range tests { suite.Run(tt.name, func() { @@ -183,9 +183,9 @@ func (suite *SecurityDaoTestSuite) TestRangeFilter() { name string args args wantSQLStr string - wantParams []interface{} + wantParams []any }{ - {"normal", args{suite.Context(), "cvss_score_v3", q.New(q.KeyWords{"cvss_score_v3": &q.Range{1.0, 2.0}})}, " and cvss_score_v3 between ? and ?", []interface{}{1.0, 2.0}}, + {"normal", args{suite.Context(), "cvss_score_v3", q.New(q.KeyWords{"cvss_score_v3": &q.Range{1.0, 2.0}})}, " and cvss_score_v3 between ? and ?", []any{1.0, 2.0}}, } for _, tt := range tests { suite.Run(tt.name, func() { @@ -224,7 +224,7 @@ func (suite *SecurityDaoTestSuite) TestTagFilter() { name string args args wantSqlStr string - wantParams []interface{} + wantParams []any }{ {"normal", args{suite.Context(), "tag", q.New(q.KeyWords{"tag": "tag_test"})}, " and a.id IN", nil}, } @@ -242,13 +242,13 @@ func (suite *SecurityDaoTestSuite) TestApplyVulFilter() { ctx context.Context sqlStr string query *q.Query - params []interface{} + params []any } tests := []struct { name string args args wantSqlStr string - wantParams []interface{} + wantParams []any }{ {"normal", args{suite.Context(), "select * from vulnerability_record", q.New(q.KeyWords{"tag": "tag_test"}), nil}, " and a.id IN", nil}, } diff --git a/src/pkg/systemartifact/cleanupcriteria.go b/src/pkg/systemartifact/cleanupcriteria.go index c148fa12d26..75a59b9cada 100644 --- a/src/pkg/systemartifact/cleanupcriteria.go +++ b/src/pkg/systemartifact/cleanupcriteria.go @@ -64,6 +64,6 @@ func (cleanupCriteria *defaultSelector) List(ctx context.Context) ([]*model.Syst duration := time.Duration(DefaultCleanupWindowSeconds) * time.Second timeRange := q.Range{Max: currentTime.Add(-duration).Format(time.RFC3339)} logger.Debugf("Cleaning up system artifacts with range: %v", timeRange) - query := q.New(map[string]interface{}{"create_time": &timeRange}) + query := q.New(map[string]any{"create_time": &timeRange}) return cleanupCriteria.dao.List(ctx, query) } diff --git a/src/pkg/systemartifact/cleanupcriteria_test.go b/src/pkg/systemartifact/cleanupcriteria_test.go index 23b22823542..d4807e5f52c 100644 --- a/src/pkg/systemartifact/cleanupcriteria_test.go +++ b/src/pkg/systemartifact/cleanupcriteria_test.go @@ -144,7 +144,7 @@ func (suite *defaultCleanupCriteriaTestSuite) TestListWithFilters() { actualSysArtifactIds := make(map[int64]bool) - query := q.Query{Keywords: map[string]interface{}{"vendor": "test_vendor37000", "repository": "test_repo37000"}} + query := q.Query{Keywords: map[string]any{"vendor": "test_vendor37000", "repository": "test_repo37000"}} sysArtifactList, err := suite.cleanupCriteria.ListWithFilters(suite.ctx, &query) for _, sysArtifact := range sysArtifactList { diff --git a/src/pkg/systemartifact/dao/dao_test.go b/src/pkg/systemartifact/dao/dao_test.go index b0b9ae2a13a..3023b39ec2d 100644 --- a/src/pkg/systemartifact/dao/dao_test.go +++ b/src/pkg/systemartifact/dao/dao_test.go @@ -267,7 +267,7 @@ func (suite *daoTestSuite) TestList() { // attempt to read all the system artifact records { query := q.Query{} - query.Keywords = map[string]interface{}{"repository": "test_repo4", "digest": "test_digest4"} + query.Keywords = map[string]any{"repository": "test_repo4", "digest": "test_digest4"} sysArtifacts, err := suite.dao.List(suite.ctx, &query) suite.NotNilf(sysArtifacts, "Expected system artifacts list to be non-nil") diff --git a/src/pkg/systemartifact/manager.go b/src/pkg/systemartifact/manager.go index 90057a4d396..1daea91bae3 100644 --- a/src/pkg/systemartifact/manager.go +++ b/src/pkg/systemartifact/manager.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io" + "maps" "sync" "time" @@ -206,9 +207,7 @@ func (mgr *systemArtifactManager) Cleanup(ctx context.Context) (int64, int64, er // iterate through this copy to invoke the cleanup registeredCriteria := make(map[string]Selector, 0) mgr.lock.Lock() - for key, val := range mgr.cleanupCriteria { - registeredCriteria[key] = val - } + maps.Copy(registeredCriteria, mgr.cleanupCriteria) mgr.lock.Unlock() for key, val := range registeredCriteria { diff --git a/src/pkg/tag/dao/dao.go b/src/pkg/tag/dao/dao.go index 26103e21a48..0145de9cced 100644 --- a/src/pkg/tag/dao/dao.go +++ b/src/pkg/tag/dao/dao.go @@ -142,7 +142,7 @@ func (d *dao) Delete(ctx context.Context, id int64) error { func (d *dao) DeleteOfArtifact(ctx context.Context, artifactID int64) error { qs, err := orm.QuerySetter(ctx, &tag.Tag{}, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) diff --git a/src/pkg/tag/dao/dao_test.go b/src/pkg/tag/dao/dao_test.go index 7b5a20dcd82..c8bf4b9ea55 100644 --- a/src/pkg/tag/dao/dao_test.go +++ b/src/pkg/tag/dao/dao_test.go @@ -86,7 +86,7 @@ func (d *daoTestSuite) TestCount() { d.True(total > 0) // query by repository ID and name total, err = d.dao.Count(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "repository_id": 1000, "name": "latest", }, @@ -110,7 +110,7 @@ func (d *daoTestSuite) TestList() { // query by repository ID and name tags, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "repository_id": 1000, "name": "latest", }, @@ -251,7 +251,7 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Nil(err) tags, err := d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) @@ -262,7 +262,7 @@ func (d *daoTestSuite) TestDeleteOfArtifact() { d.Require().Nil(err) tags, err = d.dao.List(d.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ArtifactID": artifactID, }, }) diff --git a/src/pkg/task/dao/execution.go b/src/pkg/task/dao/execution.go index 54128742d18..faf5d1b695b 100644 --- a/src/pkg/task/dao/execution.go +++ b/src/pkg/task/dao/execution.go @@ -224,7 +224,7 @@ func (e *executionDAO) GetMetrics(ctx context.Context, id int64) (*Metrics, erro func (e *executionDAO) RefreshStatus(ctx context.Context, id int64) (bool, string, error) { // as the status of the execution can be refreshed by multiple operators concurrently // we use the optimistic locking to avoid the conflict and retry 5 times at most - for i := 0; i < 5; i++ { + for range 5 { statusChanged, currentStatus, retry, err := e.refreshStatus(ctx, id) if err != nil { return false, "", err @@ -346,7 +346,7 @@ func (e *executionDAO) refreshStatus(ctx context.Context, id int64) (bool, strin type jsonbStru struct { keyPrefix string key string - value interface{} + value any } func (e *executionDAO) querySetter(ctx context.Context, query *q.Query, options ...orm.Option) (orm.QuerySeter, error) { @@ -359,7 +359,7 @@ func (e *executionDAO) querySetter(ctx context.Context, query *q.Query, options if query != nil && len(query.Keywords) > 0 { var ( jsonbStrus []jsonbStru - args []interface{} + args []any ) for key, value := range query.Keywords { @@ -407,13 +407,13 @@ func (e *executionDAO) querySetter(ctx context.Context, query *q.Query, options // key = extra_attrs.a.b.c // // ==> sql = "select id from execution where extra_attrs->?->?->>?=?", args = {a, b, c, value} -func buildInClauseSQLForExtraAttrs(jsonbStrus []jsonbStru) (string, []interface{}) { +func buildInClauseSQLForExtraAttrs(jsonbStrus []jsonbStru) (string, []any) { if len(jsonbStrus) == 0 { return "", nil } var cond string - var args []interface{} + var args []any sql := "select id from execution where" for i, jsonbStr := range jsonbStrus { diff --git a/src/pkg/task/dao/execution_test.go b/src/pkg/task/dao/execution_test.go index edf711d8460..14ef22efb1d 100644 --- a/src/pkg/task/dao/execution_test.go +++ b/src/pkg/task/dao/execution_test.go @@ -66,7 +66,7 @@ func (e *executionDAOTestSuite) TearDownTest() { func (e *executionDAOTestSuite) TestCount() { count, err := e.executionDAO.Count(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "value", }, @@ -75,7 +75,7 @@ func (e *executionDAOTestSuite) TestCount() { e.Equal(int64(1), count) count, err = e.executionDAO.Count(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "incorrect-value", }, @@ -86,7 +86,7 @@ func (e *executionDAOTestSuite) TestCount() { func (e *executionDAOTestSuite) TestList() { executions, err := e.executionDAO.List(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "value", }, @@ -96,7 +96,7 @@ func (e *executionDAOTestSuite) TestList() { e.Equal(e.executionID, executions[0].ID) executions, err = e.executionDAO.List(e.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": "test", "ExtraAttrs.key": "incorrect-value", }, diff --git a/src/pkg/task/dao/task.go b/src/pkg/task/dao/task.go index 6bead6283ba..6dad77962ea 100644 --- a/src/pkg/task/dao/task.go +++ b/src/pkg/task/dao/task.go @@ -261,7 +261,7 @@ func (t *taskDAO) querySetter(ctx context.Context, query *q.Query, options ...or var ( key string keyPrefix string - value interface{} + value any ) for key, value = range query.Keywords { if strings.HasPrefix(key, "ExtraAttrs.") { diff --git a/src/pkg/task/dao/task_test.go b/src/pkg/task/dao/task_test.go index 58a41e5519a..8333fb9b339 100644 --- a/src/pkg/task/dao/task_test.go +++ b/src/pkg/task/dao/task_test.go @@ -73,7 +73,7 @@ func (t *taskDAOTestSuite) TearDownTest() { func (t *taskDAOTestSuite) TestCount() { count, err := t.taskDAO.Count(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "value", }, @@ -82,7 +82,7 @@ func (t *taskDAOTestSuite) TestCount() { t.Equal(int64(1), count) count, err = t.taskDAO.Count(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "incorrect-value", }, @@ -93,7 +93,7 @@ func (t *taskDAOTestSuite) TestCount() { func (t *taskDAOTestSuite) TestList() { tasks, err := t.taskDAO.List(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "value", }, @@ -103,7 +103,7 @@ func (t *taskDAOTestSuite) TestList() { t.Equal(t.taskID, tasks[0].ID) tasks, err = t.taskDAO.List(t.ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": t.executionID, "ExtraAttrs.key": "incorrect-value", }, @@ -256,7 +256,7 @@ func (t *taskDAOTestSuite) TestGetMaxEndTime() { func (t *taskDAOTestSuite) TestUpdateStatusInBatch() { jobIDs := make([]string, 0) taskIDs := make([]int64, 0) - for i := 0; i < 300; i++ { + for i := range 300 { jobID := fmt.Sprintf("job-%d", i) tid, err := t.taskDAO.Create(t.ctx, &Task{ JobID: jobID, @@ -272,7 +272,7 @@ func (t *taskDAOTestSuite) TestUpdateStatusInBatch() { err := t.taskDAO.UpdateStatusInBatch(t.ctx, jobIDs, "Stopped", 10) t.Require().Nil(err) - for i := 0; i < 300; i++ { + for i := range 300 { tasks, err := t.taskDAO.List(t.ctx, &q.Query{ Keywords: q.KeyWords{"job_id": jobIDs[i]}}) t.Require().Nil(err) diff --git a/src/pkg/task/execution.go b/src/pkg/task/execution.go index 31c993e36e2..0dab797b2c9 100644 --- a/src/pkg/task/execution.go +++ b/src/pkg/task/execution.go @@ -41,9 +41,9 @@ type ExecutionManager interface { // and the "vendorID" specifies the ID of vendor if needed(e.g. policy ID for replication and retention). // The "extraAttrs" can be used to set the customized attributes Create(ctx context.Context, vendorType string, vendorID int64, trigger string, - extraAttrs ...map[string]interface{}) (id int64, err error) + extraAttrs ...map[string]any) (id int64, err error) // Update the extra attributes of the specified execution - UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) (err error) + UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) (err error) // MarkDone marks the status of the specified execution as success. // It must be called to update the execution status if the created execution contains no tasks. // In other cases, the execution status can be calculated from the referenced tasks automatically @@ -96,8 +96,8 @@ func (e *executionManager) Count(ctx context.Context, query *q.Query) (int64, er } func (e *executionManager) Create(ctx context.Context, vendorType string, vendorID int64, trigger string, - extraAttrs ...map[string]interface{}) (int64, error) { - extras := map[string]interface{}{} + extraAttrs ...map[string]any) (int64, error) { + extras := map[string]any{} if len(extraAttrs) > 0 && extraAttrs[0] != nil { extras = extraAttrs[0] } @@ -124,7 +124,7 @@ func (e *executionManager) Create(ctx context.Context, vendorType string, vendor return id, nil } -func (e *executionManager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) error { +func (e *executionManager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) error { data, err := json.Marshal(extraAttrs) if err != nil { return err @@ -170,7 +170,7 @@ func (e *executionManager) Stop(ctx context.Context, id int64) error { // when an execution is in final status, if it contains task that is a periodic or retrying job it will // run again in the near future, so we must operate the stop action no matter the status is final or not tasks, err := e.taskDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": id, }, }) @@ -264,7 +264,7 @@ func (e *executionManager) StopAndWaitWithError(ctx context.Context, id int64, t func (e *executionManager) Delete(ctx context.Context, id int64) error { tasks, err := e.taskDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ExecutionID": id, }, }) @@ -294,7 +294,7 @@ func (e *executionManager) Delete(ctx context.Context, id int64) error { func (e *executionManager) DeleteByVendor(ctx context.Context, vendorType string, vendorID int64) error { executions, err := e.executionDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": vendorType, "VendorID": vendorID, }}) @@ -355,7 +355,7 @@ func (e *executionManager) populateExecution(ctx context.Context, execution *dao } if len(execution.ExtraAttrs) > 0 { - extras := map[string]interface{}{} + extras := map[string]any{} if err := json.Unmarshal([]byte(execution.ExtraAttrs), &extras); err != nil { log.Errorf("failed to unmarshal the extra attributes of execution %d: %v", execution.ID, err) } else { diff --git a/src/pkg/task/execution_test.go b/src/pkg/task/execution_test.go index 8ceaee9010c..e24e1d3b305 100644 --- a/src/pkg/task/execution_test.go +++ b/src/pkg/task/execution_test.go @@ -60,7 +60,7 @@ func (e *executionManagerTestSuite) TestCount() { func (e *executionManagerTestSuite) TestCreate() { e.execDAO.On("Create", mock.Anything, mock.Anything).Return(int64(1), nil) id, err := e.execMgr.Create(nil, "vendor", 0, ExecutionTriggerManual, - map[string]interface{}{"k": "v"}) + map[string]any{"k": "v"}) e.Require().Nil(err) e.Equal(int64(1), id) // sleep to make sure the function in the goroutine run @@ -70,7 +70,7 @@ func (e *executionManagerTestSuite) TestCreate() { func (e *executionManagerTestSuite) TestUpdateExtraAttrs() { e.execDAO.On("Update", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err := e.execMgr.UpdateExtraAttrs(nil, 1, map[string]interface{}{"key": "value"}) + err := e.execMgr.UpdateExtraAttrs(nil, 1, map[string]any{"key": "value"}) e.Require().Nil(err) e.execDAO.AssertExpectations(e.T()) } diff --git a/src/pkg/task/hook.go b/src/pkg/task/hook.go index 46ca8e91517..f71de6f6913 100644 --- a/src/pkg/task/hook.go +++ b/src/pkg/task/hook.go @@ -69,7 +69,7 @@ func (h *HookHandler) Handle(ctx context.Context, sc *job.StatusChange) error { jobID = sc.Metadata.UpstreamJobID } tasks, err := h.taskDAO.List(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "JobID": jobID, }, }) diff --git a/src/pkg/task/mock_execution_dao_test.go b/src/pkg/task/mock_execution_dao_test.go index c80caec8830..438ba3e7182 100644 --- a/src/pkg/task/mock_execution_dao_test.go +++ b/src/pkg/task/mock_execution_dao_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_jobservice_client_test.go b/src/pkg/task/mock_jobservice_client_test.go index d40942ec6c5..987ac42baad 100644 --- a/src/pkg/task/mock_jobservice_client_test.go +++ b/src/pkg/task/mock_jobservice_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_sweep_manager_test.go b/src/pkg/task/mock_sweep_manager_test.go index e29ec8ae042..28b73e0aebe 100644 --- a/src/pkg/task/mock_sweep_manager_test.go +++ b/src/pkg/task/mock_sweep_manager_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_task_dao_test.go b/src/pkg/task/mock_task_dao_test.go index 6cdfcc80327..22a1cafa0c3 100644 --- a/src/pkg/task/mock_task_dao_test.go +++ b/src/pkg/task/mock_task_dao_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/mock_task_manager_test.go b/src/pkg/task/mock_task_manager_test.go index b4bbece809c..b8534e4c977 100644 --- a/src/pkg/task/mock_task_manager_test.go +++ b/src/pkg/task/mock_task_manager_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/pkg/task/model.go b/src/pkg/task/model.go index fcaf8c74d06..894cc29343a 100644 --- a/src/pkg/task/model.go +++ b/src/pkg/task/model.go @@ -47,10 +47,10 @@ type Execution struct { // trigger type: manual/schedule/event Trigger string `json:"trigger"` // the customized attributes for different kinds of consumers - ExtraAttrs map[string]interface{} `json:"extra_attrs"` - StartTime time.Time `json:"start_time"` - UpdateTime time.Time `json:"update_time"` - EndTime time.Time `json:"end_time"` + ExtraAttrs map[string]any `json:"extra_attrs"` + StartTime time.Time `json:"start_time"` + UpdateTime time.Time `json:"update_time"` + EndTime time.Time `json:"end_time"` } // IsOnGoing returns true when the execution is running @@ -78,7 +78,7 @@ type Task struct { // the ID of jobservice job JobID string `json:"job_id"` // the customized attributes for different kinds of consumers - ExtraAttrs map[string]interface{} `json:"extra_attrs"` + ExtraAttrs map[string]any `json:"extra_attrs"` // the time that the task record created CreationTime time.Time `json:"creation_time"` // the time that the underlying job starts @@ -103,7 +103,7 @@ func (t *Task) From(task *dao.Task) { t.EndTime = task.EndTime t.StatusRevision = task.StatusRevision if len(task.ExtraAttrs) > 0 { - extras := map[string]interface{}{} + extras := map[string]any{} if err := json.Unmarshal([]byte(task.ExtraAttrs), &extras); err != nil { log.Errorf("failed to unmarshal the extra attributes of task %d: %v", task.ID, err) return diff --git a/src/pkg/task/sweep_job.go b/src/pkg/task/sweep_job.go index 6ee7d49a0a5..c9760861669 100644 --- a/src/pkg/task/sweep_job.go +++ b/src/pkg/task/sweep_job.go @@ -165,11 +165,7 @@ func (sj *SweepJob) sweep(ctx job.Context, vendorType string, retainCount int64) return errStop } // calculate the batch position - j := i + sweepBatchSize - // avoid overflow - if j > total { - j = total - } + j := min(i+sweepBatchSize, total) if err = sj.mgr.Clean(ctx.SystemContext(), candidates[i:j]); err != nil { sj.logger.Errorf("[%s] failed to batch clean candidates, error: %v", vendorType, err) diff --git a/src/pkg/task/sweep_job_test.go b/src/pkg/task/sweep_job_test.go index 47fd5f97b6d..3871805b670 100644 --- a/src/pkg/task/sweep_job_test.go +++ b/src/pkg/task/sweep_job_test.go @@ -40,7 +40,7 @@ func TestSweepJob(t *testing.T) { } func (suite *sweepJobTestSuite) TestRun() { - params := map[string]interface{}{ + params := map[string]any{ "execution_retain_counts": map[string]int{ "WEBHOOK": 10, "REPLICATION": 20, diff --git a/src/pkg/task/sweep_manager.go b/src/pkg/task/sweep_manager.go index e82131fbc6f..02ffd7fdced 100644 --- a/src/pkg/task/sweep_manager.go +++ b/src/pkg/task/sweep_manager.go @@ -68,7 +68,7 @@ func (sm *sweepManager) listVendorIDs(ctx context.Context, vendorType string) ([ // getCandidateMaxStartTime returns the max start time for candidate executions, obtain the start time of the xth recent one. func (sm *sweepManager) getCandidateMaxStartTime(ctx context.Context, vendorType string, vendorID, retainCnt int64) (*time.Time, error) { query := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "VendorType": vendorType, "VendorID": vendorID, }, @@ -121,7 +121,7 @@ func (sm *sweepManager) ListCandidates(ctx context.Context, vendorType string, r // count the records for pagination sql := `SELECT COUNT(1) FROM execution WHERE vendor_type = ? AND vendor_id = ? AND start_time < ? AND status IN (?,?,?)` totalOfCandidate := 0 - params := []interface{}{ + params := []any{ vendorType, vendorID, maxStartTime.Format(timeFormat), @@ -145,7 +145,7 @@ func (sm *sweepManager) ListCandidates(ctx context.Context, vendorType string, r for i := n; i >= 1; i-- { q2.PageNumber = int64(i) // should copy params as pagination will append the slice - paginationParams := make([]interface{}, len(params)) + paginationParams := make([]any, len(params)) copy(paginationParams, params) paginationSQL, paginationParams := orm.PaginationOnRawSQL(q2, sql, paginationParams) ids := make([]int64, 0, defaultPageSize) @@ -165,7 +165,7 @@ func (sm *sweepManager) Clean(ctx context.Context, execIDs []int64) error { return err } // construct sql params - params := make([]interface{}, 0, len(execIDs)) + params := make([]any, 0, len(execIDs)) for _, eid := range execIDs { params = append(params, eid) } diff --git a/src/pkg/task/task.go b/src/pkg/task/task.go index fa82c14ed05..5ef8422a824 100644 --- a/src/pkg/task/task.go +++ b/src/pkg/task/task.go @@ -41,7 +41,7 @@ type Manager interface { // Create submits the job to jobservice and creates a corresponding task record. // An execution must be created first and the task will be linked to it. // The "extraAttrs" can be used to set the customized attributes - Create(ctx context.Context, executionID int64, job *Job, extraAttrs ...map[string]interface{}) (id int64, err error) + Create(ctx context.Context, executionID int64, job *Job, extraAttrs ...map[string]any) (id int64, err error) // Stop the specified task Stop(ctx context.Context, id int64) (err error) // Get the specified task @@ -50,7 +50,7 @@ type Manager interface { // Query the "ExtraAttrs" by setting 'query.Keywords["ExtraAttrs.key"]="value"' List(ctx context.Context, query *q.Query) (tasks []*Task, err error) // Update the extra attributes of the specified task - UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) (err error) + UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) (err error) // Get the log of the specified task GetLog(ctx context.Context, id int64) (log []byte, err error) // GetLogByJobID get the log of specified job id @@ -101,7 +101,7 @@ func (m *manager) Count(ctx context.Context, query *q.Query) (int64, error) { return m.dao.Count(ctx, query) } -func (m *manager) Create(ctx context.Context, executionID int64, jb *Job, extraAttrs ...map[string]interface{}) (int64, error) { +func (m *manager) Create(ctx context.Context, executionID int64, jb *Job, extraAttrs ...map[string]any) (int64, error) { // create task record in database id, err := m.createTaskRecord(ctx, executionID, extraAttrs...) if err != nil { @@ -137,12 +137,12 @@ func (m *manager) Create(ctx context.Context, executionID int64, jb *Job, extraA return id, nil } -func (m *manager) createTaskRecord(ctx context.Context, executionID int64, extraAttrs ...map[string]interface{}) (int64, error) { +func (m *manager) createTaskRecord(ctx context.Context, executionID int64, extraAttrs ...map[string]any) (int64, error) { exec, err := m.execDAO.Get(ctx, executionID) if err != nil { return 0, err } - extras := map[string]interface{}{} + extras := map[string]any{} if len(extraAttrs) > 0 && extraAttrs[0] != nil { extras = extraAttrs[0] } @@ -255,7 +255,7 @@ func (m *manager) ListScanTasksByReportUUID(ctx context.Context, uuid string) ([ return ts, nil } -func (m *manager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]interface{}) error { +func (m *manager) UpdateExtraAttrs(ctx context.Context, id int64, extraAttrs map[string]any) error { data, err := json.Marshal(extraAttrs) if err != nil { return err diff --git a/src/pkg/task/task_test.go b/src/pkg/task/task_test.go index 6cf243364f9..f259992b609 100644 --- a/src/pkg/task/task_test.go +++ b/src/pkg/task/task_test.go @@ -61,7 +61,7 @@ func (t *taskManagerTestSuite) TestCreate() { t.jsClient.On("SubmitJob", mock.Anything).Return("1", nil) t.dao.On("Update", mock.Anything, mock.Anything, mock.Anything).Return(nil) - id, err := t.mgr.Create(nil, 1, &Job{}, map[string]interface{}{"a": "b"}) + id, err := t.mgr.Create(nil, 1, &Job{}, map[string]any{"a": "b"}) t.Require().Nil(err) t.Equal(int64(1), id) t.dao.AssertExpectations(t.T()) @@ -77,7 +77,7 @@ func (t *taskManagerTestSuite) TestCreate() { t.jsClient.On("SubmitJob", mock.Anything).Return("", errors.New("error")) t.dao.On("Delete", mock.Anything, mock.Anything).Return(nil) - id, err = t.mgr.Create(nil, 1, &Job{}, map[string]interface{}{"a": "b"}) + id, err = t.mgr.Create(nil, 1, &Job{}, map[string]any{"a": "b"}) t.Require().NotNil(err) t.dao.AssertExpectations(t.T()) t.execDAO.AssertExpectations(t.T()) @@ -129,7 +129,7 @@ func (t *taskManagerTestSuite) TestGet() { func (t *taskManagerTestSuite) TestUpdateExtraAttrs() { t.dao.On("Update", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err := t.mgr.UpdateExtraAttrs(nil, 1, map[string]interface{}{}) + err := t.mgr.UpdateExtraAttrs(nil, 1, map[string]any{}) t.Require().Nil(err) t.dao.AssertExpectations(t.T()) } diff --git a/src/pkg/token/options.go b/src/pkg/token/options.go index 1e1cb28723d..6e771e7589e 100644 --- a/src/pkg/token/options.go +++ b/src/pkg/token/options.go @@ -39,7 +39,7 @@ type Options struct { } // GetKey ... -func (o *Options) GetKey() (interface{}, error) { +func (o *Options) GetKey() (any, error) { var err error var privateKey *rsa.PrivateKey var publicKey *rsa.PublicKey diff --git a/src/pkg/token/token.go b/src/pkg/token/token.go index d4e2fcbc5c1..03315e0dfca 100644 --- a/src/pkg/token/token.go +++ b/src/pkg/token/token.go @@ -66,7 +66,7 @@ func Parse(opt *Options, rawToken string, claims jwt.Claims) (*Token, error) { return nil, err } var parser = jwt.NewParser(jwt.WithLeeway(common.JwtLeeway), jwt.WithValidMethods([]string{opt.SignMethod.Alg()})) - token, err := parser.ParseWithClaims(rawToken, claims, func(_ *jwt.Token) (interface{}, error) { + token, err := parser.ParseWithClaims(rawToken, claims, func(_ *jwt.Token) (any, error) { switch k := key.(type) { case *rsa.PrivateKey: return &k.PublicKey, nil diff --git a/src/pkg/user/dao/user.go b/src/pkg/user/dao/user.go index 1e4fb6952ee..d4ba5f3417f 100644 --- a/src/pkg/user/dao/user.go +++ b/src/pkg/user/dao/user.go @@ -94,7 +94,7 @@ func toCommonUser(u *User) *commonmodels.User { } // FilterByUsernameOrEmail generates the query setter to match username or email column to the same value -func (u *User) FilterByUsernameOrEmail(_ context.Context, qs orm.QuerySeter, _ string, value interface{}) orm.QuerySeter { +func (u *User) FilterByUsernameOrEmail(_ context.Context, qs orm.QuerySeter, _ string, value any) orm.QuerySeter { usernameOrEmail, ok := value.(string) if !ok { return qs diff --git a/src/portal/app-swagger-ui/package-lock.json b/src/portal/app-swagger-ui/package-lock.json index f7056ef22ac..06fb6d26da0 100644 --- a/src/portal/app-swagger-ui/package-lock.json +++ b/src/portal/app-swagger-ui/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "css-loader": "^6.11.0", "style-loader": "^3.3.4", - "swagger-ui": "5.17.14" + "swagger-ui": "5.20.1" }, "devDependencies": { "clean-webpack-plugin": "^4.0.0", @@ -22,9 +22,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -33,9 +33,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", - "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", + "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -44,11 +44,6 @@ "node": ">=6.9.0" } }, - "node_modules/@braintree/sanitize-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.2.tgz", - "integrity": "sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==" - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -151,13 +146,19 @@ "node": ">= 8" } }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true + }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-alpha.9.tgz", - "integrity": "sha512-SAOQrFSFwgDiI4QSIPDwAIJEb4Za+8bu45sNojgV3RMtCz+n4Agw66iqGsDib5YSI/Cg1h4AKFovT3iWdfGWfw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.30.tgz", + "integrity": "sha512-5Wj3zdt0dxS9ERVk4qSuqDIsMQ8dP2vop8b494OpJ/O2W261yCV39Z+vN+PqeJ2NiKDRMlJ+QoQ1uVfKwEo8Kg==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -165,13 +166,13 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-alpha.9.tgz", - "integrity": "sha512-vGl8BWRf6ODl39fxElcIOjRE2QG5AJhn8tTNMqjjHB/2WppNBuxOVStYZeVJoWfK03OPK8v4Fp/TAcaP9+R7DQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.30.tgz", + "integrity": "sha512-pDnUhXIKKUvmeezQfwKLL05rkOH1L7ueiy5ja5ob9y2w4r+HXDID7qHtDGeRxKZoIt4E3Sd1K37OjcE9fNcknQ==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -181,36 +182,51 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-alpha.9.tgz", - "integrity": "sha512-FU/2sFSgsICB9HYFELJ79caRpXXzlAV41QTHsAM46WfRehbzZUQpOBQm4jRi3qJGSa/Jk+mQ7Vt8HLRFMpJFfg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.30.tgz", + "integrity": "sha512-hVDx0kUF1DTyaEXwmsF3wpJClEfnH0pxjEubqtvHpjjeTMgZzmKc5azbYtvgBX3uUpGHyQZyG/O9g94/wIhhMA==", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-alpha.9.tgz", - "integrity": "sha512-/W8Ktbgbs29zdhed6KHTFk0qmuIRbvEFi8wu2MHGQ5UT4i99Bdu2OyUiayhnpejWztfQxDgL08pjrQPEwgY8Yg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.30.tgz", + "integrity": "sha512-G+BDNXU/ARJCbJiFq1A6dh6pNDDp1J0jPfKeIHjsD8aZoRdpJC0F3F7onm8TjQm2cnvAi4B7vPOKzjWrYN1VWw==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-alpha.9.tgz", - "integrity": "sha512-aduC2vbwGgn6ia9IkKpqBYBaKyIDGM/80M3oU3DFgaYIIwynzuwVpN1TkBOLIFy3mAzkWoYKUS0jdZJhMy/6Ug==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.30.tgz", + "integrity": "sha512-YsFtttsq39qVU2J9lMD3i+aeuiMD8EjeageszDEePYgb4/k2PZX9YJqb9urwxydBM7BFG7H/r9K/dVUMHFV5hw==", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-arazzo-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.30.tgz", + "integrity": "sha512-HpszcpuDlSOXWruHzasR64L8640VHVDuy8xXJrhx1iBu+gDHriOM8gbh8jQgWST91H0smtPeTG9WV1/h6frhRw==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -218,28 +234,58 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-hZjxXJgMt517ADnAauWJh01k7WNRwkbWT5p6b7AXF2H3tl549A2hhLnIg3BBSE3GwB3Nv25GyrI3aA/1dFVC8A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-/DvnCZY2cVz8E79Nc5mXD8J0++D8QT/c1PKPMMGEGVwGWB6XLh8jZM0HERb6yAiLUC0qzv4Jau/iQH1gs/ZtiQ==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, + "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.30.tgz", + "integrity": "sha512-HZL76SJaUDmL1GuFcev23UX1vVuxSHIED3vvKso+k3KWNfVWZJrr7GX1ELJx84fWW8g3b5S5+nyz5q1ApT084A==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.30.tgz", + "integrity": "sha512-D2adAcu/ISoBe0zRbcX0HyaDvWoMhmaL8iPR4pvjLY7soB2tCR4uLEzAkqPa2zaOKBRA2ziF74aNKrKbM5sX8w==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-alpha.9.tgz", - "integrity": "sha512-OfX4UBb08C0xD5+F80dQAM2yt5lXxcURWkVEeCwxz7i23BB3nNEbnZXNV91Qo9eaJflPh8dO9iiHQxvfw5IgSg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.30.tgz", + "integrity": "sha512-u5YMIw/g74Z59wPBFS2A2LaheC+EEqRcbpUQOApTvb6zjW+xWxbCuKV1ypzIaVDDPIry8e3mpwjjXLj1mvad5w==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -247,15 +293,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-alpha.9.tgz", - "integrity": "sha512-qzUVRSSrnlYGMhK6w57o/RboNvy1FO0iFgEnTk56dD4wN49JRNuFqKI18IgXc1W2r9tTTG70nG1khe4cPE8TNg==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.30.tgz", + "integrity": "sha512-/Mp11+tBKTN6XnpOiQo/cKnqmvfJhdCniHCK6Bg8wpCI3dMi+nSSpIYgWEPVQfNsLtf/PaYegrtYY56W4UzNRw==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -263,15 +308,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-alpha.9.tgz", - "integrity": "sha512-Zml8Z8VCckdFjvTogaec1dabd85hg1+xZDseWcCuD0tYkaTY/sZ8zzI0dz6/4HsKCb58qjiWSa0w60N8Syr6WQ==", - "optional": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.30.tgz", + "integrity": "sha512-6sZ0LLYnEz9KXtt9xTRSc0EORBl5Fj3LUbfabUjqLQZGldsJWU+3TTQ4XtzFFHlan7z2WYyALKP7iP+b60XbPg==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -279,15 +323,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-WUZxt7Gs7P4EQsGtoD6cKAjf0uDJhkUxsIW9Bb4EAgO6tdp7LlXhbJ0fJ2QycCLY717SfJbvGLfhuSfTYo4Iow==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-nloJUjf6AtKRnBuWmaFkVk7lR7aht9cudXkR/W0ui+feLSJ5rnYy6nyLyGFLZqLnb2cSV8L6bB6tGPJnvc5KzA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -295,14 +339,14 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-7ra5uoZGrfCn1LabfJLueChPcYXyg24//LCYBtjTstyueqd5Vp7JCPeP5NnJSAaqVAP47r8ygceBPoxNp9k1EQ==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-7bz6kCgjStTKGGI4wBP2ho574lyfjH5EDPPuXhkwmAG2mOn9MZezlQhsbdo3B+vbi/58mqQb2XCoB4aeP1F+GQ==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -310,288 +354,315 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-nQOwNQgf0C8EVjf2loAAl4ifRuVOdcqycvXUdcTpsUfHN3fbndR8IKpb26mQNmnACmqgmX+LkbMdW9b+K6089g==", - "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-pq2jxSp0I6xnGzyAiEXWYMuurp8H7TlOQ6Ijr/XX54gNmaIK+yQ3HXc7S6FZx+B2kQx03Tb8Y8O7L7J7YnmFiA==", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, - "node_modules/@swagger-api/apidom-ns-workflows-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-yKo0p8OkQmDib93Kt1yqWmI7JsD6D9qUHxr/SCuAmNNWny1hxm7cZGoKJwJlGd0uAg84j4vmzWOlG3AsJbnT8g==", + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.30.tgz", + "integrity": "sha512-ER5kQtxOXG8W1cQC7xH8EYYUOAMaqVrECIZShoa6yOLoI0/a40xFF5Lansn2P9szR1hT/2neM8KLcjaxCFjXSQ==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.3" + "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-xfVMR4HrTzXU0HB4TtxwkNbUIa/cQrPa0BWutJZ0fMYMAtUox2s8GsFYnJfZP52XfpSHFM1VPclivorZqET14g==", + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.30.tgz", + "integrity": "sha512-Xghcidv1TJVwrb/jFHQZA5YHPm+LxNPpFjOJYrijugXK72D3a5fqc/2PZzkGXeYefE4lGM+YB83c08N6NDCa4w==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-alpha.9.tgz", - "integrity": "sha512-lJZkrhZ8qRTtc5fSLKefCv8j7Xzo8UBfMjpqTJhmETAtU8YfVV2i2znjgxJpm0QwV6FVQqGfK1+ASZQWPLiVcA==", + "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.30.tgz", + "integrity": "sha512-SZajkrTJ7c1I9CI3gnsdHZCQFSIyQ2H/lkWDjA/drZkRcfbR1CTbR2q0BGGlV5Y+nFHBxjRNpPbYbZrqh0WV4w==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.30.tgz", + "integrity": "sha512-T+N1ix+V5IpOWMFcamQRI50830JayD1gifnRm+mVeWJKMzp+xm08bnO8NiR9LQ2SKJZ6FWYM38oG2tAt0Lwxcg==", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-65nmKdPzw4C1bmtYn+3zoxXCI6Gnobr0StI9XE0YWiK+lpso7RH3Cgyl1yPZ0DBRVGzP+Fn9FVzmDNulEfR95w==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-KjyF966T9HVvSsk+RWaOcNDxXBqOWr/09SAw1OdBBfGHqs+xF3KOV7/2RB88Adw3+ZZ3E5oXDvVVhobq8wVvyA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-RLI4FpVB3vB6mIuT77yrsv5V2LMZ80dW9XpV+Fmbd4Jkdj+ysAFwT38cI4AsUMOxixpTDIXY1oWD7AjvylHhQQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-+6zlRD0nP7T5Yiu9hHgP3b7d016WYRXqfr9TW/yqPFInM/tI74ROPJnMQ1G3s0HyW6lB0KX7cG0O0TqcMmnSqg==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-aOewp8/3zobf/O+5Jx8y7+bX3BPRfRlHIv15qp4YVTsLs6gLISWSzTO9JpWe9cR+AfhpsAalFq4t1LwIkmLk4A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.30.tgz", + "integrity": "sha512-cciT19OOXafwBnXe9KFVwUGEVu4Zrvb4k12TYNlNqzVg1xA9pBc3Ywq5EgHIhiiQOLY3fILr0fr6B36N6irN2Q==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-zgtsAfkplCFusX2P/saqdn10J8P3kQizCXxHLvxd2j0EhMJk2wfu4HYN5Pej/7/qf/OR1QZxqtacwebd4RfpXA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-Q5b9XVTId/FiGSmGKSOxyKJZYdvWcZOqogpLkF0Q8PtPVCgp2LFl73XuJOgjxO1nkE+n/ap+93svgaaxQRaVow==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-iPuHf0cAZSUhSv8mB0FnVgatTc26cVYohgqz2cvjoGofdqoh5KKIfxOkWlIhm+qGuBp71CfZUrPYPRsd0dHgeg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-VsDpKXmRl6sXpgR6o582yyDJqfFfliYVrVWve0DCOTkpvOeOYqPPLA45oMMvunJkqVsBL4Fpy9/ZqAQvdlur7g==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-jwkfO7tzZyyrAgok+O9fKFOv1q/5njMb9DBc3D/ZF3ZLTcnEw8uj4V2HkjKxUweH5k8ip/gc8ueKmO/i7p2fng==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-Q2NQ1/IF500mFuZZDC3tTw75UOTgSknqRyBywsA159BRnqnWxwk/2//Ifh8Vwq/mMyW2zSChigCvnqI+/IvQxA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jEIDpjbjwFKXQXS/RHJeA4tthsguLoz+nJPYS3AOLfuSiby5QXsKTxgqHXxG/YJqF1xJbZL+5KcF8UyiDePumw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-6Zj1UtbQIwnsVJi2xn+Zl9yn9U014XzkX6QKrpAXIUGNCcjwWIbuOKd3u2T481OOP0BuVf3JpWhRqxumtosV3w==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-ieJL8dfIF8fmP3uJRNh/duJa3cCIIv6MzUe6o4uPT/oTDroy4qIATvnq9Dq/gtAv6rcPRpA9VhyghJ1DmjKsZQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-YaGDkZaV9ZRtbIGorsyyqL2x323gLMqqgLrPpAjaBbBFiAJRwF/gwRHMY4iJ85H2YeUxUq0jqtSc3jH3wsQJGg==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-EatIH7PZQSNDsRn9ompc62MYzboY7wAkjfYz+2FzBaSA8Vl5/+740qGQj22tu/xhwW4K72aV2NNL1m47QVF7hA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-rBa7daaUrDVAIwJZm+S4lwc5pqNt6avNTGxEB69dNZ3QDJmCC+HUnudUtsG3VqMfP46JITKUPvtzRLGjX8CgRg==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "node_modules/@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-LylC2cQdAmvR7bXqwMwBt6FHTMVGinwIdI8pjl4EbPT9hCVm1rdED53caTYM4gCm+CJGRw20r4gb9vn3+N6RrA==", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.30.tgz", + "integrity": "sha512-NRmQehyw4gbDzeBAl0zjyPqj4e/jNYgqnRLcOsxTKpWODud8RHBqEvju/M6iET6ru0o+A9265efFzqR9hiE0LA==", "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.0.0", + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" } }, - "node_modules/@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-TlA4+1ca33D7fWxO5jKBytSCv86IGI4Lze4JfrawWUXZ5efhi4LiNmW5TrGlZUyvL7yJtZcA4tn3betlj6jVwA==", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "hasInstallScript": true, "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } } }, - "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jSIHEB7lbh+MP3BhYIXFkeivDR01kugXN70e5FskW7oet2TIARsVEPheWKQFSP1U8bUZA4bsp9h9gOQ9xEeErw==", + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, "optional": true, "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-alpha.9.tgz", - "integrity": "sha512-KQ6wB5KplqdSsjxdA8BaQulj5zlF5VBCd5KP3RN/9vvixgsD/gyrVY59nisdzmPTqiL6yjhk612eQ96MgG8KiA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.30.tgz", + "integrity": "sha512-l1MpLMlmaX+y2hra5EadfR37sAMzmEz1wZomVcnw7vJEFlLQo3WwOdFvpQemPCZ9IJHUs+5zhZ++w7z60uKpSw==", "dependencies": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", - "axios": "^1.4.0", + "axios": "^1.8.2", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-error": "^1.0.0-alpha.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1" + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0" } }, "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { @@ -616,6 +687,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@swaggerexpert/cookie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@swaggerexpert/cookie/-/cookie-2.0.2.tgz", + "integrity": "sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==", + "dependencies": { + "apg-lite": "^1.0.3" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -821,15 +903,21 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, "node_modules/@types/ws": { "version": "8.5.12", @@ -1179,9 +1267,9 @@ } }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1230,17 +1318,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -1343,30 +1420,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1400,6 +1453,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -1492,12 +1557,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -1663,6 +1722,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -1706,9 +1766,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -1822,21 +1882,6 @@ "ms": "2.0.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1961,15 +2006,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -2051,9 +2087,12 @@ } }, "node_modules/dompurify": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.4.tgz", - "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/domutils": { "version": "2.8.0", @@ -2087,6 +2126,19 @@ "node": ">=4" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2107,15 +2159,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -2150,13 +2193,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -2165,7 +2204,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -2175,6 +2213,31 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2274,15 +2337,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", @@ -2488,12 +2542,13 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -2526,12 +2581,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -2562,22 +2611,25 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2586,6 +2638,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -2598,12 +2662,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2662,12 +2720,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2704,11 +2761,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -2716,11 +2772,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2732,7 +2790,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2782,6 +2839,11 @@ "node": "*" } }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==" + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -3081,12 +3143,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -3454,6 +3510,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3560,18 +3624,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minim": { "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", @@ -3601,21 +3653,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3635,12 +3672,6 @@ "multicast-dns": "cli.js" } }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -3658,12 +3689,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -3696,23 +3721,20 @@ "tslib": "^2.0.3" } }, - "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, + "node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -3756,6 +3778,17 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -3845,7 +3878,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "dependencies": { "wrappy": "1" } @@ -3883,22 +3916,22 @@ } }, "node_modules/openapi-path-templating": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-1.6.0.tgz", - "integrity": "sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.2.1.tgz", + "integrity": "sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" } }, "node_modules/openapi-server-url-templating": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.1.0.tgz", - "integrity": "sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" @@ -4220,32 +4253,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -4257,9 +4264,9 @@ } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "engines": { "node": ">=6" } @@ -4327,16 +4334,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4462,21 +4459,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -4559,16 +4541,16 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", "redux": "^5.0.0" }, "peerDependenciesMeta": { @@ -4581,12 +4563,13 @@ } }, "node_modules/react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", + "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" @@ -4599,7 +4582,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5145,9 +5128,9 @@ } }, "node_modules/short-unique-id": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", - "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.2.tgz", + "integrity": "sha512-MlRVyT5RYfDO2kUzBgOPlZriRzG+NIAuwSy1HBN8tahXyFi3+804GGi/mzjUsi6VxgiQuDgMnhoI2FqmSHX8Tg==", "bin": { "short-unique-id": "bin/short-unique-id", "suid": "bin/short-unique-id" @@ -5177,51 +5160,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -5373,7 +5311,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -5399,15 +5337,6 @@ "node": ">=6" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -5450,41 +5379,42 @@ } }, "node_modules/swagger-client": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.29.3.tgz", - "integrity": "sha512-OhhMAO2dwDEaxtUNDxwaqzw75uiZY5lX/2vx+U6eKCYZYhXWQ5mylU/0qfk/xMR20VyitsnzRc6KcFFjRoCS7A==", + "version": "3.34.4", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.34.4.tgz", + "integrity": "sha512-Qvtu8DtARAx5GwefA0eV1WRLa4Q9bhczrtNAsiBMOx3HkxAOczy1APQhrcblJdLys0xEGQ4xYizYFXfIL9BhpA==", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-error": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-reference": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "cookie": "~0.6.0", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^1.5.1", - "openapi-server-url-templating": "^1.0.0", + "openapi-path-templating": "^2.2.1", + "openapi-server-url-templating": "^1.3.0", "ramda": "^0.30.1", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.1.0" } }, "node_modules/swagger-ui": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.17.14.tgz", - "integrity": "sha512-z9pOymwowrgkoMKNsRSN6QjOyYrMAnc4iohEebnS/ELT5jjdB13Lu4f3Bl4+o2Mw5B6QOyo4vibr/A/Vb7UbMQ==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.20.1.tgz", + "integrity": "sha512-ZgAnhAAW7ZFsfYaBc8rhOCNIohI7vDNrL66ZLa5Slt1YQsj99b7FajOXED27U+RtBiiQqXWspjDw8W6F1qvu2Q==", "dependencies": { - "@babel/runtime-corejs3": "^7.24.5", - "@braintree/sanitize-url": "=7.0.2", + "@babel/runtime-corejs3": "^7.26.7", + "@scarf/scarf": "=1.4.0", "base64-js": "^1.5.1", "classnames": "^2.5.1", "css.escape": "1.5.1", "deep-extend": "0.6.0", - "dompurify": "=3.1.4", + "dompurify": "=3.2.4", "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", @@ -5500,15 +5430,15 @@ "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "^2.2.0", "react-inspector": "^6.0.1", - "react-redux": "^9.1.2", - "react-syntax-highlighter": "^15.5.0", + "react-redux": "^9.2.0", + "react-syntax-highlighter": "^15.6.1", "redux": "^5.0.1", "redux-immutable": "^4.0.0", "remarkable": "^2.0.1", - "reselect": "^5.1.0", + "reselect": "^5.1.1", "serialize-error": "^8.1.0", "sha.js": "^2.4.11", - "swagger-client": "^3.28.1", + "swagger-client": "^3.34.1", "url-parse": "^1.5.10", "xml": "=1.0.1", "xml-but-prettier": "^1.0.1", @@ -5523,34 +5453,6 @@ "node": ">=6" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/terser": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", @@ -5684,34 +5586,34 @@ } }, "node_modules/tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "hasInstallScript": true, "optional": true, + "peer": true, "dependencies": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" } }, "node_modules/tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.18.0" - } - }, - "node_modules/tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", "hasInstallScript": true, "optional": true, "dependencies": { - "nan": "^2.14.0" + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } } }, "node_modules/ts-mixer": { @@ -5729,18 +5631,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5839,11 +5729,11 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util-deprecate": { @@ -5914,9 +5804,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", "optional": true }, "node_modules/webpack": { @@ -6233,7 +6123,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "dev": true }, "node_modules/ws": { "version": "8.18.0", @@ -6285,27 +6175,22 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/runtime-corejs3": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", - "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", + "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", "requires": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" } }, - "@braintree/sanitize-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.2.tgz", - "integrity": "sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==" - }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -6387,13 +6272,18 @@ "fastq": "^1.6.0" } }, + "@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==" + }, "@swagger-api/apidom-ast": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-alpha.9.tgz", - "integrity": "sha512-SAOQrFSFwgDiI4QSIPDwAIJEb4Za+8bu45sNojgV3RMtCz+n4Agw66iqGsDib5YSI/Cg1h4AKFovT3iWdfGWfw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.30.tgz", + "integrity": "sha512-5Wj3zdt0dxS9ERVk4qSuqDIsMQ8dP2vop8b494OpJ/O2W261yCV39Z+vN+PqeJ2NiKDRMlJ+QoQ1uVfKwEo8Kg==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6401,13 +6291,13 @@ } }, "@swagger-api/apidom-core": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-alpha.9.tgz", - "integrity": "sha512-vGl8BWRf6ODl39fxElcIOjRE2QG5AJhn8tTNMqjjHB/2WppNBuxOVStYZeVJoWfK03OPK8v4Fp/TAcaP9+R7DQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.30.tgz", + "integrity": "sha512-pDnUhXIKKUvmeezQfwKLL05rkOH1L7ueiy5ja5ob9y2w4r+HXDID7qHtDGeRxKZoIt4E3Sd1K37OjcE9fNcknQ==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -6417,36 +6307,51 @@ } }, "@swagger-api/apidom-error": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-alpha.9.tgz", - "integrity": "sha512-FU/2sFSgsICB9HYFELJ79caRpXXzlAV41QTHsAM46WfRehbzZUQpOBQm4jRi3qJGSa/Jk+mQ7Vt8HLRFMpJFfg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.30.tgz", + "integrity": "sha512-hVDx0kUF1DTyaEXwmsF3wpJClEfnH0pxjEubqtvHpjjeTMgZzmKc5azbYtvgBX3uUpGHyQZyG/O9g94/wIhhMA==", "requires": { "@babel/runtime-corejs3": "^7.20.7" } }, "@swagger-api/apidom-json-pointer": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-alpha.9.tgz", - "integrity": "sha512-/W8Ktbgbs29zdhed6KHTFk0qmuIRbvEFi8wu2MHGQ5UT4i99Bdu2OyUiayhnpejWztfQxDgL08pjrQPEwgY8Yg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.30.tgz", + "integrity": "sha512-G+BDNXU/ARJCbJiFq1A6dh6pNDDp1J0jPfKeIHjsD8aZoRdpJC0F3F7onm8TjQm2cnvAi4B7vPOKzjWrYN1VWw==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-alpha.9.tgz", - "integrity": "sha512-aduC2vbwGgn6ia9IkKpqBYBaKyIDGM/80M3oU3DFgaYIIwynzuwVpN1TkBOLIFy3mAzkWoYKUS0jdZJhMy/6Ug==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.30.tgz", + "integrity": "sha512-YsFtttsq39qVU2J9lMD3i+aeuiMD8EjeageszDEePYgb4/k2PZX9YJqb9urwxydBM7BFG7H/r9K/dVUMHFV5hw==", + "optional": true, + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "@swagger-api/apidom-ns-arazzo-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.30.tgz", + "integrity": "sha512-HpszcpuDlSOXWruHzasR64L8640VHVDuy8xXJrhx1iBu+gDHriOM8gbh8jQgWST91H0smtPeTG9WV1/h6frhRw==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6454,28 +6359,58 @@ } }, "@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-hZjxXJgMt517ADnAauWJh01k7WNRwkbWT5p6b7AXF2H3tl549A2hhLnIg3BBSE3GwB3Nv25GyrI3aA/1dFVC8A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-/DvnCZY2cVz8E79Nc5mXD8J0++D8QT/c1PKPMMGEGVwGWB6XLh8jZM0HERb6yAiLUC0qzv4Jau/iQH1gs/ZtiQ==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, + "@swagger-api/apidom-ns-json-schema-2019-09": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.30.tgz", + "integrity": "sha512-HZL76SJaUDmL1GuFcev23UX1vVuxSHIED3vvKso+k3KWNfVWZJrr7GX1ELJx84fWW8g3b5S5+nyz5q1ApT084A==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "@swagger-api/apidom-ns-json-schema-2020-12": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.30.tgz", + "integrity": "sha512-D2adAcu/ISoBe0zRbcX0HyaDvWoMhmaL8iPR4pvjLY7soB2tCR4uLEzAkqPa2zaOKBRA2ziF74aNKrKbM5sX8w==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, "@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-alpha.9.tgz", - "integrity": "sha512-OfX4UBb08C0xD5+F80dQAM2yt5lXxcURWkVEeCwxz7i23BB3nNEbnZXNV91Qo9eaJflPh8dO9iiHQxvfw5IgSg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.30.tgz", + "integrity": "sha512-u5YMIw/g74Z59wPBFS2A2LaheC+EEqRcbpUQOApTvb6zjW+xWxbCuKV1ypzIaVDDPIry8e3mpwjjXLj1mvad5w==", "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6483,15 +6418,14 @@ } }, "@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-alpha.9.tgz", - "integrity": "sha512-qzUVRSSrnlYGMhK6w57o/RboNvy1FO0iFgEnTk56dD4wN49JRNuFqKI18IgXc1W2r9tTTG70nG1khe4cPE8TNg==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.30.tgz", + "integrity": "sha512-/Mp11+tBKTN6XnpOiQo/cKnqmvfJhdCniHCK6Bg8wpCI3dMi+nSSpIYgWEPVQfNsLtf/PaYegrtYY56W4UzNRw==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6499,15 +6433,14 @@ } }, "@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-alpha.9.tgz", - "integrity": "sha512-Zml8Z8VCckdFjvTogaec1dabd85hg1+xZDseWcCuD0tYkaTY/sZ8zzI0dz6/4HsKCb58qjiWSa0w60N8Syr6WQ==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.30.tgz", + "integrity": "sha512-6sZ0LLYnEz9KXtt9xTRSc0EORBl5Fj3LUbfabUjqLQZGldsJWU+3TTQ4XtzFFHlan7z2WYyALKP7iP+b60XbPg==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6515,15 +6448,15 @@ } }, "@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-WUZxt7Gs7P4EQsGtoD6cKAjf0uDJhkUxsIW9Bb4EAgO6tdp7LlXhbJ0fJ2QycCLY717SfJbvGLfhuSfTYo4Iow==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-nloJUjf6AtKRnBuWmaFkVk7lR7aht9cudXkR/W0ui+feLSJ5rnYy6nyLyGFLZqLnb2cSV8L6bB6tGPJnvc5KzA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6531,14 +6464,14 @@ } }, "@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-7ra5uoZGrfCn1LabfJLueChPcYXyg24//LCYBtjTstyueqd5Vp7JCPeP5NnJSAaqVAP47r8ygceBPoxNp9k1EQ==", - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-7bz6kCgjStTKGGI4wBP2ho574lyfjH5EDPPuXhkwmAG2mOn9MZezlQhsbdo3B+vbi/58mqQb2XCoB4aeP1F+GQ==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -6546,282 +6479,302 @@ } }, "@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-nQOwNQgf0C8EVjf2loAAl4ifRuVOdcqycvXUdcTpsUfHN3fbndR8IKpb26mQNmnACmqgmX+LkbMdW9b+K6089g==", - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-pq2jxSp0I6xnGzyAiEXWYMuurp8H7TlOQ6Ijr/XX54gNmaIK+yQ3HXc7S6FZx+B2kQx03Tb8Y8O7L7J7YnmFiA==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, - "@swagger-api/apidom-ns-workflows-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-yKo0p8OkQmDib93Kt1yqWmI7JsD6D9qUHxr/SCuAmNNWny1hxm7cZGoKJwJlGd0uAg84j4vmzWOlG3AsJbnT8g==", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.30.tgz", + "integrity": "sha512-ER5kQtxOXG8W1cQC7xH8EYYUOAMaqVrECIZShoa6yOLoI0/a40xFF5Lansn2P9szR1hT/2neM8KLcjaxCFjXSQ==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0", - "ts-mixer": "^6.0.3" + "ramda-adjunct": "^5.0.0" } }, - "@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-xfVMR4HrTzXU0HB4TtxwkNbUIa/cQrPa0BWutJZ0fMYMAtUox2s8GsFYnJfZP52XfpSHFM1VPclivorZqET14g==", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.30.tgz", + "integrity": "sha512-Xghcidv1TJVwrb/jFHQZA5YHPm+LxNPpFjOJYrijugXK72D3a5fqc/2PZzkGXeYefE4lGM+YB83c08N6NDCa4w==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-alpha.9.tgz", - "integrity": "sha512-lJZkrhZ8qRTtc5fSLKefCv8j7Xzo8UBfMjpqTJhmETAtU8YfVV2i2znjgxJpm0QwV6FVQqGfK1+ASZQWPLiVcA==", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.30.tgz", + "integrity": "sha512-SZajkrTJ7c1I9CI3gnsdHZCQFSIyQ2H/lkWDjA/drZkRcfbR1CTbR2q0BGGlV5Y+nFHBxjRNpPbYbZrqh0WV4w==", + "optional": true, + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.30.tgz", + "integrity": "sha512-T+N1ix+V5IpOWMFcamQRI50830JayD1gifnRm+mVeWJKMzp+xm08bnO8NiR9LQ2SKJZ6FWYM38oG2tAt0Lwxcg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-65nmKdPzw4C1bmtYn+3zoxXCI6Gnobr0StI9XE0YWiK+lpso7RH3Cgyl1yPZ0DBRVGzP+Fn9FVzmDNulEfR95w==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-KjyF966T9HVvSsk+RWaOcNDxXBqOWr/09SAw1OdBBfGHqs+xF3KOV7/2RB88Adw3+ZZ3E5oXDvVVhobq8wVvyA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-RLI4FpVB3vB6mIuT77yrsv5V2LMZ80dW9XpV+Fmbd4Jkdj+ysAFwT38cI4AsUMOxixpTDIXY1oWD7AjvylHhQQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-+6zlRD0nP7T5Yiu9hHgP3b7d016WYRXqfr9TW/yqPFInM/tI74ROPJnMQ1G3s0HyW6lB0KX7cG0O0TqcMmnSqg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-aOewp8/3zobf/O+5Jx8y7+bX3BPRfRlHIv15qp4YVTsLs6gLISWSzTO9JpWe9cR+AfhpsAalFq4t1LwIkmLk4A==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.30.tgz", + "integrity": "sha512-cciT19OOXafwBnXe9KFVwUGEVu4Zrvb4k12TYNlNqzVg1xA9pBc3Ywq5EgHIhiiQOLY3fILr0fr6B36N6irN2Q==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + }, + "dependencies": { + "tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "optional": true, + "requires": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + } + } } }, "@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-zgtsAfkplCFusX2P/saqdn10J8P3kQizCXxHLvxd2j0EhMJk2wfu4HYN5Pej/7/qf/OR1QZxqtacwebd4RfpXA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-Q5b9XVTId/FiGSmGKSOxyKJZYdvWcZOqogpLkF0Q8PtPVCgp2LFl73XuJOgjxO1nkE+n/ap+93svgaaxQRaVow==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-iPuHf0cAZSUhSv8mB0FnVgatTc26cVYohgqz2cvjoGofdqoh5KKIfxOkWlIhm+qGuBp71CfZUrPYPRsd0dHgeg==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-VsDpKXmRl6sXpgR6o582yyDJqfFfliYVrVWve0DCOTkpvOeOYqPPLA45oMMvunJkqVsBL4Fpy9/ZqAQvdlur7g==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-jwkfO7tzZyyrAgok+O9fKFOv1q/5njMb9DBc3D/ZF3ZLTcnEw8uj4V2HkjKxUweH5k8ip/gc8ueKmO/i7p2fng==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-Q2NQ1/IF500mFuZZDC3tTw75UOTgSknqRyBywsA159BRnqnWxwk/2//Ifh8Vwq/mMyW2zSChigCvnqI+/IvQxA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jEIDpjbjwFKXQXS/RHJeA4tthsguLoz+nJPYS3AOLfuSiby5QXsKTxgqHXxG/YJqF1xJbZL+5KcF8UyiDePumw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-6Zj1UtbQIwnsVJi2xn+Zl9yn9U014XzkX6QKrpAXIUGNCcjwWIbuOKd3u2T481OOP0BuVf3JpWhRqxumtosV3w==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-ieJL8dfIF8fmP3uJRNh/duJa3cCIIv6MzUe6o4uPT/oTDroy4qIATvnq9Dq/gtAv6rcPRpA9VhyghJ1DmjKsZQ==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-YaGDkZaV9ZRtbIGorsyyqL2x323gLMqqgLrPpAjaBbBFiAJRwF/gwRHMY4iJ85H2YeUxUq0jqtSc3jH3wsQJGg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-EatIH7PZQSNDsRn9ompc62MYzboY7wAkjfYz+2FzBaSA8Vl5/+740qGQj22tu/xhwW4K72aV2NNL1m47QVF7hA==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" - } - }, - "@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-LylC2cQdAmvR7bXqwMwBt6FHTMVGinwIdI8pjl4EbPT9hCVm1rdED53caTYM4gCm+CJGRw20r4gb9vn3+N6RrA==", - "optional": true, - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", - "@types/ramda": "~0.30.0", - "ramda": "~0.30.0", - "ramda-adjunct": "^5.0.0" - } - }, - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-TlA4+1ca33D7fWxO5jKBytSCv86IGI4Lze4JfrawWUXZ5efhi4LiNmW5TrGlZUyvL7yJtZcA4tn3betlj6jVwA==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-rBa7daaUrDVAIwJZm+S4lwc5pqNt6avNTGxEB69dNZ3QDJmCC+HUnudUtsG3VqMfP46JITKUPvtzRLGjX8CgRg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jSIHEB7lbh+MP3BhYIXFkeivDR01kugXN70e5FskW7oet2TIARsVEPheWKQFSP1U8bUZA4bsp9h9gOQ9xEeErw==", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.30.tgz", + "integrity": "sha512-NRmQehyw4gbDzeBAl0zjyPqj4e/jNYgqnRLcOsxTKpWODud8RHBqEvju/M6iET6ru0o+A9265efFzqR9hiE0LA==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" + }, + "dependencies": { + "@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "optional": true, + "requires": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + } + }, + "tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "optional": true, + "requires": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + } + } } }, "@swagger-api/apidom-reference": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-alpha.9.tgz", - "integrity": "sha512-KQ6wB5KplqdSsjxdA8BaQulj5zlF5VBCd5KP3RN/9vvixgsD/gyrVY59nisdzmPTqiL6yjhk612eQ96MgG8KiA==", - "requires": { - "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1", + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.30.tgz", + "integrity": "sha512-l1MpLMlmaX+y2hra5EadfR37sAMzmEz1wZomVcnw7vJEFlLQo3WwOdFvpQemPCZ9IJHUs+5zhZ++w7z60uKpSw==", + "requires": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0", "@types/ramda": "~0.30.0", - "axios": "^1.4.0", + "axios": "^1.8.2", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", @@ -6846,6 +6799,14 @@ } } }, + "@swaggerexpert/cookie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@swaggerexpert/cookie/-/cookie-2.0.2.tgz", + "integrity": "sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==", + "requires": { + "apg-lite": "^1.0.3" + } + }, "@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -7051,15 +7012,21 @@ "@types/node": "*" } }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, "@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, "@types/ws": { "version": "8.5.12", @@ -7352,9 +7319,9 @@ } }, "axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -7383,17 +7350,6 @@ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -7468,16 +7424,6 @@ "update-browserslist-db": "^1.1.0" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "optional": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -7502,6 +7448,15 @@ "set-function-length": "^1.2.1" } }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, "camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -7559,12 +7514,6 @@ } } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -7691,7 +7640,8 @@ "cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true }, "cookie-signature": { "version": "1.0.6", @@ -7722,9 +7672,9 @@ } }, "core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==" + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==" }, "core-util-is": { "version": "1.0.3", @@ -7796,15 +7746,6 @@ "ms": "2.0.0" } }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "optional": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7896,12 +7837,6 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true - }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -7962,9 +7897,12 @@ } }, "dompurify": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.4.tgz", - "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "requires": { + "@types/trusted-types": "^2.0.7" + } }, "domutils": { "version": "2.8.0", @@ -7992,6 +7930,16 @@ "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==" }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8009,15 +7957,6 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -8040,25 +7979,39 @@ "dev": true }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -8133,12 +8086,6 @@ "strip-final-newline": "^2.0.0" } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true - }, "express": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", @@ -8301,12 +8248,13 @@ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, @@ -8327,12 +8275,6 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, "fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -8355,20 +8297,32 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, "get-stream": { @@ -8377,12 +8331,6 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8425,13 +8373,9 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "graceful-fs": { "version": "4.2.11", @@ -8458,23 +8402,23 @@ "es-define-property": "^1.0.0" } }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } }, "hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "requires": { "function-bind": "^1.1.2" } @@ -8507,6 +8451,11 @@ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" }, + "highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==" + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -8708,12 +8657,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -8980,6 +8923,11 @@ "highlight.js": "~10.7.0" } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -9053,12 +9001,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true - }, "minim": { "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", @@ -9082,18 +9024,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9110,23 +9040,11 @@ "thunky": "^1.0.2" } }, - "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true - }, "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -9153,20 +9071,17 @@ "tslib": "^2.0.3" } }, - "node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "optional": true, - "requires": { - "semver": "^7.3.5" - } - }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" }, + "node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "optional": true + }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -9187,6 +9102,12 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, + "node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "optional": true + }, "node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -9252,7 +9173,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "requires": { "wrappy": "1" } @@ -9278,19 +9199,19 @@ } }, "openapi-path-templating": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-1.6.0.tgz", - "integrity": "sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.2.1.tgz", + "integrity": "sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==", "requires": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" } }, "openapi-server-url-templating": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.1.0.tgz", - "integrity": "sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", "requires": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" } }, "p-limit": { @@ -9511,26 +9432,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -9542,9 +9443,9 @@ } }, "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" }, "process": { "version": "0.11.10", @@ -9598,16 +9499,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9687,18 +9578,6 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -9760,21 +9639,22 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "requires": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" } }, "react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", + "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", "requires": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.27.0", "refractor": "^3.6.0" @@ -9784,7 +9664,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10190,9 +10070,9 @@ "dev": true }, "short-unique-id": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", - "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==" + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.2.tgz", + "integrity": "sha512-MlRVyT5RYfDO2kUzBgOPlZriRzG+NIAuwSy1HBN8tahXyFi3+804GGi/mzjUsi6VxgiQuDgMnhoI2FqmSHX8Tg==" }, "side-channel": { "version": "1.0.6", @@ -10212,23 +10092,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "optional": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "optional": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -10346,7 +10209,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -10366,12 +10229,6 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true - }, "style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -10393,41 +10250,42 @@ "dev": true }, "swagger-client": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.29.3.tgz", - "integrity": "sha512-OhhMAO2dwDEaxtUNDxwaqzw75uiZY5lX/2vx+U6eKCYZYhXWQ5mylU/0qfk/xMR20VyitsnzRc6KcFFjRoCS7A==", + "version": "3.34.4", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.34.4.tgz", + "integrity": "sha512-Qvtu8DtARAx5GwefA0eV1WRLa4Q9bhczrtNAsiBMOx3HkxAOczy1APQhrcblJdLys0xEGQ4xYizYFXfIL9BhpA==", "requires": { "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-error": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-reference": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "cookie": "~0.6.0", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^1.5.1", - "openapi-server-url-templating": "^1.0.0", + "openapi-path-templating": "^2.2.1", + "openapi-server-url-templating": "^1.3.0", "ramda": "^0.30.1", - "ramda-adjunct": "^5.0.0" + "ramda-adjunct": "^5.1.0" } }, "swagger-ui": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.17.14.tgz", - "integrity": "sha512-z9pOymwowrgkoMKNsRSN6QjOyYrMAnc4iohEebnS/ELT5jjdB13Lu4f3Bl4+o2Mw5B6QOyo4vibr/A/Vb7UbMQ==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.20.1.tgz", + "integrity": "sha512-ZgAnhAAW7ZFsfYaBc8rhOCNIohI7vDNrL66ZLa5Slt1YQsj99b7FajOXED27U+RtBiiQqXWspjDw8W6F1qvu2Q==", "requires": { - "@babel/runtime-corejs3": "^7.24.5", - "@braintree/sanitize-url": "=7.0.2", + "@babel/runtime-corejs3": "^7.26.7", + "@scarf/scarf": "=1.4.0", "base64-js": "^1.5.1", "classnames": "^2.5.1", "css.escape": "1.5.1", "deep-extend": "0.6.0", - "dompurify": "=3.1.4", + "dompurify": "=3.2.4", "ieee754": "^1.2.1", "immutable": "^3.x.x", "js-file-download": "^0.4.12", @@ -10443,15 +10301,15 @@ "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "^2.2.0", "react-inspector": "^6.0.1", - "react-redux": "^9.1.2", - "react-syntax-highlighter": "^15.5.0", + "react-redux": "^9.2.0", + "react-syntax-highlighter": "^15.6.1", "redux": "^5.0.1", "redux-immutable": "^4.0.0", "remarkable": "^2.0.1", - "reselect": "^5.1.0", + "reselect": "^5.1.1", "serialize-error": "^8.1.0", "sha.js": "^2.4.11", - "swagger-client": "^3.28.1", + "swagger-client": "^3.34.1", "url-parse": "^1.5.10", "xml": "=1.0.1", "xml-but-prettier": "^1.0.1", @@ -10463,31 +10321,6 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "terser": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", @@ -10579,31 +10412,24 @@ "dev": true }, "tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "optional": true, + "peer": true, "requires": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" } }, "tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", - "optional": true, - "requires": { - "nan": "^2.18.0" - } - }, - "tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", "optional": true, "requires": { - "nan": "^2.14.0" + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" } }, "ts-mixer": { @@ -10621,15 +10447,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -10696,9 +10513,9 @@ } }, "use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "requires": {} }, "util-deprecate": { @@ -10754,9 +10571,9 @@ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" }, "web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", "optional": true }, "webpack": { @@ -10965,7 +10782,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "dev": true }, "ws": { "version": "8.18.0", diff --git a/src/portal/app-swagger-ui/package.json b/src/portal/app-swagger-ui/package.json index ab4197d3747..338697c2836 100644 --- a/src/portal/app-swagger-ui/package.json +++ b/src/portal/app-swagger-ui/package.json @@ -9,7 +9,7 @@ "dependencies": { "css-loader": "^6.11.0", "style-loader": "^3.3.4", - "swagger-ui": "5.17.14" + "swagger-ui": "5.20.1" }, "devDependencies": { "clean-webpack-plugin": "^4.0.0", diff --git a/src/portal/package-lock.json b/src/portal/package-lock.json index 39a9716cc4a..7068b581758 100644 --- a/src/portal/package-lock.json +++ b/src/portal/package-lock.json @@ -35,7 +35,7 @@ "zone.js": "^0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.16", + "@angular-devkit/build-angular": "^20.0.5", "@angular-eslint/builder": "16.1.2", "@angular-eslint/eslint-plugin": "16.1.2", "@angular-eslint/eslint-plugin-template": "16.1.2", @@ -75,12 +75,12 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -102,107 +102,117 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.16.tgz", - "integrity": "sha512-gEni21kza41xaRnVWP1sMuiWHS/rdoym5FEEGDo9PG60LwRC4lekIgT09GpTlmMu007UEfo0ccQnGroD6+MqWg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.16", - "@angular-devkit/build-webpack": "0.1602.16", - "@angular-devkit/core": "16.2.16", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.9", - "@babel/preset-env": "7.22.9", - "@babel/runtime": "7.22.6", - "@babel/template": "7.22.5", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.16", - "@vitejs/plugin-basic-ssl": "1.0.1", + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-20.0.5.tgz", + "integrity": "sha512-WMpk27O6R0p4t8VKq+z/1R+J/Jc5zpHy7OVsAguwH6bUoLOpLWMW1nHDIXGS9IpfkCmMRILxwKhFYIuEcUAvNg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2000.5", + "@angular-devkit/build-webpack": "0.2000.5", + "@angular-devkit/core": "20.0.5", + "@angular/build": "20.0.5", + "@babel/core": "7.27.1", + "@babel/generator": "7.27.1", + "@babel/helper-annotate-as-pure": "7.27.1", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.27.1", + "@babel/plugin-transform-async-to-generator": "7.27.1", + "@babel/plugin-transform-runtime": "7.27.1", + "@babel/preset-env": "7.27.2", + "@babel/runtime": "7.27.1", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "20.0.5", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", - "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", "browserslist": "^4.21.5", - "chokidar": "3.5.3", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.18.17", - "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", + "copy-webpack-plugin": "13.0.0", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.5", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.1.0", + "less": "4.3.0", + "less-loader": "12.3.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.1", - "mini-css-extract-plugin": "2.7.6", - "mrmime": "1.0.1", - "open": "8.4.2", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.0.0", - "postcss": "8.4.31", - "postcss-loader": "7.3.3", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.2", + "open": "10.1.2", + "ora": "8.2.0", + "picomatch": "4.0.2", + "piscina": "5.1.1", + "postcss": "8.5.3", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.64.1", - "sass-loader": "13.3.2", - "semver": "7.5.4", - "source-map-loader": "4.0.1", + "rxjs": "7.8.2", + "sass": "1.88.0", + "sass-loader": "16.0.5", + "semver": "7.7.2", + "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.19.2", - "text-table": "0.2.0", + "terser": "5.39.1", "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.5.5", - "webpack": "5.94.0", - "webpack-dev-middleware": "6.1.2", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", + "tslib": "2.8.1", + "webpack": "5.99.8", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.1", + "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.18.17" + "esbuild": "0.25.5" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.0.5", + "@web/test-runner": "^0.20.0", + "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "^20.0.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.8 <5.9" }, "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, "@angular/localize": { "optional": true }, + "@angular/platform-browser": { + "optional": true + }, "@angular/platform-server": { "optional": true }, "@angular/service-worker": { "optional": true }, + "@angular/ssr": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, "jest": { "optional": true }, @@ -223,51 +233,41 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.16.tgz", - "integrity": "sha512-b99Sj0btI0C2GIfzoyP8epDMIOLqSTqXOxw6klGtBLaGZfM5KAxqFzekXh8cAnHxWCj20WdNhezS1eUTLOkaIA==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.2000.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.5.tgz", + "integrity": "sha512-9aPtMdRiOVP14PkbgxAKh3TivxXTBiOr66xYbxutP0cMBwzRX67ekyEpAxmTEiWnd+qmxV9tddWgGL5sWcEZgQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.16", - "rxjs": "7.8.1" + "@angular-devkit/core": "20.0.5", + "rxjs": "7.8.2" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" } }, - "node_modules/@angular-devkit/core": { - "version": "16.2.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", - "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.5.tgz", + "integrity": "sha512-bFaFP984GxqfC1WYlUEFuwkDO657ynxI51cE3J6yfwP92ykyF/MXzV0S9tRBhx5rcLVgCAiohxmzKdxPhoLWSA==", "dev": true, "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.2", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -275,1748 +275,2017 @@ } } }, - "node_modules/@angular-devkit/schematics": { - "version": "16.2.16", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.16.tgz", - "integrity": "sha512-pF6fdtJh6yLmgA7Gs45JIdxPl2MsTAhYcZIMrX1a6ID64dfwtF0MP8fDE6vrWInV1zXbzzf7l7PeKuqVtTSzKg==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.2.16", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.1", - "ora": "5.4.1", - "rxjs": "7.8.1" + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.0.5.tgz", + "integrity": "sha512-HQnKEuBhKURoaXkvTsgNbW8LyxVGYPMR/9e+KpJZv06NgJHXZumLtbkg1f1IF1d4d60SY1g+ienjFOu+Yj1FfQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2000.5", + "@babel/core": "7.27.1", + "@babel/helper-annotate-as-pure": "7.27.1", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.10", + "@vitejs/plugin-basic-ssl": "2.0.0", + "beasties": "0.3.4", + "browserslist": "^4.23.0", + "esbuild": "0.25.5", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "8.3.3", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.1.0", + "picomatch": "4.0.2", + "piscina": "5.1.1", + "rollup": "4.40.2", + "sass": "1.88.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.13", + "vite": "6.3.5", + "watchpack": "2.4.2" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.3.0" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.0.5", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <5.9", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } } }, - "node_modules/@angular-eslint/builder": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.1.2.tgz", - "integrity": "sha512-Y95IBEWqzWA7SyIh5nlPuFasw/4lOILrAdY5Ji6tOpIJgNFoiR9K1UcH46i34r3384ApN8GEQJ7FlK6D6qCOJA==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.0.0.tgz", + "integrity": "sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==", "dev": true, - "dependencies": { - "@nx/devkit": "16.5.1", - "nx": "16.5.1" + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" + "vite": "^6.0.0" } }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.1.2.tgz", - "integrity": "sha512-wDiHPFsKTijMcQUPNcoHOJ5kezIPCCbmDK6LHH7hAdAC/eDY9NHL5e4zQ2Xkf3/r1PFuwVLGTwwreEHlmeENDw==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.1.2.tgz", - "integrity": "sha512-lYVvoKUIOg/ez15yfN4zY2A++vnIeJe1xh2ADNTmmjSh2PFV24K9YOgrTbgrY3Ul9kzGDTBkvYqslq+IvMGdIw==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "dependencies": { - "@angular-eslint/utils": "16.1.2", - "@typescript-eslint/utils": "5.62.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.1.2.tgz", - "integrity": "sha512-2qsoUgPg9Qp4EVUJRwWcJ+8JMxBb0ma3pNBjFmY6LOd59igRYorJKfWep4Nln1EicYRDRsCLzeLHO976+b1yaQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular/compiler": { + "version": "20.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.0.6.tgz", + "integrity": "sha512-pgkOUnufEtzuEnjrL4BqFJCCayp1Si8cT5ZBq8CsYoQUETiYFMT2kf1OEV09vPNH4owxuzE42Wa4fEyWMRWdbA==", "dev": true, + "peer": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "16.1.2", - "@angular-eslint/utils": "16.1.2", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "aria-query": "5.3.0", - "axobject-query": "3.1.1" + "tslib": "^2.3.0" }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@angular-eslint/schematics": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.1.2.tgz", - "integrity": "sha512-319i47NU6nfaAaQTQYN7k320proTIBCueWGt+fbT11210CMqQriFmD+B85AatCwQgMgLd8Rhs1/F7YL2OOhegA==", + "node_modules/@angular-devkit/build-angular/node_modules/@inquirer/confirm": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", + "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "16.1.2", - "@angular-eslint/eslint-plugin-template": "16.1.2", - "@nx/devkit": "16.5.1", - "ignore": "5.2.4", - "nx": "16.5.1", - "strip-json-comments": "3.1.1", - "tmp": "0.2.1" + "@inquirer/core": "^10.1.11", + "@inquirer/type": "^3.0.6" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@angular/cli": ">= 16.0.0 < 17.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@angular-eslint/template-parser": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-16.1.2.tgz", - "integrity": "sha512-vIkPOShVJLBEHYY3jISCVvJF3lXL//Y70J8T9lY2CBowgqp6AzzJ6cZU7JxrORN6b64rBUVvUtCGo8L36GvfuA==", + "node_modules/@angular-devkit/build-angular/node_modules/@inquirer/core": { + "version": "10.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.14.tgz", + "integrity": "sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "16.1.2", - "eslint-scope": "^7.0.0" + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@angular-eslint/utils": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.1.2.tgz", - "integrity": "sha512-2yfEK3BPSJsUhP4JCz0EB6ktu4E4+/zc9qdtZvPWNF/eww2J/oYVPjY47C/HVg4MXpjJTI8vbdkvcnxrICIkfw==", + "node_modules/@angular-devkit/build-angular/node_modules/@inquirer/type": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "16.1.2", - "@typescript-eslint/utils": "5.62.0" + "engines": { + "node": ">=18" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@angular/animations": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", - "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-20.0.5.tgz", + "integrity": "sha512-XH+NTCaOT0gBN7XXmNgMSOsQ0VXwv6E/dKcg1iu4DqYpxklYZ7EdhgVZn5vhwpqff3VRwJ8VFzp4U38AuppXrg==", + "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <5.9", + "webpack": "^5.54.0" } }, - "node_modules/@angular/cdk": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", - "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", + "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { + "version": "24.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", + "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", + "dev": true, + "optional": true, "peer": true, "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "parse5": "^7.1.2" - }, - "peerDependencies": { - "@angular/common": "^16.0.0 || ^17.0.0", - "@angular/core": "^16.0.0 || ^17.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "undici-types": "~7.8.0" } }, - "node_modules/@angular/cli": { - "version": "16.2.16", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.16.tgz", - "integrity": "sha512-aqfNYZ45ndrf36i+7AhQ9R8BCm025j7TtYaUmvvjT4LwiUg6f6KtlZPB/ivBlXmd1g9oXqW4advL0AIi8A/Ozg==", + "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1602.16", - "@angular-devkit/core": "16.2.16", - "@angular-devkit/schematics": "16.2.16", - "@schematics/angular": "16.2.16", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", - "semver": "7.5.4", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 14" } }, - "node_modules/@angular/common": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", - "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "peerDependencies": { - "@angular/core": "16.2.12", - "rxjs": "^6.5.3 || ^7.4.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular/compiler": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", - "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "node_modules/@angular-devkit/build-angular/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "ajv": "^8.0.0" }, "peerDependenciesMeta": { - "@angular/core": { + "ajv": { "optional": true } } }, - "node_modules/@angular/compiler-cli": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", - "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", - "dependencies": { - "@babel/core": "7.23.2", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "ng-xi18n": "bundles/src/bin/ng_xi18n.js", - "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/index.js" - }, + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": ">=12" }, - "peerDependencies": { - "@angular/compiler": "16.2.12", - "typescript": ">=4.9.3 <5.2" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.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" - }, + "node_modules/@angular-devkit/build-angular/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "node_modules/@angular-devkit/build-angular/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "node_modules/@angular-devkit/build-angular/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/core": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", - "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": ">=6" }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/forms": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", - "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "node_modules/@angular-devkit/build-angular/node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": ">=18" }, - "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", - "rxjs": "^6.5.3 || ^7.4.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/localize": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.2.12.tgz", - "integrity": "sha512-sNIHDlZKENPQqx64qGF99g2sOCy9i9O4VOmjKD/FZbeE8O5qBbaQlkwOlFoQIt35/cnvtAtf7oQF6tqmiVtS2w==", + "node_modules/@angular-devkit/build-angular/node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "dependencies": { - "@babel/core": "7.23.2", - "fast-glob": "3.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "localize-extract": "tools/bundles/src/extract/cli.js", - "localize-migrate": "tools/bundles/src/migrate/cli.js", - "localize-translate": "tools/bundles/src/translate/cli.js" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": ">=18" }, - "peerDependencies": { - "@angular/compiler": "16.2.12", - "@angular/compiler-cli": "16.2.12" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "node_modules/@angular-devkit/build-angular/node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.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" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@angular/localize/node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, + "node_modules/@angular-devkit/build-angular/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">= 12" } }, - "node_modules/@angular/localize/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular/localize/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/@angular/localize/node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "node_modules/@angular-devkit/build-angular/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.6.0" + "node": ">=7.0.0" } }, - "node_modules/@angular/localize/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/@angular-devkit/build-angular/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@angular/platform-browser": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", - "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, "peerDependencies": { - "@angular/animations": "16.2.12", - "@angular/common": "16.2.12", - "@angular/core": "16.2.12" + "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { - "@angular/animations": { + "picomatch": { "optional": true } } }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", - "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "node_modules/@angular-devkit/build-angular/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/compiler": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12" + "node": ">= 14" } }, - "node_modules/@angular/router": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", - "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", - "dependencies": { - "tslib": "^2.3.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": ">=12" }, - "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", - "rxjs": "^6.5.3 || ^7.4.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "node_modules/@angular-devkit/build-angular/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "node_modules/@angular-devkit/build-angular/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "node_modules/@angular-devkit/build-angular/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "node_modules/@angular-devkit/build-angular/node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "node_modules/@angular-devkit/build-angular/node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "node_modules/@angular-devkit/build-angular/node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", - "semver": "^6.3.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@angular-devkit/build-angular/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "environment": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "get-east-asian-width": "^1.0.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "node_modules/@angular-devkit/build-angular/node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "node_modules/@angular-devkit/build-angular/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "node_modules/@angular-devkit/build-angular/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "node_modules/@angular-devkit/build-angular/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "node": ">=18" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "node_modules/@angular-devkit/build-angular/node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@angular-devkit/build-angular/node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "node_modules/@angular-devkit/build-angular/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=6.9.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "node_modules/@angular-devkit/build-angular/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" + "tslib": "^2.1.0" } }, - "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, + "node_modules/@angular-devkit/build-angular/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "node": ">=14" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "node_modules/@angular-devkit/build-angular/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "node_modules/@angular-devkit/build-angular/node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "node_modules/@angular-devkit/build-angular/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "node": ">=8" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "node_modules/@angular-devkit/build-angular/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@angular-devkit/build-angular/node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, - "engines": { - "node": ">=6.9.0" + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 14.6" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2000.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2000.5.tgz", + "integrity": "sha512-tdzw1ieaXWureLWz86fVh2OhHE0XuJGJGYEukjqsxExV/ZZ9Y0avYEIqDaC8RrPE1mHiM7W9in1DgYvPmsWxHw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@angular-devkit/architect": "0.2000.5", + "rxjs": "7.8.2" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.2000.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2000.5.tgz", + "integrity": "sha512-9aPtMdRiOVP14PkbgxAKh3TivxXTBiOr66xYbxutP0cMBwzRX67ekyEpAxmTEiWnd+qmxV9tddWgGL5sWcEZgQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@angular-devkit/core": "20.0.5", + "rxjs": "7.8.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.0.5.tgz", + "integrity": "sha512-bFaFP984GxqfC1WYlUEFuwkDO657ynxI51cE3J6yfwP92ykyF/MXzV0S9tRBhx5rcLVgCAiohxmzKdxPhoLWSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.2", + "source-map": "0.7.4" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@angular-devkit/build-webpack/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "ajv": "^8.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", - "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "node_modules/@angular-devkit/build-webpack/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14.16.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@angular-devkit/build-webpack/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.1.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@angular-devkit/core": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@angular-devkit/schematics": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.16.tgz", + "integrity": "sha512-pF6fdtJh6yLmgA7Gs45JIdxPl2MsTAhYcZIMrX1a6ID64dfwtF0MP8fDE6vrWInV1zXbzzf7l7PeKuqVtTSzKg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-devkit/core": "16.2.16", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", + "ora": "5.4.1", + "rxjs": "7.8.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@angular-eslint/builder": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.1.2.tgz", + "integrity": "sha512-Y95IBEWqzWA7SyIh5nlPuFasw/4lOILrAdY5Ji6tOpIJgNFoiR9K1UcH46i34r3384ApN8GEQJ7FlK6D6qCOJA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@nx/devkit": "16.5.1", + "nx": "16.5.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.1.2.tgz", + "integrity": "sha512-wDiHPFsKTijMcQUPNcoHOJ5kezIPCCbmDK6LHH7hAdAC/eDY9NHL5e4zQ2Xkf3/r1PFuwVLGTwwreEHlmeENDw==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.1.2.tgz", + "integrity": "sha512-lYVvoKUIOg/ez15yfN4zY2A++vnIeJe1xh2ADNTmmjSh2PFV24K9YOgrTbgrY3Ul9kzGDTBkvYqslq+IvMGdIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-eslint/utils": "16.1.2", + "@typescript-eslint/utils": "5.62.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.1.2.tgz", + "integrity": "sha512-2qsoUgPg9Qp4EVUJRwWcJ+8JMxBb0ma3pNBjFmY6LOd59igRYorJKfWep4Nln1EicYRDRsCLzeLHO976+b1yaQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-eslint/bundled-angular-compiler": "16.1.2", + "@angular-eslint/utils": "16.1.2", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "3.1.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@angular-eslint/schematics": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.1.2.tgz", + "integrity": "sha512-319i47NU6nfaAaQTQYN7k320proTIBCueWGt+fbT11210CMqQriFmD+B85AatCwQgMgLd8Rhs1/F7YL2OOhegA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-eslint/eslint-plugin": "16.1.2", + "@angular-eslint/eslint-plugin-template": "16.1.2", + "@nx/devkit": "16.5.1", + "ignore": "5.2.4", + "nx": "16.5.1", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/cli": ">= 16.0.0 < 17.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@angular-eslint/template-parser": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-16.1.2.tgz", + "integrity": "sha512-vIkPOShVJLBEHYY3jISCVvJF3lXL//Y70J8T9lY2CBowgqp6AzzJ6cZU7JxrORN6b64rBUVvUtCGo8L36GvfuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@angular-eslint/bundled-angular-compiler": "16.1.2", + "eslint-scope": "^7.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@angular-eslint/utils": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.1.2.tgz", + "integrity": "sha512-2yfEK3BPSJsUhP4JCz0EB6ktu4E4+/zc9qdtZvPWNF/eww2J/oYVPjY47C/HVg4MXpjJTI8vbdkvcnxrICIkfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@angular-eslint/bundled-angular-compiler": "16.1.2", + "@typescript-eslint/utils": "5.62.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, + "node_modules/@angular/animations": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/core": "16.2.12" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dev": true, + "node_modules/@angular/cdk": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", + "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "tslib": "^2.3.0" }, - "engines": { - "node": ">=6.9.0" + "optionalDependencies": { + "parse5": "^7.1.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", - "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "node_modules/@angular/cli": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.16.tgz", + "integrity": "sha512-aqfNYZ45ndrf36i+7AhQ9R8BCm025j7TtYaUmvvjT4LwiUg6f6KtlZPB/ivBlXmd1g9oXqW4advL0AIi8A/Ozg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@angular-devkit/architect": "0.1602.16", + "@angular-devkit/core": "16.2.16", + "@angular-devkit/schematics": "16.2.16", + "@schematics/angular": "16.2.16", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "ng": "bin/ng.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, + "node_modules/@angular/common": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/core": "16.2.12", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, + "node_modules/@angular/compiler": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/core": "16.2.12" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", - "dev": true, + "node_modules/@angular/compiler-cli": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/core": "7.23.2", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/compiler": "16.2.12", + "typescript": ">=4.9.3 <5.2" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", - "dev": true, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.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" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.13.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", - "dev": true, + "node_modules/@angular/forms": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", - "globals": "^11.1.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, + "node_modules/@angular/localize": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.2.12.tgz", + "integrity": "sha512-sNIHDlZKENPQqx64qGF99g2sOCy9i9O4VOmjKD/FZbeE8O5qBbaQlkwOlFoQIt35/cnvtAtf7oQF6tqmiVtS2w==", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/core": "7.23.2", + "fast-glob": "3.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "16.2.12", + "@angular/compiler-cli": "16.2.12" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.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" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, + "node_modules/@angular/localize/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/localize/node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", - "dev": true, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/platform-browser": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/animations": "16.2.12", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dev": true, + "node_modules/@angular/platform-browser-dynamic": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "16.2.12", + "@angular/compiler": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dev": true, + "node_modules/@angular/router": { + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dev": true, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", - "dev": true, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "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==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@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" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "ms": "^2.1.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", - "dev": true, + "node_modules/@babel/helper-module-transforms": { + "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-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2025,96 +2294,179 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "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" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "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==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, "engines": { "node": ">=6.9.0" }, @@ -2122,15 +2474,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2139,13 +2489,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2154,32 +2504,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2188,25 +2535,32 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2215,14 +2569,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2231,13 +2584,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2246,18 +2599,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "semver": "^6.3.1" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2266,22 +2615,34 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "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==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "node_modules/@babel/plugin-transform-classes": { + "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==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@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" }, "engines": { "node": ">=6.9.0" @@ -2290,29 +2651,26 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2321,13 +2679,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -2336,13 +2695,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2351,13 +2711,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2366,30 +2726,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2398,108 +2757,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2508,1322 +2787,2914 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", - "optional": true - }, - "node_modules/@cds/city": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cds/city/-/city-1.1.0.tgz", - "integrity": "sha512-S9K+Q39BGOghyLHmR0Wdcmu1i1noSUk8HcvMj+3IaohZw02WFd99aPTQDHJeseXrXZP3CNovaSlePI0R11NcFg==", - "optional": true - }, - "node_modules/@cds/core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.2.tgz", - "integrity": "sha512-m18JDBenj8qL+msOZkYs3tn8Yq3w9FzbaKRN1FFjL/pp5S9w2wUXazuA+Kuin84LN72K/LAy3LyUVYMkZSqM7A==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, "dependencies": { - "lit": "^2.1.3", - "ramda": "^0.29.0", - "tslib": "^2.3.1" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, - "optionalDependencies": { - "@cds/city": "^1.1.0", - "modern-normalize": "1.1.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@clr/angular": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/@clr/angular/-/angular-15.4.0.tgz", - "integrity": "sha512-6DaQUUV4cN0gZHVttN/o7Y7mtZmRFVG10NQsD0i8FP/o92BCjL/pO5+AvvSi5E/3ArMmuqlhVaSjpvsMfg9yww==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, "dependencies": { - "tslib": "^2.3.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/cdk": "15 || 16", - "@angular/common": "15 || 16", - "@angular/core": "15 || 16", - "@cds/core": "^5.6.0 || ^6.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@clr/icons": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@clr/icons/-/icons-13.0.2.tgz", - "integrity": "sha512-bdcSuFvQAbIIp8Q2Fm55BjHW5cawP4xEOkZf2IEIin0d9ViRcAJNjACBCOMDhx2up7nPZsXwN2gL8zJhL7TSZQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "@webcomponents/custom-elements": "^1.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@clr/ui": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/@clr/ui/-/ui-15.4.0.tgz", - "integrity": "sha512-kixMm/RGUSbS41RPhULKu4dGjqoijve2MjJHbFSeqhYkdpWuKlbOK0wCn8wP7F5rQ7EY1JVxu2nzN3BzACmYxA==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "@clr/angular": "15.4.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, - "engines": { - "node": "^14 || ^16 || >=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "postcss-selector-parser": "^6.0.10" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/request": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz", - "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dev": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.0", - "http-signature": "~1.4.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.13.0", - "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/schematic": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@cypress/schematic/-/schematic-2.5.2.tgz", - "integrity": "sha512-H+V3ZP3KQVOs6b49N66jioXa+rkLzszVi+Bl3jiroVTURUNMOpSa4BOrt10Pn8F57TO0Bamhch2WOk/e9cq98w==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "dependencies": { - "jsonc-parser": "^3.0.0", - "rxjs": "~6.6.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/cli": ">=14", - "@angular/core": ">=14" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/schematic/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "dependencies": { - "tslib": "^1.9.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "npm": ">=2.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/schematic/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.0.tgz", + "integrity": "sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", + "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", - "cpu": [ - "s390x" - ], + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/@babel/preset-env": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@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.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@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-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.27.2", + "@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.1", + "@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.27.1", + "@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.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", - "cpu": [ - "x64" - ], + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@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" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "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" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@babel/types": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", + "optional": true + }, + "node_modules/@cds/city": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cds/city/-/city-1.1.0.tgz", + "integrity": "sha512-S9K+Q39BGOghyLHmR0Wdcmu1i1noSUk8HcvMj+3IaohZw02WFd99aPTQDHJeseXrXZP3CNovaSlePI0R11NcFg==", + "optional": true + }, + "node_modules/@cds/core": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@cds/core/-/core-6.4.2.tgz", + "integrity": "sha512-m18JDBenj8qL+msOZkYs3tn8Yq3w9FzbaKRN1FFjL/pp5S9w2wUXazuA+Kuin84LN72K/LAy3LyUVYMkZSqM7A==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "lit": "^2.1.3", + "ramda": "^0.29.0", + "tslib": "^2.3.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optionalDependencies": { + "@cds/city": "^1.1.0", + "modern-normalize": "1.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/@clr/angular": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@clr/angular/-/angular-15.4.0.tgz", + "integrity": "sha512-6DaQUUV4cN0gZHVttN/o7Y7mtZmRFVG10NQsD0i8FP/o92BCjL/pO5+AvvSi5E/3ArMmuqlhVaSjpvsMfg9yww==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "tslib": "^2.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@angular/cdk": "15 || 16", + "@angular/common": "15 || 16", + "@angular/core": "15 || 16", + "@cds/core": "^5.6.0 || ^6.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@clr/icons": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@clr/icons/-/icons-13.0.2.tgz", + "integrity": "sha512-bdcSuFvQAbIIp8Q2Fm55BjHW5cawP4xEOkZf2IEIin0d9ViRcAJNjACBCOMDhx2up7nPZsXwN2gL8zJhL7TSZQ==", + "peerDependencies": { + "@webcomponents/custom-elements": "^1.0.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@clr/ui": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@clr/ui/-/ui-15.4.0.tgz", + "integrity": "sha512-kixMm/RGUSbS41RPhULKu4dGjqoijve2MjJHbFSeqhYkdpWuKlbOK0wCn8wP7F5rQ7EY1JVxu2nzN3BzACmYxA==", + "peerDependencies": { + "@clr/angular": "15.4.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, "engines": { - "node": ">=10.10.0" + "node": ">=0.1.90" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, "engines": { - "node": ">=12.22" + "node": "^14 || ^16 || >=18" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@cypress/request": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz", + "integrity": "sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.13.0", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@cypress/schematic": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@cypress/schematic/-/schematic-2.5.2.tgz", + "integrity": "sha512-H+V3ZP3KQVOs6b49N66jioXa+rkLzszVi+Bl3jiroVTURUNMOpSa4BOrt10Pn8F57TO0Bamhch2WOk/e9cq98w==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "jsonc-parser": "^3.0.0", + "rxjs": "~6.6.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@angular/cli": ">=14", + "@angular/core": ">=14" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@cypress/schematic/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "tslib": "^1.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "npm": ">=2.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/@cypress/schematic/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "debug": "^3.1.0", + "lodash.once": "^4.1.1" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "ms": "^2.1.1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=14.17.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", - "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" - }, - "node_modules/@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.0.0" - } - }, - "node_modules/@ngtools/webpack": { - "version": "16.2.16", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.16.tgz", - "integrity": "sha512-4gm2allK0Pjy/Lxb9IGRnhEZNEOJSOTWwy09VOdHouV2ODRK7Tto2LgteaFJUUSLkuvWRsI7pfuA6yrz8KDfHw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", - "webpack": "^5.54.0" + "node": ">=18" } }, - "node_modules/@ngx-translate/core": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", - "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "rxjs": "^6.5.5 || ^7.4.0" + "node": ">=18" } }, - "node_modules/@ngx-translate/http-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", - "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^16.13.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/common": ">=16.0.0", - "@angular/core": ">=16.0.0", - "@ngx-translate/core": ">=15.0.0", - "rxjs": "^6.5.5 || ^7.4.0" + "node": ">=18" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "which": "^3.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "eslint-visitor-keys": "^3.3.0" }, - "bin": { - "node-which": "bin/which.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "bin": { - "node-which": "bin/which.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/devkit": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", - "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "@nx/devkit": "16.5.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nrwl/tao": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", - "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "nx": "16.5.1" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, - "bin": { - "tao": "index.js" + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@nx/devkit": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", - "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@inquirer/figures": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "dependencies": { - "@nrwl/devkit": "16.5.1", - "ejs": "^3.1.7", - "ignore": "^5.0.4", - "semver": "7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", + "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", + "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" + }, + "node_modules/@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.3.0.tgz", + "integrity": "sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.3.0.tgz", + "integrity": "sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.3.0.tgz", + "integrity": "sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.3.0.tgz", + "integrity": "sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.3.0.tgz", + "integrity": "sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.3.0.tgz", + "integrity": "sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.3.0.tgz", + "integrity": "sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.4.tgz", + "integrity": "sha512-Sqih1YARrmMoHlXGgI9JrrgkzxcaaEso0AH+Y7j8NHonUs+xe4iDsgC3IBIDNdzEewbNpccNN6hip+b5vmyRLw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.4", + "@napi-rs/nice-android-arm64": "1.0.4", + "@napi-rs/nice-darwin-arm64": "1.0.4", + "@napi-rs/nice-darwin-x64": "1.0.4", + "@napi-rs/nice-freebsd-x64": "1.0.4", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.4", + "@napi-rs/nice-linux-arm64-gnu": "1.0.4", + "@napi-rs/nice-linux-arm64-musl": "1.0.4", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.4", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.4", + "@napi-rs/nice-linux-s390x-gnu": "1.0.4", + "@napi-rs/nice-linux-x64-gnu": "1.0.4", + "@napi-rs/nice-linux-x64-musl": "1.0.4", + "@napi-rs/nice-win32-arm64-msvc": "1.0.4", + "@napi-rs/nice-win32-ia32-msvc": "1.0.4", + "@napi-rs/nice-win32-x64-msvc": "1.0.4" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.4.tgz", + "integrity": "sha512-OZFMYUkih4g6HCKTjqJHhMUlgvPiDuSLZPbPBWHLjKmFTv74COzRlq/gwHtmEVaR39mJQ6ZyttDl2HNMUbLVoA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.4.tgz", + "integrity": "sha512-k8u7cjeA64vQWXZcRrPbmwjH8K09CBnNaPnI9L1D5N6iMPL3XYQzLcN6WwQonfcqCDv5OCY3IqX89goPTV4KMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-GsLdQvUcuVzoyzmtjsThnpaVEizAqH5yPHgnsBmq3JdVoVZHELFo7PuJEdfOH1DOHi2mPwB9sCJEstAYf3XCJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.4.tgz", + "integrity": "sha512-1y3gyT3e5zUY5SxRl3QDtJiWVsbkmhtUHIYwdWWIQ3Ia+byd/IHIEpqAxOGW1nhhnIKfTCuxBadHQb+yZASVoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.4.tgz", + "integrity": "sha512-06oXzESPRdXUuzS8n2hGwhM2HACnDfl3bfUaSqLGImM8TA33pzDXgGL0e3If8CcFWT98aHows5Lk7xnqYNGFeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.4.tgz", + "integrity": "sha512-CgklZ6g8WL4+EgVVkxkEvvsi2DSLf9QIloxWO0fvQyQBp6VguUSX3eHLeRpqwW8cRm2Hv/Q1+PduNk7VK37VZw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.4.tgz", + "integrity": "sha512-wdAJ7lgjhAlsANUCv0zi6msRwq+D4KDgU+GCCHssSxWmAERZa2KZXO0H2xdmoJ/0i03i6YfK/sWaZgUAyuW2oQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.4.tgz", + "integrity": "sha512-4b1KYG+sriufhFrpUS9uNOEYYJqSfcbnwGx6uGX7JjrH8tELG90cOpCawz5THNIwlS3DhLgnCOcn0+4p6z26QA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.4.tgz", + "integrity": "sha512-iaf3vMRgr23oe1PUaKpxaH3DS0IMN0+N9iEiWVwYPm/U15vZFYdqVegGfN2PzrZLUl5lc8ZxbmEKDfuqslhAMA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.4.tgz", + "integrity": "sha512-UXoREY6Yw6rHrGuTwQgBxpfjK34t6mTjibE9/cXbefL9AuUCJ9gEgwNKZiONuR5QGswChqo9cnthjdKkYyAdDg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.4.tgz", + "integrity": "sha512-eFbgYCRPmsqbYPAlLYU5hYTNbogmIDUvknilehHsFhCH1+0/kN87lP+XaLT0Yeq4V/rpwChSd9vlz4muzFArtw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.4.tgz", + "integrity": "sha512-4T3E6uTCwWT6IPnwuPcWVz3oHxvEp/qbrCxZhsgzwTUBEwu78EGNXGdHfKJQt3soth89MLqZJw+Zzvnhrsg1mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.4.tgz", + "integrity": "sha512-NtbBkAeyBPLvCBkWtwkKXkNSn677eaT0cX3tygq+2qVv71TmHgX4gkX6o9BXjlPzdgPGwrUudavCYPT9tzkEqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.4.tgz", + "integrity": "sha512-vubOe3i+YtSJGEk/++73y+TIxbuVHi+W8ZzrRm2eETCjCRwNlgbfToQZ85dSA+4iBB/NJRGNp+O4hfdbbttZWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.4.tgz", + "integrity": "sha512-BMOVrUDZeg1RNRKVlh4eyLv5djAAVLiSddfpuuQ47EFjBcklg0NUeKMFKNrKQR4UnSn4HAiACLD7YK7koskwmg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.4.tgz", + "integrity": "sha512-kCNk6HcRZquhw/whwh4rHsdPyOSCQCgnVDVik+Y9cuSVTDy3frpiCJTScJqPPS872h4JgZKkr/+CwcwttNEo9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngx-translate/core": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", + "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", + "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", + "engines": { + "node": "^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "@ngx-translate/core": ">=15.0.0", + "rxjs": "^6.5.5 || ^7.4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "dependencies": { + "@nx/devkit": "16.5.1" + } + }, + "node_modules/@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "dependencies": { + "nx": "16.5.1" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 15 <= 17" + } + }, + "node_modules/@nx/devkit/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/devkit/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/devkit/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "nx": ">= 15 <= 17" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@nx/devkit/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "optional": true, "engines": { - "node": ">=10" + "node": ">=14" } }, - "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@nx/devkit/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", - "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", "cpu": [ "arm64" ], @@ -3831,15 +5702,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@nx/nx-darwin-x64": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", - "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", "cpu": [ "x64" ], @@ -3847,15 +5715,25 @@ "optional": true, "os": [ "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "cpu": [ + "arm64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", - "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", "cpu": [ "x64" ], @@ -3863,15 +5741,25 @@ "optional": true, "os": [ "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "cpu": [ + "arm" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", - "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", "cpu": [ "arm" ], @@ -3879,15 +5767,25 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "cpu": [ + "arm64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", - "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", "cpu": [ "arm64" ], @@ -3895,47 +5793,77 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "cpu": [ + "loong64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", - "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "cpu": [ + "riscv64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", - "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "cpu": [ + "s390x" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", - "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", "cpu": [ "x64" ], @@ -3943,15 +5871,25 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "cpu": [ + "x64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", - "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", "cpu": [ "arm64" ], @@ -3959,54 +5897,33 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", - "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", "cpu": [ - "x64" + "ia32" ], "dev": true, "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + ] }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "engines": { - "node": ">=14" - } + "os": [ + "win32" + ] }, "node_modules/@schematics/angular": { "version": "16.2.16", @@ -4162,15 +6079,6 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@tufjs/canonical-json": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", @@ -4280,10 +6188,20 @@ "@types/json-schema": "*" } }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true }, "node_modules/@types/express": { @@ -4317,9 +6235,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, "dependencies": { "@types/node": "*" @@ -4362,9 +6280,9 @@ "dev": true }, "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.12.tgz", + "integrity": "sha512-a0ToKlRVnUw3aXKQq2F+krxZKq7B8LEQijzPn5RdFAMatARD2JX9o8FBpMXOOrjob0uc13aN+V/AXniOXW4d9A==", "dev": true, "dependencies": { "@types/node": "*" @@ -4401,9 +6319,9 @@ "dev": true }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true }, "node_modules/@types/semver": { @@ -4469,9 +6387,9 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "dependencies": { "@types/node": "*" @@ -4697,167 +6615,155 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" - } - }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -4867,99 +6773,6 @@ "integrity": "sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==", "peer": true }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" - }, - "peerDependencies": { - "typescript": ">=3.2.x || >= 4.x" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5031,13 +6844,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -5058,31 +6864,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -5091,15 +6875,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5109,15 +6884,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -5276,6 +7042,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -5438,9 +7205,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -5450,14 +7217,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5501,9 +7272,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -5527,113 +7298,125 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", "dev": true, "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", - "webpack": ">=5" + "webpack": ">=5.61.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/babel-loader/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "node_modules/babel-loader/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" + "p-locate": "^5.0.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/babel-loader/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "node_modules/babel-loader/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "p-limit": "^3.0.2" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5689,6 +7472,25 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/beasties": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.4.tgz", + "integrity": "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5772,9 +7574,9 @@ "dev": true }, "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -5814,16 +7616,10 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "funding": [ { "type": "opencollective", @@ -5839,10 +7635,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5890,6 +7686,21 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6054,9 +7865,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001663", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", - "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "funding": [ { "type": "opencollective", @@ -6079,16 +7890,15 @@ "dev": true }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, "engines": { - "node": ">=4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chardet": { @@ -6107,15 +7917,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6128,6 +7932,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -6299,6 +8106,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -6306,7 +8114,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/color-support": { "version": "1.1.3", @@ -6359,12 +8168,6 @@ "node": ">= 6" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -6387,32 +8190,23 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6428,11 +8222,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -6576,9 +8373,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { "node": ">= 0.6" @@ -6603,20 +8400,19 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", "dev": true, "dependencies": { - "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^13.1.1", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -6638,37 +8434,6 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/core-js": { "version": "3.38.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", @@ -6681,12 +8446,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", + "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", "dev": true, "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.25.0" }, "funding": { "type": "opencollective", @@ -6722,15 +8487,15 @@ } }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -6747,91 +8512,6 @@ } } }, - "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cron-validator": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cron-validator/-/cron-validator-1.3.1.tgz", @@ -6861,35 +8541,44 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "dependencies": { "boolbase": "^1.0.0", @@ -6903,9 +8592,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "engines": { "node": ">= 6" @@ -6926,30 +8615,6 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -7075,30 +8740,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/cypress/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cypress/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/cytoscape": { "version": "3.30.2", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", @@ -7591,20 +9232,6 @@ "node": ">=0.10" } }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -7670,12 +9297,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -7714,62 +9335,34 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -7883,6 +9476,16 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -7975,28 +9578,6 @@ } ] }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -8019,9 +9600,9 @@ "optional": true }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -8105,9 +9686,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", - "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==" + "version": "1.5.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==" }, "node_modules/elkjs": { "version": "0.8.2", @@ -8295,6 +9876,18 @@ "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -8377,52 +9970,55 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.5.tgz", + "integrity": "sha512-V/rbdOws2gDcnCAECfPrajhuafI0WY4WumUgc8ZHwOLnvmM0doLQ+dqvVFI2qkVxQsvo6880aC9IjpyDqcwwTw==", "dev": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/escalade": { @@ -8434,48 +10030,18 @@ } }, "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, "node_modules/eslint": { @@ -8723,15 +10289,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8888,12 +10445,6 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, "node_modules/eventemitter2": { "version": "6.4.7", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", @@ -8957,9 +10508,9 @@ "dev": true }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "dependencies": { "accepts": "~1.3.8", @@ -8967,7 +10518,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -8981,7 +10532,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -8996,6 +10547,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -9087,16 +10642,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -9114,6 +10669,22 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -9253,22 +10824,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9470,12 +11025,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -9549,6 +11098,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -9568,15 +11129,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -9758,14 +11310,6 @@ "node": ">= 0.8" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -9841,18 +11385,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", - "dev": true, - "dependencies": { - "@wessberg/ts-evaluator": "0.0.27" - }, - "peerDependencies": { - "typescript": ">=3.7.5" - } - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -9899,11 +11431,12 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -9975,23 +11508,6 @@ "node": ">= 0.4" } }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, "node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -10061,34 +11577,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -10108,9 +11596,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -10122,8 +11610,20 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { @@ -10155,9 +11655,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true }, "node_modules/http-proxy": { @@ -10174,54 +11674,21 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.8", + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/http-signature": { @@ -10269,6 +11736,15 @@ "ms": "^2.0.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10372,9 +11848,9 @@ } }, "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", "dev": true }, "node_modules/import-fresh": { @@ -10536,15 +12012,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inquirer/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10704,9 +12171,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "dependencies": { "hasown": "^2.0.2" @@ -10775,6 +12242,39 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -10818,6 +12318,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -10868,12 +12380,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -11110,15 +12616,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11249,15 +12746,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jake/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11285,48 +12773,24 @@ "colors": "1.4.0" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 10.13.0" } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -11354,81 +12818,15 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -11772,15 +13170,6 @@ "node": ">=0.10.0" } }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/known-css-properties": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", @@ -11788,9 +13177,9 @@ "dev": true }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -11813,9 +13202,9 @@ } }, "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", + "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", @@ -11826,7 +13215,7 @@ "lessc": "bin/lessc" }, "engines": { - "node": ">=6" + "node": ">=14" }, "optionalDependencies": { "errno": "^0.1.1", @@ -11839,23 +13228,29 @@ } }, "node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.0.tgz", + "integrity": "sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==", "dev": true, - "dependencies": { - "klona": "^2.0.4" - }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "less": "^3.5.0 || ^4.0.0", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/less/node_modules/make-dir": { @@ -12009,6 +13404,40 @@ "@types/trusted-types": "^2.0.2" } }, + "node_modules/lmdb": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.3.0.tgz", + "integrity": "sha512-MgJocUI6QEiSXQBFWLeyo1R7eQj8Rke5dlPxX0KFwli8/bsCxpM/KbXO5y0qmV/5llQ3wpneDWcTYxa+4vn8iQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.3.0", + "@lmdb/lmdb-darwin-x64": "3.3.0", + "@lmdb/lmdb-linux-arm": "3.3.0", + "@lmdb/lmdb-linux-arm64": "3.3.0", + "@lmdb/lmdb-linux-x64": "3.3.0", + "@lmdb/lmdb-win32-arm64": "3.3.0", + "@lmdb/lmdb-win32-x64": "3.3.0" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "optional": true + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -12019,9 +13448,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -12140,15 +13569,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12660,15 +14080,22 @@ } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.4" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" }, "engines": { "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/meow": { @@ -12886,6 +14313,18 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -12896,12 +14335,13 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -13203,9 +14643,9 @@ } }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "engines": { "node": ">=10" @@ -13216,6 +14656,38 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/msgpackr": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.4.tgz", + "integrity": "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==", + "dev": true, + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -13248,9 +14720,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -13422,21 +14894,6 @@ "@angular/core": ">=13.0.0" } }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -13488,10 +14945,25 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", @@ -13785,12 +15257,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, "node_modules/nx": { "version": "16.5.1", "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", @@ -13970,15 +15436,6 @@ "node": "*" } }, - "node_modules/nx/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nx/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -14082,15 +15539,6 @@ "node": ">= 0.4" } }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, - "engines": { - "node": ">= 10.12.0" - } - }, "node_modules/object.assign": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", @@ -14275,15 +15723,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14296,6 +15735,13 @@ "node": ">=8" } }, + "node_modules/ordered-binary": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "dev": true, + "optional": true + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -14354,16 +15800,20 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry/node_modules/retry": { @@ -14422,12 +15872,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14486,12 +15930,12 @@ } }, "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.1.0.tgz", + "integrity": "sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==", "dev": true, "dependencies": { - "entities": "^4.3.0", + "entities": "^6.0.0", "parse5": "^7.0.0", "parse5-sax-parser": "^7.0.0" }, @@ -14499,6 +15943,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -14576,9 +16032,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "node_modules/path-type": { @@ -14603,9 +16059,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14627,115 +16083,16 @@ "node": ">=0.10.0" } }, - "node_modules/piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", - "dev": true, - "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "node_modules/piscina": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.1.tgz", + "integrity": "sha512-9rPDIPsCwOivatEZGM8+apgM7AiTDLSnpwMmLaSmdm2PeND8bFJzZLZZxyrJjLH8Xx/MpKoVaKf+vZOWALNHbw==", "dev": true, "engines": { - "node": ">=12.20" + "node": ">=20.x" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" } }, "node_modules/possible-typed-array-names": { @@ -14748,9 +16105,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -14767,34 +16124,43 @@ } ], "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/postcss-media-query-parser": { @@ -14816,13 +16182,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -14832,13 +16198,26 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -14847,6 +16226,19 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -15469,21 +16861,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regex-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", @@ -15509,15 +16886,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -15525,25 +16902,34 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/request-progress": { @@ -15726,21 +17112,56 @@ "optional": true }, "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.7" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -15813,13 +17234,13 @@ "devOptional": true }, "node_modules/sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "version": "1.88.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.88.0.tgz", + "integrity": "sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -15827,32 +17248,35 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", + "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -15863,32 +17287,107 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "node_modules/sass/node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, - "optional": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "dependencies": { - "xmlchars": "^2.2.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/sass/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true + }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -15897,7 +17396,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -16232,10 +17731,13 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16553,17 +18055,16 @@ } }, "node_modules/source-map-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, "dependencies": { - "abab": "^2.0.6", "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -16733,6 +18234,18 @@ "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -17129,14 +18642,18 @@ "optional": true }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { @@ -17152,15 +18669,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17200,12 +18708,6 @@ "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "node_modules/table": { "version": "6.8.2", "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", @@ -17357,9 +18859,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.1.tgz", + "integrity": "sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -17375,16 +18877,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -17408,105 +18910,30 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", - "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/throttleit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", @@ -17528,11 +18955,53 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "optional": true + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/tmp": { "version": "0.2.1", @@ -17546,14 +19015,6 @@ "node": ">=8.17.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17607,25 +19068,20 @@ "node": ">= 4.0.0" } }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/tree-dump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", + "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/tree-kill": { @@ -17670,9 +19126,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17901,6 +19357,14 @@ "node": "*" } }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", @@ -17993,9 +19457,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -18011,8 +19475,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -18121,61 +19585,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -18209,28 +19618,6 @@ "eslint": ">=6.0.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -18262,34 +19649,33 @@ "defaults": "^1.0.3" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "optional": true + }, "node_modules/web-worker": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", "optional": true }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.99.8", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", + "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -18301,9 +19687,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -18324,19 +19710,20 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", - "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.12", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -18352,54 +19739,52 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz", + "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "http-proxy-middleware": "^2.0.7", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -18410,6 +19795,42 @@ } } }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -18419,61 +19840,63 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "node_modules/webpack-dev-server/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", "dev": true, - "engines": { - "node": ">=10.0.0" + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { @@ -18506,31 +19929,6 @@ } } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -18553,30 +19951,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -18600,35 +19974,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -18838,16 +20183,16 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -18858,18 +20203,6 @@ } } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -18952,6 +20285,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", diff --git a/src/portal/package.json b/src/portal/package.json index a3ca026be50..01695e21266 100644 --- a/src/portal/package.json +++ b/src/portal/package.json @@ -53,7 +53,7 @@ "zone.js": "^0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.16", + "@angular-devkit/build-angular": "^20.0.5", "@angular-eslint/builder": "16.1.2", "@angular-eslint/eslint-plugin": "16.1.2", "@angular-eslint/eslint-plugin-template": "16.1.2", diff --git a/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts b/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts index 60d1a507464..709f0d16e4d 100644 --- a/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts +++ b/src/portal/src/app/base/left-side-nav/clearing-job/gc-page/gc/gc-history/gc-history.component.ts @@ -284,6 +284,6 @@ export class GcHistoryComponent implements OnInit, OnDestroy { } shouldShowDetails(status: string): boolean { - return status !== JOB_STATUS.PENDING && status !== JOB_STATUS.RUNNING; + return status !== JOB_STATUS.PENDING; } } diff --git a/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts b/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts index 73469b090c8..181f4b7069c 100644 --- a/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts +++ b/src/portal/src/app/base/left-side-nav/config/security/security.component.spec.ts @@ -99,4 +99,38 @@ describe('SecurityComponent', () => { 'CVE-2019-789' ); }); + it('should not allow empty and whitespace CVEs', async () => { + // set cveIds with mix empty and whitespace + component.cveIds = ` + + , , \n , \t, , + `; + component.addToSystemAllowlist(); + const finalIds = component.systemAllowlist.items.map(i => i.cve_id); + expect(finalIds).not.toContain(' '); + expect(finalIds).not.toContain('\n'); + expect(finalIds).not.toContain(''); // no empty CVEs + + // modal should be closed + expect(component.cveIds).toBeNull(); + expect(component.showAddModal).toBeFalse(); + }); + it('should add only unique CVEs to the allowlist', () => { + // set cveIds with duplicates and valid + component.cveIds = ` + CVE-2024-0002, + CVE-2024-0002, + CVE-2024-0004 + `; + + component.addToSystemAllowlist(); + const finalIds = component.systemAllowlist.items.map(i => i.cve_id); + expect(finalIds).toContain('CVE-2024-0004'); + expect(finalIds).not.toContain(''); // no empty CVEs + expect(finalIds.filter(id => id === 'CVE-2024-0002').length).toBe(1); // no duplicates + + // modal should be closed + expect(component.cveIds).toBeNull(); + expect(component.showAddModal).toBeFalse(); + }); }); diff --git a/src/portal/src/app/base/left-side-nav/config/security/security.component.ts b/src/portal/src/app/base/left-side-nav/config/security/security.component.ts index 6ad5d9b9ec5..50715ecf67e 100644 --- a/src/portal/src/app/base/left-side-nav/config/security/security.component.ts +++ b/src/portal/src/app/base/left-side-nav/config/security/security.component.ts @@ -174,7 +174,12 @@ export class SecurityComponent implements OnInit, OnDestroy { this.systemAllowlist.items.forEach(item => { map[item.cve_id] = true; }); - this.cveIds.split(/[\n,]+/).forEach(id => { + const newCveIds = this.cveIds + .split(/[\n,]+/) + .map(id => id.trim()) // remove leading/trailing whitespace + .filter(id => id.length > 0); // skip empty or whitespace-only strings + + newCveIds.forEach(id => { let cveObj: any = {}; cveObj.cve_id = id.trim(); if (!map[cveObj.cve_id]) { diff --git a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html index d5b243a6eef..091aa9754f8 100644 --- a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/config-scanner.component.html @@ -2,17 +2,6 @@

{{ 'SCANNER.IMAGE_SCANNERS' | translate }} - - - {{ 'SCANNER.VIEW_DOC' | translate }} - -

{ .GenerateSbomOnPush ).toBeTruthy(); }); + it('should not allow empty and whitespace CVEs', async () => { + // set cveIds with mix of empty and whitespace + component.projectPolicyConfigComponent.cveIds = ` + , , \n , \t, , + `; + + component.projectPolicyConfigComponent.addToProjectAllowlist(); + + const finalIds = + component.projectPolicyConfigComponent.projectAllowlist.items.map( + i => i.cve_id + ); + expect(finalIds).not.toContain(' '); + expect(finalIds).not.toContain('\n'); + expect(finalIds).not.toContain(''); // no empty CVEs + + // modal should be closed + expect(component.projectPolicyConfigComponent.cveIds).toBeNull(); + expect(component.projectPolicyConfigComponent.showAddModal).toBeFalse(); + }); + it('should add only unique CVEs to the allowlist', () => { + // set cveIds with duplicates and valid + component.projectPolicyConfigComponent.cveIds = ` + CVE-2024-0002, + CVE-2024-0002, + CVE-2024-0004 + `; + component.projectPolicyConfigComponent.addToProjectAllowlist(); + const finalIds = + component.projectPolicyConfigComponent.projectAllowlist.items.map( + i => i.cve_id + ); + expect(finalIds).toContain('CVE-2024-0004'); + expect(finalIds).not.toContain(''); // no empty CVEs + expect(finalIds.filter(id => id === 'CVE-2024-0002').length).toBe(1); // no duplicates + + // modal should be closed + expect(component.projectPolicyConfigComponent.cveIds).toBeNull(); + expect(component.projectPolicyConfigComponent.showAddModal).toBeFalse(); + }); it('should get hasChangeConfigRole', () => { expect( component.projectPolicyConfigComponent.hasChangeConfigRole diff --git a/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts b/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts index 0e3c55e3913..b35e3992dbe 100644 --- a/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts +++ b/src/portal/src/app/base/project/project-config/project-policy-config/project-policy-config.component.ts @@ -13,7 +13,10 @@ // limitations under the License. import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; import { compareValue, clone } from '../../../../shared/units/utils'; -import { ProjectService } from '../../../../shared/services'; +import { + ProjectCVEAllowlist, + ProjectService, +} from '../../../../shared/services'; import { ErrorHandler } from '../../../../shared/units/error-handler'; import { State, SystemCVEAllowlist } from '../../../../shared/services'; import { @@ -133,8 +136,8 @@ export class ProjectPolicyConfigComponent implements OnInit { userProjectAllowlist = false; systemAllowlistOrProjectAllowlist: string; systemAllowlistOrProjectAllowlistOrigin: string; - projectAllowlist; - projectAllowlistOrigin; + projectAllowlist: ProjectCVEAllowlist; + projectAllowlistOrigin: ProjectCVEAllowlist; speedUnit = BandwidthUnit.KB; speedUnits = [ { @@ -454,7 +457,12 @@ export class ProjectPolicyConfigComponent implements OnInit { this.projectAllowlist.items.forEach(item => { map[item.cve_id] = true; }); - this.cveIds.split(/[\n,]+/).forEach(id => { + const newCveIds = this.cveIds + .split(/[\n,]+/) + .map(id => id.trim()) // remove leading/trailing whitespace + .filter(id => id.length > 0); // skip empty or whitespace-only strings + + newCveIds.forEach(id => { let cveObj: any = {}; cveObj.cve_id = id.trim(); if (!map[cveObj.cve_id]) { diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html index d3936a48520..3231851702e 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html @@ -465,7 +465,9 @@ (submitStopFinish)="submitSbomStopFinish($event)" (scanFinished)="sbomFinished($event)" *ngIf=" - hasSbom(artifact) && !artifact?.accessoryLoading + hasSbom(artifact) && + !artifact?.accessoryLoading && + !hasChild(artifact) " [inputScanner]=" handleSbomOverview(artifact.sbom_overview) diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts index 9e96dcc03e7..45101eb70c3 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.spec.ts @@ -502,6 +502,26 @@ describe('ArtifactListTabComponent', () => { ); expect(comp.handleScanOverview(mockArtifacts[0])).not.toBeNull(); }); + it('Should return true for artifacts with child references', async () => { + const artifactWithChild = { + ...mockArtifacts[0], + references: [{ child_digest: 'childDigest123' }], // child reference + }; + + const result = comp.hasChild(artifactWithChild); + + expect(result).toBeTruthy(); + }); + it('Should return false for artifacts without child references', async () => { + const artifactWithoutChild = { + ...mockArtifacts[0], + references: [], // No child references + }; + + const result = comp.hasChild(artifactWithoutChild); + + expect(result).toBeFalsy(); + }); it('Test utils', async () => { fixture = TestBed.createComponent(ArtifactListTabComponent); comp = fixture.componentInstance; diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts index fc225a663b2..38628601e14 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts @@ -915,6 +915,14 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy { ); } + hasChild(artifact: Artifact): boolean { + return !!( + artifact && + artifact.references && + artifact.references.some(ref => ref['child_digest']) + ); + } + submitFinish(e: boolean) { this.scanFinishedArtifactLength += 1; // all selected scan action has started diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html index 8884cacf4ae..2d9d98f6f7e 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.html @@ -3,6 +3,7 @@ *ngIf="isImage(artifact)" [title]="getPullCommandForRuntimeByDigest(artifact)" [iconMode]="true" + id="pullCommandForDigest" (onCopySuccess)=" onCpSuccess(getPullCommandForRuntimeByDigest(artifact)) " @@ -12,6 +13,7 @@
{ let component: PullCommandComponent; @@ -29,11 +30,11 @@ describe('PullCommandComponent', () => { fixture = TestBed.createComponent(PullCommandComponent); component = fixture.componentInstance; - // Mock the artifact input with a valid value component.artifact = { - type: ArtifactType.IMAGE, - digest: 'sampleDigest', - tags: [{ name: 'latest' }], + type: ArtifactType.CHART, + tagNumber: 1, + digest: 'sha256@digest', + tags: [{ name: '1.0.0' }], }; fixture.detectChanges(); @@ -42,4 +43,69 @@ describe('PullCommandComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should not display pull command for chart', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.CHART, + tagNumber: 0, + digest: 'sha256@digest', + tags: [], + }; + component.getPullCommandForChart(component.artifact); + expect( + component.getPullCommandForChart(component.artifact).length + ).toBe(0); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = + fixture.nativeElement.querySelector(`#pullCommandForChart`); + expect(modal).toBeFalsy(); + }); + + it('should display when pull command for chart is available', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.CHART, + tagNumber: 1, + digest: 'sha256@digest', + tags: [{ name: '1.0.0' }], + }; + component.getPullCommandForChart(component.artifact); + expect( + component.getPullCommandForChart(component.artifact).length + ).toBeGreaterThan(0); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = + fixture.nativeElement.querySelector(`#pullCommandForChart`); + expect(modal).toBeTruthy(); + }); + + it('should display when pull command for digest is available', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.IMAGE, + }; + component.getPullCommandForRuntimeByDigest(component.artifact); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = fixture.nativeElement.querySelector( + `#pullCommandForDigest` + ); + expect(modal).toBeTruthy(); + }); + + it('should display when pull command for CNAB is available', async () => { + // Mock the artifact input with a valid value + component.artifact = { + type: ArtifactType.CNAB, + }; + component.getPullCommandForCNAB(component.artifact); + fixture.detectChanges(); + await fixture.whenStable(); + const modal = + fixture.nativeElement.querySelector(`#pullCommandForCNAB`); + expect(modal).toBeTruthy(); + }); }); diff --git a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts index 1fe4d790144..df0a8a7792c 100644 --- a/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts +++ b/src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/pull-command/pull-command.component.ts @@ -100,14 +100,18 @@ export class PullCommandComponent { } getPullCommandForChart(artifact: Artifact): string { - return getPullCommandByTag( - artifact.type, - `${this.registryUrl ? this.registryUrl : location.hostname}/${ - this.projectName - }/${this.repoName}`, - artifact.tags[0].name, - Clients.CHART - ); + if (artifact.tagNumber > 0) { + return getPullCommandByTag( + artifact.type, + `${this.registryUrl ? this.registryUrl : location.hostname}/${ + this.projectName + }/${this.repoName}`, + artifact.tags[0].name, + Clients.CHART + ); + } else { + return ''; + } } // For tagMode diff --git a/src/portal/src/app/shared/components/app-level-alerts/app-level-alerts.component.ts b/src/portal/src/app/shared/components/app-level-alerts/app-level-alerts.component.ts index 21842d235cf..de1910855c6 100644 --- a/src/portal/src/app/shared/components/app-level-alerts/app-level-alerts.component.ts +++ b/src/portal/src/app/shared/components/app-level-alerts/app-level-alerts.component.ts @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. import { Component, OnDestroy, OnInit } from '@angular/core'; -import { SCANNERS_DOC } from '../../../base/left-side-nav/interrogation-services/scanner/scanner'; import { SessionService } from '../../services/session.service'; import { DEFAULT_PAGE_SIZE, delUrlParam } from '../../units/utils'; import { forkJoin, Observable, Subscription } from 'rxjs'; @@ -37,7 +36,6 @@ const YES: string = 'yes'; styleUrls: ['./app-level-alerts.component.scss'], }) export class AppLevelAlertsComponent implements OnInit, OnDestroy { - scannerDocUrl: string = SCANNERS_DOC; showScannerInfo: boolean = false; message: Message; appLevelMsgSub: Subscription; diff --git a/src/portal/src/app/shared/entities/shared.const.ts b/src/portal/src/app/shared/entities/shared.const.ts index 258eacfa14e..0102b2f7d14 100644 --- a/src/portal/src/app/shared/entities/shared.const.ts +++ b/src/portal/src/app/shared/entities/shared.const.ts @@ -21,6 +21,7 @@ import locale_fr from '@angular/common/locales/fr'; import locale_pt from '@angular/common/locales/pt-PT'; import locale_tr from '@angular/common/locales/tr'; import locale_de from '@angular/common/locales/de'; +import locale_ru from '@angular/common/locales/ru'; import { ClrCommonStrings } from '@clr/angular/utils/i18n/common-strings.interface'; export const enum AlertType { @@ -261,6 +262,7 @@ export const LANGUAGES = { 'pt-br': ['Português do Brasil', locale_pt], 'tr-tr': ['Türkçe', locale_tr], 'de-de': ['Deutsch', locale_de], + 'ru-ru': ['Русский', locale_ru], } as const; export const supportedLangs = Object.keys(LANGUAGES) as SupportedLanguage[]; /** diff --git a/src/portal/src/app/shared/services/interface.ts b/src/portal/src/app/shared/services/interface.ts index 7f7bb3f0032..3b73f7253cc 100644 --- a/src/portal/src/app/shared/services/interface.ts +++ b/src/portal/src/app/shared/services/interface.ts @@ -433,6 +433,11 @@ export interface ProjectRootInterface { VALUE: number; LABEL: string; } +export interface ProjectCVEAllowlist { + id?: number; + expires_at?: number; + items?: Array<{ cve_id: string }>; +} export interface SystemCVEAllowlist { id?: number; project_id?: number; diff --git a/src/portal/src/i18n/lang/de-de-lang.json b/src/portal/src/i18n/lang/de-de-lang.json index 5beb2d90a1c..152a938481d 100644 --- a/src/portal/src/i18n/lang/de-de-lang.json +++ b/src/portal/src/i18n/lang/de-de-lang.json @@ -1572,7 +1572,6 @@ "SET_UNHEALTHY_SCANNER": "Der gewählte Scanner:{{name}} ist nicht gesund", "SCANNED_BY": "Gescannt von:", "IMAGE_SCANNERS": "Image Scanner", - "VIEW_DOC": "Siehe Dokumentation", "ALL_SCANNERS": "Alle Scanner", "HELP_INFO_1": "Der Standardscanner wurde installiert. Um andere Scanner zu installieren, siehe ", "HELP_INFO_2": "Dokumentation.", diff --git a/src/portal/src/i18n/lang/en-us-lang.json b/src/portal/src/i18n/lang/en-us-lang.json index 23051b8ff9b..220ddf43434 100644 --- a/src/portal/src/i18n/lang/en-us-lang.json +++ b/src/portal/src/i18n/lang/en-us-lang.json @@ -1574,7 +1574,6 @@ "SET_UNHEALTHY_SCANNER": "Selected scanner:{{name}} is unhealthy", "SCANNED_BY": "Scanned by:", "IMAGE_SCANNERS": "Image Scanners", - "VIEW_DOC": "view documentation", "ALL_SCANNERS": "All scanners", "HELP_INFO_1": "The default scanner has been installed. To install other scanners refer to the ", "HELP_INFO_2": "documentation.", diff --git a/src/portal/src/i18n/lang/es-es-lang.json b/src/portal/src/i18n/lang/es-es-lang.json index 683525a612d..f0c93275daf 100644 --- a/src/portal/src/i18n/lang/es-es-lang.json +++ b/src/portal/src/i18n/lang/es-es-lang.json @@ -1569,7 +1569,6 @@ "SET_UNHEALTHY_SCANNER": "Escaner seleccionado :{{name}} es unhealthy", "SCANNED_BY": "Escaneado por:", "IMAGE_SCANNERS": "Imágenes Escaners", - "VIEW_DOC": "ver documentación", "ALL_SCANNERS": "Todos los escaners", "HELP_INFO_1": "El default escaner ha sido instalado. Para instalar otros escaners refierase a la ", "HELP_INFO_2": "documentación.", diff --git a/src/portal/src/i18n/lang/fr-fr-lang.json b/src/portal/src/i18n/lang/fr-fr-lang.json index c5ab21d50e5..0d44c8420ca 100644 --- a/src/portal/src/i18n/lang/fr-fr-lang.json +++ b/src/portal/src/i18n/lang/fr-fr-lang.json @@ -1574,7 +1574,6 @@ "SET_UNHEALTHY_SCANNER": "Scanneurs sélectionnés : {{name}} est en mauvaise santé", "SCANNED_BY": "Scanné par :", "IMAGE_SCANNERS": "Scanneurs d'images", - "VIEW_DOC": "Voir la documentation", "ALL_SCANNERS": "Tous les scanneurs", "HELP_INFO_1": "Le scanneur par défaut a été installé. Pour installer d'autres scanneurs,", "HELP_INFO_2": "référez-vous à la documentation.", diff --git a/src/portal/src/i18n/lang/ko-kr-lang.json b/src/portal/src/i18n/lang/ko-kr-lang.json index e7ff6ae6fe3..63e8cefde11 100644 --- a/src/portal/src/i18n/lang/ko-kr-lang.json +++ b/src/portal/src/i18n/lang/ko-kr-lang.json @@ -1563,7 +1563,6 @@ "SET_UNHEALTHY_SCANNER": "스캐너 선택:{{name}} 이 위험한 상태입니다", "SCANNED_BY": "스캔한 사람:", "IMAGE_SCANNERS": "이미지 스캐너", - "VIEW_DOC": "문서 보기", "ALL_SCANNERS": "모든 스캐너", "HELP_INFO_1": "기본 스캐너가 설치되었습니다. 다른 스캐너를 설치하려면 다음을 참조하십시오", "HELP_INFO_2": "문서.", diff --git a/src/portal/src/i18n/lang/pt-br-lang.json b/src/portal/src/i18n/lang/pt-br-lang.json index cdecd1f97fb..bc7061ce6cd 100644 --- a/src/portal/src/i18n/lang/pt-br-lang.json +++ b/src/portal/src/i18n/lang/pt-br-lang.json @@ -1569,7 +1569,6 @@ "SET_UNHEALTHY_SCANNER": "Examinador selecionado '{{name}}' está com problemas", "SCANNED_BY": "Analisado por:", "IMAGE_SCANNERS": "Examinadores de Imagens", - "VIEW_DOC": "Aprender mais a respeito", "ALL_SCANNERS": "Todos os examinadores", "HELP_INFO_1": "O examinador padrão foi instalado. Para incluir outros, confira a ", "HELP_INFO_2": "documentação.", diff --git a/src/portal/src/i18n/lang/ru-ru-lang.json b/src/portal/src/i18n/lang/ru-ru-lang.json new file mode 100644 index 00000000000..c37a1642771 --- /dev/null +++ b/src/portal/src/i18n/lang/ru-ru-lang.json @@ -0,0 +1,1847 @@ +{ + "APP_TITLE": { + "VMW_HARBOR": "Harbor", + "HARBOR": "Harbor", + "VIC": "vSphere Integrated Containers", + "MGMT": "Управление", + "REG": "Реестр", + "HARBOR_SWAGGER": "Harbor Swagger", + "THEME_DARK_TEXT": "ТЕМНЫЙ", + "THEME_LIGHT_TEXT": "СВЕТЛЫЙ" + }, + "SIGN_IN": { + "REMEMBER": "Запомнить меня", + "INVALID_MSG": "Неверное имя пользователя или пароль.", + "FORGOT_PWD": "Забыли пароль", + "HEADER_LINK": "Войти", + "CORE_SERVICE_NOT_AVAILABLE": "Основная служба недоступна.", + "OR": "ИЛИ", + "VIA_LOCAL_DB": "ВОЙТИ ЧЕРЕЗ ЛОКАЛЬНУЮ БАЗУ ДАННЫХ" + }, + "SIGN_UP": { + "TITLE": "Регистрация" + }, + "BUTTON": { + "STOP": "ОСТАНОВИТЬ", + "CANCEL": "ОТМЕНА", + "OK": "ОК", + "DELETE": "УДАЛИТЬ", + "LOG_IN": "ВОЙТИ", + "LOG_IN_OIDC": "Войти через OIDC провайдер", + "SIGN_UP_LINK": "Зарегистрироваться", + "SIGN_UP": "ЗАРЕГИСТРИРОВАТЬСЯ", + "CONFIRM": "ПОДТВЕРДИТЬ", + "SEND": "ОТПРАВИТЬ", + "SAVE": "СОХРАНИТЬ", + "TEST_MAIL": "ПРОВЕРИТЬ ПОЧТОВЫЙ СЕРВЕР", + "CLOSE": "ЗАКРЫТЬ", + "TEST_LDAP": "ПРОВЕРИТЬ LDAP СЕРВЕР", + "TEST_OIDC": "ПРОВЕРИТЬ OIDC СЕРВЕР", + "MORE_INFO": "Подробнее...", + "YES": "ДА", + "NO": "НЕТ", + "NEGATIVE": "ОТРИЦАТЕЛЬНО", + "COPY": "КОПИРОВАТЬ", + "EDIT": "РЕДАКТИРОВАТЬ", + "SWITCH": "ПЕРЕКЛЮЧИТЬ", + "REPLICATE": "РЕПЛИЦИРОВАТЬ", + "ACTIONS": "Действия", + "BROWSE": "Просмотреть", + "UPLOAD": "Загрузить", + "NO_FILE": "Файл не выбран", + "ADD": "ДОБАВИТЬ", + "RUN": "ЗАПУСТИТЬ", + "CONTINUE": "ПРОДОЛЖИТЬ", + "ENABLE": "ВКЛЮЧИТЬ", + "DISABLE": "ОТКЛЮЧИТЬ" + }, + "BATCH": { + "DELETED_SUCCESS": "Успешно удалено", + "DELETED_FAILURE": "Удаление не удалось или частично не удалось", + "SWITCH_SUCCESS": "Успешно переключено", + "SWITCH_FAILURE": "Переключение не удалось", + "REPLICATE_SUCCESS": "Успешно запущено", + "REPLICATE_FAILURE": "Запуск не удался", + "STOP_SUCCESS": "Успешно остановлено", + "STOP_FAILURE": "Остановить выполнение не удалось", + "TIME_OUT": "Шлюз не отвечает" + }, + "TOOLTIP": { + "NAME_FILTER": "Фильтровать по имени ресурса. Оставьте пустым или используйте '**' для соответствия всем. 'library/**' соответствует только ресурсам под 'library'. Для получения дополнительных шаблонов обратитесь к руководству пользователя.", + "TAG_FILTER": "Фильтровать по тегу/версии ресурсов. Оставьте пустым или используйте '**' для соответствия всем. '1.0*' соответствует только тегам, начинающимся с '1.0'. Для получения дополнительных шаблонов обратитесь к руководству пользователя.", + "LABEL_FILTER": "Фильтровать ресурсы по меткам.", + "RESOURCE_FILTER": "Фильтровать по типу ресурсов.", + "PUSH_BASED": "Отправлять ресурсы с локального Harbor на удаленный реестр.", + "PULL_BASED": "Получать ресурсы с удаленного реестра на локальный Harbor.", + "DESTINATION_NAMESPACE": "Укажите целевое пространство имен. Если пусто, ресурсы будут помещены в то же пространство имен, что и источник.", + "OVERRIDE": "Укажите, следует ли перезаписывать ресурсы в месте назначения, если ресурс с таким же именем уже существует.", + "EMAIL": "Почта должна быть действительным адресом, например name@example.com.", + "USER_NAME": "Не может содержать специальные символы и максимальная длина должна быть 255 символов.", + "FULL_NAME": "Максимальная длина должна быть 20 символов.", + "COMMENT": "Длина комментария должна быть менее 30 символов.", + "CURRENT_PWD": "Требуется текущий пароль.", + "PASSWORD": "Пароль должен быть длиной от 8 до 20 символов с хотя бы одной заглавной буквой, одной строчной буквой и одной цифрой.", + "CONFIRM_PWD": "Пароли не совпадают.", + "SIGN_IN_USERNAME": "Требуется имя пользователя.", + "SIGN_IN_PWD": "Требуется пароль.", + "SIGN_UP_MAIL": "Почта используется только для сброса пароля.", + "SIGN_UP_REAL_NAME": "Имя и фамилия", + "ITEM_REQUIRED": "Поле обязательно для заполнения.", + "SCOPE_REQUIRED": "Поле обязательно для заполнения и должно быть в формате области.", + "NUMBER_REQUIRED": "Поле обязательно для заполнения и должно быть числами.", + "PORT_REQUIRED": "Поле обязательно для заполнения и должно быть действительным номером порта.", + "CRON_REQUIRED": "Поле обязательно для заполнения и должно быть в формате cron.", + "EMAIL_EXISTING": "Адрес электронной почты уже существует.", + "USER_EXISTING": "Имя пользователя уже используется.", + "RULE_USER_EXISTING": "Имя уже используется.", + "EMPTY": "Имя обязательно", + "NONEMPTY": "Не может быть пустым", + "REPO_TOOLTIP": "Пользователи не могут выполнять никакие операции с образами в этом режиме.", + "ENDPOINT_FORMAT": "Конечная точка должна начинаться с HTTP:// или HTTPS://.", + "OIDC_ENDPOINT_FORMAT": "Конечная точка должна начинаться с HTTPS://.", + "OIDC_NAME": "Имя OIDC провайдера.", + "OIDC_ENDPOINT": "URL OIDC-совместимого сервера.", + "OIDC_SCOPE": "Область, отправляемая на OIDC сервер во время аутентификации. Должна содержать “openid” и “offline_access”. Если вы используете Google, удалите “offline_access” из этого поля.", + "OIDC_VERIFYCERT": "Снимите этот флажок, если ваш OIDC сервер размещен на самоподписанном сертификате.", + "OIDC_AUTOONBOARD": "Пропустить экран адаптации, чтобы пользователь не мог изменить свое имя пользователя. Имя пользователя предоставляется из ID токена", + "OIDC_USER_CLAIM": "Имя утверждения в ID токене, откуда извлекается имя пользователя. Если не указано, по умолчанию будет использоваться 'name'", + "NEW_SECRET": "Секрет должен быть длиннее 8 символов с хотя бы одной заглавной буквой, одной строчной буквой и одной цифрой" + }, + "PLACEHOLDER": { + "CURRENT_PWD": "Введите текущий пароль", + "NEW_PWD": "Введите новый пароль", + "CONFIRM_PWD": "Подтвердите новый пароль", + "USER_NAME": "Введите имя пользователя", + "MAIL": "Введите адрес электронной почты", + "FULL_NAME": "Введите полное имя", + "SIGN_IN_NAME": "Имя пользователя", + "SIGN_IN_PWD": "Пароль" + }, + "PROFILE": { + "TITLE": "Профиль пользователя", + "USER_NAME": "Имя пользователя", + "EMAIL": "Почта", + "FULL_NAME": "Имя и фамилия", + "COMMENT": "Комментарии", + "PASSWORD": "Пароль", + "SAVE_SUCCESS": "Профиль пользователя успешно сохранен.", + "ADMIN_RENAME_BUTTON": "Изменить имя пользователя", + "ADMIN_RENAME_TIP": "Выберите кнопку, чтобы изменить имя пользователя на \"admin@harbor.local\". Эту операцию нельзя отменить.", + "RENAME_SUCCESS": "Имя успешно изменено!", + "RENAME_CONFIRM_INFO": "Предупреждение, изменение имени на admin@harbor.local не может быть отменено.", + "CLI_PASSWORD": "Секрет CLI", + "CLI_PASSWORD_TIP": "Вы можете использовать этот секрет CLI как пароль при использовании docker/helm cli для доступа к Harbor.", + "COPY_SUCCESS": "успешно скопировано", + "COPY_ERROR": "копирование не удалось", + "ADMIN_CLI_SECRET_BUTTON": "СГЕНЕРИРОВАТЬ СЕКРЕТ", + "ADMIN_CLI_SECRET_RESET_BUTTON": "Загрузить свой секрет", + "NEW_SECRET": "Секрет", + "CONFIRM_SECRET": "Повторно введите секрет", + "GENERATE_SUCCESS": "Настройка секрета CLI прошла успешно", + "GENERATE_ERROR": "Настройка секрета CLI не удалась", + "CONFIRM_TITLE_CLI_GENERATE": "Вы уверены, что хотите перегенерировать секрет?", + "CONFIRM_BODY_CLI_GENERATE": "Если вы перегенерируете секрет CLI, старый секрет CLI будет отброшен" + }, + "CHANGE_PWD": { + "TITLE": "Изменить пароль", + "CURRENT_PWD": "Текущий пароль", + "NEW_PWD": "Новый пароль", + "CONFIRM_PWD": "Подтвердите пароль", + "SAVE_SUCCESS": "Пароль пользователя успешно изменен.", + "PASS_TIPS": "Длина от 8 до 128 символов с 1 заглавной, 1 строчной буквой и 1 цифрой" + }, + "ACCOUNT_SETTINGS": { + "PROFILE": "Профиль пользователя", + "CHANGE_PWD": "Изменить пароль", + "ABOUT": "О программе", + "LOGOUT": "Выйти" + }, + "GLOBAL_SEARCH": { + "PLACEHOLDER": "Поиск {{param}}...", + "PLACEHOLDER_VIC": "Поиск в Реестре..." + }, + "TOP_NAV": { + "DATETIME_RENDERING_DEFAULT": "По умолчанию" + }, + "SIDE_NAV": { + "DASHBOARD": "Панель управления", + "PROJECTS": "Проекты", + "SYSTEM_MGMT": { + "NAME": "Администрирование", + "USER": "Пользователи", + "GROUP": "Группы", + "REGISTRY": "Реестры", + "REPLICATION": "Репликации", + "CONFIG": "Конфигурация", + "VULNERABILITY": "Уязвимости", + "GARBAGE_COLLECTION": "Сборка мусора", + "INTERROGATION_SERVICES": "Сервисы опроса" + }, + "LOGS": "Логи", + "TASKS": "Задачи", + "API_EXPLORER": "Api Explorer", + "HARBOR_API_MANAGEMENT": "Harbor API V2.0", + "HELM_API_MANAGEMENT": "Harbor API", + "DISTRIBUTIONS": { + "NAME": "Распределения", + "INSTANCES": "Экземпляры" + } + }, + "USER": { + "ADD_ACTION": "Новый пользователь", + "ENABLE_ADMIN_ACTION": "СДЕЛАТЬ АДМИНИСТРАТОРОМ", + "DISABLE_ADMIN_ACTION": "ОТОЗВАТЬ АДМИНИСТРАТОРА", + "DEL_ACTION": "Удалить", + "FILTER_PLACEHOLDER": "Фильтровать пользователей", + "COLUMN_NAME": "Имя", + "COLUMN_ADMIN": "Администратор", + "COLUMN_EMAIL": "Почта", + "COLUMN_REG_NAME": "Время регистрации", + "IS_ADMIN": "Да", + "IS_NOT_ADMIN": "Нет", + "ADD_USER_TITLE": "Новый пользователь", + "SAVE_SUCCESS": "Новый пользователь успешно создан.", + "DELETION_TITLE": "Подтвердить удаление пользователя", + "DELETION_SUMMARY": "Вы хотите удалить пользователя {{param}}?", + "DELETE_SUCCESS": "Пользователи успешно удалены.", + "ITEMS": "элементов", + "OF": "из", + "RESET_OK": "Пароль пользователей успешно сброшен", + "EXISTING_PASSWORD": "Новый пароль не может совпадать со старым", + "UNKNOWN": "Неизвестно", + "UNKNOWN_TIP": "Пожалуйста, проверьте, имеет ли пользователь статус администратора через Систему Управления Идентификацией, если значение \"Неизвестно\"" + }, + "PROJECT": { + "PROJECTS": "Проекты", + "NAME": "Название проекта", + "ROLE": "Роль", + "PUBLIC_OR_PRIVATE": "Уровень доступа", + "REPO_COUNT": "Количество репозиториев", + "CHART_COUNT": "Количество диаграмм", + "CREATION_TIME": "Время создания", + "ACCESS_LEVEL": "Уровень доступа", + "PUBLIC": "Публичный", + "PRIVATE": "Приватный", + "MAKE": "Создать", + "NEW_POLICY": "Новое правило репликации", + "DELETE": "Удалить", + "ALL_PROJECTS": "Все проекты", + "PRIVATE_PROJECTS": "Приватные проекты", + "PUBLIC_PROJECTS": "Публичные проекты", + "PROJECT": "Проект", + "NEW_PROJECT": "Новый проект", + "NAME_TOOLTIP": "Название проекта должно содержать от 1 до 255 символов с нижними регистрами, цифрами и ._- и должно начинаться с символов или цифр.", + "NAME_IS_REQUIRED": "Название проекта обязательно.", + "NAME_ALREADY_EXISTS": "Название проекта уже существует.", + "NAME_IS_ILLEGAL": "Название проекта недействительно.", + "UNKNOWN_ERROR": "Произошла неизвестная ошибка при создании проекта.", + "ITEMS": "элементы", + "DELETION_TITLE": "Подтвердите удаление проекта", + "DELETION_SUMMARY": "Вы хотите удалить проект {{param}}?", + "FILTER_PLACEHOLDER": "Фильтровать проекты", + "REPLICATION_RULE": "Правило репликации", + "CREATED_SUCCESS": "Проект успешно создан.", + "DELETED_SUCCESS": "Проекты успешно удалены.", + "TOGGLED_SUCCESS": "Проект успешно переключен.", + "FAILED_TO_DELETE_PROJECT": "Проект содержит репозитории, правила репликации или диаграммы Helm и не может быть удален.", + "INLINE_HELP_PUBLIC": "Когда проект установлен как публичный, любой пользователь имеет права на чтение репозиториев в этом проекте, и пользователю не нужно выполнять \"docker login\" перед загрузкой образов в этот проект.", + "OF": "из", + "COUNT_QUOTA": "Квота по количеству", + "STORAGE_QUOTA": "Квота по хранилищу", + "COUNT_QUOTA_TIP": "Пожалуйста, введите целое число между '1' и '100,000,000', '-1' для неограниченного.", + "STORAGE_QUOTA_TIP": "Верхний предел Квоты по Хранилищу принимает только целые значения, ограниченные '1024TB'. Введите '-1' для неограниченной квоты", + "QUOTA_UNLIMIT_TIP": "Для неограниченной квоты введите '-1'.", + "TYPE": "Тип", + "PROXY_CACHE": "Прокси-кэш", + "PROXY_CACHE_TOOLTIP": "Включите это, чтобы разрешить проекту действовать как прокси-кэш для определенного экземпляра реестра. Harbor может действовать как прокси для DockerHub, Docker Registry, Harbor, Aws ECR, Azure ACR, Quay, Google GCR, Github GHCR и JFrog Artifactory.", + "ENDPOINT": "Конечная точка", + "PROXY_CACHE_ENDPOINT": "Конечная точка прокси-кэша", + "NO_PROJECT": "Мы не смогли найти никаких проектов" + }, + "PROJECT_DETAIL": { + "SUMMARY": "Сводка", + "REPOSITORIES": "Репозитории", + "REPLICATION": "Репликация", + "USERS": "Участники", + "LOGS": "Логи", + "LABELS": "Метки", + "PROJECTS": "Проекты", + "CONFIG": "Конфигурация", + "HELMCHART": "Диаграммы Helm", + "ROBOT_ACCOUNTS": "Аккаунты роботов", + "WEBHOOKS": "Вебхуки", + "IMMUTABLE_TAG": "Неизменяемые теги", + "POLICY": "Политика" + }, + "PROJECT_CONFIG": { + "REGISTRY": "Реестр проекта", + "PUBLIC_TOGGLE": "Публичный", + "PUBLIC_POLICY": "Сделать реестр проекта публичным сделает все репозитории доступными для всех.", + "SECURITY": "Безопасность развертывания", + "CONTENT_TRUST_TOGGLE": "Включить доверие к контенту", + "CONTENT_TRUST_POLCIY": "Разрешить развертывание только проверенных образов.", + "PREVENT_VULNERABLE_TOGGLE": "Предотвращать запуск уязвимых образов.", + "PREVENT_VULNERABLE_1": "Предотвращать развертывание образов с уязвимостью серьезности", + "PREVENT_VULNERABLE_2": "и выше.", + "SCAN": "Сканирование уязвимостей", + "AUTOSCAN_TOGGLE": "Автоматически сканировать образы при отправке", + "AUTOSCAN_POLICY": "Автоматически сканировать образы, когда они отправляются в реестр проекта." + }, + "MEMBER": { + "NEW_USER": "Добавить пользователя", + "NEW_MEMBER": "Новый участник", + "MEMBER": "Участник", + "NAME": "Имя", + "ROLE": "Роль", + "SYS_ADMIN": "Системный администратор", + "PROJECT_ADMIN": "Администратор проекта", + "PROJECT_MAINTAINER": "Сопровождающий", + "DEVELOPER": "Разработчик", + "GUEST": "Гость", + "LIMITED_GUEST": "Ограниченный гость", + "DELETE": "Удалить", + "ITEMS": "элементы", + "ACTIONS": "Действия", + "USER": "Пользователь", + "USERS": "Пользователи", + "EMAIL": "Почта", + "ADD_USER": "Добавить пользователя", + "NEW_USER_INFO": "Добавить пользователя в качестве участника этого проекта с указанной ролью", + "NEW_GROUP": "Новая группа", + "IMPORT_GROUP": "Добавить группу", + "NEW_GROUP_INFO": "Добавить существующую группу пользователей или выбрать группу из LDAP/AD в качестве участника проекта", + "ADD_GROUP_SELECT": "Добавить существующую группу пользователей в качестве участника проекта", + "CREATE_GROUP_SELECT": "Добавить группу из LDAP в качестве участника проекта", + "LDAP_SEARCH_DN": "LDAP Группа DN", + "LDAP_SEARCH_NAME": "Имя", + "LDAP_GROUP": "Группа", + "LDAP_GROUPS": "Группы", + "LDAP_PROPERTY": "Свойство", + "ACTION": "ДЕЙСТВИЕ", + "MEMBER_TYPE": "Тип участника", + "GROUP_TYPE": "Группа", + "USER_TYPE": "Пользователь", + "USERNAME_IS_REQUIRED": "Имя пользователя обязательно", + "USERNAME_DOES_NOT_EXISTS": "Имя пользователя не существует", + "USERNAME_ALREADY_EXISTS": "Имя пользователя уже добавлено в этот проект", + "UNKNOWN_ERROR": "Произошла неизвестная ошибка при добавлении участника", + "FILTER_PLACEHOLDER": "Фильтровать участников", + "DELETION_TITLE": "Подтвердите удаление участников проекта", + "DELETION_SUMMARY": "Вы хотите удалить участников проекта {{param}}?", + "ADDED_SUCCESS": "Участник успешно добавлен.", + "DELETED_SUCCESS": "Участник успешно удален.", + "SWITCHED_SUCCESS": "Роль участника успешно переключена.", + "OF": "из", + "SWITCH_TITLE": "Подтвердите переключение участников проекта", + "SWITCH_SUMMARY": "Вы хотите переключить участников проекта {{param}}?", + "SET_ROLE": "Установить роль", + "REMOVE": "Удалить", + "GROUP_NAME_REQUIRED": "Имя группы обязательно", + "NON_EXISTENT_GROUP": "Имя группы не существует", + "GROUP_ALREADY_ADDED": "Имя группы уже добавлено в этот проект" + }, + "ROBOT_ACCOUNT": { + "NAME": "Имя", + "PERMISSIONS": "Разрешения", + "TOKEN": "Секрет", + "NEW_ROBOT_ACCOUNT": "НОВЫЙ АККАУНТ РОБОТА", + "ENABLED_STATE": "Состояние включения", + "NUMBER_REQUIRED": "Поле обязательно и должно быть целым числом, отличным от 0.", + "DESCRIPTION": "Описание", + "CREATETION": "Время создания", + "EXPIRATION": "Срок действия", + "TOKEN_EXPIRATION": "Срок действия токена робота (Дни)", + "ACTION": "Действие", + "EDIT": "Редактировать", + "ITEMS": "элементы", + "OF": "из", + "DISABLE_ACCOUNT": "Деактивировать аккаунт", + "ENABLE_ACCOUNT": "Включить аккаунт", + "DELETE": "Удалить", + "CREAT_ROBOT_ACCOUNT": "Создать аккаунт робота", + "PERMISSIONS_ARTIFACT": "Артефакт", + "PERMISSIONS_HELMCHART": "Диаграмма Helm (Chart Museum)", + "PUSH": "Отправить", + "PULL": "Загрузить", + "FILTER_PLACEHOLDER": "Фильтровать аккаунты роботов", + "ROBOT_NAME": "Не может содержать специальные символы(~#$%) и максимальная длина должна быть 255 символов.", + "ACCOUNT_EXISTING": "Аккаунт робота уже существует.", + "ALERT_TEXT": "Это единственный раз, когда вы можете скопировать этот секрет. У вас не будет другого шанса", + "CREATED_SUCCESS": "Успешно создан '{{param}}'.", + "COPY_SUCCESS": "Секрет успешно скопирован для '{{param}}'", + "DELETION_TITLE": "Подтвердите удаление аккаунтов роботов", + "DELETION_SUMMARY": "Вы хотите удалить аккаунты роботов {{param}}?", + "PULL_IS_MUST": "Разрешение на загрузку проверяется по умолчанию и не может быть изменено.", + "EXPORT_TO_FILE": "экспортировать в файл", + "EXPIRES_AT": "Истекает", + "EXPIRATION_TOOLTIP": "Если не установлено, будет использоваться время истечения системной конфигурации", + "INVALID_VALUE": "Значение срока действия недействительно", + "NEVER_EXPIRED": "Никогда не истекает", + "NAME_PREFIX": "Префикс имени робота", + "NAME_PREFIX_REQUIRED": "Префикс имени робота обязателен" + }, + "WEBHOOK": { + "EDIT_BUTTON": "РЕДАКТИРОВАТЬ", + "ENABLED_BUTTON": "ВКЛЮЧИТЬ", + "DISABLED_BUTTON": "ДЕАКТИВИРОВАТЬ", + "TYPE": "Вебхук", + "STATUS": "Статус", + "CREATED": "Создан", + "ENABLED": "Включен", + "DISABLED": "Деактивирован", + "OF": "из", + "ITEMS": "элементы", + "LAST_TRIGGERED": "Последний запуск", + "EDIT_WEBHOOK": "Редактировать вебхук", + "ADD_WEBHOOK": "Добавить вебхук", + "CREATE_WEBHOOK": "Начать с вебхуков", + "EDIT_WEBHOOK_DESC": "Укажите конечную точку для получения уведомлений вебхуков", + "CREATE_WEBHOOK_DESC": "Чтобы начать с вебхуков, предоставьте конечную точку и учетные данные для доступа к серверу вебхуков.", + "VERIFY_REMOTE_CERT_TOOLTIP": "Определите, должен ли вебхук проверять сертификат удаленного URL. Снимите этот флажок, если удаленный URL использует самоподписанный или ненадежный сертификат.", + "ENDPOINT_URL": "URL конечной точки", + "URL_IS_REQUIRED": "URL конечной точки обязателен.", + "AUTH_HEADER": "Заголовок аутентификации", + "VERIFY_REMOTE_CERT": "Проверить удаленный сертификат", + "TEST_ENDPOINT_BUTTON": "ПРОВЕРИТЬ КОНЕЧНУЮ ТОЧКУ", + "CANCEL_BUTTON": "ОТМЕНА", + "SAVE_BUTTON": "СОХРАНИТЬ", + "TEST_ENDPOINT_SUCCESS": "Соединение успешно проверено.", + "TEST_ENDPOINT_FAILURE": "Не удалось проверить конечную точку.", + "ENABLED_WEBHOOK_TITLE": "Включить вебхук", + "ENABLED_WEBHOOK_SUMMARY": "Вы хотите включить вебхук {{name}}?", + "DISABLED_WEBHOOK_TITLE": "Деактивировать вебхук", + "DISABLED_WEBHOOK_SUMMARY": "Вы хотите деактивировать вебхук {{name}}?", + "DELETE_WEBHOOK_TITLE": "Удалить вебхук(и)", + "DELETE_WEBHOOK_SUMMARY": "Вы хотите удалить вебхук(и) {{names}}?", + "WEBHOOKS": "Вебхуки", + "NEW_WEBHOOK": "Новый вебхук", + "ENABLE": "Включить", + "DISABLE": "Деактивировать", + "NAME": "Имя", + "TARGET": "URL конечной точки", + "EVENT_TYPES": "Типы событий", + "DESCRIPTION": "Описание", + "NO_WEBHOOK": "Нет вебхука", + "LAST_TRIGGER": "Последний триггер", + "WEBHOOK_NAME": "Имя вебхука", + "NO_TRIGGER": "Нет триггера", + "NAME_REQUIRED": "Имя обязательно", + "NOTIFY_TYPE": "Тип уведомления", + "EVENT_TYPE": "Тип события", + "EVENT_TYPE_REQUIRED": "Требуется хотя бы один тип события" + }, + "GROUP": { + "GROUP": "Группа", + "GROUPS": "Группы", + "IMPORT_LDAP_GROUP": "Импорт LDAP группы", + "IMPORT_HTTP_GROUP": "Новая HTTP группа", + "IMPORT_OIDC_GROUP": "Новая OIDC группа", + "ADD": "Новая группа", + "EDIT": "Редактировать", + "DELETE": "Удалить", + "NAME": "Имя", + "TYPE": "Тип", + "DN": "DN", + "GROUP_DN": "DN LDAP группы", + "PROPERTY": "Свойство", + "REG_TIME": "Время регистрации", + "ADD_GROUP_SUCCESS": "Группа успешно добавлена", + "EDIT_GROUP_SUCCESS": "Группа успешно отредактирована", + "LDAP_TYPE": "LDAP", + "HTTP_TYPE": "HTTP", + "OIDC_TYPE": "OIDC", + "OF": "из", + "ITEMS": "элементов", + "NEW_MEMBER": "Новый участник группы", + "NEW_USER_INFO": "Добавить группу как участника этого проекта с указанной ролью", + "ROLE": "Роль", + "SYS_ADMIN": "Системный администратор", + "PROJECT_ADMIN": "Администратор проекта", + "PROJECT_MAINTAINER": "Сопровождающий проекта", + "DEVELOPER": "Разработчик", + "GUEST": "Гость", + "LIMITED_GUEST": "Ограниченный гость", + "DELETION_TITLE": "Подтверждение удаления участников группы", + "DELETION_SUMMARY": "Вы хотите удалить участника(ов) группы {{param}}?" + }, + "AUDIT_LOG": { + "USERNAME": "Имя пользователя", + "REPOSITORY_NAME": "Имя репозитория", + "TAGS": "Теги", + "OPERATION": "Операция", + "OPERATIONS": "Операции", + "TIMESTAMP": "Отметка времени", + "ALL_OPERATIONS": "Все операции", + "PULL": "Выгрузка", + "PUSH": "Загрузка", + "CREATE": "Создать", + "DELETE": "Удалить", + "OTHERS": "Другие", + "ADVANCED": "Расширенный", + "SIMPLE": "Простой", + "ITEMS": "элементов", + "FILTER_PLACEHOLDER": "Фильтровать логи", + "INVALID_DATE": "Неверная дата.", + "OF": "из", + "NOT_FOUND": "Мы не смогли найти никаких логов!", + "RESOURCE": "Ресурс", + "RESOURCE_TYPE": "Тип ресурса" + }, + "REPLICATION": { + "YES": "Да", + "SECONDS": "Секунды", + "MINUTES": "Минуты", + "HOURS": "Часы", + "MONTH": "Месяц", + "DAY_MONTH": "День месяца", + "DAY_WEEK": "День недели", + "CRON_TITLE": "Описание шаблона для cron '* * * * * *'. Строка cron основана на времени UTC", + "FIELD_NAME": "Имя поля", + "MANDATORY": "Обязательно?", + "ALLOWED_VALUES": "Допустимые значения", + "ALLOWED_CHARACTERS": "Допустимые специальные символы", + "TOTAL": "Всего", + "OVERRIDE": "Переопределить", + "ENABLED_RULE": "Включить правило", + "OVERRIDE_INFO": "Переопределить", + "OPERATION": "Операция", + "CURRENT": "текущий", + "FILTER_PLACEHOLDER": "Фильтровать задачи", + "STOP_TITLE": "Подтверждение остановки выполнений", + "BOTH": "оба", + "STOP_SUCCESS": "Остановка выполнения {{param}} успешна", + "STOP_SUMMARY": "Вы хотите остановить выполнения {{param}}?", + "TASK_ID": "ID задачи", + "RESOURCE_TYPE": "Тип ресурса", + "SOURCE": "Источник", + "DESTINATION": "Назначение", + "POLICY": "Политика", + "DURATION": "Длительность", + "SUCCESS_RATE": "Успешный процент", + "SUCCESS": "УСПЕШНО", + "FAILURE": "ОШИБКА", + "IN_PROGRESS": "В ПРОЦЕССЕ", + "REPLICATION_RULE": "Правило репликации", + "NEW_REPLICATION_RULE": "Новое правило репликации", + "ENDPOINTS": "Конечные точки", + "FILTER_POLICIES_PLACEHOLDER": "Фильтровать правила", + "FILTER_EXECUTIONS_PLACEHOLDER": "Фильтровать выполнения", + "DELETION_TITLE": "Подтверждение удаления правила репликации", + "DELETION_SUMMARY": "Вы хотите удалить правило репликации {{param}}?", + "REPLICATION_TITLE": "Подтверждение репликации правила", + "REPLICATION_SUMMARY": "Вы хотите реплицировать правило {{param}}?", + "DELETION_TITLE_FAILURE": "Не удалось удалить правило", + "DELETION_SUMMARY_FAILURE": "имеет статус ожидания/выполнения/повторной попытки", + "REPLICATE_SUMMARY_FAILURE": "имеет статус ожидания/выполнения", + "FILTER_TARGETS_PLACEHOLDER": "Фильтровать конечные точки", + "DELETION_TITLE_TARGET": "Подтверждение удаления конечной точки", + "DELETION_SUMMARY_TARGET": "Вы хотите удалить конечную точку {{param}}?", + "ADD_POLICY": "Новое правило репликации", + "EDIT_POLICY": "Редактировать", + "EDIT_POLICY_TITLE": "Редактировать правило репликации", + "DELETE_POLICY": "Удалить", + "TEST_CONNECTION": "Проверить соединение", + "TESTING_CONNECTION": "Проверка соединения...", + "TEST_CONNECTION_SUCCESS": "Соединение успешно проверено.", + "TEST_CONNECTION_FAILURE": "Не удалось проверить соединение с конечной точкой.", + "ID": "ID", + "NAME": "Имя", + "NAME_IS_REQUIRED": "Имя обязательно.", + "DESCRIPTION": "Описание", + "ENABLE": "Включить", + "DISABLE": "Деактивировать", + "REPLICATION_MODE": "Режим репликации", + "SRC_REGISTRY": "Реестр источника", + "DESTINATION_NAMESPACE": "Реестр назначения:Пространство имен", + "DESTINATION_NAME_IS_REQUIRED": "Имя конечной точки обязательно.", + "NEW_DESTINATION": "Новая конечная точка", + "DESTINATION_URL": "URL конечной точки", + "DESTINATION_URL_IS_REQUIRED": "URL конечной точки обязателен.", + "DESTINATION_USERNAME": "Имя пользователя", + "DESTINATION_PASSWORD": "Пароль", + "ALL_STATUS": "Все статусы", + "ENABLED": "Включено", + "DISABLED": "Деактивировано", + "LAST_START_TIME": "Последнее время запуска", + "ACTIVATION": "Активация", + "REPLICATION_EXECUTION": "Выполнение", + "REPLICATION_EXECUTIONS": "Выполнения", + "STOPJOB": "Остановить", + "ALL": "Все", + "PENDING": "Ожидание", + "RUNNING": "Выполнение", + "ERROR": "Ошибка", + "RETRYING": "Повторная попытка", + "STOPPED": "ОСТАНОВЛЕНО", + "FINISHED": "Завершено", + "CANCELED": "Отменено", + "SIMPLE": "Простой", + "ADVANCED": "Расширенный", + "STATUS": "Статус", + "REPLICATION_TRIGGER": "Триггер", + "CREATION_TIME": "Время начала", + "UPDATE_TIME": "Время обновления", + "END_TIME": "Время окончания", + "LOGS": "Логи", + "OF": "из", + "ITEMS": "элементов", + "NO_LOGS": "Нет логов", + "TOGGLE_ENABLE_TITLE": "Включить правило", + "TOGGLE_DISABLE_TITLE": "Деактивировать правило", + "CREATED_SUCCESS": "Правило репликации успешно создано.", + "UPDATED_SUCCESS": "Правило репликации успешно обновлено.", + "DELETED_SUCCESS": "Правило репликации успешно удалено.", + "DELETED_FAILED": "Не удалось удалить правило репликации.", + "TOGGLED_SUCCESS": "Статус правила репликации успешно изменен.", + "CANNOT_EDIT": "Правило репликации не может быть изменено, пока оно включено.", + "INVALID_DATE": "Неверная дата.", + "PLACEHOLDER": "Мы не смогли найти никаких правил репликации!", + "JOB_PLACEHOLDER": "Мы не смогли найти никаких задач репликации!", + "NO_ENDPOINT_INFO": "Пожалуйста, добавьте конечную точку первой", + "NO_LABEL_INFO": "Пожалуйста, добавьте метку первой", + "NO_PROJECT_INFO": "Этот проект не существует", + "SOURCE_RESOURCE_FILTER": "Фильтр ресурсов источника", + "SCHEDULED": "Запланировано", + "MANUAL": "Вручную", + "EVENT_BASED": "На основе событий", + "DAILY": "Ежедневно", + "WEEKLY": "Еженедельно", + "SETTING": "Настройки", + "TRIGGER": "Условие триггера", + "TARGETS": "Цель", + "MODE": "Режим", + "TRIGGER_MODE": "Режим триггера", + "SOURCE_PROJECT": "Проект источника", + "REPLICATE": "Реплицировать", + "DELETE_REMOTE_IMAGES": "Удалять удаленные ресурсы при локальном удалении", + "DELETE_ENABLED": "Включить эту политику", + "NEW": "Новый", + "NAME_TOOLTIP": "Имя правила репликации должно быть не менее 2 символов с нижними регистрами, цифрами и символами ._- и должно начинаться с символов или цифр.", + "DESTINATION_NAME_TOOLTIP": "Имя назначения должно быть не менее 2 символов с нижними регистрами, цифрами и символами ._- и должно начинаться с символов или цифр.", + "ACKNOWLEDGE": "Подтвердить", + "RULE_DISABLED": "Это правило было деактивировано, так как метка, используемая в его фильтре, была удалена. \n Отредактируйте правило и обновите его фильтр, чтобы включить его.", + "REPLI_MODE": "Режим репликации", + "SOURCE_REGISTRY": "Реестр источника", + "SOURCE_NAMESPACES": "Пространства имен источника", + "DEST_REGISTRY": "Реестр назначения", + "DEST_NAMESPACE": "Пространство имен назначения", + "NAMESPACE_TOOLTIP": "Имя пространства имен должно быть не менее 2 символов с нижними регистрами, цифрами и символами ._-/ и должно начинаться с символов или цифр.", + "TAG": "Тег", + "LABEL": "Метка", + "RESOURCE": "Ресурс", + "ENABLE_TITLE": "Включить правило", + "ENABLE_SUMMARY": "Вы хотите включить правило {{param}}?", + "DISABLE_TITLE": "Деактивировать правило", + "DISABLE_SUMMARY": "Вы хотите деактивировать правило {{param}}?", + "ENABLE_SUCCESS": "Правило успешно включено", + "ENABLE_FAILED": "Не удалось включить правило", + "DISABLE_SUCCESS": "Правило успешно деактивировано", + "DISABLE_FAILED": "Не удалось деактивировать правило", + "DES_REPO_FLATTENING": "Сглаживание репозитория назначения", + "NAMESPACE": "Пространство имен", + "REPO_FLATTENING": "Сглаживание", + "NO_FLATTING": "Без сглаживания", + "FLATTEN_LEVEL_1": "Сгладить 1 уровень", + "FLATTEN_LEVEL_2": "Сгладить 2 уровня", + "FLATTEN_LEVEL_3": "Сгладить 3 уровня", + "FLATTEN_ALL": "Сгладить все уровни", + "FLATTEN_LEVEL_TIP": "Уменьшить вложенную структуру репозитория при копировании образов. Предположим, что вложенная структура репозитория 'a/b/c/d/img', а пространство имен назначения 'ns', соответствующие результаты каждого элемента следующие:", + "FLATTEN_LEVEL_TIP_ALL": "'Сгладить все уровни'(Используется до v2.3): 'a/b/c/d/img' -> 'ns/img'", + "FLATTEN_LEVEL_TIP_NO": "'Без сглаживания': 'a/b/c/d/img' -> 'ns/a/b/c/d/img", + "FLATTEN_LEVEL_TIP_1": "'Сгладить 1 Уровень' (По умолчанию): 'a/b/c/d/img' -> 'ns/b/c/d/img'", + "FLATTEN_LEVEL_TIP_2": "'Сгладить 2 Уровня': 'a/b/c/d/img' -> 'ns/c/d/img'", + "FLATTEN_LEVEL_TIP_3": "'Сгладить 3 Уровня': 'a/b/c/d/img' -> 'ns/d/img'", + "NOTE": "Примечание: Диаграммы Chartmuseum поддерживают только структуру репозитория с 2 компонентами пути: 'a/chart'", + "BANDWIDTH": "Пропускная способность", + "BANDWIDTH_ERROR_TIP": "Пожалуйста, введите -1 или целое число больше 0", + "BANDWIDTH_TOOLTIP": "Установите максимальную пропускную способность сети для каждого выполнения. Обратите внимание на количество одновременных выполнений. Для неограниченной пропускной способности введите -1", + "UNLIMITED": "Неограниченно", + "UNREACHABLE_SOURCE_REGISTRY": "Не удалось подключиться к исходному реестру, убедитесь, что исходный реестр доступен перед редактированием этого правила: {{error}}", + "CRON_ERROR_TIP": "Поле обязательно для заполнения, и \"*\" не допускается для поля \"Минуты\"", + "COPY_BY_CHUNK": "Копировать по частям", + "COPY_BY_CHUNK_TIP": "Укажите, следует ли копировать большой двоичный объект по частям. Передача по частям может увеличить количество запросов API.", + "TRIGGER_STOP_SUCCESS": "Успешно запущено остановку выполнения" + }, + "DESTINATION": { + "NEW_ENDPOINT": "Новая Конечная Точка", + "PROVIDER": "Провайдер", + "ENDPOINT": "Конечная Точка", + "NAME": "Имя", + "NAME_IS_REQUIRED": "Имя конечной точки обязательно.", + "URL": "URL Конечной Точки", + "URL_IS_REQUIRED": "URL конечной точки обязателен.", + "AUTHENTICATION": "Аутентификация", + "ACCESS_ID": "Идентификатор Доступа", + "ACCESS_SECRET": "Секрет Доступа", + "STATUS": "Статус", + "TEST_CONNECTION": "Проверить Соединение", + "TITLE_EDIT": "Редактировать Конечную Точку", + "TITLE_ADD": "Новая Конечная Точка Реестра", + "EDIT": "Редактировать", + "DELETE": "Удалить", + "TESTING_CONNECTION": "Проверка Соединения...", + "TEST_CONNECTION_SUCCESS": "Соединение успешно проверено.", + "TEST_CONNECTION_FAILURE": "Не удалось пропинговать конечную точку.", + "CONFLICT_NAME": "Имя конечной точки уже существует.", + "INVALID_NAME": "Недопустимое имя конечной точки.", + "FAILED_TO_GET_TARGET": "Не удалось получить конечную точку.", + "CREATION_TIME": "Время Создания", + "OF": "из", + "ITEMS": "элементов", + "CREATED_SUCCESS": "Конечная точка успешно создана.", + "UPDATED_SUCCESS": "Конечная точка успешно обновлена.", + "DELETED_SUCCESS": "Конечные точки успешно удалены.", + "DELETED_FAILED": "Не удалось удалить конечные точки.", + "CANNOT_EDIT": "Конечную точку нельзя изменить, пока правило репликации активно.", + "FAILED_TO_DELETE_TARGET_IN_USED": "Не удалось удалить используемую конечную точку.", + "PLACEHOLDER": "Мы не смогли найти ни одной конечной точки!", + "DEPRECATED": "Helm Hub переходит на Artifact Hub" +}, + "REPOSITORY": { + "COPY_DIGEST_ID": "Копировать Хэш", + "DELETE": "Удалить", + "NAME": "Название", + "TAGS": "Теги", + "PLATFORM": "ОС/Архитектура", + "ARTIFACT_TOOTIP": "Нажмите, чтобы просмотреть список артефактов этого индекса OCI", + "ARTIFACTS_COUNT": "Артефакты", + "PULL_COUNT": "Загрузки", + "PULL_COMMAND": "Команда Загрузки", + "PULL_TIME": "Время Загрузки", + "PUSH_TIME": "Время Загрузки", + "IMMUTABLE": "Неизменяемый", + "MY_REPOSITORY": "Мой Репозиторий", + "PUBLIC_REPOSITORY": "Публичный Репозиторий", + "DELETION_TITLE_REPO": "Подтверждение Удаления Репозитория", + "DELETION_TITLE_REPO_SIGNED": "Репозиторий не может быть удален", + "DELETION_SUMMARY_REPO_SIGNED": "Репозиторий '{{repoName}}' не может быть удален, так как существуют следующие подписанные образы.\n{{signedImages}} \nПеред удалением репозитория необходимо отменить подпись всех подписанных образов!", + "DELETION_SUMMARY_REPO": "Вы хотите удалить репозиторий {{repoName}}?", + "DELETION_TITLE_ARTIFACT": "Подтверждение Удаления Артефакта", + "DELETION_SUMMARY_ARTIFACT": "Вы хотите удалить артефакт {{param}}? При удалении этого артефакта все теги, ссылающиеся на этот хэш, также будут удалены.", + "DELETION_TITLE_TAG": "Подтверждение Удаления Тега", + "DELETION_SUMMARY_TAG": "Вы хотите удалить тег {{param}}?", + "DELETION_TITLE_TAG_DENIED": "Подписанный тег не может быть удален", + "DELETION_SUMMARY_TAG_DENIED": "Тег должен быть удален из Нотариуса перед удалением.\nУдалить из Нотариуса с помощью этой команды:\n", + "TAGS_NO_DELETE": "Удаление запрещено в режиме только для чтения.", + "FILTER_FOR_REPOSITORIES": "Фильтр Репозиториев", + "TAG": "Тег", + "ARTIFACT": "Артефакт", + "ARTIFACTS": "Артефакты", + "SIZE": "Размер", + "VULNERABILITY": "Уязвимости", + "BUILD_HISTORY": "История Сборки", + "SIGNED": "Подписанный", + "AUTHOR": "Автор", + "CREATED": "Время Создания", + "DOCKER_VERSION": "Версия Docker", + "ARCHITECTURE": "Архитектура", + "OS": "ОС", + "SHOW_DETAILS": "Показать Детали", + "REPOSITORIES": "Репозитории", + "OF": "из", + "ITEMS": "элементов", + "NO_ITEMS": "НЕТ ЭЛЕМЕНТОВ", + "POP_REPOS": "Популярные Репозитории", + "DELETED_REPO_SUCCESS": "Репозитории успешно удалены.", + "DELETED_TAG_SUCCESS": "Теги успешно удалены.", + "COPY": "Копировать", + "NOTARY_IS_UNDETERMINED": "Невозможно определить подпись этого тега.", + "PLACEHOLDER": "Мы не смогли найти никаких репозиториев!", + "INFO": "Информация", + "NO_INFO": "Нет описания для этого репозитория. Вы можете добавить его в этот репозиторий.", + "IMAGE": "Образы", + "LABELS": "Метки", + "ADD_LABEL_TO_IMAGE": "Добавить метки к этому образу", + "FILTER_BY_LABEL": "Фильтровать образы по метке", + "FILTER_ARTIFACT_BY_LABEL": "Фильтровать артефакт по метке", + "ADD_LABELS": "Добавить Метки", + "RETAG": "Копировать", + "ACTION": "ДЕЙСТВИЕ", + "DEPLOY": "РАЗВЕРНУТЬ", + "ADDITIONAL_INFO": "Добавить Дополнительную Информацию", + "REPO_NAME": "Репозиторий", + "MARKDOWN": "Поддерживается оформление с помощью Markdown", + "LAST_MODIFIED": "Время Последнего Изменения" + }, + "HELM_CHART": { + "HELMCHARTS": "Диаграммы", + "CHARTVERSIONS": "Версии", + "UPLOAD_TITLE": "Загрузить файлы диаграммы", + "CHART_FILE": "Файл диаграммы", + "CHART_PROV": "Файл Prov", + "DOWNLOAD": "Скачать", + "SUMMARY": "Сводка", + "DEPENDENCIES": "Зависимости", + "VALUES": "Значения", + "OVERVIEW": "Обзор", + "HOME": "Главная", + "SRC_REPO": "Исходный репозиторий", + "CREATED": "Время создания", + "MAINTAINERS": "Сопровождающие", + "OTHER_MAINTAINERS": "{{ name }} и {{ number }} других", + "PULLS": "Количество запросов", + "VERSION": "Версия", + "APP_VERSION": "Версия приложения", + "INSTALL": "Установить", + "INSTALL_CHART": "Установить диаграмму", + "NAME": "Имя", + "REPO": "Репозиторий", + "FILTER_FOR_CHARTS": "Фильтр для диаграмм", + "DELETE": "Удалить", + "OF": "из", + "VERSIONS": "версий", + "IMAGES": "Изображения", + "ENGINE": "Движок", + "ACTION": "Действие", + "UPLOAD": "Загрузить", + "DELETE_CHART_VERSION_TITLE": "Удалить версии диаграммы", + "DELETE_CHART_VERSION": "Вы хотите удалить версию {{param}}?", + "IMPORT": "Импортировать", + "EXPORT": "Экспортировать", + "ADD_REPO": "Добавить репозиторий", + "SHOW_KV": "Пары ключ-значение", + "SHOW_YAML": "Файл YAML", + "PLACEHOLDER": "Мы не смогли найти никаких диаграмм!", + "NO_VERSION_PLACEHOLDER": "Мы не смогли найти никаких версий!", + "FILE_UPLOADED": "Файл успешно загружен", + "SIGN": "Подписать", + "SIGNED": "Подписано", + "UNSIGNED": "Не подписано", + "ITEMS": "элементов", + "NO_README": "Для этой диаграммы не предоставлен файл readme.", + "SECURITY": "Безопасность", + "ACTIVE": "Активно", + "DEPRECATED": "Устарело", + "VERIFY_CHART": "Проверить диаграмму", + "COMMAND": "Команды", + "PROV_FILE": "Файл Prov", + "READY": "Готово", + "NOT_READY": "Не готово", + "LABELS": "Метки", + "ADD_LABEL_TO_CHART_VERSION": "Добавить метки к этой версии диаграммы", + "STATUS": "Статус" + }, + "SUMMARY": { + "QUOTAS": "квоты", + "PROJECT_REPOSITORY": "Репозитории", + "PROJECT_HELM_CHART": "Диаграмма Helm", + "PROJECT_MEMBER": "Участники", + "PROJECT_QUOTAS": "Квоты", + "ARTIFACT_COUNT": "Количество артефактов", + "STORAGE_CONSUMPTION": "Потребление хранилища", + "ADMIN": "Администратор(ы)", + "MAINTAINER": "Сопровождающий(ие)", + "DEVELOPER": "Разработчик(и)", + "GUEST": "Гость(и)", + "LIMITED_GUEST": "Ограниченный гость(и)", + "SEE_ALL": "ПОСМОТРЕТЬ ВСЕ" + }, + "ALERT": { + "FORM_CHANGE_CONFIRMATION": "Некоторые изменения еще не сохранены. Вы хотите отменить?" + }, + "RESET_PWD": { + "TITLE": "Сбросить пароль", + "CAPTION": "Введите вашу почту, чтобы сбросить пароль", + "EMAIL": "Почта", + "SUCCESS": "Письмо со ссылкой для сброса пароля успешно отправлено. Вы можете закрыть это диалоговое окно и проверить свою почту.", + "CAPTION2": "Введите ваш новый пароль", + "RESET_OK": "Пароль успешно сброшен. Нажмите ОК, чтобы войти с новым паролем." + }, + "RECENT_LOG": { + "SUB_TITLE": "Показать", + "SUB_TITLE_SUFIX": "Логи" + }, + "CONFIG": { + "HISTORY": "История", + "TITLE": "Конфигурация", + "AUTH": "Аутентификация", + "REPLICATION": "Репликация", + "LABEL": "Метки", + "REPOSITORY": "Репозиторий", + "REPO_READ_ONLY": "Репозиторий только для чтения", + "WEBHOOK_NOTIFICATION_ENABLED": "Вебхуки включены", + "SYSTEM": "Настройки системы", + "PROJECT_QUOTAS": "Квоты проектов", + "VULNERABILITY": "Уязвимость", + "GC": "Сборка мусора", + "CONFIRM_TITLE": "Подтвердить отмену", + "CONFIRM_SUMMARY": "Некоторые изменения не были сохранены. Вы хотите отменить их?", + "SAVE_SUCCESS": "Конфигурация успешно сохранена.", + "VERIFY_REMOTE_CERT": "Проверка удаленного сертификата", + "TOKEN_EXPIRATION": "Срок действия токена (Минуты)", + "SESSION_TIMEOUT": "Тайм-аут сессии (Минуты)", + "SESSION_TIMEOUT_INFO": "Установите тайм-аут сессии для интерфейса Harbor. По умолчанию 60 минут.", + "AUTH_MODE": "Режим аутентификации", + "PRO_CREATION_RESTRICTION": "Создание проектов", + "SELF_REGISTRATION": "Разрешить саморегистрацию", + "AUTH_MODE_DB": "База данных", + "AUTH_MODE_LDAP": "LDAP", + "AUTH_MODE_UAA": "UAA", + "AUTH_MODE_HTTP": "HTTP аутентификация", + "AUTH_MODE_OIDC": "OIDC", + "SCOPE_BASE": "Базовый", + "SCOPE_ONE_LEVEL": "Один уровень", + "SCOPE_SUBTREE": "Поддерево", + "PRO_CREATION_EVERYONE": "Все", + "PRO_CREATION_ADMIN": "Только администратор", + "ROOT_CERT": "Корневой сертификат реестра", + "ROOT_CERT_LINK": "Скачать", + "REGISTRY_CERTIFICATE": "Сертификат реестра", + "NO_CHANGE": "Сохранение отменено, так как ничего не изменилось", + "TOOLTIP": { + "SELF_REGISTRATION_ENABLE": "Включить регистрацию.", + "SELF_REGISTRATION_DISABLE": "Отключить регистрацию.", + "VERIFY_REMOTE_CERT": "Определяет, должна ли репликация образов проверять сертификат удаленного реестра Harbor. Снимите этот флажок, если удаленный реестр использует самоподписанный или ненадежный сертификат.", + "AUTH_MODE": "По умолчанию режим аутентификации — база данных, т. е. учетные данные хранятся в локальной базе данных. Установите его в LDAP, если хотите проверить учетные данные пользователя на LDAP-сервере.", + "LDAP_SEARCH_DN": "DN пользователя, у которого есть разрешение на поиск на LDAP/AD сервере. Если ваш LDAP/AD сервер не поддерживает анонимный поиск, вы должны настроить этот DN и ldap_search_pwd.", + "LDAP_BASE_DN": "Базовый DN для поиска пользователя в LDAP/AD.", + "LDAP_UID": "Атрибут, используемый при поиске для сопоставления пользователя. Это может быть uid, cn, email, sAMAccountName или другие атрибуты в зависимости от вашего LDAP/AD.", + "LDAP_SCOPE": "Область поиска пользователей.", + "TOKEN_EXPIRATION": "Время истечения срока действия токена, созданного службой токенов. По умолчанию 30 минут.", + "ROBOT_NAME_PREFIX": "Префикс строки для каждого имени робота, значение по умолчанию 'robot$'", + "ROBOT_TOKEN_EXPIRATION": "Время истечения срока действия токена учетной записи робота, по умолчанию 30 дней. Отображает количество дней, преобразованных из минут и округленных в меньшую сторону", + "PRO_CREATION_RESTRICTION": "Флаг, определяющий, какие пользователи имеют право создавать проекты. По умолчанию любой может создать проект. Установите значение 'Только администратор', чтобы только администратор мог создать проект.", + "ROOT_CERT_DOWNLOAD": "Скачать корневой сертификат реестра.", + "SCANNING_POLICY": "Установить политику сканирования образов на основе различных требований. 'Нет': Нет активной политики; 'Ежедневно в': Запуск сканирования в указанное время каждый день.", + "VERIFY_CERT": "Проверить сертификат с LDAP сервера", + "REPO_TOOLTIP": "Пользователи не могут выполнять никаких операций с образами в этом режиме.", + "WEBHOOK_TOOLTIP": "Включите вебхуки, чтобы получать обратные вызовы на ваши назначенные конечные точки, когда выполняются определенные действия, такие как отправка, получение, удаление, сканирование образов или диаграмм", + "HOURLY_CRON": "Запускать один раз в час, в начале часа. Эквивалентно 0 0 * * * *.", + "WEEKLY_CRON": "Запускать один раз в неделю, в полночь между субботой и воскресеньем. Эквивалентно 0 0 0 * * 0.", + "DAILY_CRON": "Запускать один раз в день, в полночь. Эквивалентно 0 0 0 * * *." + }, + "LDAP": { + "URL": "URL сервера LDAP", + "SEARCH_DN": "Поиск DN в LDAP", + "SEARCH_PWD": "Пароль для поиска в LDAP", + "BASE_DN": "Базовый DN в LDAP", + "FILTER": "Фильтр LDAP", + "UID": "UID в LDAP", + "SCOPE": "Область поиска LDAP", + "VERIFY_CERT": "Проверка сертификата LDAP", + "LDAP_GROUP_BASE_DN": "Базовый DN группы в LDAP", + "LDAP_GROUP_BASE_DN_INFO": "Базовый DN, с которого будет производиться поиск группы в LDAP/AD. Это поле не может быть пустым, если вам нужно включить функциональность, связанную с группами LDAP.", + "LDAP_GROUP_FILTER": "Фильтр группы LDAP", + "LDAP_GROUP_FILTER_INFO": "Фильтр для поиска групп LDAP/AD. Для OpenLDAP: objectclass=groupOfNames. Для Active Directory: objectclass=group. Это поле не может быть пустым, если вам нужна функциональность, связанная с группами LDAP.", + "LDAP_GROUP_GID": "GID группы в LDAP", + "LDAP_GROUP_GID_INFO": "Атрибут, используемый для поиска пользователя, может быть uid, cn или другими атрибутами в зависимости от вашего LDAP/AD. Группа в Harbor будет называться по этому атрибуту по умолчанию. Это поле не может быть пустым, если вам нужно включить функциональность, связанную с группами LDAP.", + "LDAP_GROUP_ADMIN_DN": "DN администратора группы в LDAP", + "LDAP_GROUP_ADMIN_DN_INFO": "Укажите DN группы LDAP. Все пользователи LDAP в этой группе будут иметь права администратора в Harbor. Оставьте пустым, если не хотите этого.", + "LDAP_GROUP_MEMBERSHIP": "Членство в группе LDAP", + "LDAP_GROUP_MEMBERSHIP_INFO": "Атрибут, указывающий членство в группе LDAP, значение по умолчанию — memberof, в некоторых LDAP-серверах это может быть \"ismemberof\". Это поле не может быть пустым, если вам нужно включить функциональность, связанную с группами LDAP.", + "GROUP_SCOPE": "Область поиска групп LDAP", + "GROUP_SCOPE_INFO": "Область поиска групп, по умолчанию выбирается Subtree." + }, + "UAA": { + "ENDPOINT": "Конечная точка UAA", + "CLIENT_ID": "ID клиента UAA", + "CLIENT_SECRET": "Секрет клиента UAA", + "VERIFY_CERT": "Проверка сертификата UAA" + }, + "HTTP_AUTH": { + "ENDPOINT": "Конечная точка сервера", + "TOKEN_REVIEW": "Конечная точка проверки токена", + "SKIP_SEARCH": "Пропустить поиск", + "VERIFY_CERT": "Проверка сертификата", + "ADMIN_GROUPS": "Группы администраторов" + }, + "OIDC": { + "OIDC_PROVIDER": "Название провайдера OIDC", + "OIDC_REDIREC_URL": "Убедитесь, что URL перенаправления на провайдере OIDC установлен на", + "ENDPOINT": "Конечная точка OIDC", + "CLIENT_ID": "ID клиента OIDC", + "CLIENTSECRET": "Секрет клиента OIDC", + "SCOPE": "Область OIDC", + "OIDC_VERIFYCERT": "Проверка сертификата", + "OIDC_AUTOONBOARD": "Автоматическая регистрация", + "USER_CLAIM": "Утверждение имени пользователя", + "OIDC_SETNAME": "Установить имя пользователя OIDC", + "OIDC_SETNAMECONTENT": "Вы должны создать имя пользователя Harbor при первой аутентификации через сторонний сервис (OIDC). Это имя будет использоваться в Harbor для связи с проектами, ролями и т.д.", + "OIDC_USERNAME": "Имя пользователя", + "GROUP_CLAIM_NAME": "Имя утверждения группы", + "GROUP_CLAIM_NAME_INFO": "Имя пользовательского утверждения группы, которое вы настроили у своего провайдера OIDC", + "OIDC_ADMIN_GROUP": "Группа администраторов OIDC", + "OIDC_ADMIN_GROUP_INFO": "Укажите имя группы администраторов OIDC. Все пользователи OIDC в этой группе будут иметь права администратора в Harbor. Оставьте пустым, если не хотите этого.", + "OIDC_GROUP_FILTER": "Фильтр групп OIDC", + "OIDC_GROUP_FILTER_INFO": "Фильтр групп OIDC, которые соответствуют предоставленному регулярному выражению. Оставьте пустым, чтобы соответствовать всем группам." + }, + "SCANNING": { + "STOP_SCAN_ALL_SUCCESS": "Триггер остановки сканирования всех успешно!", + "TRIGGER_SCAN_ALL_SUCCESS": "Триггер сканирования всех успешно!", + "TRIGGER_SCAN_ALL_FAIL": "Не удалось запустить сканирование всех с ошибкой: {{error}}", + "TITLE": "Сканирование уязвимостей", + "SCAN_ALL": "Сканировать все", + "SCHEDULE_TO_SCAN_ALL": "Запланировать сканирование всех", + "SCAN_NOW": "СКАНИРОВАТЬ СЕЙЧАС", + "SCAN": "СКАНИРОВАТЬ", + "NONE_POLICY": "Нет", + "DAILY_POLICY": "Ежедневно в", + "REFRESH_POLICY": "При обновлении", + "DB_REFRESH_TIME": "База данных обновлена", + "DB_NOT_READY": "База данных уязвимостей может быть не полностью готова!", + "NEXT_SCAN": "Доступно после", + "STATUS": { + "PENDING": "В ожидании", + "RUNNING": "Выполняется", + "STOPPED": "Остановлено", + "ERROR": "Ошибка", + "SUCCESS": "Успешно", + "SCHEDULED": "Запланировано" + }, + "MANUAL": "Вручную", + "SCHEDULED": "Запланировано" + }, + "TEST_MAIL_SUCCESS": "Соединение с почтовым сервером подтверждено.", + "TEST_LDAP_SUCCESS": "Соединение с сервером LDAP подтверждено.", + "TEST_MAIL_FAILED": "Не удалось подтвердить соединение с почтовым сервером с ошибкой: {{param}}.", + "TEST_LDAP_FAILED": "Не удалось подтвердить соединение с сервером LDAP с ошибкой: {{param}}.", + "LEAVING_CONFIRMATION_TITLE": "Подтверждение выхода", + "LEAVING_CONFIRMATION_SUMMARY": "Изменения еще не сохранены. Хотите покинуть текущую страницу?", + "TEST_OIDC_SUCCESS": "Соединение с сервером OIDC подтверждено." + }, + "PAGE_NOT_FOUND": { + "MAIN_TITLE": "Страница не найдена", + "SUB_TITLE": "Перенаправление на главную страницу через", + "UNIT": "секунд..." + }, + "ABOUT": { + "VERSION": "Версия", + "BUILD": "Сборка", + "COPYRIGHT": "Проект Harbor — это проект с открытым исходным кодом, который хранит, подписывает и сканирует контент. Harbor расширяет открытый исходный код Docker Distribution, добавляя функциональность, обычно требуемую пользователями, такую как безопасность, управление идентификацией и доступом. Harbor поддерживает расширенные функции, такие как управление пользователями, контроль доступа, мониторинг активности и репликация между экземплярами. Наличие реестра ближе к среде сборки и выполнения также может улучшить эффективность передачи образов.", + "COPYRIGHT_SUFIX": ".", + "TRADEMARK": "VMware является зарегистрированной торговой маркой или торговой маркой VMware, Inc. в Соединенных Штатах и других странах. Все другие названия, упомянутые здесь, могут быть товарными знаками соответствующих компаний.", + "END_USER_LICENSE": "Лицензионное соглашение с конечным пользователем", + "OPEN_SOURCE_LICENSE": "Лицензия на открытый исходный код/Лицензия на сторонние продукты" + }, + "START_PAGE": { + "GETTING_START": "", + "GETTING_START_TITLE": "Начало работы" + }, + "TOP_REPO": "Популярные репозитории", + "STATISTICS": { + "PRO_ITEM": "Проекты", + "REPO_ITEM": "Репозитории", + "INDEX_PRIVATE": "Приватные", + "INDEX_PUB": "Публичные", + "INDEX_TOTAL": "Всего", + "STORAGE": "ХРАНИЛИЩЕ", + "LIMIT": "Лимит", + "STORAGE_USED": "Использовано хранилища" + }, + "SEARCH": { + "IN_PROGRESS": "Поиск...", + "BACK": "Назад" + }, + "VULNERABILITY": { + "STATE": { + "OTHER_STATUS": "Не сканировано", + "QUEUED": "В очереди", + "ERROR": "Просмотр лога", + "SCANNING": "Сканируется", + "STOPPED": "Сканирование остановлено" + }, + "GRID": { + "PLACEHOLDER": "Мы не смогли найти никаких результатов сканирования!", + "COLUMN_ID": "Уязвимость", + "COLUMN_SEVERITY": "Серьезность", + "COLUMN_PACKAGE": "Пакет", + "COLUMN_PACKAGES": "Пакеты", + "COLUMN_VERSION": "Текущая версия", + "COLUMN_FIXED": "Исправлено в версии", + "COLUMN_DESCRIPTION": "Описание", + "FOOT_ITEMS": "Элементы", + "FOOT_OF": "из", + "IN_ALLOW_LIST": "В списке разрешенных CVE", + "CVSS3": "CVSS3" + }, + "CHART": { + "SCANNING_TIME": "Время завершения сканирования:", + "SCANNING_PERCENT": "Процент завершения сканирования:", + "SCANNING_PERCENT_EXPLAIN": "Процент завершения сканирования рассчитывается как количество успешно отсканированных образов / общее количество образов, указанных в индексе образов.", + "TOOLTIPS_TITLE": "Из {{totalPackages}} {{package}} {{totalVulnerability}} известны {{vulnerability}}.", + "TOOLTIPS_TITLE_SINGULAR": "Из {{totalPackages}} {{package}} {{totalVulnerability}} известна {{vulnerability}}.", + "TOOLTIPS_TITLE_ZERO": "Не обнаружено уязвимостей" + }, + "SEVERITY": { + "CRITICAL": "Критическая", + "HIGH": "Высокая", + "MEDIUM": "Средняя", + "LOW": "Низкая", + "NONE": "Нет" + }, + "SINGULAR": "уязвимость", + "OVERALL_SEVERITY": "Серьезность уязвимости:", + "NO_VULNERABILITY": "Нет уязвимостей", + "PLURAL": "уязвимости", + "PLACEHOLDER": "Фильтровать уязвимости", + "PACKAGE": "пакет", + "PACKAGES": "пакеты", + "SCAN_NOW": "Сканировать", + "SCAN_BY": "СКАНИРОВАНО {{scanner}}", + "REPORTED_BY": "Сообщено {{scanner}}", + "NO_SCANNER": "НЕТ СКАНЕРА", + "TRIGGER_STOP_SUCCESS": "Триггер остановки сканирования успешно", + "STOP_NOW": "Остановить сканирование" + }, + "PUSH_IMAGE": { + "TITLE": "Команда отправки", + "DOCKER": "Docker", + "HELM": "Helm", + "CNAB": "CNAB", + "TAG_COMMAND_CHART": "Упаковать чарт для этого проекта:", + "PUSH_COMMAND_CHART": "Отправить чарт в этот проект:", + "PUSH_COMMAND_CNAB": "Отправить CNAB в этот проект:", + "TOOLTIP": "Ссылки на команды для отправки артефакта в этот проект.", + "TAG_COMMAND": "Пометить образ для этого проекта:", + "PUSH_COMMAND": "Отправить образ в этот проект:", + "COPY_ERROR": "Копирование не удалось, попробуйте скопировать ссылки на команды вручную." + }, + "ARTIFACT": { + "FILTER_FOR_ARTIFACTS": "Фильтр артефактов", + "ADDITIONS": "Дополнения", + "ANNOTATION": "Аннотации", + "OVERVIEW": "Обзор", + "IMAGE": "ИЗОБРАЖЕНИЕ", + "CHART": "ЧАРТ", + "CNAB": "CNAB", + "WASM": "WASM", + "TAGGED": "Помеченные", + "UNTAGGED": "Непомеченные", + "ALL": "Все", + "PLACEHOLDER": "Мы не смогли найти никаких артефактов!", + "SCAN_UNSUPPORTED": "Неподдерживаемый" + }, + "TAG": { + "CREATION_TIME_PREFIX": "Создано", + "CREATOR_PREFIX": "от", + "ANONYMITY": "анонимность", + "IMAGE_DETAILS": "Детали образа", + "DOCKER_VERSION": "Версия Docker", + "ARCHITECTURE": "Архитектура", + "OS": "ОС", + "OS_VERSION": "Версия ОС", + "HAVE": "имеет", + "HAS": "имеет", + "SCAN_COMPLETION_TIME": "Сканирование завершено", + "IMAGE_VULNERABILITIES": "Уязвимости образа", + "LEVEL_VULNERABILITIES": "Уровень уязвимостей", + "PLACEHOLDER": "Мы не смогли найти никаких тегов!", + "COPY_ERROR": "Копирование не удалось, попробуйте скопировать вручную.", + "FILTER_FOR_TAGS": "Фильтр тегов", + "AUTHOR": "Автор", + "LABELS": "Метки", + "CREATION": "Создано", + "COMMAND": "Команды", + "UPLOADTIME": "Время загрузки", + "NAME": "Имя", + "PULL_TIME": "Время вытягивания", + "PUSH_TIME": "Время отправки", + "OF": "из", + "ITEMS": "элементов", + "ADD_TAG": "ДОБАВИТЬ ТЕГ", + "REMOVE_TAG": "УДАЛИТЬ ТЕГ", + "NAME_ALREADY_EXISTS": "Тег уже существует в репозитории" + }, + "LABEL": { + "LABEL": "Метка", + "DESCRIPTION": "Описание", + "CREATION_TIME": "Время создания", + "NEW_LABEL": "Новая метка", + "EDIT": "Редактировать", + "DELETE": "Удалить", + "LABEL_NAME": "Имя метки", + "COLOR": "Цвет", + "FILTER_LABEL_PLACEHOLDER": "Фильтр меток", + "NO_LABELS": "Нет меток", + "DELETION_TITLE_TARGET": "Подтверждение удаления метки", + "DELETION_SUMMARY_TARGET": "Вы хотите удалить {{param}}?", + "PLACEHOLDER": "Мы не смогли найти никаких меток!", + "NAME_ALREADY_EXISTS": "Имя метки уже существует." + }, + "QUOTA": { + "PROJECT": "Проект", + "OWNER": "Владелец", + "COUNT": "Количество", + "STORAGE": "Хранилище", + "EDIT": "Редактировать", + "DELETE": "Удалить", + "OF": "из", + "PROJECT_QUOTA_DEFAULT_ARTIFACT": "Количество артефактов по умолчанию на проект", + "PROJECT_QUOTA_DEFAULT_DISK": "Дисковое пространство по умолчанию на проект", + "EDIT_PROJECT_QUOTAS": "Редактировать квоты проекта", + "EDIT_DEFAULT_PROJECT_QUOTAS": "Редактировать квоты по умолчанию для проектов", + "SET_QUOTAS": "Установить квоты проекта для проекта '{{params}}'", + "SET_DEFAULT_QUOTAS": "Установить квоты по умолчанию при создании новых проектов", + "COUNT_QUOTA": "Количество артефактов", + "COUNT_DEFAULT_QUOTA": "Количество артефактов по умолчанию", + "STORAGE_QUOTA": "Потребление хранилища", + "STORAGE_DEFAULT_QUOTA": "Потребление хранилища по умолчанию", + "SAVE_SUCCESS": "Редактирование квоты прошло успешно", + "UNLIMITED": "неограниченно", + "INVALID_INPUT": "неверный ввод", + "PLACEHOLDER": "Мы не смогли найти никаких квот проекта", + "FILTER_PLACEHOLDER": "Поиск по имени (точное совпадение)", + "QUOTA_USED": "Использовано квоты" + }, + "WEEKLY": { + "MONDAY": "Понедельник", + "TUESDAY": "Вторник", + "WEDNESDAY": "Среда", + "THURSDAY": "Четверг", + "FRIDAY": "Пятница", + "SATURDAY": "Суббота", + "SUNDAY": "Воскресенье" + }, + "OPERATION": { + "LOCAL_EVENT": "Локальные события", + "ALL": "Все", + "RUNNING": "Выполняется", + "FAILED": "Не удалось", + "STOP_EXECUTIONS": "Остановить выполнение", + "DELETE_PROJECT": "Удалить проект", + "DELETE_REPO": "Удалить репозиторий", + "DELETE_TAG": "Удалить тег", + "DELETE_USER": "Удалить пользователя", + "DELETE_ROBOT": "Удалить робота", + "DELETE_REGISTRY": "Удалить реестр", + "DELETE_REPLICATION": "Удалить репликацию", + "DELETE_MEMBER": "Удалить участника", + "DELETE_GROUP": "Удалить группу", + "DELETE_CHART_VERSION": "Удалить версию чарта", + "DELETE_CHART": "Удалить чарт", + "SWITCH_ROLE": "Сменить роль", + "ADD_GROUP": "Добавить группу", + "ADD_USER": "Добавить пользователя", + "DELETE_LABEL": "Удалить метку", + "REPLICATION": "Репликация", + "DAY_AGO": " день(ей) назад", + "HOUR_AGO": " час(ов) назад", + "MINUTE_AGO": " минут(ы) назад", + "SECOND_AGO": "менее 1 минуты", + "EVENT_LOG": "ЖУРНАЛ СОБЫТИЙ" + }, + "UNKNOWN_ERROR": "Произошли неизвестные ошибки. Пожалуйста, попробуйте позже.", + "UNAUTHORIZED_ERROR": "Ваша сессия недействительна или истекла. Вам нужно войти, чтобы продолжить.", + "REPO_READ_ONLY": "Harbor находится в режиме только для чтения, удаление репозитория, артефакта, тега и отправка образа будут отключены в режиме только для чтения.", + "FORBIDDEN_ERROR": "У вас нет необходимых прав для выполнения этого действия.", + "GENERAL_ERROR": "Произошли ошибки при вызове сервиса: {{param}}.", + "BAD_REQUEST_ERROR": "Мы не можем выполнить ваш запрос из-за неверного запроса.", + "NOT_FOUND_ERROR": "Ваш запрос не может быть выполнен, так как объект не существует.", + "CONFLICT_ERROR": "Мы не можем выполнить ваш запрос из-за конфликта.", + "PRECONDITION_FAILED": "Мы не можем выполнить ваш запрос из-за невыполнения предварительного условия.", + "SERVER_ERROR": "Мы не можем выполнить ваш запрос из-за внутренних ошибок сервера.", + "INCONRRECT_OLD_PWD": "Старый пароль неверный.", + "UNKNOWN": "н/д", + "STATUS": "Статус", + "START_TIME": "Время начала", + "CREATION_TIME": "Время создания", + "UPDATE_TIME": "Время обновления", + "LOGS": "Логи", + "PENDING": "Ожидание", + "FINISHED": "Завершено", + "STOPPED": "Остановлено", + "RUNNING": "Выполняется", + "ERROR": "Ошибка", + "SCHEDULE": { + "NONE": "Нет", + "DAILY": "Ежедневно", + "WEEKLY": "Еженедельно", + "HOURLY": "Ежечасно", + "CUSTOM": "Пользовательский", + "MANUAL": "Вручную", + "SCHEDULE": "Запланировано", + "CRON": "cron", + "ON": "в", + "AT": "в", + "NOSCHEDULE": "Произошла ошибка при получении расписания" + }, + "GC": { + "CURRENT_SCHEDULE": "Расписание для GC", + "GC_NOW": "GC СЕЙЧАС", + "JOB_HISTORY": "История GC", + "JOB_ID": "ID задания", + "TRIGGER_TYPE": "Тип триггера", + "LATEST_JOBS": "Последние {{param}} заданий", + "MSG_SUCCESS": "Сборка мусора прошла успешно", + "MSG_SCHEDULE_SET": "Расписание для сборки мусора установлено", + "MSG_SCHEDULE_RESET": "Расписание для сборки мусора сброшено", + "PARAMETERS": "Параметры", + "DELETE_UNTAGGED": "Разрешить сборку мусора для непомеченных артефактов", + "EXPLAIN": "GC — это ресурсоемкая операция, которая может повлиять на производительность реестра", + "DRY_RUN_SUCCESS": "Сухой запуск успешно запущен" + }, + "RETAG": { + "MSG_SUCCESS": "Артефакт успешно скопирован", + "TIP_REPO": "Имя репозитория разбивается на компоненты пути. Компонент имени репозитория должен состоять как минимум из одного символа нижнего регистра, алфавитно-цифровых символов, разделенных точками, тире или подчеркиваниями. Более строго, он должен соответствовать регулярному выражению [a-z0-9]+(?:[._-][a-z0-9]+)*. Если имя репозитория имеет два или более компонентов пути, они должны быть разделены косой чертой ('/'). Общая длина имени репозитория, включая косые черты, должна быть менее 256 символов.", + "TIP_TAG": "Тег — это метка, применяемая к образу Docker в репозитории. Теги — это способ различать различные образы в репозитории. Он должен соответствовать регулярному выражению: (`[\\w][\\w.-]{0,127}`)" + }, + "CVE_ALLOWLIST": { + "DEPLOYMENT_SECURITY": "Безопасность развертывания", + "CVE_ALLOWLIST": "Список разрешенных CVE", + "SYS_ALLOWLIST_EXPLAIN": "Системный список разрешенных позволяет игнорировать уязвимости в этом списке при расчете уязвимости образа.", + "ADD_SYS": "Добавить CVE ID в системный список разрешенных", + "WARNING_SYS": "Системный список разрешенных CVE истек. Вы можете включить список, продлив срок действия.", + "WARNING_PRO": "Проектный список разрешенных CVE истек. Вы можете включить список, продлив срок действия.", + "ADD": "ДОБАВИТЬ", + "ENTER": "Введите CVE ID(s)", + "HELP": "Разделитель: запятые или символы новой строки", + "NONE": "Нет", + "EXPIRES_AT": "Истекает", + "NEVER_EXPIRES": "Никогда не истекает", + "PRO_ALLOWLIST_EXPLAIN": "Проектный список разрешенных позволяет игнорировать уязвимости в этом списке в этом проекте при отправке и вытягивании образов.", + "PRO_OR_SYS": "Вы можете использовать список по умолчанию, настроенный на системном уровне, или нажать на 'Проектный список разрешенных', чтобы создать новый список", + "MERGE_INTO": "Добавьте отдельные CVE ID перед нажатием 'КОПИРОВАТЬ ИЗ СИСТЕМЫ', чтобы добавить системный список разрешенных.", + "SYS_ALLOWLIST": "Системный список разрешенных", + "PRO_ALLOWLIST": "Проектный список разрешенных", + "ADD_SYSTEM": "КОПИРОВАТЬ ИЗ СИСТЕМЫ" + }, + "TAG_RETENTION": { + "TAG_RETENTION": "Сохранение тегов", + "RETENTION_RULES": "Правила сохранения", + "RULE_NAME_1": " артефакты за последние {{number}} дней", + "RULE_NAME_2": " последние активные {{number}} артефактов", + "RULE_NAME_3": " последние отправленные {{number}} артефактов" + }, + "RETENTION": { + "RULE_NAME_4": " {{number}} последних артефактов", + "RULE_NAME_5": " всегда", + "ADD_RULE": "ДОБАВИТЬ ПРАВИЛО", + "ADD_RULE_HELP_1": "Нажмите кнопку ДОБАВИТЬ ПРАВИЛО, чтобы добавить правило.", + "ADD_RULE_HELP_2": "Политики хранения тегов запускаются один раз в день.", + "RETENTION_RUNS": "Запуски хранения", + "RUN_NOW": "ЗАПУСТИТЬ СЕЙЧАС", + "WHAT_IF_RUN": "ПРОБНЫЙ ЗАПУСК", + "ABORT": "ОТМЕНА", + "SERIAL": "ID", + "STATUS": "Статус", + "DRY_RUN": "Пробный запуск", + "START_TIME": "Время начала", + "DURATION": "Длительность", + "DETAILS": "Детали", + "REPOSITORY": "Репозиторий", + "EDIT": "Редактировать", + "DISABLE": "Деактивировать", + "ENABLE": "Активировать", + "DELETE": "Удалить", + "ADD_TITLE": "Добавить правило хранения тегов", + "ADD_SUBTITLE": "Укажите правило хранения тегов для этого проекта. Все правила хранения тегов рассчитываются независимо, и каждое правило может применяться к выбранному списку репозиториев.", + "BY_WHAT": "По количеству артефактов или количеству дней", + "RULE_TEMPLATE_1": " артефакты за последние # дней", + "RULE_TEMPLATE_2": " последние активные # артефактов", + "RULE_TEMPLATE_3": " последние загруженные # артефактов", + "RULE_TEMPLATE_4": " последние скачанные # артефактов", + "RULE_TEMPLATE_5": " всегда", + "ACTION_RETAIN": " хранить", + "UNIT_DAY": "ДНЕЙ", + "UNIT_COUNT": "КОЛИЧЕСТВО", + "NUMBER": "ЧИСЛО", + "IN_REPOSITORIES": "Для репозиториев", + "REP_SEPARATOR": "Введите несколько репозиториев через запятую, repo*, или **", + "TAGS": "Теги", + "UNTAGGED": " без тега", + "INCLUDE_UNTAGGED": " артефакты без тега", + "MATCHES_TAGS": "Соответствует тегам", + "MATCHES_EXCEPT_TAGS": "Соответствует, кроме тегов", + "TAG_SEPARATOR": "Введите несколько тегов через запятую, tag*, или **. При необходимости включите все артефакты без тега при применении селектора 'включая' или 'исключая', установив флажок выше.", + "LABELS": "Метки", + "MATCHES_LABELS": "Соответствует меткам", + "MATCHES_EXCEPT_LABELS": "Соответствует, кроме меток", + "REP_LABELS": "Введите несколько меток через запятую", + "RETENTION_RUN": "Запуск хранения", + "RETENTION_RUN_EXPLAIN": "Выполнение политики хранения может иметь негативные последствия для артефактов в этом проекте, и затронутые теги артефактов будут удалены. Нажмите ОТМЕНА и используйте ПРОБНЫЙ ЗАПУСК для симуляции эффекта этой политики. В противном случае нажмите ЗАПУСТИТЬ, чтобы продолжить.", + "RETENTION_RUN_ABORTED": "Запуск хранения отменен", + "RETENTION_RUN_ABORTED_EXPLAIN": "Этот запуск хранения был отменен. Удаленные артефакты необратимы. Вы можете инициировать другой запуск, чтобы продолжить удаление артефактов. Для симуляции запуска вы можете использовать “ПРОБНЫЙ ЗАПУСК”.", + "LOADING": "Загрузка...", + "NO_EXECUTION": "Мы не смогли найти никаких выполнений!", + "NO_HISTORY": "Мы не смогли найти никакой истории!", + "DELETION": "Удаления", + "EDIT_TITLE": "Редактировать правило хранения тегов", + "LOG": "Лог", + "EXCLUDES": "Исключает", + "MATCHES": "Соответствует", + "REPO": " репозитории", + "EXC": " исключая ", + "MAT": " соответствующие ", + "AND": " и", + "WITH": " с ", + "WITHOUT": " без ", + "LOWER_LABELS": " метки", + "WITH_CONDITION": " с", + "LOWER_TAGS": " теги", + "TRIGGER": "Расписание", + "RETAINED": "Хранится", + "TOTAL": "Всего", + "NONE": " нет", + "RULE_NAME_6": " артефакты, скачанные за последние {{number}} дней", + "RULE_NAME_7": " артефакты, загруженные за последние {{number}} дней", + "RULE_TEMPLATE_6": " артефакты, скачанные за последние # дней", + "RULE_TEMPLATE_7": " артефакты, загруженные за последние # дней", + "SCHEDULE": "Расписание", + "SCHEDULE_WARNING": "Выполнение политики хранения приводит к необратимому удалению артефактов из проекта Harbor. Пожалуйста, дважды проверьте все политики перед планированием.", + "EXISTING_RULE": "Существующее правило", + "ILLEGAL_RULE": "Недопустимое правило", + "INVALID_RULE": "Недействительное правило", + "COUNT_LARGE": "Параметр \"КОЛИЧЕСТВО\" слишком велик", + "DAYS_LARGE": "Параметр \"ДНЕЙ\" слишком велик", + "EXECUTION_TYPE": "Тип выполнения", + "ACTION": "ДЕЙСТВИЕ", + "YES": "Да", + "NO": "Нет" + }, + "IMMUTABLE_TAG": { + "IMMUTABLE_RULES": "Правила неизменяемости", + "ADD_RULE": "ДОБАВИТЬ ПРАВИЛО", + "ADD_RULE_HELP_1": "Нажмите кнопку ДОБАВИТЬ ПРАВИЛО, чтобы добавить правило.", + "EDIT": "Редактировать", + "DISABLE": "Деактивировать", + "ENABLE": "Активировать", + "DELETE": "Удалить", + "ADD_TITLE": "Добавить правило неизменяемости тегов", + "ADD_SUBTITLE": "Укажите правило неизменяемости тегов для этого проекта. Примечание: все правила неизменяемости тегов сначала рассчитываются независимо, а затем объединяются для получения окончательного набора неизменяемых тегов.", + "IN_REPOSITORIES": "Для репозиториев", + "REP_SEPARATOR": "Введите несколько репозиториев через запятую, repo*, или **", + "TAGS": "Теги", + "TAG_SEPARATOR": "Введите несколько тегов через запятую, tag*, или **.", + "EDIT_TITLE": "Редактировать правило неизменяемости тегов", + "EXC": " исключая ", + "MAT": " соответствующие ", + "AND": " и", + "WITH": " с ", + "WITHOUT": " без ", + "LOWER_LABELS": " метки", + "LOWER_TAGS": " теги", + "NONE": " нет", + "EXISTING_RULE": "Существующее правило", + "ACTION": "ДЕЙСТВИЕ" + }, + "SCANNER": { + "DELETION_SUMMARY": "Вы хотите удалить сканер {{param}}?", + "SKIP_CERT_VERIFY": "Установите этот флажок, чтобы пропустить проверку сертификата, когда удаленный реестр использует самоподписанный или ненадежный сертификат.", + "NAME": "Имя", + "NAME_EXISTS": "Имя уже существует", + "NAME_REQUIRED": "Имя обязательно", + "NAME_REX": "Имя должно быть не менее 2 символов с нижними регистрами, цифрами и ._- и должно начинаться с символов или цифр.", + "DESCRIPTION": "Описание", + "ENDPOINT": "Конечная точка", + "ENDPOINT_EXISTS": "EndpointUrl уже существует", + "ENDPOINT_REQUIRED": "EndpointUrl обязателен", + "ILLEGAL_ENDPOINT": "EndpointUrl недопустим", + "AUTH": "Авторизация", + "NONE": "Нет", + "BASIC": "Базовая", + "BEARER": "Bearer", + "API_KEY": "APIKey", + "USERNAME": "Имя пользователя", + "USERNAME_REQUIRED": "Имя пользователя обязательно", + "PASSWORD": "Пароль", + "PASSWORD_REQUIRED": "Пароль обязателен", + "TOKEN": "Токен", + "TOKEN_REQUIRED": "Токен обязателен", + "API_KEY_REQUIRED": "APIKey обязателен", + "SKIP": "Пропустить проверку сертификата", + "ADD_SCANNER": "Добавить сканер", + "EDIT_SCANNER": "Редактировать сканер", + "TEST_CONNECTION": "ПРОВЕРИТЬ СОЕДИНЕНИЕ", + "ADD_SUCCESS": "Успешно добавлено ", + "TEST_PASS": "Тест пройден", + "TEST_FAILED": "Ping: регистрация {{name}}:{{url}} недоступна", + "UPDATE_SUCCESS": "Успешно обновлено", + "SCANNER_COLON": "Сканер:", + "NAME_COLON": "Имя:", + "VENDOR_COLON": "Поставщик:", + "VERSION_COLON": "Версия:", + "CAPABILITIES": "Возможности", + "CONSUMES_MIME_TYPES_COLON": "Типы MIME для потребления:", + "PRODUCTS_MIME_TYPES_COLON": "Типы MIME для производства:", + "PROPERTIES": "Свойства", + "NEW_SCANNER": "НОВЫЙ СКАНЕР", + "SET_AS_DEFAULT": "УСТАНОВИТЬ ПО УМОЛЧАНИЮ", + "HEALTH": "Здоровье", + "DISABLED": "Деактивирован", + "NO_SCANNER": "Не удалось найти ни одного сканера", + "DEFAULT": "По умолчанию", + "HEALTHY": "Здоров", + "UNHEALTHY": "Нездоров", + "SCANNERS": "Сканеры", + "SCANNER": "Сканер", + "EDIT": "Редактировать", + "NOT_AVAILABLE": "Недоступно", + "ADAPTER": "Адаптер", + "VENDOR": "Поставщик", + "VERSION": "Версия", + "SELECT_SCANNER": "Выбрать сканер", + "ENABLED": "Активирован", + "ENABLE": "Активировать", + "DISABLE": "Деактивировать", + "DELETE_SUCCESS": "Успешно удалено", + "TOTAL": "Всего", + "FIXABLE": "Исправимо", + "DURATION": "Длительность:", + "OPTIONS": "Опции", + "USE_INNER": "Использовать внутренний адрес реестра", + "USE_INNER_TIP": "Если этот параметр установлен, сканер будет принудительно использовать внутренний адрес реестра для доступа к соответствующим контентам.", + "VULNERABILITY_SEVERITY": "Серьезность уязвимости:", + "CONFIRM_DELETION": "Подтвердить удаление сканера", + "NO_PROJECT_SCANNER": "Нет сканера", + "SET_UNHEALTHY_SCANNER": "Выбранный сканер:{{name}} нездоров", + "SCANNED_BY": "Просканировано:", + "IMAGE_SCANNERS": "Сканеры изображений", + "VIEW_DOC": "просмотреть документацию", + "ALL_SCANNERS": "Все сканеры", + "HELP_INFO_1": "Сканер по умолчанию установлен. Чтобы установить другие сканеры, обратитесь к ", + "HELP_INFO_2": "документации.", + "NO_DEFAULT_SCANNER": "Нет сканера по умолчанию" + }, + "DISTRIBUTION": { + "FILTER_INSTANCE_PLACEHOLDER": "Фильтровать экземпляры", + "FILTER_HISTORIES_PLACEHOLDER": "Фильтровать истории", + "ADD_ACTION": "НОВЫЙ ЭКЗЕМПЛЯР", + "PREHEAT_ACTION": "Предварительный нагрев", + "EDIT_ACTION": "Редактировать", + "ENABLE_ACTION": "Активировать", + "DISABLE_ACTION": "Деактивировать", + "DELETE_ACTION": "Удалить", + "NOT_FOUND": "Мы не смогли найти ни одного экземпляра!", + "NAME": "Имя", + "ENDPOINT": "Конечная точка", + "STATUS": "Статус", + "ENABLED": "Активирован", + "SETUP_TIMESTAMP": "Время настройки", + "PROVIDER": "Поставщик", + "DELETION_TITLE": "Подтвердить удаление экземпляра", + "DELETION_SUMMARY": "Вы хотите удалить экземпляр(ы) {{param}}?", + "ENABLE_TITLE": "Активировать экземпляр(ы)", + "ENABLE_SUMMARY": "Вы хотите активировать экземпляр(ы) {{param}}?", + "DISABLE_TITLE": "Деактивировать экземпляр(ы)", + "DISABLE_SUMMARY": "Вы хотите деактивировать экземпляр(ы) {{param}}?", + "IMAGE": "Изображение", + "START_TIME": "Время начала", + "FINISH_TIME": "Время окончания", + "INSTANCE": "Экземпляр", + "HISTORIES": "Истории", + "CREATE_SUCCESS": "Экземпляр успешно создан", + "CREATE_FAILED": "Ошибка при создании экземпляра", + "DELETED_SUCCESS": "Экземпляр(ы) успешно удален(ы)", + "DELETED_FAILED": "Ошибка при удалении экземпляра(ов)", + "ENABLE_SUCCESS": "Экземпляр(ы) успешно активирован(ы)", + "ENABLE_FAILED": "Ошибка при активации экземпляра(ов)", + "DISABLE_SUCCESS": "Экземпляр(ы) успешно деактивирован(ы)", + "DISABLE_FAILED": "Ошибка при деактивации экземпляра(ов)", + "UPDATE_SUCCESS": "Экземпляр успешно обновлен", + "UPDATE_FAILED": "Ошибка при обновлении экземпляра", + "REQUEST_PREHEAT_SUCCESS": "Запрос на предварительный нагрев успешно выполнен", + "REQUEST_PREHEAT_FAILED": "Ошибка при запросе на предварительный нагрев", + "DESCRIPTION": "Описание", + "AUTH_MODE": "Режим аутентификации", + "USERNAME": "Имя пользователя", + "PASSWORD": "Пароль", + "TOKEN": "Токен", + "SETUP_NEW_INSTANCE": "Настроить новый экземпляр", + "EDIT_INSTANCE": "Редактировать экземпляр", + "SETUP": { + "NAME_PLACEHOLDER": "Введите имя экземпляра", + "DESCRIPTION_PLACEHOLDER": "Введите описание экземпляра", + "ENDPOINT_PLACEHOLDER": "Введите конечную точку экземпляра", + "USERNAME_PLACEHOLDER": "Введите имя пользователя", + "PASSWORD_PLACEHOLDER": "Введите пароль", + "TOKEN_PLACEHOLDER": "Введите токен" + }, + "MAINTAINER": "Ответственный(е)", + "SOURCE": "Источник", + "VERSION": "Версия", + "SET_AS_DEFAULT": "Установить по умолчанию", + "DELETE_INSTANCE": "Удалить экземпляр", + "ENABLE_INSTANCE": "Активировать экземпляр", + "DISABLE_INSTANCE": "Деактивировать экземпляр", + "SET_DEFAULT_SUCCESS": "Успешно установлено по умолчанию", + "SET_DEFAULT_FAILED": "Ошибка при установке по умолчанию", + "UPDATE_INSTANCE": "Обновить экземпляр", + "CREATE_INSTANCE": "Создать экземпляр" + }, + "P2P_PROVIDER": { + "P2P_PROVIDER": "P2P Предварительный нагрев", + "POLICIES": "Политики", + "NEW_POLICY": "НОВАЯ ПОЛИТИКА", + "NAME": "Имя", + "ENABLED": "Активировано", + "PROVIDER": "Поставщик", + "FILTERS": "Фильтры", + "TRIGGER": "Триггер", + "CREATED": "Время создания", + "DESCRIPTION": "Описание", + "NO_POLICY": "Нет политики", + "ENABLED_POLICY_SUMMARY": "Вы хотите активировать политику {{name}}?", + "DISABLED_POLICY_SUMMARY": "Вы хотите деактивировать политику {{name}}?", + "ENABLED_POLICY_TITLE": "Активировать Политику", + "DISABLED_POLICY_TITLE": "Деактивировать Политику", + "DELETE_POLICY_SUMMARY": "Вы хотите удалить политику {{names}}?", + "EDIT_POLICY": "Редактировать политику P2P Поставщика", + "ADD_POLICY": "Создать политику P2P Поставщика", + "NAME_REQUIRED": "Имя обязательно", + "PROVIDER_REQUIRED": "Поставщик обязателен", + "ADDED_SUCCESS": "Политика успешно добавлена", + "UPDATED_SUCCESS": "Политика успешно обновлена", + "EXECUTE": "ВЫПОЛНИТЬ", + "EXECUTE_SUCCESSFULLY": "Успешно выполнено", + "EXECUTE_TITLE": "Подтвердить выполнение политики", + "EXECUTE_SUMMARY": "Вы хотите выполнить политику {{param}}?", + "STOP_TITLE": "Подтвердить остановку выполнения", + "STOP_SUMMARY": "Вы хотите остановить выполнение политики {{param}}?", + "STOP_SUCCESSFULLY": "Успешно остановлено", + "STATUS_MSG": "Сообщение о статусе", + "JOB_PLACEHOLDER": "Мы не смогли найти никаких выполнений", + "PROVIDER_TYPE": "Поставщик", + "ID": "ID выполнения", + "NO_PROVIDER": "Пожалуйста, сначала добавьте поставщика", + "ARTIFACT": "Артефакт", + "DIGEST": "Дайджест", + "TYPE": "Тип", + "TASKS": "Задачи", + "TASKS_PLACEHOLDER": "Мы не смогли найти никаких задач", + "SEVERITY_WARNING": "Настройки уязвимостей здесь конфликтуют с соответствующей конфигурацией проекта, которая переопределит настройки здесь", + "REPOS": "Репозитории", + "TAGS": "Теги", + "CRITERIA": "Критерии", + "ONLY_SIGNED": "Только подписанные образы", + "PREHEAT_ON_PUSH": "Предварительный нагрев при отправке", + "START_TEXT": "Нет уязвимости серьезности", + "EDN_TEXT": "и выше", + "LABELS": "Метки", + "SCHEDULE": "Расписание", + "TEST_FAILED": "Тест не пройден", + "MANUAL": "Ручной", + "SCHEDULED": "Запланированный", + "EVENT_BASED": "Событийно-ориентированный", + "EVENT_BASED_EXPLAIN_LINE1": "Политика будет оцениваться всякий раз, когда происходят следующие события:", + "EVENT_BASED_EXPLAIN_LINE2": "Артефакт отправлен", + "EVENT_BASED_EXPLAIN_LINE3": "Артефакт помечен", + "EVENT_BASED_EXPLAIN_LINE4": "Артефакт просканирован", + "REPO_REQUIRED": "Репозиторий обязателен", + "TAG_REQUIRED": "Тег обязателен", + "DELETE_SUCCESSFULLY": "Политика успешно удалена", + "UPDATED_SUCCESSFULLY": "Политика успешно обновлена", + "EXECUTIONS": "Выполнения", + "TAG_SEPARATOR": "Введите несколько тегов, разделенных запятыми, tag*, или **", + "CONTENT_WARNING": "Настройки доверия к содержимому здесь конфликтуют с соответствующей конфигурацией проекта, которая переопределит настройки здесь", + "PREHEAT_EXPLAIN": "Предварительный нагрев перенесет образ в сеть p2p", + "CRITERIA_EXPLAIN": "Как указано в разделе 'Безопасность развертывания' вкладки Конфигурация", + "SKIP_CERT_VERIFY": "Установите этот флажок, чтобы пропустить проверку сертификата, когда удаленный поставщик использует самоподписанный или ненадежный сертификат.", + "NAME_TOOLTIP": "Имя политики должно быть не менее 2 символов с нижними регистрами, цифрами и ._- и должно начинаться с символов или цифр.", + "NEED_HELP": "Пожалуйста, обратитесь к системному администратору, чтобы добавить поставщика" + }, + "PAGINATION": { + "PAGE_SIZE": "Размер страницы" + }, + "SYSTEM_ROBOT": { + "READ": "Чтение", + "CREATE": "Создание", + "ARTIFACT": "Артефакт", + "HELM": "Helm Chart", + "HELM_VERSION": "Версия Helm Chart", + "ADD_ROBOT": "Добавить Робота", + "UPDATE_ROBOT": "Обновить Робота", + "UPDATE_ROBOT_SUCCESSFULLY": "Робот успешно обновлен", + "PLACEHOLDER": "Введите новый секрет", + "SECRET": "Секрет должен быть длиной от 8 до 20 символов с хотя бы одной заглавной буквой, одной строчной буквой и одной цифрой.", + "REFRESH_SECRET": "Обновить Секрет", + "REFRESH_SECRET_SUCCESS": "Секрет успешно обновлен", + "DELETE_ROBOT": "Удалить Робота", + "DELETE_ROBOT_SUCCESS": "Робот(ы) успешно удален(ы)", + "ENABLE_TITLE": "Активировать Робота", + "ENABLE_SUMMARY": "Вы хотите активировать робота {{param}}?", + "DISABLE_TITLE": "Деактивировать Робота", + "DISABLE_SUMMARY": "Вы хотите деактивировать робота {{param}}?", + "ENABLE_ROBOT_SUCCESSFULLY": "Робот успешно активирован", + "DISABLE_ROBOT_SUCCESSFULLY": "Робот успешно деактивирован", + "ROBOT_ACCOUNT": "Аккаунт Робота", + "PROJECTS": "Проекты", + "ALL_PROJECTS": "Все проекты с", + "PERMISSIONS": "ПРАВА ДОСТУПА", + "REFRESH_SECRET_SUMMARY": "Автоматически обновите секрет аккаунта робота или, при необходимости, откройте детали, чтобы вручную указать новый секрет", + "TOKEN": "Секрет", + "NEW_TOKEN": "Новый Секрет", + "REFRESH": "ОБНОВИТЬ", + "PROJECTS_MODAL_TITLE": "Проекты для Аккаунта Робота", + "PROJECTS_MODAL_SUMMARY": "Это проекты, которые охватываются этим аккаунтом робота.", + "CREATE_ROBOT": "Создать Системный Аккаунт Робота", + "CREATE_ROBOT_SUMMARY": "Создайте системный аккаунт робота, который будет охватывать определенные проекты. Выберите \"Охватывать все проекты\", чтобы применить ко всем существующим и будущим проектам", + "EDIT_ROBOT": "Редактировать Системный Аккаунт Робота", + "EDIT_ROBOT_SUMMARY": "Редактируйте системный аккаунт робота. Выберите \"Охватывать все проекты\", чтобы применить ко всем существующим и будущим проектам", + "EXPIRATION_TIME": "Время истечения", + "EXPIRATION_TIME_EXPLAIN": "Время истечения (в днях, отправной точкой является время создания) токена аккаунта робота. Для того, чтобы он никогда не истекал, введите \"-1\".", + "EXPIRATION_DEFAULT": "дней(по умолчанию)", + "EXPIRATION_DAYS": "Указать количество дней", + "EXPIRATION_NEVER": "Никогда", + "EXPIRATION_REQUIRED": "Требуется действительное время истечения", + "COVER_ALL": "Охватывать все проекты", + "COVER_ALL_EXPLAIN": "Установите флажок, чтобы применить ко всем существующим и будущим проектам", + "COVER_ALL_SUMMARY": "Выбраны все текущие и будущие проекты.", + "RESET_PERMISSION": "СБРОСИТЬ ПРАВА ДОСТУПА", + "PERMISSION_COLUMN": "Права доступа", + "EXPIRES_AT": "Истекает в", + "VIEW_SECRET": "ОБНОВИТЬ СЕКРЕТ", + "LEGACY": "Устаревший", + "CREATE_PROJECT_ROBOT": "Создать Аккаунт Робота", + "CREATE_PROJECT_ROBOT_SUMMARY": "Создайте аккаунт робота для этого проекта", + "EDIT_PROJECT_ROBOT": "Редактировать Аккаунт Робота", + "EDIT_PROJECT_ROBOT_SUMMARY": "Редактируйте аккаунт робота для этого проекта", + "NOT_FOUND": "Мы не смогли найти никаких роботов!", + "SELECT_ALL": "Выбрать все", + "UNSELECT_ALL": "Снять выбор со всего", + "ROBOT_ACCOUNT_NAV": "Аккаунты Роботов", + "COVERED_PROJECTS": "ПРОЕКТ(Ы)", + "CONFIRM_SECRET": "Подтвердить Секрет", + "SECRET_AGAIN": "Введите секрет еще раз", + "INCONSISTENT": "Два секрета не совпадают", + "NAME_TOOLTIP": "Имя робота должно быть длиной от 1 до 255 символов с нижними регистрами, цифрами и ._- и должно начинаться с символов или цифр.", + "ENABLE_NEW_SECRET": "Включите эту опцию, чтобы вручную указать новый секрет", + "DELETE": "Удалить", + "ARTIFACT_LABEL": "Метка артефакта", + "SCAN": "Сканировать", + "SCANNER_PULL": "Сканер Пулл", + "SEARCH_BY_NAME": "Поиск по имени (без префикса)", + "FINAL_PROJECT_NAME_TIP": "Финальное имя проекта робота состоит из префикса, имени проекта, знака плюс и текущего введенного значения", + "FINAL_SYSTEM_NAME_TIP": "Финальное системное имя робота состоит из префикса и текущего введенного значения", + "PUSH_AND_PULL": "Отправить", + "PUSH_PERMISSION_TOOLTIP": "Разрешение на отправку не может работать отдельно, оно должно работать вместе с разрешением на скачивание", + "STOP": "Остановить", + "LIST": "Список", + "REPOSITORY": "Репозиторий", + "HELM_LABEL": "Метка Helm Chart", + "EXPIRES_IN": "Истекает через", + "EXPIRED": "Истек" + }, + "ACCESSORY": { + "DELETION_TITLE_ACCESSORY": "Подтверждение удаления дополнения", + "DELETION_SUMMARY_ACCESSORY": "Вы хотите удалить все дополнения артефакта {{param}}?", + "DELETION_SUMMARY_ONE_ACCESSORY": "Вы хотите удалить дополнение(я) {{param}}?", + "DELETE_ACCESSORY": "Удалить дополнение", + "DELETED_SUCCESS": "Дополнение успешно удалено", + "DELETED_FAILED": "Не удалось удалить дополнение", + "CO_SIGNED": "Подписано Cosign", + "NOTARY_SIGNED": "Подписано Notary", + "ACCESSORY": "Дополнение", + "ACCESSORIES": "Дополнения", + "SUBJECT_ARTIFACT": "Основной артефакт", + "CO_SIGN": "Cosign", + "NOTARY": "Notary", + "PLACEHOLDER": "Мы не смогли найти никаких дополнений!" + }, + "CLEARANCES": { + "CLEARANCES": "Очистка", + "AUDIT_LOG": "Смена журнала", + "LAST_COMPLETED": "Последнее выполнение", + "NEXT_SCHEDULED_TIME": "Следующее запланированное время", + "SCHEDULE_TO_PURGE": "Запланировать очистку", + "KEEP_IN": "Сохранять записи в", + "KEEP_IN_TOOLTIP": "Сохранять записи в этом интервале", + "KEEP_IN_ERROR": "Значение этого элемента должно быть целым числом, а временное значение должно быть больше 0 и меньше 10000 дней", + "DAYS": "Дни", + "HOURS": "Часы", + "INCLUDED_OPERATIONS": "Включенные операции", + "INCLUDED_OPERATION_TOOLTIP": "Удалить журналы аудита для выбранных операций", + "INCLUDED_OPERATION_ERROR": "Пожалуйста, выберите хотя бы одну операцию", + "PURGE_NOW": "ОЧИСТИТЬ СЕЙЧАС", + "PURGE_NOW_SUCCESS": "Очистка успешно запущена", + "PURGE_SCHEDULE_RESET": "Расписание очистки было сброшено", + "PURGE_HISTORY": "История очистки", + "FORWARD_ENDPOINT": "Конечная точка пересылки журнала аудита Syslog", + "FORWARD_ENDPOINT_TOOLTIP": "Пересылать журналы аудита на конечную точку syslog, например: harbor-log:10514", + "SKIP_DATABASE": "Пропустить базу данных журнала аудита", + "SKIP_DATABASE_TOOLTIP": "Пропустить запись журнала аудита в базу данных, доступно только при настроенной конечной точке пересылки журнала аудита", + "STOP_GC_SUCCESS": "Успешно запущено остановка операции GC", + "STOP_PURGE_SUCCESS": "Успешно запущено остановка операции очистки", + "NO_GC_RECORDS": "Мы не смогли найти никаких историй GC!", + "NO_PURGE_RECORDS": "Мы не смогли найти никаких историй очистки!" + }, + "CVE_EXPORT": { + "EXPORT_SOME_PROJECTS": "Экспорт CVE", + "ALL_PROJECTS": "Все проекты", + "EXPORT_TITLE": "Экспорт CVE", + "EXPORT_SUBTITLE": "Установить условия экспорта", + "EXPORT_CVE_FILTER_HELP_TEXT": "Введите несколько идентификаторов CVE, разделенных запятыми", + "CVE_IDS": "Идентификаторы CVE", + "EXPORT_BUTTON": "ЭКСПОРТ", + "JOB_NAME": "Имя задания", + "JOB_NAME_REQUIRED": "Имя задания обязательно", + "JOB_NAME_EXISTING": "Имя задания уже существует", + "TRIGGER_EXPORT_SUCCESS": "Успешно запущен экспорт CVE!" + }, + "JOB_SERVICE_DASHBOARD": { + "SCHEDULE_PAUSED": "Запланировано(Приостановлено)", + "SCHEDULE_BEEN_PAUSED": "{{param}} было приостановлено", + "PENDING_JOBS": "Ожидающие задания в очередях", + "OTHERS": "Другие", + "STOP_ALL": "ОСТАНОВИТЬ ВСЕ", + "CONFIRM_STOP_ALL": "Подтвердить остановку всех", + "CONFIRM_STOP_ALL_CONTENT": "Вы хотите остановить все очереди заданий?", + "STOP_ALL_SUCCESS": "Успешно остановлены все очереди заданий", + "STOP_BTN": "ОСТАНОВИТЬ", + "PAUSE_BTN": "ПРИОСТАНОВИТЬ", + "RESUME_BTN": "ВОЗОБНОВИТЬ", + "JOB_TYPE": "Тип задания", + "PENDING_COUNT": "Количество ожидающих", + "LATENCY": "Задержка", + "PAUSED": "Приостановлено", + "NO_JOB_QUEUE": "Мы не смогли найти никаких очередей заданий", + "CONFIRM_STOPPING_JOBS": "Подтвердить остановку заданий", + "CONFIRM_STOPPING_JOBS_CONTENT": "Вы хотите остановить задания {{param}}?", + "CONFIRM_PAUSING_JOBS": "Подтвердить приостановку заданий", + "CONFIRM_PAUSING_JOBS_CONTENT": "Вы хотите приостановить задания {{param}}?", + "CONFIRM_RESUMING_JOBS": "Подтвердить возобновление заданий", + "CONFIRM_RESUMING_JOBS_CONTENT": "Вы хотите возобновить задания {{param}}?", + "STOP_SUCCESS": "Успешно остановлены задания", + "PAUSE_SUCCESS": "Успешно приостановлены задания", + "RESUME_SUCCESS": "Успешно возобновлены задания", + "SCHEDULES": "Расписания", + "RUNNING_STATUS": "Выполняется", + "RESUME_ALL_BTN_TEXT": "ВОЗОБНОВИТЬ ВСЕ", + "PAUSE_ALL_BTN_TEXT": "ПРИОСТАНОВИТЬ ВСЕ", + "CONFIRM_PAUSING_ALL": "Подтвердить приостановку всех", + "CONFIRM_PAUSING_ALL_CONTENT": "Вы хотите приостановить все расписания заданий?", + "CONFIRM_RESUMING_ALL": "Подтвердить возобновление всех", + "CONFIRM_RESUMING_ALL_CONTENT": "Вы хотите возобновить все расписания заданий?", + "PAUSE_ALL_SUCCESS": "Успешно приостановлены все расписания", + "RESUME_ALL_SUCCESS": "Успешно возобновлены все расписания", + "VENDOR_TYPE": "Тип поставщика", + "VENDOR_ID": "Идентификатор поставщика", + "NO_SCHEDULE": "Мы не смогли найти никаких расписаний", + "WORKERS": "Рабочие", + "FREE_ALL": "Освободить все", + "CONFIRM_FREE_ALL": "Подтвердить освобождение всех", + "CONFIRM_FREE_ALL_CONTENT": "Вы хотите освободить всех рабочих?", + "CONFIRM_FREE_WORKERS": "Подтвердить освобождение рабочих", + "CONFIRM_FREE_WORKERS_CONTENT": "Вы хотите освободить рабочих {{param}}?", + "FREE_WORKER_SUCCESS": "Успешно освобождены рабочие", + "FREE_ALL_SUCCESS": "Успешно освобождены все рабочие", + "WORKER_POOL": "Пул рабочих", + "WORKER_POOL_ID": "Идентификатор пула рабочих", + "PID": "Pid", + "START_AT": "Начато в", + "HEARTBEAT_AT": "Последний пульс в", + "CONCURRENCY": "Параллелизм", + "NO_WORKER_POOL": "Мы не смогли найти никаких пулов рабочих", + "FREE": "Освободить", + "WORKER_ID": "Идентификатор рабочего", + "JOB_ID": "Идентификатор задания", + "CHECK_IN_AT": "Зарегистрирован в", + "NO_WORKER": "Мы не смогли найти никаких рабочих", + "JOB_QUEUE": "Очереди заданий", + "JOB_SERVICE_DASHBOARD": "Панель управления сервисом заданий", + "OPERATION_STOP_ALL_QUEUES": "Остановить все очереди заданий", + "OPERATION_STOP_SPECIFIED_QUEUES": "Остановить указанные очереди заданий", + "OPERATION_PAUSE_SPECIFIED_QUEUES": "Приостановить указанные очереди заданий", + "OPERATION_RESUME_SPECIFIED_QUEUES": "Возобновить указанные очереди заданий", + "OPERATION_PAUSE_SCHEDULE": "Приостановить все расписания", + "OPERATION_RESUME_SCHEDULE": "Возобновить все расписания", + "OPERATION_FREE_ALL": "Освободить всех рабочих", + "OPERATION_FREE_SPECIFIED_WORKERS": "Освободить указанных рабочих", + "QUEUE_STOP_BTN_INFO": "ОСТАНОВИТЬ — Остановить и удалить все задания в выбранных очередях.", + "QUEUE_PAUSE_BTN_INFO": "ПРИОСТАНОВИТЬ — Приостановить выполнение заданий в этом типе очереди заданий. Задания могут быть поставлены в очередь, когда очередь приостановлена.", + "QUEUE_RESUME_BTN_INFO": "ВОЗОБНОВИТЬ — Возобновить выполнение заданий в этом типе очереди заданий.", + "SCHEDULE_PAUSE_BTN_INFO": "ПРИОСТАНОВИТЬ — Приостановить все расписания для выполнения.", + "SCHEDULE_RESUME_BTN_INFO": "ВОЗОБНОВИТЬ — Возобновить все расписания для выполнения.", + "WORKER_FREE_BTN_INFO": "Остановить текущее выполняемое задание, чтобы освободить рабочего", + "CRON": "Cron" + } +} diff --git a/src/portal/src/i18n/lang/tr-tr-lang.json b/src/portal/src/i18n/lang/tr-tr-lang.json index ac4df4cad12..1b97201314d 100644 --- a/src/portal/src/i18n/lang/tr-tr-lang.json +++ b/src/portal/src/i18n/lang/tr-tr-lang.json @@ -1573,7 +1573,6 @@ "SET_UNHEALTHY_SCANNER": "Selected scanner:{{name}} is unhealthy", "SCANNED_BY": "Scanned by:", "IMAGE_SCANNERS": "Image Scanners", - "VIEW_DOC": "view documentation", "ALL_SCANNERS": "All scanners", "HELP_INFO_1": "The default scanner has been installed. To install other scanners refer to the ", "HELP_INFO_2": "documentation.", diff --git a/src/portal/src/i18n/lang/zh-cn-lang.json b/src/portal/src/i18n/lang/zh-cn-lang.json index cebb66f8b00..409dae4ea60 100644 --- a/src/portal/src/i18n/lang/zh-cn-lang.json +++ b/src/portal/src/i18n/lang/zh-cn-lang.json @@ -1571,7 +1571,6 @@ "SET_UNHEALTHY_SCANNER": "选择的扫描器:{{name}}是不健康的", "SCANNED_BY": "扫描器:", "IMAGE_SCANNERS": "镜像扫描器", - "VIEW_DOC": "查看文档", "ALL_SCANNERS": "全部扫描器", "HELP_INFO_1": "默认扫描器已安装。获取扫描器安装帮助,请查看", "HELP_INFO_2": "文档。", diff --git a/src/portal/src/i18n/lang/zh-tw-lang.json b/src/portal/src/i18n/lang/zh-tw-lang.json index 3de4517b6b9..e2734c1cb4e 100644 --- a/src/portal/src/i18n/lang/zh-tw-lang.json +++ b/src/portal/src/i18n/lang/zh-tw-lang.json @@ -1569,7 +1569,6 @@ "SET_UNHEALTHY_SCANNER": "所選擇的掃描器:{{name}} 是不健康的", "SCANNED_BY": "由此掃描:", "IMAGE_SCANNERS": "映像檔掃描器", - "VIEW_DOC": "檢視文件", "ALL_SCANNERS": "全部掃描器", "HELP_INFO_1": "預設掃描器已安裝。如需其他掃描器的安裝說明,請參閱", "HELP_INFO_2": "說明文件。", diff --git a/src/registryctl/api/base.go b/src/registryctl/api/base.go index d40711e1387..fa4aaefba5b 100644 --- a/src/registryctl/api/base.go +++ b/src/registryctl/api/base.go @@ -48,7 +48,7 @@ func HandleError(w http.ResponseWriter, err error) { } // WriteJSON response status code will be written automatically if there is an error -func WriteJSON(w http.ResponseWriter, v interface{}) error { +func WriteJSON(w http.ResponseWriter, v any) error { b, err := json.Marshal(v) if err != nil { HandleInternalServerError(w, err) diff --git a/src/server/middleware/cosign/cosign_test.go b/src/server/middleware/cosign/cosign_test.go index d50109e00b8..a37f8d7b328 100644 --- a/src/server/middleware/cosign/cosign_test.go +++ b/src/server/middleware/cosign/cosign_test.go @@ -143,7 +143,7 @@ func (suite *MiddlewareTestSuite) TestCosignSignature() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": subArtDigest, }, }) @@ -173,7 +173,7 @@ func (suite *MiddlewareTestSuite) TestCosignSignatureDup() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": accID, }, }) diff --git a/src/server/middleware/csrf/csrf_test.go b/src/server/middleware/csrf/csrf_test.go index 1b9e75512a0..acc1649d8ad 100644 --- a/src/server/middleware/csrf/csrf_test.go +++ b/src/server/middleware/csrf/csrf_test.go @@ -21,7 +21,7 @@ func resetMiddleware() { func TestMain(m *testing.M) { test.InitDatabaseFromEnv() - conf := map[string]interface{}{} + conf := map[string]any{} config.InitWithSettings(conf) result := m.Run() if result != 0 { @@ -94,12 +94,12 @@ func TestMiddlewareInvalidKey(t *testing.T) { func TestSecureCookie(t *testing.T) { assert.True(t, secureCookie()) - conf := map[string]interface{}{ + conf := map[string]any{ common.ExtEndpoint: "http://harbor.test", } config.InitWithSettings(conf) assert.False(t, secureCookie()) - conf = map[string]interface{}{} + conf = map[string]any{} config.InitWithSettings(conf) } diff --git a/src/server/middleware/log/log_test.go b/src/server/middleware/log/log_test.go index e40440ff912..83d3901a8b9 100644 --- a/src/server/middleware/log/log_test.go +++ b/src/server/middleware/log/log_test.go @@ -48,7 +48,7 @@ func (s *MiddlewareTestSuite) TestTableMiddleware() { type args struct { headers map[string]string - fields map[string]interface{} + fields map[string]any ctxTraceparent string } tests := []struct { diff --git a/src/server/middleware/repoproxy/proxy.go b/src/server/middleware/repoproxy/proxy.go index d5a2dcbc684..75abdcae26a 100644 --- a/src/server/middleware/repoproxy/proxy.go +++ b/src/server/middleware/repoproxy/proxy.go @@ -329,7 +329,7 @@ func proxyManifestHead(ctx context.Context, w http.ResponseWriter, ctl proxy.Con // Then GET the image by digest, in order to associate the tag with the digest // Ensure tag after head request, make sure tags in proxy cache keep update bCtx := orm.Context() - for i := 0; i < ensureTagMaxRetry; i++ { + for range ensureTagMaxRetry { time.Sleep(ensureTagInterval) bArt := lib.ArtifactInfo{ProjectName: art.ProjectName, Repository: art.Repository, Digest: string(desc.Digest)} err := ctl.EnsureTag(bCtx, bArt, art.Tag) diff --git a/src/server/middleware/security/auth_proxy_test.go b/src/server/middleware/security/auth_proxy_test.go index b4a65924432..22b93caf9af 100644 --- a/src/server/middleware/security/auth_proxy_test.go +++ b/src/server/middleware/security/auth_proxy_test.go @@ -45,7 +45,7 @@ func TestAuthProxy(t *testing.T) { require.Nil(t, err) defer server.Close() - c := map[string]interface{}{ + c := map[string]any{ common.HTTPAuthProxySkipSearch: "true", common.HTTPAuthProxyVerifyCert: "false", common.HTTPAuthProxyEndpoint: "https://auth.proxy/suffix", diff --git a/src/server/middleware/security/robot_test.go b/src/server/middleware/security/robot_test.go index 3976f3b2fda..890b609fbe1 100644 --- a/src/server/middleware/security/robot_test.go +++ b/src/server/middleware/security/robot_test.go @@ -26,7 +26,7 @@ import ( ) func TestRobot(t *testing.T) { - conf := map[string]interface{}{ + conf := map[string]any{ common.RobotNamePrefix: "robot@", } config.InitWithSettings(conf) diff --git a/src/server/middleware/subject/subject_test.go b/src/server/middleware/subject/subject_test.go index 323b0c78bb7..a0c02114db7 100644 --- a/src/server/middleware/subject/subject_test.go +++ b/src/server/middleware/subject/subject_test.go @@ -177,7 +177,7 @@ func (suite *MiddlewareTestSuite) TestSubject() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": subArtDigest, }, }) @@ -213,7 +213,7 @@ func (suite *MiddlewareTestSuite) TestSubjectAfterAcc() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "SubjectArtifactDigest": subArtDigest, "SubjectArtifactRepo": name, }, @@ -242,7 +242,7 @@ func (suite *MiddlewareTestSuite) TestSubjectDup() { suite.Equal(http.StatusCreated, res.Code) accs, err := accessory.Mgr.List(suite.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ID": accID, }, }) diff --git a/src/server/middleware/transaction/transaction_test.go b/src/server/middleware/transaction/transaction_test.go index 994947a6c61..0d3aae88262 100644 --- a/src/server/middleware/transaction/transaction_test.go +++ b/src/server/middleware/transaction/transaction_test.go @@ -47,10 +47,10 @@ func (m *mockOrmer) Reset() { type mockTxOrmer struct { o.TxOrmer commitErr error - records []interface{} + records []any } -func (m *mockTxOrmer) Insert(i interface{}) (int64, error) { +func (m *mockTxOrmer) Insert(i any) (int64, error) { m.records = append(m.records, i) return int64(len(m.records)), nil } diff --git a/src/server/middleware/v2auth/auth.go b/src/server/middleware/v2auth/auth.go index a64fcf0ac97..b7d8687a0a4 100644 --- a/src/server/middleware/v2auth/auth.go +++ b/src/server/middleware/v2auth/auth.go @@ -97,11 +97,10 @@ func getChallenge(req *http.Request, accessList []access) string { return `Basic realm="harbor"` } // No auth header, treat it as CLI and redirect to token service - ep, err := tokenSvcEndpoint(req) + tokenSvc, err := tokenSvcURL(req) if err != nil { logger.Errorf("failed to get the endpoint for token service, error: %v", err) } - tokenSvc := fmt.Sprintf("%s/service/token", strings.TrimSuffix(ep, "/")) scope := "" for _, a := range accessList { if len(scope) > 0 { @@ -116,12 +115,28 @@ func getChallenge(req *http.Request, accessList []access) string { return challenge } -func tokenSvcEndpoint(req *http.Request) (string, error) { +func tokenSvcURL(req *http.Request) (string, error) { + getURL := func(ep string) string { + return fmt.Sprintf("%s/service/token", strings.TrimSuffix(ep, "/")) + } + // TODO: Double check if the internal core URL can be removed, after the token service URI is built according to the Host info in request. rawCoreURL := config.InternalCoreURL() if match(req.Context(), req.Host, rawCoreURL) { - return rawCoreURL, nil + return getURL(rawCoreURL), nil + } + extEp, err := config.ExtEndpoint() + if err != nil { + return "", err + } + if len(req.Host) > 0 { + l := strings.Split(extEp, "://") + if len(l) > 1 { + return getURL(l[0] + "://" + req.Host), nil + } + return getURL(req.Host), nil } - return config.ExtEndpoint() + log.Infof("The Host is empty in the request, forming the URL via the configured external endpoint: %s", extEp) + return getURL(extEp), nil } func match(ctx context.Context, reqHost, rawURL string) bool { diff --git a/src/server/middleware/v2auth/auth_test.go b/src/server/middleware/v2auth/auth_test.go index 060a59eb7f1..c635ef76654 100644 --- a/src/server/middleware/v2auth/auth_test.go +++ b/src/server/middleware/v2auth/auth_test.go @@ -46,7 +46,7 @@ func TestMain(m *testing.M) { ctl := &projecttesting.Controller{} mockGet := func(ctx context.Context, - projectIDOrName interface{}, options ...project.Option) (*proModels.Project, error) { + projectIDOrName any, options ...project.Option) (*proModels.Project, error) { name := projectIDOrName.(string) id, _ := strconv.Atoi(strings.TrimPrefix(name, "project_")) if id == 0 { @@ -59,12 +59,12 @@ func TestMain(m *testing.M) { } mock.OnAnything(ctl, "Get").Return( func(ctx context.Context, - projectIDOrName interface{}, options ...project.Option) *proModels.Project { + projectIDOrName any, options ...project.Option) *proModels.Project { p, _ := mockGet(ctx, projectIDOrName, options...) return p }, func(ctx context.Context, - projectIDOrName interface{}, options ...project.Option) error { + projectIDOrName any, options ...project.Option) error { _, err := mockGet(ctx, projectIDOrName, options...) return err }, @@ -73,7 +73,7 @@ func TestMain(m *testing.M) { checker = reqChecker{ ctl: ctl, } - conf := map[string]interface{}{ + conf := map[string]any{ common.ExtEndpoint: "https://harbor.test", common.CoreURL: "https://harbor.core:8443", } @@ -222,70 +222,107 @@ func TestMiddleware(t *testing.T) { } func TestGetChallenge(t *testing.T) { - req1, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) - req1x := req1.Clone(req1.Context()) - req1x.SetBasicAuth("u", "p") - req2, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/_catalog", nil) - req2x := req2.Clone(req2.Context()) - req2x.Header.Set("Authorization", "Bearer xx") - req3, _ := http.NewRequest(http.MethodPost, "https://registry.test/v2/project_1/ubuntu/blobs/uploads/mount=?mount=sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f&from=project_2/ubuntu", nil) - req3 = req3.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ - Repository: "project_1/ubuntu", - Reference: "14.04", - ProjectName: "project_1", - BlobMountRepository: "project_2/ubuntu", - BlobMountProjectName: "project_2", - BlobMountDigest: "sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f", - })) - req3x := req3.Clone(req3.Context()) - req3x.SetBasicAuth("", "") - req3x.Host = "harbor.test" - req4, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/project_1/hello-world/manifests/v1", nil) - req4 = req4.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ - Repository: "project_1/hello-world", - Reference: "v1", - ProjectName: "project_1", - })) - req4.Host = "harbor.core:8443" - cases := []struct { + name string request *http.Request challenge string }{ { - request: req1, + name: "Regular login request to '/v2' should return challenge whose realm is token URL with the Host header in Request", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) + return req + }(), + challenge: `Bearer realm="https://registry.test/service/token",service="harbor-registry"`, + }, + { + name: "Regular login request to '/v2' without 'Host', should return challenge whose realm is token URL with Ext endpoint", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) + req.Host = "" + return req + }(), challenge: `Bearer realm="https://harbor.test/service/token",service="harbor-registry"`, }, { - request: req1x, + name: "Request to 'v2' carrying basic auth header, the challenge should not have token service URI as realm b/c it's not from OCI client", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/", nil) + req.SetBasicAuth("u", "p") + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req2, + name: "Request to '/v2/_catalog' should return the challenge should not have token service URI as realm", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/_catalog", nil) + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req2x, + name: "Request to '/v2/_catalog' should return the challenge should not have token service URI as realm, disregarding the auth header in request", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://registry.test/v2/_catalog", nil) + req.Header.Set("Authorization", "Bearer xx") + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req3, + name: "Request to mount a blob from one repo to another should return challenge with scope according to the artifact info in the context of the request", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodPost, "https://harbor.test/v2/project_1/ubuntu/blobs/uploads/mount=?mount=sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f&from=project_2/ubuntu", nil) + req = req.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ + Repository: "project_1/ubuntu", + Reference: "14.04", + ProjectName: "project_1", + BlobMountRepository: "project_2/ubuntu", + BlobMountProjectName: "project_2", + BlobMountDigest: "sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f", + })) + return req + }(), challenge: `Bearer realm="https://harbor.test/service/token",service="harbor-registry",scope="repository:project_1/ubuntu:pull,push repository:project_2/ubuntu:pull"`, }, { - request: req3x, + name: "Request to be passed to registry, if it has basic auth header, it should return challenge without token URI as realm", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodPost, "https://harbor.test/v2/project_1/ubuntu/blobs/uploads/mount=?mount=sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f&from=project_2/ubuntu", nil) + req = req.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ + Repository: "project_1/ubuntu", + Reference: "14.04", + ProjectName: "project_1", + BlobMountRepository: "project_2/ubuntu", + BlobMountProjectName: "project_2", + BlobMountDigest: "sha256:08e4a417ff4e3913d8723a05cc34055db01c2fd165b588e049c5bad16ce6094f", + })) + req.SetBasicAuth("user", "password") + return req + }(), challenge: `Basic realm="harbor"`, }, { - request: req4, + name: "Request to be passed to registry, if it is sent from internal, the token service URI in the realm of the challenge should also point to the internal URI", + request: func() *http.Request { + req, _ := http.NewRequest(http.MethodGet, "https://harbor.core:8443/v2/project_1/hello-world/manifests/v1", nil) + req = req.WithContext(lib.WithArtifactInfo(context.Background(), lib.ArtifactInfo{ + Repository: "project_1/hello-world", + Reference: "v1", + ProjectName: "project_1", + })) + return req + }(), challenge: `Bearer realm="https://harbor.core:8443/service/token",service="harbor-registry",scope="repository:project_1/hello-world:pull"`, }, } for _, c := range cases { - acs := accessList(c.request) - assert.Equal(t, c.challenge, getChallenge(c.request, acs)) + t.Run(c.name, func(t *testing.T) { + acs := accessList(c.request) + assert.Equal(t, c.challenge, getChallenge(c.request, acs)) + }) } - } func TestMatch(t *testing.T) { diff --git a/src/server/middleware/vulnerable/vulnerable.go b/src/server/middleware/vulnerable/vulnerable.go index 5fbd52ebb11..9a1ae56c4e9 100644 --- a/src/server/middleware/vulnerable/vulnerable.go +++ b/src/server/middleware/vulnerable/vulnerable.go @@ -17,6 +17,7 @@ package vulnerable import ( "fmt" "net/http" + "slices" "github.com/goharbor/harbor/src/controller/artifact/processor/cnab" "github.com/goharbor/harbor/src/controller/artifact/processor/image" @@ -110,12 +111,10 @@ func Middleware() func(http.Handler) http.Handler { if art.IsImageIndex() { // artifact is image index, skip the checking when it is in the allowlist skippingAllowlist := []string{image.ArtifactTypeImage, cnab.ArtifactTypeCNAB} - for _, t := range skippingAllowlist { - if art.Type == t { - logger.Debugf("artifact %s@%s is image index and its type is %s in skipping allowlist, "+ - "skip the vulnerability prevention checking", art.RepositoryName, art.Digest, art.Type) - return nil - } + if slices.Contains(skippingAllowlist, art.Type) { + logger.Debugf("artifact %s@%s is image index and its type is %s in skipping allowlist, "+ + "skip the vulnerability prevention checking", art.RepositoryName, art.Digest, art.Type) + return nil } } diff --git a/src/server/registry/referrers.go b/src/server/registry/referrers.go index 00504dfd4ca..b7259a5f5da 100644 --- a/src/server/registry/referrers.go +++ b/src/server/registry/referrers.go @@ -180,7 +180,7 @@ type listReferrersOK struct { /* In: Body */ - Payload interface{} `json:"body,omitempty"` + Payload any `json:"body,omitempty"` } // newListReferrersOK creates newlistReferrersOK with default headers values @@ -207,7 +207,7 @@ func (o *listReferrersOK) WithXTotalCount(xTotalCount int64) *listReferrersOK { } // WithPayload adds the payload to the list accessories o k response -func (o *listReferrersOK) WithPayload(payload interface{}) *listReferrersOK { +func (o *listReferrersOK) WithPayload(payload any) *listReferrersOK { o.Payload = payload return o } diff --git a/src/server/registry/tag.go b/src/server/registry/tag.go index 3f0ddb66569..43d2abe37b3 100644 --- a/src/server/registry/tag.go +++ b/src/server/registry/tag.go @@ -69,7 +69,7 @@ func (t *tagHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { } tags, err := t.tagCtl.List(req.Context(), &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": repository.RepositoryID, }}, nil) if err != nil { diff --git a/src/server/registry/util/util.go b/src/server/registry/util/util.go index 2915da71e85..aa9e175d5ef 100644 --- a/src/server/registry/util/util.go +++ b/src/server/registry/util/util.go @@ -147,12 +147,7 @@ func pickItems(items []string, n *int, last string) ([]string, string) { i = sort.Search(len(items), func(ix int) bool { return strings.Compare(items[ix], last) > 0 }) } - j := i + *n - - if j >= len(items) { - j = len(items) - } - + j := min(i+*n, len(items)) result := items[i:j] nextLast := "" diff --git a/src/server/v2.0/handler/artifact.go b/src/server/v2.0/handler/artifact.go index e54e8f1179e..e05006be686 100644 --- a/src/server/v2.0/handler/artifact.go +++ b/src/server/v2.0/handler/artifact.go @@ -73,7 +73,7 @@ type artifactAPI struct { labelMgr label.Manager } -func (a *artifactAPI) Prepare(ctx context.Context, _ string, params interface{}) middleware.Responder { +func (a *artifactAPI) Prepare(ctx context.Context, _ string, params any) middleware.Responder { if err := unescapePathParams(params, "RepositoryName"); err != nil { a.SendError(ctx, err) } @@ -406,7 +406,7 @@ func (a *artifactAPI) GetVulnerabilitiesAddition(ctx context.Context, params ope return a.SendError(ctx, err) } - vulnerabilities := make(map[string]interface{}) + vulnerabilities := make(map[string]any) for _, mimeType := range parseScanReportMimeTypes(params.XAcceptVulnerabilities) { reports, err := a.scanCtl.GetReport(ctx, artifact, []string{mimeType}) diff --git a/src/server/v2.0/handler/artifact_test.go b/src/server/v2.0/handler/artifact_test.go index 68908cda333..9675d084ffa 100644 --- a/src/server/v2.0/handler/artifact_test.go +++ b/src/server/v2.0/handler/artifact_test.go @@ -116,7 +116,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // report not found for the default X-Accept-Vulnerabilities suite.onGetReport(v1.MimeTypeNativeReport) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -127,7 +127,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // report found for the default X-Accept-Vulnerabilities suite.onGetReport(v1.MimeTypeNativeReport, suite.report1) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -139,7 +139,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // report found for the X-Accept-Vulnerabilities of "application/vnd.security.vulnerability.report; version=1.1" suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport, suite.report2) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -152,7 +152,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { // and the X-Accept-Vulnerabilities is "application/vnd.security.vulnerability.report; version=1.1, application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0" suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport, suite.report2) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport + "," + v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -167,7 +167,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport) suite.onGetReport(v1.MimeTypeNativeReport, suite.report1) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport + "," + v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -182,7 +182,7 @@ func (suite *ArtifactTestSuite) TestGetVulnerabilitiesAddition() { suite.onGetReport(v1.MimeTypeGenericVulnerabilityReport) suite.onGetReport(v1.MimeTypeNativeReport) - var body map[string]interface{} + var body map[string]any res, err := suite.GetJSON(url, &body, map[string]string{"X-Accept-Vulnerabilities": v1.MimeTypeGenericVulnerabilityReport + "," + v1.MimeTypeNativeReport}) suite.NoError(err) suite.Equal(200, res.StatusCode) diff --git a/src/server/v2.0/handler/assembler/report.go b/src/server/v2.0/handler/assembler/report.go index d5bc801c753..d503f28180b 100644 --- a/src/server/v2.0/handler/assembler/report.go +++ b/src/server/v2.0/handler/assembler/report.go @@ -118,7 +118,7 @@ func (assembler *ScanReportAssembler) Assemble(ctx context.Context) error { if len(execs) == 0 { continue } - artifact.SBOMOverView = map[string]interface{}{ + artifact.SBOMOverView = map[string]any{ sbomModel.ScanStatus: execs[0].Status, sbomModel.StartTime: execs[0].StartTime, sbomModel.EndTime: execs[0].EndTime, @@ -127,7 +127,7 @@ func (assembler *ScanReportAssembler) Assemble(ctx context.Context) error { continue } - artifact.SBOMOverView = map[string]interface{}{ + artifact.SBOMOverView = map[string]any{ sbomModel.StartTime: overview[sbomModel.StartTime], sbomModel.EndTime: overview[sbomModel.EndTime], sbomModel.ScanStatus: overview[sbomModel.ScanStatus], diff --git a/src/server/v2.0/handler/assembler/report_test.go b/src/server/v2.0/handler/assembler/report_test.go index b0dd8f9f037..6c509205ff3 100644 --- a/src/server/v2.0/handler/assembler/report_test.go +++ b/src/server/v2.0/handler/assembler/report_test.go @@ -45,7 +45,7 @@ func (suite *VulAssemblerTestSuite) TestScannable() { mock.OnAnything(checker, "IsScannable").Return(true, nil) - summary := map[string]interface{}{"key": "value"} + summary := map[string]any{"key": "value"} mock.OnAnything(scanCtl, "GetSummary").Return(summary, nil) var artifact model.Artifact @@ -67,7 +67,7 @@ func (suite *VulAssemblerTestSuite) TestNotScannable() { mock.OnAnything(checker, "IsScannable").Return(false, nil) - summary := map[string]interface{}{"key": "value"} + summary := map[string]any{"key": "value"} mock.OnAnything(scanCtl, "GetSummary").Return(summary, nil) var art model.Artifact @@ -89,7 +89,7 @@ func (suite *VulAssemblerTestSuite) TestAssembleSBOMOverview() { } mock.OnAnything(checker, "IsScannable").Return(true, nil) - overview := map[string]interface{}{ + overview := map[string]any{ "sbom_digest": "sha256:123456", "scan_status": "Success", } @@ -117,7 +117,7 @@ func (suite *VulAssemblerTestSuite) TestAssembleSBOMOverviewImageIndex() { } mock.OnAnything(checker, "IsScannable").Return(true, nil) - overview := map[string]interface{}{} + overview := map[string]any{} mock.OnAnything(scanCtl, "GetSummary").Return(overview, nil) execs := []*task.Execution{ {ID: 1, Status: "Error"}, diff --git a/src/server/v2.0/handler/base.go b/src/server/v2.0/handler/base.go index ed166392b5a..d7531733774 100644 --- a/src/server/v2.0/handler/base.go +++ b/src/server/v2.0/handler/base.go @@ -46,7 +46,7 @@ var ( type BaseAPI struct{} // Prepare default prepare for operation -func (*BaseAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (*BaseAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -75,7 +75,7 @@ func (b *BaseAPI) HasPermission(ctx context.Context, action rbac.Action, resourc } // HasProjectPermission returns true when the request has action permission on project subresource -func (b *BaseAPI) HasProjectPermission(ctx context.Context, projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) bool { +func (b *BaseAPI) HasProjectPermission(ctx context.Context, projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) bool { projectID, projectName, err := utils.ParseProjectIDOrName(projectIDOrName) if err != nil { return false @@ -105,7 +105,7 @@ func (b *BaseAPI) HasProjectPermission(ctx context.Context, projectIDOrName inte // RequireProjectAccess checks the permission against the resources according to the context // An error will be returned if it doesn't meet the requirement -func (b *BaseAPI) RequireProjectAccess(ctx context.Context, projectIDOrName interface{}, action rbac.Action, subresource ...rbac.Resource) error { +func (b *BaseAPI) RequireProjectAccess(ctx context.Context, projectIDOrName any, action rbac.Action, subresource ...rbac.Resource) error { if b.HasProjectPermission(ctx, projectIDOrName, action, subresource...) { return nil } diff --git a/src/server/v2.0/handler/config.go b/src/server/v2.0/handler/config.go index b0e4e6958ab..5102212305a 100644 --- a/src/server/v2.0/handler/config.go +++ b/src/server/v2.0/handler/config.go @@ -91,8 +91,8 @@ func (c *configAPI) UpdateConfigurations(ctx context.Context, params configure.U return configure.NewUpdateConfigurationsOK() } -func toCfgMap(conf *models.Configurations) (map[string]interface{}, error) { - var cfgMap map[string]interface{} +func toCfgMap(conf *models.Configurations) (map[string]any, error) { + var cfgMap map[string]any buf, err := json.Marshal(conf) if err != nil { return cfgMap, err diff --git a/src/server/v2.0/handler/gc.go b/src/server/v2.0/handler/gc.go index c8e57b0363a..03ca356dada 100644 --- a/src/server/v2.0/handler/gc.go +++ b/src/server/v2.0/handler/gc.go @@ -47,7 +47,7 @@ func newGCAPI() *gcAPI { } } -func (g *gcAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (g *gcAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -79,9 +79,9 @@ func (g *gcAPI) UpdateGCSchedule(ctx context.Context, params operation.UpdateGCS return operation.NewUpdateGCScheduleOK() } -func (g *gcAPI) kick(ctx context.Context, scheType string, cron string, parameters map[string]interface{}) (int64, error) { +func (g *gcAPI) kick(ctx context.Context, scheType string, cron string, parameters map[string]any) (int64, error) { if parameters == nil { - parameters = make(map[string]interface{}) + parameters = make(map[string]any) } // set the required parameters for GC parameters["redis_url_reg"] = os.Getenv("_REDIS_URL_REG") diff --git a/src/server/v2.0/handler/handler.go b/src/server/v2.0/handler/handler.go index 2f770c696bb..10a22bb6c52 100644 --- a/src/server/v2.0/handler/handler.go +++ b/src/server/v2.0/handler/handler.go @@ -86,7 +86,7 @@ func New() http.Handler { } // function is called before the Prepare of the operation -func beforePrepare(ctx context.Context, operation string, _ interface{}) rmiddleware.Responder { +func beforePrepare(ctx context.Context, operation string, _ any) rmiddleware.Responder { metric.SetMetricOpID(ctx, operation) return nil } diff --git a/src/server/v2.0/handler/immutable.go b/src/server/v2.0/handler/immutable.go index 9f312e78cd9..d071c8f4719 100644 --- a/src/server/v2.0/handler/immutable.go +++ b/src/server/v2.0/handler/immutable.go @@ -163,7 +163,7 @@ func (ia *immutableAPI) ListImmuRules(ctx context.Context, params operation.List WithPayload(results) } -func (ia *immutableAPI) getProjectID(ctx context.Context, projectNameOrID interface{}) (int64, error) { +func (ia *immutableAPI) getProjectID(ctx context.Context, projectNameOrID any) (int64, error) { projectName, ok := projectNameOrID.(string) if ok { p, err := ia.projectCtr.Get(ctx, projectName, project.Metadata(false)) diff --git a/src/server/v2.0/handler/model/artifact.go b/src/server/v2.0/handler/model/artifact.go index 78d4d11bafc..d2db618198e 100644 --- a/src/server/v2.0/handler/model/artifact.go +++ b/src/server/v2.0/handler/model/artifact.go @@ -29,8 +29,8 @@ import ( type Artifact struct { artifact.Artifact // TODO: rename to VulOverview - ScanOverview map[string]interface{} `json:"scan_overview"` - SBOMOverView map[string]interface{} `json:"sbom_overview"` + ScanOverview map[string]any `json:"scan_overview"` + SBOMOverView map[string]any `json:"sbom_overview"` } // ToSwagger converts the artifact to the swagger model diff --git a/src/server/v2.0/handler/model/quota.go b/src/server/v2.0/handler/model/quota.go index 6f9b6d7de76..94bcf53f79a 100644 --- a/src/server/v2.0/handler/model/quota.go +++ b/src/server/v2.0/handler/model/quota.go @@ -75,7 +75,7 @@ type QuotaRefObject struct { // ToSwagger converts the QuotaRefObject to the swagger model func (rl *QuotaRefObject) ToSwagger() models.QuotaRefObject { - result := make(map[string]interface{}, len(rl.QuotaRefObject)) + result := make(map[string]any, len(rl.QuotaRefObject)) for name, value := range rl.QuotaRefObject { result[string(name)] = value diff --git a/src/server/v2.0/handler/preheat.go b/src/server/v2.0/handler/preheat.go index d084e08ba63..1222d303c19 100644 --- a/src/server/v2.0/handler/preheat.go +++ b/src/server/v2.0/handler/preheat.go @@ -65,7 +65,7 @@ type preheatAPI struct { taskCtl taskCtl.Controller } -func (api *preheatAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (api *preheatAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -332,7 +332,7 @@ func (api *preheatAPI) DeletePolicy(ctx context.Context, params operation.Delete } return nil } - executions, err := api.executionCtl.List(ctx, &q.Query{Keywords: map[string]interface{}{ + executions, err := api.executionCtl.List(ctx, &q.Query{Keywords: map[string]any{ "vendor_type": job.P2PPreheatVendorType, "vendor_id": policy.ID, }}) @@ -786,7 +786,7 @@ func (api *preheatAPI) GetPreheatLog(ctx context.Context, params operation.GetPr return operation.NewGetPreheatLogOK().WithPayload(string(l)) } -func (api *preheatAPI) requireTaskInProject(ctx context.Context, projectNameOrID interface{}, policyName string, executionID, taskID int64) error { +func (api *preheatAPI) requireTaskInProject(ctx context.Context, projectNameOrID any, policyName string, executionID, taskID int64) error { projectID, err := getProjectID(ctx, projectNameOrID) notFoundErr := fmt.Errorf("project id %d, task id %d not found", projectID, taskID) if err != nil { @@ -809,7 +809,7 @@ func (api *preheatAPI) requireTaskInProject(ctx context.Context, projectNameOrID return errors.NotFoundError(notFoundErr) } -func (api *preheatAPI) requireExecutionInProject(ctx context.Context, projectNameOrID interface{}, policyName string, executionID int64) error { +func (api *preheatAPI) requireExecutionInProject(ctx context.Context, projectNameOrID any, policyName string, executionID int64) error { projectID, err := getProjectID(ctx, projectNameOrID) notFoundErr := fmt.Errorf("project id %d, execution id %d not found", projectID, executionID) if err != nil { diff --git a/src/server/v2.0/handler/project.go b/src/server/v2.0/handler/project.go index 5faf77ce322..acc1d47b0d3 100644 --- a/src/server/v2.0/handler/project.go +++ b/src/server/v2.0/handler/project.go @@ -17,6 +17,7 @@ package handler import ( "context" "fmt" + "slices" "strconv" "strings" "sync" @@ -187,7 +188,7 @@ func (a *projectAPI) CreateProject(ctx context.Context, params operation.CreateP // in most case, it's 1 if _, ok := secCtx.(*robotSec.SecurityContext); ok || secCtx.IsSolutionUser() { q := &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "sysadmin_flag": true, }, Sorts: []*q.Sort{ @@ -753,7 +754,7 @@ func (a *projectAPI) ListArtifactsOfProject(ctx context.Context, params operatio WithPayload(artifacts) } -func (a *projectAPI) deletable(ctx context.Context, projectNameOrID interface{}) (*project.Project, *models.ProjectDeletable, error) { +func (a *projectAPI) deletable(ctx context.Context, projectNameOrID any) (*project.Project, *models.ProjectDeletable, error) { p, err := a.getProject(ctx, projectNameOrID) if err != nil { return nil, nil, err @@ -768,7 +769,7 @@ func (a *projectAPI) deletable(ctx context.Context, projectNameOrID interface{}) return p, result, nil } -func (a *projectAPI) getProject(ctx context.Context, projectNameOrID interface{}, options ...project.Option) (*project.Project, error) { +func (a *projectAPI) getProject(ctx context.Context, projectNameOrID any, options ...project.Option) (*project.Project, error) { p, err := a.projectCtl.Get(ctx, projectNameOrID, options...) if err != nil { return nil, err @@ -795,13 +796,12 @@ func (a *projectAPI) validateProjectReq(ctx context.Context, req *models.Project if err != nil { return fmt.Errorf("failed to get the registry %d: %v", *req.RegistryID, err) } + permitted := false - for _, t := range config.GetPermittedRegistryTypesForProxyCache() { - if string(registry.Type) == t { - permitted = true - break - } + if slices.Contains(config.GetPermittedRegistryTypesForProxyCache(), string(registry.Type)) { + permitted = true } + if !permitted { return errors.BadRequestError(fmt.Errorf("unsupported registry type %s", string(registry.Type))) } diff --git a/src/server/v2.0/handler/project_test.go b/src/server/v2.0/handler/project_test.go index eca7f09a3a2..275d404bdec 100644 --- a/src/server/v2.0/handler/project_test.go +++ b/src/server/v2.0/handler/project_test.go @@ -151,7 +151,7 @@ func (suite *ProjectTestSuite) TestListScannerCandidatesOfProject() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(0), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return(nil, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/projects/1/scanner/candidates", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -163,7 +163,7 @@ func (suite *ProjectTestSuite) TestListScannerCandidatesOfProject() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(3), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return([]*scanner.Registration{suite.reg}, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/projects/1/scanner/candidates?page_size=1&page=2&name=n&description=d&url=u&ex_name=n&ex_url=u", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -183,7 +183,7 @@ func (suite *ProjectTestSuite) TestSetScannerOfProject() { // get project failed mock.OnAnything(suite.projectCtl, "Get").Return(nil, fmt.Errorf("failed to get project")).Once() - res, err := suite.PutJSON("/projects/1/scanner", map[string]interface{}{"uuid": "uuid"}) + res, err := suite.PutJSON("/projects/1/scanner", map[string]any{"uuid": "uuid"}) suite.NoError(err) suite.Equal(500, res.StatusCode) } @@ -192,7 +192,7 @@ func (suite *ProjectTestSuite) TestSetScannerOfProject() { mock.OnAnything(suite.projectCtl, "Get").Return(suite.project, nil).Once() mock.OnAnything(suite.scannerCtl, "SetRegistrationByProject").Return(nil).Once() - res, err := suite.PutJSON("/projects/1/scanner", map[string]interface{}{"uuid": "uuid"}) + res, err := suite.PutJSON("/projects/1/scanner", map[string]any{"uuid": "uuid"}) suite.NoError(err) suite.Equal(200, res.StatusCode) } @@ -202,7 +202,7 @@ func (suite *ProjectTestSuite) TestSetScannerOfProject() { mock.OnAnything(suite.projectCtl, "Get").Return(suite.project, nil).Once() mock.OnAnything(suite.scannerCtl, "SetRegistrationByProject").Return(nil).Once() - res, err := suite.PutJSON("/projects/library/scanner", map[string]interface{}{"uuid": "uuid"}) + res, err := suite.PutJSON("/projects/library/scanner", map[string]any{"uuid": "uuid"}) suite.NoError(err) suite.Equal(200, res.StatusCode) } diff --git a/src/server/v2.0/handler/purge.go b/src/server/v2.0/handler/purge.go index dc8c77d5da4..2379ad12de3 100644 --- a/src/server/v2.0/handler/purge.go +++ b/src/server/v2.0/handler/purge.go @@ -90,7 +90,7 @@ func verifyCreateRequest(params purge.CreatePurgeScheduleParams) error { return nil } -func retentionHour(m map[string]interface{}) (int, error) { +func retentionHour(m map[string]any) (int, error) { if ret, ok := m[common.PurgeAuditRetentionHour]; ok { if rh, ok := ret.(json.Number); ok { ret, err := rh.Int64() @@ -106,9 +106,9 @@ func retentionHour(m map[string]interface{}) (int, error) { return 0, nil } -func (p *purgeAPI) kick(ctx context.Context, vendorType string, scheType string, cron string, parameters map[string]interface{}) (int64, error) { +func (p *purgeAPI) kick(ctx context.Context, vendorType string, scheType string, cron string, parameters map[string]any) (int64, error) { if parameters == nil { - parameters = make(map[string]interface{}) + parameters = make(map[string]any) } var err error var id int64 @@ -140,7 +140,7 @@ func (p *purgeAPI) kick(ctx context.Context, vendorType string, scheType string, return id, err } -func (p *purgeAPI) updateSchedule(ctx context.Context, vendorType, cronType, cron string, policy pg.JobPolicy, extraParams map[string]interface{}) error { +func (p *purgeAPI) updateSchedule(ctx context.Context, vendorType, cronType, cron string, policy pg.JobPolicy, extraParams map[string]any) error { if err := utils.ValidateCronString(cron); err != nil { return errors.New(nil).WithCode(errors.BadRequestCode). WithMessagef("invalid cron string for scheduled log rotation purge: %s, error: %v", cron, err) @@ -318,7 +318,7 @@ func verifyUpdateRequest(params purge.UpdatePurgeScheduleParams) error { return nil } -func (p *purgeAPI) createSchedule(ctx context.Context, vendorType string, cronType string, cron string, policy pg.JobPolicy, extraParam map[string]interface{}) error { +func (p *purgeAPI) createSchedule(ctx context.Context, vendorType string, cronType string, cron string, policy pg.JobPolicy, extraParam map[string]any) error { _, err := p.schedulerCtl.Create(ctx, vendorType, cronType, cron, pg.SchedulerCallback, policy, extraParam) if err != nil { return err diff --git a/src/server/v2.0/handler/purge_test.go b/src/server/v2.0/handler/purge_test.go index c25a824d7a9..bd07dd03a4c 100644 --- a/src/server/v2.0/handler/purge_test.go +++ b/src/server/v2.0/handler/purge_test.go @@ -34,10 +34,10 @@ func Test_verifyUpdateRequest(t *testing.T) { args args wantErr bool }{ - {"normal", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, - {"missing_schedule", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_retention_hour", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_operations", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168"}}}}, true}, + {"normal", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, + {"missing_schedule", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_retention_hour", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_operations", args{purge.UpdatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168"}}}}, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -57,10 +57,10 @@ func Test_verifyCreateRequest(t *testing.T) { args args wantErr bool }{ - {"normal", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, - {"missing_schedule", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_retention_hour", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, - {"missing_event_types", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]interface{}{common.PurgeAuditRetentionHour: "168"}}}}, true}, + {"normal", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, false}, + {"missing_schedule", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Parameters: map[string]any{common.PurgeAuditRetentionHour: "168", common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_retention_hour", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditIncludeEventTypes: "pull_artifact"}}}}, true}, + {"missing_event_types", args{purge.CreatePurgeScheduleParams{Schedule: &models.Schedule{Schedule: &models.ScheduleObj{}, Parameters: map[string]any{common.PurgeAuditRetentionHour: "168"}}}}, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -74,7 +74,7 @@ func Test_verifyCreateRequest(t *testing.T) { func Test_checkRetentionHour(t *testing.T) { type args struct { - m map[string]interface{} + m map[string]any } tests := []struct { name string @@ -82,10 +82,10 @@ func Test_checkRetentionHour(t *testing.T) { want int wantErr assert.ErrorAssertionFunc }{ - {"normal", args{map[string]interface{}{common.PurgeAuditRetentionHour: 24}}, 24, func(t assert.TestingT, err error, i ...interface{}) bool { return false }}, - {"overflow", args{map[string]interface{}{common.PurgeAuditRetentionHour: 250000}}, 0, func(t assert.TestingT, err error, i ...interface{}) bool { return true }}, - {"equal", args{map[string]interface{}{common.PurgeAuditRetentionHour: 240000}}, 240000, func(t assert.TestingT, err error, i ...interface{}) bool { return false }}, - {"wrong type", args{map[string]interface{}{common.PurgeAuditRetentionHour: "wrong type"}}, 0, func(t assert.TestingT, err error, i ...interface{}) bool { return true }}, + {"normal", args{map[string]any{common.PurgeAuditRetentionHour: 24}}, 24, func(t assert.TestingT, err error, i ...any) bool { return false }}, + {"overflow", args{map[string]any{common.PurgeAuditRetentionHour: 250000}}, 0, func(t assert.TestingT, err error, i ...any) bool { return true }}, + {"equal", args{map[string]any{common.PurgeAuditRetentionHour: 240000}}, 240000, func(t assert.TestingT, err error, i ...any) bool { return false }}, + {"wrong type", args{map[string]any{common.PurgeAuditRetentionHour: "wrong type"}}, 0, func(t assert.TestingT, err error, i ...any) bool { return true }}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/server/v2.0/handler/quota_test.go b/src/server/v2.0/handler/quota_test.go index b6cdd2e3554..66438a87d79 100644 --- a/src/server/v2.0/handler/quota_test.go +++ b/src/server/v2.0/handler/quota_test.go @@ -64,7 +64,7 @@ func (suite *QuotaTestSuite) SetupSuite() { } func (suite *QuotaTestSuite) TestAuthorization() { - newBody := func(body interface{}) io.Reader { + newBody := func(body any) io.Reader { if body == nil { return nil } @@ -81,7 +81,7 @@ func (suite *QuotaTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any }{ {http.MethodGet, "/quotas/1", nil}, {http.MethodGet, "/quotas", nil}, @@ -129,7 +129,7 @@ func (suite *QuotaTestSuite) TestGetQuota() { // quota not found mock.OnAnything(suite.quotaCtl, "Get").Return(nil, errors.NotFoundError(nil)).Once() - var quota map[string]interface{} + var quota map[string]any res, err := suite.GetJSON("/quotas/1", "a) suite.NoError(err) suite.Equal(404, res.StatusCode) @@ -139,7 +139,7 @@ func (suite *QuotaTestSuite) TestGetQuota() { // quota found mock.OnAnything(suite.quotaCtl, "Get").Return(suite.quota, nil).Once() - var quota map[string]interface{} + var quota map[string]any res, err := suite.GetJSON("/quotas/1", "a) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -176,7 +176,7 @@ func (suite *QuotaTestSuite) TestListQuotas() { mock.OnAnything(suite.quotaCtl, "Count").Return(int64(0), nil).Once() mock.OnAnything(suite.quotaCtl, "List").Return(nil, nil).Once() - var quotas []interface{} + var quotas []any res, err := suite.GetJSON("/quotas", "as) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -188,7 +188,7 @@ func (suite *QuotaTestSuite) TestListQuotas() { mock.OnAnything(suite.quotaCtl, "Count").Return(int64(3), nil).Once() mock.OnAnything(suite.quotaCtl, "List").Return([]*quota.Quota{suite.quota}, nil).Once() - var quotas []interface{} + var quotas []any res, err := suite.GetJSON("/quotas?page_size=1&page=2", "as) suite.NoError(err) suite.Equal(200, res.StatusCode) diff --git a/src/server/v2.0/handler/replication.go b/src/server/v2.0/handler/replication.go index c5c700f679b..e53157faaa1 100644 --- a/src/server/v2.0/handler/replication.go +++ b/src/server/v2.0/handler/replication.go @@ -46,7 +46,7 @@ type replicationAPI struct { ctl replication.Controller } -func (r *replicationAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (r *replicationAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -362,14 +362,14 @@ func (r *replicationAPI) ListReplicationTasks(ctx context.Context, params operat } query.Keywords["ExecutionID"] = params.ID if params.Status != nil { - var status interface{} = *params.Status + var status any = *params.Status // as we convert the status when responding requests to keep the backward compatibility, // here we need to reverse-convert the status // the status "pending" and "stopped" is same with jobservice, no need to convert switch status { case "InProgress": status = &q.OrList{ - Values: []interface{}{ + Values: []any{ job.ScheduledStatus.String(), job.RunningStatus.String(), }, diff --git a/src/server/v2.0/handler/repository.go b/src/server/v2.0/handler/repository.go index 2f864aedc52..2629c760ff5 100644 --- a/src/server/v2.0/handler/repository.go +++ b/src/server/v2.0/handler/repository.go @@ -17,6 +17,7 @@ package handler import ( "context" "fmt" + "html/template" "github.com/go-openapi/runtime/middleware" @@ -55,7 +56,7 @@ type repositoryAPI struct { artCtl artifact.Controller } -func (r *repositoryAPI) Prepare(ctx context.Context, _ string, params interface{}) middleware.Responder { +func (r *repositoryAPI) Prepare(ctx context.Context, _ string, params any) middleware.Responder { if err := unescapePathParams(params, "RepositoryName"); err != nil { r.SendError(ctx, err) } @@ -116,7 +117,7 @@ func (r *repositoryAPI) listAuthorizedProjectIDs(ctx context.Context) ([]int64, return nil, errors.UnauthorizedError(errors.New("security context not found")) } query := &q.Query{ - Keywords: map[string]interface{}{}, + Keywords: map[string]any{}, } if secCtx.IsAuthenticated() { switch v := secCtx.(type) { @@ -212,7 +213,7 @@ func (r *repositoryAPI) GetRepository(ctx context.Context, params operation.GetR func (r *repositoryAPI) assembleRepository(ctx context.Context, repository *model.RepoRecord) *models.Repository { repo := repository.ToSwagger() total, err := r.artCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "RepositoryID": repo.ID, }, }) @@ -235,7 +236,7 @@ func (r *repositoryAPI) UpdateRepository(ctx context.Context, params operation.U if err := r.repoCtl.Update(ctx, &repomodel.RepoRecord{ RepositoryID: repository.RepositoryID, Name: repository.Name, - Description: params.Repository.Description, + Description: template.HTMLEscapeString(params.Repository.Description), }, "Description"); err != nil { return r.SendError(ctx, err) } diff --git a/src/server/v2.0/handler/retention.go b/src/server/v2.0/handler/retention.go index 033e085abb6..5e0478a851e 100644 --- a/src/server/v2.0/handler/retention.go +++ b/src/server/v2.0/handler/retention.go @@ -133,7 +133,7 @@ var ( } ) -func (r *retentionAPI) Prepare(ctx context.Context, _ string, _ interface{}) middleware.Responder { +func (r *retentionAPI) Prepare(ctx context.Context, _ string, _ any) middleware.Responder { if err := r.RequireAuthenticated(ctx); err != nil { return r.SendError(ctx, err) } diff --git a/src/server/v2.0/handler/robot.go b/src/server/v2.0/handler/robot.go index f8f4f10c1d8..221a0725779 100644 --- a/src/server/v2.0/handler/robot.go +++ b/src/server/v2.0/handler/robot.go @@ -318,7 +318,7 @@ func (rAPI *robotAPI) requireAccess(ctx context.Context, r *robot.Robot, action if r.Level == robot.LEVELSYSTEM { return rAPI.RequireSystemAccess(ctx, action, rbac.ResourceRobot) } else if r.Level == robot.LEVELPROJECT { - var ns interface{} + var ns any if r.ProjectNameOrID != nil { ns = r.ProjectNameOrID } else if r.ProjectID > 0 { diff --git a/src/server/v2.0/handler/scan.go b/src/server/v2.0/handler/scan.go index e3c74d6c2c4..f4e34f84161 100644 --- a/src/server/v2.0/handler/scan.go +++ b/src/server/v2.0/handler/scan.go @@ -42,7 +42,7 @@ type scanAPI struct { scanCtl scan.Controller } -func (s *scanAPI) Prepare(ctx context.Context, _ string, params interface{}) middleware.Responder { +func (s *scanAPI) Prepare(ctx context.Context, _ string, params any) middleware.Responder { if err := unescapePathParams(params, "RepositoryName"); err != nil { s.SendError(ctx, err) } diff --git a/src/server/v2.0/handler/scan_all.go b/src/server/v2.0/handler/scan_all.go index 469e3520b68..0e0d7388127 100644 --- a/src/server/v2.0/handler/scan_all.go +++ b/src/server/v2.0/handler/scan_all.go @@ -58,7 +58,7 @@ type scanAllAPI struct { makeCtx func() context.Context } -func (s *scanAllAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (s *scanAllAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -208,7 +208,7 @@ func (s *scanAllAPI) createOrUpdateScanAllSchedule(ctx context.Context, cronType } } - cbParams := map[string]interface{}{ + cbParams := map[string]any{ // the operator of schedule job is harbor-jobservice "operator": secret.JobserviceUser, } @@ -289,7 +289,7 @@ func (s *scanAllAPI) getLatestScanAllExecution(ctx context.Context, trigger ...s } func (s *scanAllAPI) requireScanEnabled(ctx context.Context) error { - kws := make(map[string]interface{}) + kws := make(map[string]any) kws["is_default"] = true query := &q.Query{ diff --git a/src/server/v2.0/handler/scan_all_test.go b/src/server/v2.0/handler/scan_all_test.go index 0a91ebed158..33bfa361f54 100644 --- a/src/server/v2.0/handler/scan_all_test.go +++ b/src/server/v2.0/handler/scan_all_test.go @@ -97,7 +97,7 @@ func (suite *ScanAllTestSuite) SetupSuite() { } func (suite *ScanAllTestSuite) TestAuthorization() { - newBody := func(body interface{}) io.Reader { + newBody := func(body any) io.Reader { if body == nil { return nil } @@ -114,7 +114,7 @@ func (suite *ScanAllTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any }{ {http.MethodGet, "/scans/all/metrics", nil}, {http.MethodGet, "/scans/schedule/metrics", nil}, @@ -185,7 +185,7 @@ func (suite *ScanAllTestSuite) TestGetLatestScanAllMetrics() { // scan all execution not found mock.OnAnything(suite.execMgr, "List").Return(nil, nil).Once() - var stats map[string]interface{} + var stats map[string]any res, err := suite.GetJSON("/scans/all/metrics", &stats) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -223,7 +223,7 @@ func (suite *ScanAllTestSuite) TestGetLatestScheduledScanAllMetrics() { // scan all execution not found mock.OnAnything(suite.execMgr, "List").Return(nil, nil).Once() - var stats map[string]interface{} + var stats map[string]any res, err := suite.GetJSON("/scans/schedule/metrics", &stats) suite.NoError(err) suite.Equal(200, res.StatusCode) diff --git a/src/server/v2.0/handler/scanexport.go b/src/server/v2.0/handler/scanexport.go index 09c5e0580c2..6a797aa1dda 100644 --- a/src/server/v2.0/handler/scanexport.go +++ b/src/server/v2.0/handler/scanexport.go @@ -58,7 +58,7 @@ type scanDataExportAPI struct { userMgr user.Manager } -func (se *scanDataExportAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (se *scanDataExportAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } @@ -97,10 +97,6 @@ func (se *scanDataExportAPI) ExportScanData(ctx context.Context, params operatio userContext := context.WithValue(ctx, export.CsvJobVendorIDKey, usr.UserID) - if err != nil { - return se.SendError(ctx, err) - } - jobID, err := se.scanDataExportCtl.Start(userContext, se.convertToCriteria(params.Criteria, secContext.GetUsername(), usr.UserID)) if err != nil { return se.SendError(ctx, err) @@ -134,9 +130,6 @@ func (se *scanDataExportAPI) GetScanDataExportExecution(ctx context.Context, par return se.SendError(ctx, err) } - if err != nil { - return se.SendError(ctx, err) - } sdeExec := models.ScanDataExportExecution{ EndTime: strfmt.DateTime(execution.EndTime), ID: execution.ID, diff --git a/src/server/v2.0/handler/scanexport_test.go b/src/server/v2.0/handler/scanexport_test.go index 76008c20b46..b2325210880 100644 --- a/src/server/v2.0/handler/scanexport_test.go +++ b/src/server/v2.0/handler/scanexport_test.go @@ -74,7 +74,7 @@ func (suite *ScanExportTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any headers map[string]string }{ {http.MethodPost, "/export/cve", criteria, map[string]string{"X-Scan-Data-Type": v1.MimeTypeGenericVulnerabilityReport}}, @@ -191,7 +191,7 @@ func (suite *ScanExportTestSuite) TestExportScanData() { suite.Equal(200, res.StatusCode) suite.Equal(nil, err) - respData := make(map[string]interface{}) + respData := make(map[string]any) json.NewDecoder(res.Body).Decode(&respData) suite.Equal(int64(100), int64(respData["id"].(float64))) diff --git a/src/server/v2.0/handler/scanner_test.go b/src/server/v2.0/handler/scanner_test.go index e18f9bdae6f..068ac5dfff9 100644 --- a/src/server/v2.0/handler/scanner_test.go +++ b/src/server/v2.0/handler/scanner_test.go @@ -66,7 +66,7 @@ func (suite *ScannerTestSuite) SetupSuite() { } func (suite *ScannerTestSuite) TestAuthorization() { - newBody := func(body interface{}) io.Reader { + newBody := func(body any) io.Reader { if body == nil { return nil } @@ -79,7 +79,7 @@ func (suite *ScannerTestSuite) TestAuthorization() { reqs := []struct { method string url string - body interface{} + body any }{ {http.MethodGet, "/scanners", nil}, {http.MethodPost, "/scanners", suite.reg}, @@ -87,7 +87,7 @@ func (suite *ScannerTestSuite) TestAuthorization() { {http.MethodGet, "/scanners/uuid1", nil}, {http.MethodPut, "/scanners/uuid1", suite.reg}, {http.MethodDelete, "/scanners/uuid1", nil}, - {http.MethodPatch, "/scanners/uuid1", map[string]interface{}{"is_default": true}}, + {http.MethodPatch, "/scanners/uuid1", map[string]any{"is_default": true}}, {http.MethodGet, "/scanners/uuid1/metadata", nil}, } @@ -124,7 +124,7 @@ func (suite *ScannerTestSuite) TestCreateScannerWithInvalidBody() { { // name missing - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "url": "http://reg:8080", }) suite.NoError(err) @@ -133,7 +133,7 @@ func (suite *ScannerTestSuite) TestCreateScannerWithInvalidBody() { { // url missing - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", }) suite.NoError(err) @@ -142,7 +142,7 @@ func (suite *ScannerTestSuite) TestCreateScannerWithInvalidBody() { { // invalid url - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "invalid url", }) @@ -158,7 +158,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { mock.OnAnything(suite.scannerCtl, "CreateRegistration").Return("", fmt.Errorf("failed to create registration")).Once() - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -168,7 +168,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { mock.OnAnything(suite.scannerCtl, "CreateRegistration").Return("uuid", nil).Once() - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -179,7 +179,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { // access_credential missing - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -190,7 +190,7 @@ func (suite *ScannerTestSuite) TestCreateScanner() { { mock.OnAnything(suite.scannerCtl, "CreateRegistration").Return("uuid", nil).Once() - res, err := suite.PostJSON("/scanners", map[string]interface{}{ + res, err := suite.PostJSON("/scanners", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -268,7 +268,7 @@ func (suite *ScannerTestSuite) TestGetScanner() { // scanner not found mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(nil, nil).Once() - var scanner map[string]interface{} + var scanner map[string]any res, err := suite.GetJSON("/scanners/uuid", &scanner) suite.NoError(err) suite.Equal(404, res.StatusCode) @@ -278,7 +278,7 @@ func (suite *ScannerTestSuite) TestGetScanner() { // scanner found mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() - var scanner map[string]interface{} + var scanner map[string]any res, err := suite.GetJSON("/scanners/uuid", &scanner) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -340,7 +340,7 @@ func (suite *ScannerTestSuite) TestListScanners() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(0), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return(nil, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/scanners", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -352,7 +352,7 @@ func (suite *ScannerTestSuite) TestListScanners() { mock.OnAnything(suite.scannerCtl, "GetTotalOfRegistrations").Return(int64(3), nil).Once() mock.OnAnything(suite.scannerCtl, "ListRegistrations").Return([]*scanner.Registration{suite.reg}, nil).Once() - var scanners []interface{} + var scanners []any res, err := suite.GetJSON("/scanners?page_size=1&page=2", &scanners) suite.NoError(err) suite.Equal(200, res.StatusCode) @@ -370,7 +370,7 @@ func (suite *ScannerTestSuite) TestPingScanner() { { // bad req - res, err := suite.PostJSON("/scanners/ping", map[string]interface{}{ + res, err := suite.PostJSON("/scanners/ping", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -383,7 +383,7 @@ func (suite *ScannerTestSuite) TestPingScanner() { // ping failed mock.OnAnything(suite.scannerCtl, "Ping").Return(nil, fmt.Errorf("failed to ping scanner")).Once() - res, err := suite.PostJSON("/scanners/ping", map[string]interface{}{ + res, err := suite.PostJSON("/scanners/ping", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -395,7 +395,7 @@ func (suite *ScannerTestSuite) TestPingScanner() { // ping mock.OnAnything(suite.scannerCtl, "Ping").Return(&suite.metadata, nil).Once() - res, err := suite.PostJSON("/scanners/ping", map[string]interface{}{ + res, err := suite.PostJSON("/scanners/ping", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -410,7 +410,7 @@ func (suite *ScannerTestSuite) TestSetScannerAsDefault() { suite.Security.On("Can", mock.Anything, mock.Anything, mock.Anything).Return(true).Times(times) { - res, err := suite.PatchJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PatchJSON("/scanners/uuid", map[string]any{ "is_default": false, }) suite.NoError(err) @@ -421,7 +421,7 @@ func (suite *ScannerTestSuite) TestSetScannerAsDefault() { // set default failed mock.OnAnything(suite.scannerCtl, "SetDefaultRegistration").Return(fmt.Errorf("failed to set default")).Once() - res, err := suite.PatchJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PatchJSON("/scanners/uuid", map[string]any{ "is_default": true, }) suite.NoError(err) @@ -432,7 +432,7 @@ func (suite *ScannerTestSuite) TestSetScannerAsDefault() { // set default mock.OnAnything(suite.scannerCtl, "SetDefaultRegistration").Return(nil).Once() - res, err := suite.PatchJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PatchJSON("/scanners/uuid", map[string]any{ "is_default": true, }) suite.NoError(err) @@ -456,7 +456,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // get scanner failed mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(nil, fmt.Errorf("failed to get registration")).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -468,7 +468,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // scanner not found mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(nil, nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -480,7 +480,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // immutable scanner mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(&scanner.Registration{Immutable: true}, nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -492,7 +492,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { // bad req mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", "auth": "Basic", @@ -506,7 +506,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() mock.OnAnything(suite.scannerCtl, "UpdateRegistration").Return(fmt.Errorf("failed to update the scanner")).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) @@ -519,7 +519,7 @@ func (suite *ScannerTestSuite) TestUpdateScanner() { mock.OnAnything(suite.scannerCtl, "GetRegistration").Return(suite.reg, nil).Once() mock.OnAnything(suite.scannerCtl, "UpdateRegistration").Return(nil).Once() - res, err := suite.PutJSON("/scanners/uuid", map[string]interface{}{ + res, err := suite.PutJSON("/scanners/uuid", map[string]any{ "name": "reg", "url": "http://reg:8080", }) diff --git a/src/server/v2.0/handler/search.go b/src/server/v2.0/handler/search.go index ecae3f8f0cc..d519b4b4735 100644 --- a/src/server/v2.0/handler/search.go +++ b/src/server/v2.0/handler/search.go @@ -167,7 +167,7 @@ func (s *searchAPI) filterRepositories(ctx context.Context, projects []*project. // searchOK ... type searchOK struct { - Payload interface{} + Payload any } func (o *searchOK) WithPayload(payload *models.Search) *searchOK { diff --git a/src/server/v2.0/handler/statistic.go b/src/server/v2.0/handler/statistic.go index 382819c8042..4e20e309fda 100644 --- a/src/server/v2.0/handler/statistic.go +++ b/src/server/v2.0/handler/statistic.go @@ -61,12 +61,12 @@ func (s *statisticAPI) GetStatistic(ctx context.Context, _ operation.GetStatisti if len(pubProjs) == 0 { statistic.PublicRepoCount = 0 } else { - var ids []interface{} + var ids []any for _, p := range pubProjs { ids = append(ids, p.ProjectID) } n, err := s.repoCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": q.NewOrList(ids), }, }) @@ -108,7 +108,7 @@ func (s *statisticAPI) GetStatistic(ctx context.Context, _ operation.GetStatisti } statistic.TotalStorageConsumption = sum + sysArtifactStorageSize } else { - var privProjectIDs []interface{} + var privProjectIDs []any if sc, ok := securityCtx.(*local.SecurityContext); ok && sc.IsAuthenticated() { user := sc.User() member := &project.MemberQuery{ @@ -130,7 +130,7 @@ func (s *statisticAPI) GetStatistic(ctx context.Context, _ operation.GetStatisti statistic.PrivateRepoCount = 0 } else { n, err := s.repoCtl.Count(ctx, &q.Query{ - Keywords: map[string]interface{}{ + Keywords: map[string]any{ "ProjectID": q.NewOrList(privProjectIDs), }, }) diff --git a/src/server/v2.0/handler/util.go b/src/server/v2.0/handler/util.go index ebff63b5cd4..0309c88d911 100644 --- a/src/server/v2.0/handler/util.go +++ b/src/server/v2.0/handler/util.go @@ -48,7 +48,7 @@ func parseScanReportMimeTypes(header *string) []string { var mimeTypes []string if header != nil { - for _, mimeType := range strings.Split(*header, ",") { + for mimeType := range strings.SplitSeq(*header, ",") { mimeType = strings.TrimSpace(mimeType) switch mimeType { case v1.MimeTypeNativeReport, v1.MimeTypeGenericVulnerabilityReport: @@ -64,7 +64,7 @@ func parseScanReportMimeTypes(header *string) []string { return mimeTypes } -func unescapePathParams(params interface{}, fieldNames ...string) error { +func unescapePathParams(params any, fieldNames ...string) error { val := reflect.ValueOf(params) if val.Kind() != reflect.Ptr { return fmt.Errorf("params must be ptr") @@ -102,7 +102,7 @@ func unescapePathParams(params interface{}, fieldNames ...string) error { return nil } -func parseProjectNameOrID(str string, isResourceName *bool) interface{} { +func parseProjectNameOrID(str string, isResourceName *bool) any { if lib.BoolValue(isResourceName) { // always as projectName return str @@ -117,7 +117,7 @@ func parseProjectNameOrID(str string, isResourceName *bool) interface{} { return v // projectID } -func getProjectID(ctx context.Context, projectNameOrID interface{}) (int64, error) { +func getProjectID(ctx context.Context, projectNameOrID any) (int64, error) { projectName, ok := projectNameOrID.(string) if ok { p, err := project.Ctl.Get(ctx, projectName, project.Metadata(false)) diff --git a/src/server/v2.0/handler/util_test.go b/src/server/v2.0/handler/util_test.go index 36998a2fdd7..613adc82bd0 100644 --- a/src/server/v2.0/handler/util_test.go +++ b/src/server/v2.0/handler/util_test.go @@ -28,7 +28,7 @@ func Test_unescapePathParams(t *testing.T) { str := "params" type args struct { - params interface{} + params any fieldNames []string } tests := []struct { diff --git a/src/server/v2.0/handler/webhook.go b/src/server/v2.0/handler/webhook.go index a77a30a0149..921a7f485f4 100644 --- a/src/server/v2.0/handler/webhook.go +++ b/src/server/v2.0/handler/webhook.go @@ -53,11 +53,11 @@ type webhookAPI struct { webhookCtl webhook_ctl.Controller } -func (n *webhookAPI) Prepare(_ context.Context, _ string, _ interface{}) middleware.Responder { +func (n *webhookAPI) Prepare(_ context.Context, _ string, _ any) middleware.Responder { return nil } -func (n *webhookAPI) requirePolicyInProject(ctx context.Context, projectIDOrName interface{}, policyID int64) error { +func (n *webhookAPI) requirePolicyInProject(ctx context.Context, projectIDOrName any, policyID int64) error { projectID, err := getProjectID(ctx, projectIDOrName) if err != nil { return err diff --git a/src/server/v2.0/handler/webhook_job.go b/src/server/v2.0/handler/webhook_job.go index ae14108c390..5ab4ab4e134 100644 --- a/src/server/v2.0/handler/webhook_job.go +++ b/src/server/v2.0/handler/webhook_job.go @@ -89,7 +89,7 @@ func (n *webhookJobAPI) ListWebhookJobs(ctx context.Context, params webhookjob.L } // requirePolicyAccess checks whether the project has the permission to the policy. -func (n *webhookJobAPI) requirePolicyAccess(ctx context.Context, projectNameIrID interface{}, policy *policyModel.Policy) error { +func (n *webhookJobAPI) requirePolicyAccess(ctx context.Context, projectNameIrID any, policy *policyModel.Policy) error { p, err := n.projectMgr.Get(ctx, projectNameIrID) if err != nil { return err diff --git a/src/testing/common/security/context.go b/src/testing/common/security/context.go index df5e7299301..668d8490762 100644 --- a/src/testing/common/security/context.go +++ b/src/testing/common/security/context.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package security diff --git a/src/testing/controller/artifact/controller.go b/src/testing/controller/artifact/controller.go index 86f0a09ef15..9d5fa154c08 100644 --- a/src/testing/controller/artifact/controller.go +++ b/src/testing/controller/artifact/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package artifact diff --git a/src/testing/controller/blob/controller.go b/src/testing/controller/blob/controller.go index 540d1e65cda..f1940e7c13b 100644 --- a/src/testing/controller/blob/controller.go +++ b/src/testing/controller/blob/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package blob diff --git a/src/testing/controller/config/controller.go b/src/testing/controller/config/controller.go index 5813385deac..0fd1097e704 100644 --- a/src/testing/controller/config/controller.go +++ b/src/testing/controller/config/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package config diff --git a/src/testing/controller/jobservice/scheduler_controller.go b/src/testing/controller/jobservice/scheduler_controller.go index beff24babda..6f62c4f169a 100644 --- a/src/testing/controller/jobservice/scheduler_controller.go +++ b/src/testing/controller/jobservice/scheduler_controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobservice diff --git a/src/testing/controller/project/controller.go b/src/testing/controller/project/controller.go index 837255d00bc..c627a82dfbb 100644 --- a/src/testing/controller/project/controller.go +++ b/src/testing/controller/project/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package project diff --git a/src/testing/controller/proxy/remote_interface.go b/src/testing/controller/proxy/remote_interface.go index bc17a9ac695..701e28702d2 100644 --- a/src/testing/controller/proxy/remote_interface.go +++ b/src/testing/controller/proxy/remote_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package proxy diff --git a/src/testing/controller/purge/controller.go b/src/testing/controller/purge/controller.go index 25d26571e8d..4f61df63203 100644 --- a/src/testing/controller/purge/controller.go +++ b/src/testing/controller/purge/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package purge diff --git a/src/testing/controller/quota/controller.go b/src/testing/controller/quota/controller.go index f2b44ec6955..537005447c8 100644 --- a/src/testing/controller/quota/controller.go +++ b/src/testing/controller/quota/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package quota diff --git a/src/testing/controller/replication/controller.go b/src/testing/controller/replication/controller.go index 74de17c3d64..0674eae0a98 100644 --- a/src/testing/controller/replication/controller.go +++ b/src/testing/controller/replication/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package replication diff --git a/src/testing/controller/repository/controller.go b/src/testing/controller/repository/controller.go index 4e40ba447bf..9c96f3daf8b 100644 --- a/src/testing/controller/repository/controller.go +++ b/src/testing/controller/repository/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package repository diff --git a/src/testing/controller/retention/controller.go b/src/testing/controller/retention/controller.go index a1126e18ff4..795c6117e7f 100644 --- a/src/testing/controller/retention/controller.go +++ b/src/testing/controller/retention/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package retention diff --git a/src/testing/controller/robot/controller.go b/src/testing/controller/robot/controller.go index e3a634b1978..0d60be33fee 100644 --- a/src/testing/controller/robot/controller.go +++ b/src/testing/controller/robot/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package robot diff --git a/src/testing/controller/scan/checker.go b/src/testing/controller/scan/checker.go index 6c2d60c8bc8..b37e9088ad3 100644 --- a/src/testing/controller/scan/checker.go +++ b/src/testing/controller/scan/checker.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scan diff --git a/src/testing/controller/scan/controller.go b/src/testing/controller/scan/controller.go index bdf1de5eb87..6c952a9dcc6 100644 --- a/src/testing/controller/scan/controller.go +++ b/src/testing/controller/scan/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scan diff --git a/src/testing/controller/scandataexport/controller.go b/src/testing/controller/scandataexport/controller.go index 8eb625af768..89003e25613 100644 --- a/src/testing/controller/scandataexport/controller.go +++ b/src/testing/controller/scandataexport/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scandataexport diff --git a/src/testing/controller/scanner/controller.go b/src/testing/controller/scanner/controller.go index e536845b66e..6fb271c89ff 100644 --- a/src/testing/controller/scanner/controller.go +++ b/src/testing/controller/scanner/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scanner diff --git a/src/testing/controller/securityhub/controller.go b/src/testing/controller/securityhub/controller.go index 1e988b1f24e..9be40ec0e09 100644 --- a/src/testing/controller/securityhub/controller.go +++ b/src/testing/controller/securityhub/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package securityhub diff --git a/src/testing/controller/systemartifact/controller.go b/src/testing/controller/systemartifact/controller.go index 7edd59c62a9..6524590c591 100644 --- a/src/testing/controller/systemartifact/controller.go +++ b/src/testing/controller/systemartifact/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package systemartifact diff --git a/src/testing/controller/task/controller.go b/src/testing/controller/task/controller.go index 800bf6a6218..2f03f83d696 100644 --- a/src/testing/controller/task/controller.go +++ b/src/testing/controller/task/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/controller/task/execution_controller.go b/src/testing/controller/task/execution_controller.go index 5e187e53e2e..b5e8297d42f 100644 --- a/src/testing/controller/task/execution_controller.go +++ b/src/testing/controller/task/execution_controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/controller/user/controller.go b/src/testing/controller/user/controller.go index 12f4253e700..d7c3e553241 100644 --- a/src/testing/controller/user/controller.go +++ b/src/testing/controller/user/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package user diff --git a/src/testing/controller/webhook/controller.go b/src/testing/controller/webhook/controller.go index 27d06e71a8c..c80428ae16c 100644 --- a/src/testing/controller/webhook/controller.go +++ b/src/testing/controller/webhook/controller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package webhook diff --git a/src/testing/job/mock_client.go b/src/testing/job/mock_client.go index 69e001b0a34..d7f927c1e12 100644 --- a/src/testing/job/mock_client.go +++ b/src/testing/job/mock_client.go @@ -3,6 +3,7 @@ package job import ( "fmt" "math/rand" + "slices" "github.com/goharbor/harbor/src/common/http" "github.com/goharbor/harbor/src/common/job/models" @@ -54,10 +55,5 @@ func (mjc *MockJobClient) GetExecutions(uuid string) ([]job.Stats, error) { } func (mjc *MockJobClient) validUUID(uuid string) bool { - for _, u := range mjc.JobUUID { - if uuid == u { - return true - } - } - return false + return slices.Contains(mjc.JobUUID, uuid) } diff --git a/src/testing/jobservice/context.go b/src/testing/jobservice/context.go index b6d01a9dddf..8c7fc0bf1fa 100644 --- a/src/testing/jobservice/context.go +++ b/src/testing/jobservice/context.go @@ -27,7 +27,7 @@ func (mjc *MockJobContext) Build(tracker job.Tracker) (job.Context, error) { } // Get ... -func (mjc *MockJobContext) Get(prop string) (interface{}, bool) { +func (mjc *MockJobContext) Get(prop string) (any, bool) { args := mjc.Called(prop) return args.Get(0), args.Bool(1) } @@ -71,51 +71,51 @@ type MockJobLogger struct { } // Debug ... -func (mjl *MockJobLogger) Debug(v ...interface{}) { +func (mjl *MockJobLogger) Debug(v ...any) { logger.Debug(v...) } // Debugf ... -func (mjl *MockJobLogger) Debugf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Debugf(format string, v ...any) { logger.Debugf(format, v...) } // Info ... -func (mjl *MockJobLogger) Info(v ...interface{}) { +func (mjl *MockJobLogger) Info(v ...any) { logger.Info(v...) } // Infof ... -func (mjl *MockJobLogger) Infof(format string, v ...interface{}) { +func (mjl *MockJobLogger) Infof(format string, v ...any) { logger.Infof(format, v...) } // Warning ... -func (mjl *MockJobLogger) Warning(v ...interface{}) { +func (mjl *MockJobLogger) Warning(v ...any) { logger.Warning(v...) } // Warningf ... -func (mjl *MockJobLogger) Warningf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Warningf(format string, v ...any) { logger.Warningf(format, v...) } // Error ... -func (mjl *MockJobLogger) Error(v ...interface{}) { +func (mjl *MockJobLogger) Error(v ...any) { logger.Error(v...) } // Errorf ... -func (mjl *MockJobLogger) Errorf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Errorf(format string, v ...any) { logger.Errorf(format, v...) } // Fatal ... -func (mjl *MockJobLogger) Fatal(v ...interface{}) { +func (mjl *MockJobLogger) Fatal(v ...any) { logger.Fatal(v...) } // Fatalf ... -func (mjl *MockJobLogger) Fatalf(format string, v ...interface{}) { +func (mjl *MockJobLogger) Fatalf(format string, v ...any) { logger.Fatalf(format, v...) } diff --git a/src/testing/lib/cache/cache.go b/src/testing/lib/cache/cache.go index 036b34bbc1a..bdf7e9258ca 100644 --- a/src/testing/lib/cache/cache.go +++ b/src/testing/lib/cache/cache.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cache diff --git a/src/testing/lib/cache/iterator.go b/src/testing/lib/cache/iterator.go index d25f725da5e..5c7218462cf 100644 --- a/src/testing/lib/cache/iterator.go +++ b/src/testing/lib/cache/iterator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cache diff --git a/src/testing/lib/config/manager.go b/src/testing/lib/config/manager.go index 32e853e3865..276c80f0735 100644 --- a/src/testing/lib/config/manager.go +++ b/src/testing/lib/config/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package config diff --git a/src/testing/lib/orm/creator.go b/src/testing/lib/orm/creator.go index e1d58b116d8..cfba5e8b411 100644 --- a/src/testing/lib/orm/creator.go +++ b/src/testing/lib/orm/creator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package orm diff --git a/src/testing/lib/orm/orm.go b/src/testing/lib/orm/orm.go index 34bec811d81..54588b8f560 100644 --- a/src/testing/lib/orm/orm.go +++ b/src/testing/lib/orm/orm.go @@ -26,39 +26,39 @@ import ( type FakeOrmer struct { } -func (f *FakeOrmer) LoadRelated(md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeOrmer) LoadRelated(md any, name string, args ...utils.KV) (int64, error) { return 0, nil } -func (f *FakeOrmer) QueryM2MWithCtx(ctx context.Context, md interface{}, name string) orm.QueryM2Mer { +func (f *FakeOrmer) QueryM2MWithCtx(ctx context.Context, md any, name string) orm.QueryM2Mer { return nil } -func (f *FakeOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName any) orm.QuerySeter { return nil } -func (f *FakeOrmer) InsertWithCtx(ctx context.Context, md interface{}) (int64, error) { +func (f *FakeOrmer) InsertWithCtx(ctx context.Context, md any) (int64, error) { return 0, nil } -func (f *FakeOrmer) InsertOrUpdateWithCtx(ctx context.Context, md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeOrmer) InsertOrUpdateWithCtx(ctx context.Context, md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } -func (f *FakeOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds interface{}) (int64, error) { +func (f *FakeOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds any) (int64, error) { return 0, nil } -func (f *FakeOrmer) UpdateWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) UpdateWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeOrmer) DeleteWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) DeleteWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeOrmer) RawWithCtx(ctx context.Context, query string, args ...interface{}) orm.RawSeter { +func (f *FakeOrmer) RawWithCtx(ctx context.Context, query string, args ...any) orm.RawSeter { return nil } @@ -95,68 +95,68 @@ func (f *FakeOrmer) DoTxWithCtxAndOpts(ctx context.Context, opts *sql.TxOptions, } // Read ... -func (f *FakeOrmer) Read(md interface{}, cols ...string) error { +func (f *FakeOrmer) Read(md any, cols ...string) error { return nil } -func (f *FakeOrmer) ReadWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeOrmer) ReadWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeOrmer) ReadForUpdateWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeOrmer) ReadForUpdateWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeOrmer) ReadOrCreateWithCtx(ctx context.Context, md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeOrmer) ReadOrCreateWithCtx(ctx context.Context, md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } -func (f *FakeOrmer) LoadRelatedWithCtx(_ context.Context, md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeOrmer) LoadRelatedWithCtx(_ context.Context, md any, name string, args ...utils.KV) (int64, error) { return 0, nil } // ReadForUpdate ... -func (f *FakeOrmer) ReadForUpdate(md interface{}, cols ...string) error { +func (f *FakeOrmer) ReadForUpdate(md any, cols ...string) error { return nil } // ReadOrCreate ... -func (f *FakeOrmer) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeOrmer) ReadOrCreate(md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } // Insert ... -func (f *FakeOrmer) Insert(interface{}) (int64, error) { +func (f *FakeOrmer) Insert(any) (int64, error) { return 0, nil } // InsertOrUpdate ... -func (f *FakeOrmer) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeOrmer) InsertOrUpdate(md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } // InsertMulti ... -func (f *FakeOrmer) InsertMulti(bulk int, mds interface{}) (int64, error) { +func (f *FakeOrmer) InsertMulti(bulk int, mds any) (int64, error) { return 0, nil } // Update ... -func (f *FakeOrmer) Update(md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) Update(md any, cols ...string) (int64, error) { return 0, nil } // Delete ... -func (f *FakeOrmer) Delete(md interface{}, cols ...string) (int64, error) { +func (f *FakeOrmer) Delete(md any, cols ...string) (int64, error) { return 0, nil } // QueryM2M ... -func (f *FakeOrmer) QueryM2M(md interface{}, name string) orm.QueryM2Mer { +func (f *FakeOrmer) QueryM2M(md any, name string) orm.QueryM2Mer { return nil } // QueryTable ... -func (f *FakeOrmer) QueryTable(ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeOrmer) QueryTable(ptrStructOrTableName any) orm.QuerySeter { return nil } @@ -181,7 +181,7 @@ func (f *FakeOrmer) Rollback() error { } // Raw ... -func (f *FakeOrmer) Raw(query string, args ...interface{}) orm.RawSeter { +func (f *FakeOrmer) Raw(query string, args ...any) orm.RawSeter { return &FakeRawSeter{} } @@ -199,51 +199,51 @@ func (f *FakeOrmer) DBStats() *sql.DBStats { type FakeTxOrmer struct { } -func (f *FakeTxOrmer) Read(md interface{}, cols ...string) error { +func (f *FakeTxOrmer) Read(md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeTxOrmer) ReadWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadForUpdate(md interface{}, cols ...string) error { +func (f *FakeTxOrmer) ReadForUpdate(md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadForUpdateWithCtx(ctx context.Context, md interface{}, cols ...string) error { +func (f *FakeTxOrmer) ReadForUpdateWithCtx(ctx context.Context, md any, cols ...string) error { return nil } -func (f *FakeTxOrmer) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeTxOrmer) ReadOrCreate(md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } -func (f *FakeTxOrmer) ReadOrCreateWithCtx(ctx context.Context, md interface{}, col1 string, cols ...string) (bool, int64, error) { +func (f *FakeTxOrmer) ReadOrCreateWithCtx(ctx context.Context, md any, col1 string, cols ...string) (bool, int64, error) { return false, 0, nil } -func (f *FakeTxOrmer) LoadRelated(md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeTxOrmer) LoadRelated(md any, name string, args ...utils.KV) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) LoadRelatedWithCtx(ctx context.Context, md interface{}, name string, args ...utils.KV) (int64, error) { +func (f *FakeTxOrmer) LoadRelatedWithCtx(ctx context.Context, md any, name string, args ...utils.KV) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) QueryM2M(md interface{}, name string) orm.QueryM2Mer { +func (f *FakeTxOrmer) QueryM2M(md any, name string) orm.QueryM2Mer { return nil } -func (f *FakeTxOrmer) QueryM2MWithCtx(ctx context.Context, md interface{}, name string) orm.QueryM2Mer { +func (f *FakeTxOrmer) QueryM2MWithCtx(ctx context.Context, md any, name string) orm.QueryM2Mer { return nil } -func (f *FakeTxOrmer) QueryTable(ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeTxOrmer) QueryTable(ptrStructOrTableName any) orm.QuerySeter { return nil } -func (f *FakeTxOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName interface{}) orm.QuerySeter { +func (f *FakeTxOrmer) QueryTableWithCtx(ctx context.Context, ptrStructOrTableName any) orm.QuerySeter { return nil } @@ -251,51 +251,51 @@ func (f *FakeTxOrmer) DBStats() *sql.DBStats { return nil } -func (f *FakeTxOrmer) Insert(md interface{}) (int64, error) { +func (f *FakeTxOrmer) Insert(md any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertWithCtx(ctx context.Context, md interface{}) (int64, error) { +func (f *FakeTxOrmer) InsertWithCtx(ctx context.Context, md any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeTxOrmer) InsertOrUpdate(md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertOrUpdateWithCtx(ctx context.Context, md interface{}, colConflitAndArgs ...string) (int64, error) { +func (f *FakeTxOrmer) InsertOrUpdateWithCtx(ctx context.Context, md any, colConflitAndArgs ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertMulti(bulk int, mds interface{}) (int64, error) { +func (f *FakeTxOrmer) InsertMulti(bulk int, mds any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds interface{}) (int64, error) { +func (f *FakeTxOrmer) InsertMultiWithCtx(ctx context.Context, bulk int, mds any) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) Update(md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) Update(md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) UpdateWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) UpdateWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) Delete(md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) Delete(md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) DeleteWithCtx(ctx context.Context, md interface{}, cols ...string) (int64, error) { +func (f *FakeTxOrmer) DeleteWithCtx(ctx context.Context, md any, cols ...string) (int64, error) { return 0, nil } -func (f *FakeTxOrmer) Raw(query string, args ...interface{}) orm.RawSeter { +func (f *FakeTxOrmer) Raw(query string, args ...any) orm.RawSeter { return &FakeRawSeter{} } -func (f *FakeTxOrmer) RawWithCtx(ctx context.Context, query string, args ...interface{}) orm.RawSeter { +func (f *FakeTxOrmer) RawWithCtx(ctx context.Context, query string, args ...any) orm.RawSeter { return nil } @@ -323,15 +323,15 @@ func (f FakeRawSeter) Exec() (sql.Result, error) { return nil, nil } -func (f FakeRawSeter) QueryRow(containers ...interface{}) error { +func (f FakeRawSeter) QueryRow(containers ...any) error { return nil } -func (f FakeRawSeter) QueryRows(containers ...interface{}) (int64, error) { +func (f FakeRawSeter) QueryRows(containers ...any) (int64, error) { return 0, nil } -func (f FakeRawSeter) SetArgs(i ...interface{}) orm.RawSeter { +func (f FakeRawSeter) SetArgs(i ...any) orm.RawSeter { return nil } @@ -351,7 +351,7 @@ func (f FakeRawSeter) RowsToMap(result *orm.Params, keyCol, valueCol string) (in return 0, nil } -func (f FakeRawSeter) RowsToStruct(ptrStruct interface{}, keyCol, valueCol string) (int64, error) { +func (f FakeRawSeter) RowsToStruct(ptrStruct any, keyCol, valueCol string) (int64, error) { return 0, nil } diff --git a/src/testing/mock/mock.go b/src/testing/mock/mock.go index 3595cd657a8..b095535f411 100644 --- a/src/testing/mock/mock.go +++ b/src/testing/mock/mock.go @@ -35,11 +35,11 @@ var ( type Arguments = mock.Arguments type mockable interface { - On(methodName string, arguments ...interface{}) *mock.Call + On(methodName string, arguments ...any) *mock.Call } // OnAnything mock method on obj which match any args -func OnAnything(obj interface{}, methodName string) *mock.Call { +func OnAnything(obj any, methodName string) *mock.Call { m, ok := obj.(mockable) if !ok { panic("obj not mockable") @@ -52,8 +52,8 @@ func OnAnything(obj interface{}, methodName string) *mock.Call { panic(fmt.Sprintf("assert: arguments: %s is not a func", v)) } - args := []interface{}{} - for i := 0; i < fnType.NumIn(); i++ { + args := []any{} + for range fnType.NumIn() { args = append(args, mock.Anything) } diff --git a/src/testing/pkg/accessory/dao/dao.go b/src/testing/pkg/accessory/dao/dao.go index 8ebfe552430..a91fba3e75d 100644 --- a/src/testing/pkg/accessory/dao/dao.go +++ b/src/testing/pkg/accessory/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/accessory/manager.go b/src/testing/pkg/accessory/manager.go index 443cf862261..f49d3ad7331 100644 --- a/src/testing/pkg/accessory/manager.go +++ b/src/testing/pkg/accessory/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package accessory diff --git a/src/testing/pkg/accessory/model/accessory.go b/src/testing/pkg/accessory/model/accessory.go index 06bfe78f732..fb5cbd7254e 100644 --- a/src/testing/pkg/accessory/model/accessory.go +++ b/src/testing/pkg/accessory/model/accessory.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package model diff --git a/src/testing/pkg/allowlist/dao/dao.go b/src/testing/pkg/allowlist/dao/dao.go index b16693704dd..e2d92ef5bab 100644 --- a/src/testing/pkg/allowlist/dao/dao.go +++ b/src/testing/pkg/allowlist/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/allowlist/manager.go b/src/testing/pkg/allowlist/manager.go index b684b0c8dfc..452b34322ff 100644 --- a/src/testing/pkg/allowlist/manager.go +++ b/src/testing/pkg/allowlist/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package allowlist diff --git a/src/testing/pkg/artifact/manager.go b/src/testing/pkg/artifact/manager.go index 225b5b96ddc..ffcaeeb6979 100644 --- a/src/testing/pkg/artifact/manager.go +++ b/src/testing/pkg/artifact/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package artifact diff --git a/src/testing/pkg/artifactrash/manager.go b/src/testing/pkg/artifactrash/manager.go index 19dec5d5d08..fbaff20f167 100644 --- a/src/testing/pkg/artifactrash/manager.go +++ b/src/testing/pkg/artifactrash/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package artifactrash diff --git a/src/testing/pkg/audit/dao/dao.go b/src/testing/pkg/audit/dao/dao.go index d6273686cb0..02ece9f79d3 100644 --- a/src/testing/pkg/audit/dao/dao.go +++ b/src/testing/pkg/audit/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/audit/manager.go b/src/testing/pkg/audit/manager.go index 6ca666b80c0..0bd35fef0c5 100644 --- a/src/testing/pkg/audit/manager.go +++ b/src/testing/pkg/audit/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package audit diff --git a/src/testing/pkg/auditext/dao/dao.go b/src/testing/pkg/auditext/dao/dao.go index 3b98c619667..a1322606b1a 100644 --- a/src/testing/pkg/auditext/dao/dao.go +++ b/src/testing/pkg/auditext/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/auditext/manager.go b/src/testing/pkg/auditext/manager.go index de6d8c57c77..d68cda8be28 100644 --- a/src/testing/pkg/auditext/manager.go +++ b/src/testing/pkg/auditext/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package auditext diff --git a/src/testing/pkg/blob/manager.go b/src/testing/pkg/blob/manager.go index 62ad23c841e..9a2985959db 100644 --- a/src/testing/pkg/blob/manager.go +++ b/src/testing/pkg/blob/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package blob diff --git a/src/testing/pkg/cached/manifest/redis/cached_manager.go b/src/testing/pkg/cached/manifest/redis/cached_manager.go index 4cc6ae7ef5e..7405d8ff067 100644 --- a/src/testing/pkg/cached/manifest/redis/cached_manager.go +++ b/src/testing/pkg/cached/manifest/redis/cached_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package redis diff --git a/src/testing/pkg/chart/operator.go b/src/testing/pkg/chart/operator.go index 1023f50ab20..9084f3041cd 100644 --- a/src/testing/pkg/chart/operator.go +++ b/src/testing/pkg/chart/operator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package chart diff --git a/src/testing/pkg/distribution/manifest.go b/src/testing/pkg/distribution/manifest.go index 2893d4d335f..24246f2e371 100644 --- a/src/testing/pkg/distribution/manifest.go +++ b/src/testing/pkg/distribution/manifest.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package distribution diff --git a/src/testing/pkg/immutable/dao/dao.go b/src/testing/pkg/immutable/dao/dao.go index e27357a7d5d..4ee31353f2a 100644 --- a/src/testing/pkg/immutable/dao/dao.go +++ b/src/testing/pkg/immutable/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/immutable/matcher.go b/src/testing/pkg/immutable/matcher.go index a961564cffc..8e9cb260851 100644 --- a/src/testing/pkg/immutable/matcher.go +++ b/src/testing/pkg/immutable/matcher.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package immutable diff --git a/src/testing/pkg/joblog/dao/dao.go b/src/testing/pkg/joblog/dao/dao.go index 0f7f16394d0..fa02f77b8a4 100644 --- a/src/testing/pkg/joblog/dao/dao.go +++ b/src/testing/pkg/joblog/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/joblog/manager.go b/src/testing/pkg/joblog/manager.go index 0daf9f4c263..809519163f8 100644 --- a/src/testing/pkg/joblog/manager.go +++ b/src/testing/pkg/joblog/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package joblog diff --git a/src/testing/pkg/jobmonitor/job_service_monitor_client.go b/src/testing/pkg/jobmonitor/job_service_monitor_client.go index 85d810d7c2d..32d0d3d9b2e 100644 --- a/src/testing/pkg/jobmonitor/job_service_monitor_client.go +++ b/src/testing/pkg/jobmonitor/job_service_monitor_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/pool_manager.go b/src/testing/pkg/jobmonitor/pool_manager.go index 9e1fe4f9786..b546606e21d 100644 --- a/src/testing/pkg/jobmonitor/pool_manager.go +++ b/src/testing/pkg/jobmonitor/pool_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/queue_manager.go b/src/testing/pkg/jobmonitor/queue_manager.go index e7ce33a2598..16e644bccfb 100644 --- a/src/testing/pkg/jobmonitor/queue_manager.go +++ b/src/testing/pkg/jobmonitor/queue_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/redis_client.go b/src/testing/pkg/jobmonitor/redis_client.go index c5bdb97e5e7..799ccdebe4c 100644 --- a/src/testing/pkg/jobmonitor/redis_client.go +++ b/src/testing/pkg/jobmonitor/redis_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/jobmonitor/worker_manager.go b/src/testing/pkg/jobmonitor/worker_manager.go index b26ee6ffca1..8fa5a6b53ee 100644 --- a/src/testing/pkg/jobmonitor/worker_manager.go +++ b/src/testing/pkg/jobmonitor/worker_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package jobmonitor diff --git a/src/testing/pkg/label/dao/dao.go b/src/testing/pkg/label/dao/dao.go index 7f353c07812..ca5a6bda261 100644 --- a/src/testing/pkg/label/dao/dao.go +++ b/src/testing/pkg/label/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/label/manager.go b/src/testing/pkg/label/manager.go index 7063bbd2e0a..6d3164761d6 100644 --- a/src/testing/pkg/label/manager.go +++ b/src/testing/pkg/label/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package label diff --git a/src/testing/pkg/ldap/manager.go b/src/testing/pkg/ldap/manager.go index a865391e320..3670a954796 100644 --- a/src/testing/pkg/ldap/manager.go +++ b/src/testing/pkg/ldap/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package ldap diff --git a/src/testing/pkg/member/fake_member_manager.go b/src/testing/pkg/member/fake_member_manager.go index 5252c2846df..4267f2b12e5 100644 --- a/src/testing/pkg/member/fake_member_manager.go +++ b/src/testing/pkg/member/fake_member_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package member diff --git a/src/testing/pkg/notification/policy/dao/dao.go b/src/testing/pkg/notification/policy/dao/dao.go index 9d7547ca465..d5c08afca14 100644 --- a/src/testing/pkg/notification/policy/dao/dao.go +++ b/src/testing/pkg/notification/policy/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/notification/policy/manager.go b/src/testing/pkg/notification/policy/manager.go index 07c406fff1d..fdb14ce714e 100644 --- a/src/testing/pkg/notification/policy/manager.go +++ b/src/testing/pkg/notification/policy/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package policy diff --git a/src/testing/pkg/oidc/dao/meta_dao.go b/src/testing/pkg/oidc/dao/meta_dao.go index 7492532742c..8a40225af93 100644 --- a/src/testing/pkg/oidc/dao/meta_dao.go +++ b/src/testing/pkg/oidc/dao/meta_dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/oidc/meta_manager.go b/src/testing/pkg/oidc/meta_manager.go index 54668823a43..3f3c4c42959 100644 --- a/src/testing/pkg/oidc/meta_manager.go +++ b/src/testing/pkg/oidc/meta_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package oidc diff --git a/src/testing/pkg/p2p/preheat/instance/manager.go b/src/testing/pkg/p2p/preheat/instance/manager.go index 5fe05fd8042..85475cf0f47 100644 --- a/src/testing/pkg/p2p/preheat/instance/manager.go +++ b/src/testing/pkg/p2p/preheat/instance/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package instance diff --git a/src/testing/pkg/p2p/preheat/policy/manager.go b/src/testing/pkg/p2p/preheat/policy/manager.go index 4f09455f93b..adb8d65a3f4 100644 --- a/src/testing/pkg/p2p/preheat/policy/manager.go +++ b/src/testing/pkg/p2p/preheat/policy/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package policy diff --git a/src/testing/pkg/parser/parser.go b/src/testing/pkg/parser/parser.go index 785347ec3c8..24acb57f8dc 100644 --- a/src/testing/pkg/parser/parser.go +++ b/src/testing/pkg/parser/parser.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package parser diff --git a/src/testing/pkg/processor/processor.go b/src/testing/pkg/processor/processor.go index e97d1320697..e3e8bed06f4 100644 --- a/src/testing/pkg/processor/processor.go +++ b/src/testing/pkg/processor/processor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package processor diff --git a/src/testing/pkg/project/manager.go b/src/testing/pkg/project/manager.go index ab159eb6700..23fd2bc7784 100644 --- a/src/testing/pkg/project/manager.go +++ b/src/testing/pkg/project/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package project diff --git a/src/testing/pkg/project/metadata/manager.go b/src/testing/pkg/project/metadata/manager.go index f93ebbcee24..76610d37acf 100644 --- a/src/testing/pkg/project/metadata/manager.go +++ b/src/testing/pkg/project/metadata/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package metadata diff --git a/src/testing/pkg/queuestatus/manager.go b/src/testing/pkg/queuestatus/manager.go index 59a85ebc725..2ce6a77cee6 100644 --- a/src/testing/pkg/queuestatus/manager.go +++ b/src/testing/pkg/queuestatus/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package queuestatus diff --git a/src/testing/pkg/quota/driver/driver.go b/src/testing/pkg/quota/driver/driver.go index 69f459aa7be..0ac1eb57cf2 100644 --- a/src/testing/pkg/quota/driver/driver.go +++ b/src/testing/pkg/quota/driver/driver.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package driver diff --git a/src/testing/pkg/quota/manager.go b/src/testing/pkg/quota/manager.go index 37a7ae4b7a0..6053360b74a 100644 --- a/src/testing/pkg/quota/manager.go +++ b/src/testing/pkg/quota/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package quota diff --git a/src/testing/pkg/rbac/dao/dao.go b/src/testing/pkg/rbac/dao/dao.go index 7e06417d2d3..78a08b6343e 100644 --- a/src/testing/pkg/rbac/dao/dao.go +++ b/src/testing/pkg/rbac/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/rbac/manager.go b/src/testing/pkg/rbac/manager.go index 828f1190402..66567ca81db 100644 --- a/src/testing/pkg/rbac/manager.go +++ b/src/testing/pkg/rbac/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package rbac diff --git a/src/testing/pkg/reg/adapter/adapter.go b/src/testing/pkg/reg/adapter/adapter.go index b19d5524217..183c0a6d337 100644 --- a/src/testing/pkg/reg/adapter/adapter.go +++ b/src/testing/pkg/reg/adapter/adapter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package adapter diff --git a/src/testing/pkg/reg/dao/dao.go b/src/testing/pkg/reg/dao/dao.go index 9477b9c16c1..f54d624aee1 100644 --- a/src/testing/pkg/reg/dao/dao.go +++ b/src/testing/pkg/reg/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/reg/manager.go b/src/testing/pkg/reg/manager.go index 8ed3b5fd1ac..8c67490f979 100644 --- a/src/testing/pkg/reg/manager.go +++ b/src/testing/pkg/reg/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package reg diff --git a/src/testing/pkg/registry/fake_registry_client.go b/src/testing/pkg/registry/fake_registry_client.go index 9dc8c3a7c3c..577eff9da1a 100644 --- a/src/testing/pkg/registry/fake_registry_client.go +++ b/src/testing/pkg/registry/fake_registry_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package registry diff --git a/src/testing/pkg/replication/dao/dao.go b/src/testing/pkg/replication/dao/dao.go index e39d0df5546..3b0626a65fe 100644 --- a/src/testing/pkg/replication/dao/dao.go +++ b/src/testing/pkg/replication/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/replication/manager.go b/src/testing/pkg/replication/manager.go index ba3f46cff1e..0c23fb4d90b 100644 --- a/src/testing/pkg/replication/manager.go +++ b/src/testing/pkg/replication/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package replication diff --git a/src/testing/pkg/repository/dao/dao.go b/src/testing/pkg/repository/dao/dao.go index 4c8a9fcd35a..247b86bb32e 100644 --- a/src/testing/pkg/repository/dao/dao.go +++ b/src/testing/pkg/repository/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/repository/manager.go b/src/testing/pkg/repository/manager.go index fc28d1fa423..a2210831a0a 100644 --- a/src/testing/pkg/repository/manager.go +++ b/src/testing/pkg/repository/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package repository diff --git a/src/testing/pkg/robot/dao/dao.go b/src/testing/pkg/robot/dao/dao.go index c080792662d..42020586081 100644 --- a/src/testing/pkg/robot/dao/dao.go +++ b/src/testing/pkg/robot/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/robot/manager.go b/src/testing/pkg/robot/manager.go index a0f397e2bdd..549ebef192c 100644 --- a/src/testing/pkg/robot/manager.go +++ b/src/testing/pkg/robot/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package robot diff --git a/src/testing/pkg/scan/export/artifact_digest_calculator.go b/src/testing/pkg/scan/export/artifact_digest_calculator.go index 2a1afd76086..48caf88e1df 100644 --- a/src/testing/pkg/scan/export/artifact_digest_calculator.go +++ b/src/testing/pkg/scan/export/artifact_digest_calculator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package export diff --git a/src/testing/pkg/scan/export/filter_processor.go b/src/testing/pkg/scan/export/filter_processor.go index 2ea32f4becd..65862f7beb6 100644 --- a/src/testing/pkg/scan/export/filter_processor.go +++ b/src/testing/pkg/scan/export/filter_processor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package export diff --git a/src/testing/pkg/scan/export/manager.go b/src/testing/pkg/scan/export/manager.go index 32d6e1cd666..d5ac34a21b7 100644 --- a/src/testing/pkg/scan/export/manager.go +++ b/src/testing/pkg/scan/export/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package export diff --git a/src/testing/pkg/scan/handler.go b/src/testing/pkg/scan/handler.go index 9d4e0ccdae1..3854e0337c8 100644 --- a/src/testing/pkg/scan/handler.go +++ b/src/testing/pkg/scan/handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scan diff --git a/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go b/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go index 8b5e3432de1..ee13ffc8e17 100644 --- a/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go +++ b/src/testing/pkg/scan/postprocessors/native_scan_report_converter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package postprocessors diff --git a/src/testing/pkg/scan/report/manager.go b/src/testing/pkg/scan/report/manager.go index 7c499b79f57..c7500370b7d 100644 --- a/src/testing/pkg/scan/report/manager.go +++ b/src/testing/pkg/scan/report/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package report diff --git a/src/testing/pkg/scan/rest/v1/client.go b/src/testing/pkg/scan/rest/v1/client.go index e1172b02366..bb3cc17e24f 100644 --- a/src/testing/pkg/scan/rest/v1/client.go +++ b/src/testing/pkg/scan/rest/v1/client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/rest/v1/client_pool.go b/src/testing/pkg/scan/rest/v1/client_pool.go index 37f8e572d03..b8513132862 100644 --- a/src/testing/pkg/scan/rest/v1/client_pool.go +++ b/src/testing/pkg/scan/rest/v1/client_pool.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/rest/v1/request_resolver.go b/src/testing/pkg/scan/rest/v1/request_resolver.go index 932f447abdf..a4cd95bba3b 100644 --- a/src/testing/pkg/scan/rest/v1/request_resolver.go +++ b/src/testing/pkg/scan/rest/v1/request_resolver.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/rest/v1/response_handler.go b/src/testing/pkg/scan/rest/v1/response_handler.go index bdb15b2c0ac..5445cc96d07 100644 --- a/src/testing/pkg/scan/rest/v1/response_handler.go +++ b/src/testing/pkg/scan/rest/v1/response_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package v1 diff --git a/src/testing/pkg/scan/sbom/manager.go b/src/testing/pkg/scan/sbom/manager.go index 1751c90a384..b156a4cdb43 100644 --- a/src/testing/pkg/scan/sbom/manager.go +++ b/src/testing/pkg/scan/sbom/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package sbom diff --git a/src/testing/pkg/scan/scanner/manager.go b/src/testing/pkg/scan/scanner/manager.go index 6d562635090..68d79f6e4cf 100644 --- a/src/testing/pkg/scan/scanner/manager.go +++ b/src/testing/pkg/scan/scanner/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scanner diff --git a/src/testing/pkg/scheduler/scheduler.go b/src/testing/pkg/scheduler/scheduler.go index 601b7face7e..d02f76ad9ea 100644 --- a/src/testing/pkg/scheduler/scheduler.go +++ b/src/testing/pkg/scheduler/scheduler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package scheduler diff --git a/src/testing/pkg/securityhub/manager.go b/src/testing/pkg/securityhub/manager.go index e686cb6d144..91c11e5b864 100644 --- a/src/testing/pkg/securityhub/manager.go +++ b/src/testing/pkg/securityhub/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package securityhub diff --git a/src/testing/pkg/systemartifact/cleanup/selector.go b/src/testing/pkg/systemartifact/cleanup/selector.go index 2027a222d9a..44dc06c2627 100644 --- a/src/testing/pkg/systemartifact/cleanup/selector.go +++ b/src/testing/pkg/systemartifact/cleanup/selector.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package cleanup diff --git a/src/testing/pkg/systemartifact/dao/dao.go b/src/testing/pkg/systemartifact/dao/dao.go index 43480e3b59a..13a2d62d351 100644 --- a/src/testing/pkg/systemartifact/dao/dao.go +++ b/src/testing/pkg/systemartifact/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/systemartifact/manager.go b/src/testing/pkg/systemartifact/manager.go index f5e014f7154..e8e6e499632 100644 --- a/src/testing/pkg/systemartifact/manager.go +++ b/src/testing/pkg/systemartifact/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package systemartifact diff --git a/src/testing/pkg/tag/manager.go b/src/testing/pkg/tag/manager.go index e5acff10414..518725e1e42 100644 --- a/src/testing/pkg/tag/manager.go +++ b/src/testing/pkg/tag/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package tag diff --git a/src/testing/pkg/task/execution_manager.go b/src/testing/pkg/task/execution_manager.go index 4c28f9eb183..524eab54ca7 100644 --- a/src/testing/pkg/task/execution_manager.go +++ b/src/testing/pkg/task/execution_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/pkg/task/manager.go b/src/testing/pkg/task/manager.go index 2de7636ed18..506ecce8bff 100644 --- a/src/testing/pkg/task/manager.go +++ b/src/testing/pkg/task/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package task diff --git a/src/testing/pkg/user/dao/dao.go b/src/testing/pkg/user/dao/dao.go index 10304cdf307..c40af3c2ccf 100644 --- a/src/testing/pkg/user/dao/dao.go +++ b/src/testing/pkg/user/dao/dao.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package dao diff --git a/src/testing/pkg/user/manager.go b/src/testing/pkg/user/manager.go index 8f0826b8f57..4d3228dcc59 100644 --- a/src/testing/pkg/user/manager.go +++ b/src/testing/pkg/user/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package user diff --git a/src/testing/pkg/usergroup/fake_usergroup_manager.go b/src/testing/pkg/usergroup/fake_usergroup_manager.go index 40439bb6dab..2ab429d469a 100644 --- a/src/testing/pkg/usergroup/fake_usergroup_manager.go +++ b/src/testing/pkg/usergroup/fake_usergroup_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package usergroup diff --git a/src/testing/registryctl/client.go b/src/testing/registryctl/client.go index eda6ed061a9..9b1284236d6 100644 --- a/src/testing/registryctl/client.go +++ b/src/testing/registryctl/client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.51.0. DO NOT EDIT. +// Code generated by mockery v2.53.3. DO NOT EDIT. package registryctl diff --git a/src/testing/server/v2.0/handler/handler.go b/src/testing/server/v2.0/handler/handler.go index a632f3968c8..b8b2f6983e1 100644 --- a/src/testing/server/v2.0/handler/handler.go +++ b/src/testing/server/v2.0/handler/handler.go @@ -94,7 +94,7 @@ func (suite *Suite) Get(url string, headers ...map[string]string) (*http.Respons } // GetJSON ... -func (suite *Suite) GetJSON(url string, js interface{}, headers ...map[string]string) (*http.Response, error) { +func (suite *Suite) GetJSON(url string, js any, headers ...map[string]string) (*http.Response, error) { res, err := suite.Get(url, headers...) if err != nil { return nil, err @@ -123,7 +123,7 @@ func (suite *Suite) Patch(url string, body io.Reader, headers ...map[string]stri } // PatchJSON ... -func (suite *Suite) PatchJSON(url string, js interface{}) (*http.Response, error) { +func (suite *Suite) PatchJSON(url string, js any) (*http.Response, error) { buf, err := json.Marshal(js) if err != nil { return nil, err @@ -138,7 +138,7 @@ func (suite *Suite) Post(url string, body io.Reader, headers ...map[string]strin } // PostJSON ... -func (suite *Suite) PostJSON(url string, js interface{}) (*http.Response, error) { +func (suite *Suite) PostJSON(url string, js any) (*http.Response, error) { buf, err := json.Marshal(js) if err != nil { return nil, err @@ -153,7 +153,7 @@ func (suite *Suite) Put(url string, body io.Reader, headers ...map[string]string } // PutJSON ... -func (suite *Suite) PutJSON(url string, js interface{}) (*http.Response, error) { +func (suite *Suite) PutJSON(url string, js any) (*http.Response, error) { buf, err := json.Marshal(js) if err != nil { return nil, err diff --git a/src/testing/suite.go b/src/testing/suite.go index 51fcb6e9fcd..1c693d21efa 100644 --- a/src/testing/suite.go +++ b/src/testing/suite.go @@ -152,7 +152,7 @@ func (suite *Suite) NextHandler(statusCode int, headers map[string]string) http. } // ExecSQL ... -func (suite *Suite) ExecSQL(query string, args ...interface{}) { +func (suite *Suite) ExecSQL(query string, args ...any) { o := o.NewOrm() _, err := o.Raw(query, args...).Exec() diff --git a/tests/apitests/python/library/docker_api.py b/tests/apitests/python/library/docker_api.py index e18b18173e7..0f36a6c7fc5 100644 --- a/tests/apitests/python/library/docker_api.py +++ b/tests/apitests/python/library/docker_api.py @@ -92,7 +92,8 @@ def list_image_tags(harbor_host, repository, username, password, n = None, last class DockerAPI(object): def __init__(self): - self.DCLIENT = docker.APIClient(base_url='unix://var/run/docker.sock',version='auto',timeout=30) + # The 120-second timeout is set to support robot test cases that may require extended durations. + self.DCLIENT = docker.APIClient(base_url='unix://var/run/docker.sock',version='auto',timeout=120) self.DCLIENT2 = docker.from_env() def docker_login(self, registry, username, password, expected_error_message = None): diff --git a/tests/ci/api_common_install.sh b/tests/ci/api_common_install.sh index 470d58fa4cf..8e1bc9407da 100755 --- a/tests/ci/api_common_install.sh +++ b/tests/ci/api_common_install.sh @@ -58,7 +58,7 @@ then sed "s/# github_token: xxx/github_token: $GITHUB_TOKEN/" -i make/harbor.yml fi -sudo make compile build prepare COMPILETAG=compile_golangimage GOBUILDTAGS="include_oss include_gcs" TRIVYFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false +sudo make compile build prepare COMPILETAG=compile_golangimage GOBUILDTAGS="include_oss include_gcs" TRIVYFLAG=true EXPORTERFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false # set the debugging env echo "GC_TIME_WINDOW_HOURS=0" | sudo tee -a ./make/common/config/core/env diff --git a/tests/ci/api_run.sh b/tests/ci/api_run.sh index 83f60ffd8bd..498e4057959 100755 --- a/tests/ci/api_run.sh +++ b/tests/ci/api_run.sh @@ -3,7 +3,7 @@ set -x #source gskey.sh -sudo gsutil version -l +sudo aws --version harbor_logs_bucket="harbor-ci-logs" @@ -12,8 +12,7 @@ E2E_IMAGE="goharbor/harbor-e2e-engine:latest-api" # GS util function uploader { - sudo gsutil cp $1 gs://$2/$1 - sudo gsutil acl ch -u AllUsers:R gs://$2/$1 + sudo aws s3 cp $1 s3://$2/$1 } set +e @@ -21,9 +20,9 @@ set +e docker ps # run db auth api cases if [ "$1" = 'DB' ]; then - docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --exclude proxy_cache -v DOCKER_USER:${DOCKER_USER} -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:Harbor12345 /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot + docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --exclude proxy_cache -v DOCKER_USER:"${DOCKER_USER}" -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:${HARBOR_ADMIN_PASSWD} -v HARBOR_ADMIN:${HARBOR_ADMIN} /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot elif [ "$1" = 'PROXY_CACHE' ]; then - docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --include setup --include proxy_cache -v DOCKER_USER:${DOCKER_USER} -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:Harbor12345 /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot + docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot --include setup --include proxy_cache -v DOCKER_USER:"${DOCKER_USER}" -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:${HARBOR_ADMIN_PASSWD} -v HARBOR_ADMIN:${HARBOR_ADMIN} /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_DB.robot elif [ "$1" = 'LDAP' ]; then # run ldap api cases python $DIR/../../tests/configharbor.py -H $IP -u $HARBOR_ADMIN -p $HARBOR_ADMIN_PASSWD -c auth_mode=ldap_auth \ @@ -32,24 +31,24 @@ elif [ "$1" = 'LDAP' ]; then ldap_search_password=admin \ ldap_base_dn=dc=example,dc=com \ ldap_uid=cn - docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot -v DOCKER_USER:${DOCKER_USER} -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:Harbor12345 /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_LDAP.robot + docker run -i --privileged -v $DIR/../../:/drone -v $DIR/../:/ca -w /drone $E2E_IMAGE robot -v DOCKER_USER:"${DOCKER_USER}" -v DOCKER_PWD:${DOCKER_PWD} -v ip:$2 -v ip1: -v http_get_ca:false -v HARBOR_PASSWORD:${HARBOR_ADMIN_PASSWD} -v HARBOR_ADMIN:${HARBOR_ADMIN} /drone/tests/robot-cases/Group1-Nightly/Setup.robot /drone/tests/robot-cases/Group0-BAT/API_LDAP.robot else rc=999 fi rc=$? ## --------------------------------------------- Upload Harbor CI Logs ------------------------------------------- -timestamp=$(date +%s) -GIT_COMMIT=$(git rev-parse --short "$GITHUB_SHA") -outfile="integration_logs_$timestamp$GIT_COMMIT.tar.gz" -sudo tar -zcvf $outfile output.xml log.html /var/log/harbor/* -if [ -f "$outfile" ]; then - uploader $outfile $harbor_logs_bucket - echo "----------------------------------------------" - echo "Download test logs:" - echo "https://storage.googleapis.com/harbor-ci-logs/$outfile" - echo "----------------------------------------------" -else - echo "No log output file to upload" -fi +#timestamp=$(date +%s) +#GIT_COMMIT=$(git rev-parse --short "$GITHUB_SHA") +#outfile="integration_logs_$timestamp$GIT_COMMIT.tar.gz" +#sudo tar -zcvf $outfile output.xml log.html /var/log/harbor/* +#if [ -f "$outfile" ]; then +# uploader $outfile $harbor_logs_bucket +# echo "----------------------------------------------" +# echo "Download test logs:" +# echo "https://storage.googleapis.com/harbor-ci-logs/$outfile" +# echo "----------------------------------------------" +#else +# echo "No log output file to upload" +#fi exit $rc diff --git a/tests/ci/build_util.sh b/tests/ci/build_util.sh index 4d5a521f09a..27585cdc646 100644 --- a/tests/ci/build_util.sh +++ b/tests/ci/build_util.sh @@ -4,8 +4,7 @@ set -x set -e function uploader { - gsutil cp $1 gs://$2/$1 - gsutil -D setacl public-read gs://$2/$1 &> /dev/null + aws s3 cp $1 s3://$2/$1 } function publishImage { diff --git a/tests/ci/distro_installer.sh b/tests/ci/distro_installer.sh index cbf2ddc81c2..d93a8fe33b3 100755 --- a/tests/ci/distro_installer.sh +++ b/tests/ci/distro_installer.sh @@ -3,5 +3,5 @@ set -x set -e -sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false -sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.23.8 COMPILETAG=compile_golangimage TRIVYFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.24.3 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.24.3 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false diff --git a/tests/ci/ut_install.sh b/tests/ci/ut_install.sh index 09431586ec1..a207780b388 100755 --- a/tests/ci/ut_install.sh +++ b/tests/ci/ut_install.sh @@ -18,11 +18,11 @@ set -e # cd ../ # binary will be $(go env GOPATH)/bin/golangci-lint # go get installation aren't guaranteed to work. We recommend using binary installation. -curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.61.0 +curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.2 sudo service postgresql stop || echo no postgresql need to be stopped sleep 2 -sudo rm -rf /data/* +sudo rm -rf /data/* sudo -E env "PATH=$PATH" make go_check sudo ./tests/hostcfg.sh sudo ./tests/generateCerts.sh diff --git a/tests/e2e_setup/README.md b/tests/e2e_setup/README.md index f6e037af8e7..99939a39d3d 100644 --- a/tests/e2e_setup/README.md +++ b/tests/e2e_setup/README.md @@ -36,6 +36,11 @@ cp robotvars.sample.py robotvars.py ./e2e_container.sh ``` +Check if harbor_ca.crt exists in /ca directory. if not copy it +``` +cp /ca/ca.crt /ca/harbor_ca.crt +``` + #### 4. Run setup, in the previous container console, run the following command. ``` robot -V /drone/tests/e2e_setup/robotvars.py /drone/tests/robot-cases/Group1-Nightly/Setup_Nightly.robot diff --git a/tests/e2e_setup/e2e_container.sh b/tests/e2e_setup/e2e_container.sh index d08efa0de7a..aaf27d92c39 100755 --- a/tests/e2e_setup/e2e_container.sh +++ b/tests/e2e_setup/e2e_container.sh @@ -3,5 +3,6 @@ HARBOR_SRC_FOLDER=$(realpath ../../) echo ${HARBOR_SRC_FOLDER} -docker run -it --privileged -v /var/log/harbor:/var/log/harbor -v /etc/hosts:/etc/hosts -v ${HARBOR_SRC_FOLDER}:/drone -v ${HARBOR_SRC_FOLDER}/tests/harbor_ca.crt:/ca/ca.crt -v /dev/shm:/dev/shm -w /drone registry.goharbor.io/harbor-ci/goharbor/harbor-e2e-engine:latest-ui /bin/bash +# If the testbed network type is private need to set NETWORK_TYPE private, default is public +docker run -it --privileged -v /var/log/harbor:/var/log/harbor -v /etc/hosts:/etc/hosts -v ${HARBOR_SRC_FOLDER}:/drone -v ${HARBOR_SRC_FOLDER}/tests/harbor_ca.crt:/ca/ca.crt -v /dev/shm:/dev/shm -e NETWORK_TYPE=public -w /drone registry.goharbor.io/harbor-ci/goharbor/harbor-e2e-engine:latest-ui /bin/bash diff --git a/tests/integration.sh b/tests/integration.sh index 4a608f01c83..1eb69f82bee 100755 --- a/tests/integration.sh +++ b/tests/integration.sh @@ -14,7 +14,7 @@ # limitations under the License. # set -x -gsutil version -l +aws --version set +x docker-compose version @@ -58,17 +58,6 @@ else harbor_target_bucket=$harbor_releases_bucket/$DRONE_BRANCH fi -# GC credentials -keyfile="/root/harbor-ci-logs.key" -botofile="/root/.boto" -echo -n $GS_PRIVATE_KEY > $keyfile -chmod 400 $keyfile -echo "[Credentials]" >> $botofile -echo "gs_service_key_file = $keyfile" >> $botofile -echo "gs_service_client_id = $GS_CLIENT_EMAIL" >> $botofile -echo "[GSUtil]" >> $botofile -echo "content_language = en" >> $botofile -echo "default_project_id = $GS_PROJECT_ID" >> $botofile container_ip=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` echo $container_ip @@ -106,10 +95,9 @@ echo "Harbor Assets version: $Harbor_Assets_Version" echo "Harbor Build Base tag: $Harbor_Build_Base_Tag" echo "--------------------------------------------------" -# GS util +# AWS S3 util function uploader { - gsutil cp $1 gs://$2/$1 - gsutil -D setacl public-read gs://$2/$1 &> /dev/null + aws s3 cp $1 s3://$2/$1 } function package_installer { diff --git a/tests/resources/Docker-Util.robot b/tests/resources/Docker-Util.robot index 930bce6e614..c8d3b5f8b11 100644 --- a/tests/resources/Docker-Util.robot +++ b/tests/resources/Docker-Util.robot @@ -17,6 +17,12 @@ Documentation This resource provides helper functions for docker operations Library OperatingSystem Library Process +*** Variables *** +# Define variables for start dockerd within private network +${DOCKERD_CMD} dockerd +${DOCKERD_ARGS} --iptables=false +${LOG_FILE} ./docker-daemon.log + *** Keywords *** Run Docker Info [Arguments] ${docker-params} @@ -115,12 +121,22 @@ Get Container IP # docker:1.13-dind # If you are running this keyword in a container, make sure it is run with --privileged turned on Start Docker Daemon Locally + ${test_network_type}= Get Environment Variable NETWORK_TYPE public + Log To Console current test_network_type: ${test_network_type} ${pid}= Run pidof dockerd #${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/docker_config.sh #Log ${output} #Should Be Equal As Integers ${rc} 0 Return From Keyword If '${pid}' != '${EMPTY}' OperatingSystem.File Should Exist /usr/local/bin/dockerd-entrypoint.sh + ${handle}= Set Variable "" + IF '${test_network_type}' == 'private' + Log To Console network type is private + ${handle}= Start Process ${DOCKERD_CMD} ${DOCKERD_ARGS} stdout=${LOG_FILE} stderr=${LOG_FILE} shell=Tr + ELSE IF '${test_network_type}' == 'public' + Log To Console network type is public + ${handle}= Start Process /usr/local/bin/dockerd-entrypoint.sh dockerd>./daemon-docker-local.log 2>&1 shell=True + END ${handle}= Start Process /usr/local/bin/dockerd-entrypoint.sh dockerd>./daemon-local.log 2>&1 shell=True Process Should Be Running ${handle} FOR ${IDX} IN RANGE 5 diff --git a/tests/resources/Harbor-Pages/SecurityHub.robot b/tests/resources/Harbor-Pages/SecurityHub.robot index 16366fc2a07..dd1a1a50b48 100644 --- a/tests/resources/Harbor-Pages/SecurityHub.robot +++ b/tests/resources/Harbor-Pages/SecurityHub.robot @@ -74,19 +74,19 @@ Check The Search By One Condition Select From List By Value ${vulnerabilities_filter_select} project_id Retry Text Input ${vulnerabilities_filter_input} ${project_name} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][starts-with(@title, '${project_name}')] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][starts-with(@title, '${project_name}')] 15 # Check the search by repository name Select From List By Value ${vulnerabilities_filter_select} repository_name Retry Text Input ${vulnerabilities_filter_input} ${repository_name} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][@title='${repository_name}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[2][@title='${repository_name}'] 15 # Check the search by artifact digest Select From List By Value ${vulnerabilities_filter_select} digest Retry Text Input ${vulnerabilities_filter_input} ${digest} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3][@title='${digest}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3][@title='${digest}'] 15 ${short_digest}= Set Variable ${digest}[0:15] - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3]//a[text()='${short_digest}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[3]//a[text()='${short_digest}'] 15 # Check the search by CVE ID Select From List By Value ${vulnerabilities_filter_select} cve_id Retry Text Input ${vulnerabilities_filter_input} ${cve_id} @@ -96,12 +96,12 @@ Check The Search By One Condition Select From List By Value ${vulnerabilities_filter_select} package Retry Text Input ${vulnerabilities_filter_input} ${package} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[7][@title='${package}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[7][@title='${package}'] 15 # Check the search by tag Select From List By Value ${vulnerabilities_filter_select} tag Retry Text Input ${vulnerabilities_filter_input} ${tag} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[4][text()='${tag}'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[4][text()='${tag}'] 15 # Check the search by CVSS3 Select From List By Value ${vulnerabilities_filter_select} cvss_score_v3 ${cvss3_from_input}= Format String {}{} ${vulnerabilities_filter_input} [1] @@ -109,28 +109,28 @@ Check The Search By One Condition Retry Text Input ${cvss3_from_input} ${cvss_score_v3_from} Retry Text Input ${cvss3_to_input} ${cvss_score_v3_to} Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[5][text()>=${cvss_score_v3_from} and text()<=${cvss_score_v3_to}] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[5][text()>=${cvss_score_v3_from} and text()<=${cvss_score_v3_to}] 15 # Check the search by severity # Critical Select From List By Value ${vulnerabilities_filter_select} severity Select From List By Value //form//div[2]//select Critical Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Critical'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Critical'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["critical_cnt"]} CVEs'] # High Select From List By Value //form//div[2]//select High Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='High'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='High'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["high_cnt"]} CVEs'] # Medium Select From List By Value //form//div[2]//select Medium Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Medium'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Medium'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["medium_cnt"]} CVEs'] # Low Select From List By Value //form//div[2]//select Low Retry Button Click ${security_hub_search_btn} - Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Low'] 10 + Retry Wait Element Count //div[@class='datagrid']//clr-dg-cell[6]//span[text()='Low'] 15 Retry Wait Element //clr-dg-footer//span[text()='${summary["low_cnt"]} CVEs'] # n/a Select From List By Value //form//div[2]//select Unknown diff --git a/tests/resources/Harbor-Util.robot b/tests/resources/Harbor-Util.robot index 4d466255adc..186091dafff 100644 --- a/tests/resources/Harbor-Util.robot +++ b/tests/resources/Harbor-Util.robot @@ -55,8 +55,8 @@ Package Harbor Offline [Arguments] ${with_trivy}=true Log To Console \nStart Docker Daemon Start Docker Daemon Locally - Log To Console make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= - ${rc} ${output}= Run And Return Rc And Output make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= + Log To Console make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= + ${rc} ${output}= Run And Return Rc And Output make package_offline GOBUILDTAGS="include_oss include_gcs" BASEIMAGETAG=%{Harbor_Build_Base_Tag} NPM_REGISTRY=%{NPM_REGISTRY} VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= Log To Console ${rc} Log To Console ${output} Should Be Equal As Integers ${rc} 0 @@ -65,8 +65,8 @@ Package Harbor Online [Arguments] ${with_trivy}=true Log To Console \nStart Docker Daemon Start Docker Daemon Locally - Log To Console \nmake package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= - ${rc} ${output}= Run And Return Rc And Output make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} HTTPPROXY= + Log To Console \nmake package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= + ${rc} ${output}= Run And Return Rc And Output make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=%{Harbor_Assets_Version} PKGVERSIONTAG=%{Harbor_Package_Version} TRIVYFLAG=${with_trivy} EXPORTERFLAG=true HTTPPROXY= Log ${rc} Log ${output} Should Be Equal As Integers ${rc} 0 @@ -159,5 +159,5 @@ Wait for Harbor Ready Fail Harbor failed to come up properly! Get Harbor Version - ${rc} ${output}= Run And Return Rc And Output curl -k -X GET --header 'Accept: application/json' 'https://${ip}/api/v2.0/systeminfo'|grep -i harbor_version + ${rc} ${output}= Run And Return Rc And Output curl -k -X GET -u ${HARBOR_ADMIN}:${HARBOR_PASSWORD} --header 'Accept: application/json' 'https://${ip}/api/v2.0/systeminfo'|grep -i harbor_version Log To Console ${output} diff --git a/tests/robot-cases/Group1-Nightly/Trivy.robot b/tests/robot-cases/Group1-Nightly/Trivy.robot index 33fa8279d22..42333152826 100644 --- a/tests/robot-cases/Group1-Nightly/Trivy.robot +++ b/tests/robot-cases/Group1-Nightly/Trivy.robot @@ -86,7 +86,7 @@ Test Case - Security Hub # Check the vulnerabilities search Retry Wait Element Not Visible ${add_search_criteria_icon} Retry Wait Element Not Visible ${remove_search_criteria_icon} - Retry Wait Element Count ${vulnerabilities_datagrid_row} 10 + Retry Wait Element Count ${vulnerabilities_datagrid_row} 15 Check The Quick Search Check The Search By One Condition project${d} project${d}/${images}[2] ${digest} ${cve_id} ${package} ${tag} ${cvss_score_v3_from} ${cvss_score_v3_to} ${summary} Check The Search By All Condition project${d} project${d}/${images}[2] ${digest} ${cve_id} ${package} ${tag} ${cvss_score_v3_from} ${cvss_score_v3_to} ${severity} diff --git a/tools/release/release_utils.sh b/tools/release/release_utils.sh index 637e57579f4..3aa15399f32 100644 --- a/tools/release/release_utils.sh +++ b/tools/release/release_utils.sh @@ -9,12 +9,12 @@ function getAssets { local prerelease=$5 local assetsPath=$6 mkdir $assetsPath && pushd $assetsPath - gsutil cp gs://$bucket/$branch/$offlinePackage . + aws s3 cp s3://$bucket/$branch/$offlinePackage . md5sum $offlinePackage > md5sum # Pre-release does not handle online installer packages if [ $prerelease = "false" ] then - gsutil cp gs://$bucket/$branch/$onlinePackage . + aws s3 cp s3://$bucket/$branch/$onlinePackage . md5sum $onlinePackage >> md5sum fi popd diff --git a/tools/swagger/templates/README.md b/tools/swagger/templates/README.md index 9ac75203bbe..cc7a34d2310 100644 --- a/tools/swagger/templates/README.md +++ b/tools/swagger/templates/README.md @@ -4,16 +4,16 @@ In Stratoscale, we really like the idea of API-first services, and we also reall We saw the go-swagger library, and thought that most of it can really help us. Generating code from swagger files is a big problem with a lot of corner cases, and go-swagger is doing great job. -The one thing that we felt missing, is customization of the server to run with our design principles: +The one thing that we felt missing was customization of the server to run with our design principles: * Custom `main` function * Dependency injection -* Limited scopes with unit testing. +* Limited scope with unit testing. Also: -* Adding you functions to the generated `configure_swagger_*.go` seems to be a burden. -* Lack of Interface that the service implement. +* Adding your functions to the generated `configure_swagger_*.go` seems to be a burden. +* Lack of Interface that the service implements. * Complicated and custom http clients and runtime. Those are the changes that this contributor templates are providing: @@ -22,7 +22,7 @@ Those are the changes that this contributor templates are providing: ### The new `restapi` package exposes interfaces -* Those interfaces can implemented by the developer and are the business logic of the service. +* Those interfaces can be implemented by the developer and are the business logic of the service. * The implementation of those is extensible. * The implementation is separated from the generated code. @@ -32,8 +32,8 @@ The `restapi.Handler` (see [example](./example/restapi/configure_swagger_petstor a standard `http.Handler` * Given objects that implements the business logic, we can create a simple http handler. -* This handler is standard go http.Handler, so we can now use any other middleware, library, or framework - that support it. +* This handler is a standard go http.Handler, so we can now use any other middleware, library, or framework +that supports it. * This handler is standard, so we understand it better. ## Client @@ -57,7 +57,7 @@ In the [example package](https://github.com/Stratoscale/swagger/tree/master/exam ### [restapi](https://github.com/Stratoscale/swagger/tree/master/example/restapi) -This package is autogenerated and contains the server routing and parameters parsing. +This package is autogenerated and contains the server routing and parameter parsing. The modified version contains `restapi.PetAPI` and `restapi.StoreAPI` which were auto generated. @@ -94,7 +94,7 @@ There is also a `restapi.Config`: type Config struct { PetAPI StoreAPI - Logger func(string, ...interface{}) + Logger func(string, ...any) // InnerMiddleware is for the handler executors. These do not apply to the swagger.json document. // The middleware executes after routing but before authentication, binding and validation InnerMiddleware func(http.Handler) http.Handler @@ -116,7 +116,7 @@ Let's look how we use this generated code to build our server. ### [internal](https://github.com/Stratoscale/swagger/tree/master/example/internal) The `internal` package is **not** auto generated and contains the business logic of our server. -We can see two structs that implements the `restapi.PetAPI` and `restapi.StoreAPI` interfaces, +We can see two structs that implement the `restapi.PetAPI` and `restapi.StoreAPI` interfaces, needed to make our server work. When adding or removing functions from our REST API, we can just add or remove functions to those @@ -189,7 +189,7 @@ type SwaggerPetstore { } ``` -Those fields are objects, which implements interfaces declared in the [pet](./example/client/pet) and +Those fields are objects, which implement interfaces declared in the [pet](./example/client/pet) and [store](./example/client/store) packages: For example: @@ -234,7 +234,7 @@ security: The securityDefinitions section defines different security types that your application can handle. The supported types by go-swagger are: -* `apiKey` - token that should be able to processed. +* `apiKey` - token that should be able to be processed. * `oauth2` - token and scopes that should be processed. * and `basic` - user/password that should be processed. @@ -253,7 +253,7 @@ paths: - token: [admin] ``` -Here we overridden the scope of token in the POST /pets URL so that only admin can use this API. +Here we have overridden the scope of the token in the POST /pets URL so that only admin can use this API. Let's see how we can use this functionality. @@ -265,12 +265,12 @@ Once we created a security definition named "token", a function called "AuthToke type Config struct { ... // AuthToken Applies when the "Cookie" header is set - AuthToken func(token string) (interface{}, error) + AuthToken func(token string) (any, error) } ``` -This function gets the content of the Cookie header, and should return an `interface{}` and `error`. -The `interface{}` is the object that should represent the user that performed the request, it should +This function gets the content of the Cookie header, and should return an `any` and `error`. +The `any` is the object that should represent the user that performed the request, it should be nil to return an unauthorized 401 HTTP response. If the returned `error` is not nil, an HTTP 500, internal server error will be returned. @@ -289,14 +289,14 @@ type Config struct { This one is a custom defined function that gets the request and can return an error. If the returned error is not nil, and 403 HTTP error will be returned to the client - here the policy -enforcement comes to place. +enforcement comes into play. There are two things that this function should be aware of: 1. The user - it can retrieve the user information from the context: `ctx.Value(restapi.AuthKey).(MyUserType)`. Usually, a server will have a function for extracting this user information and returns a concrete type which could be used by all the routes. 2. The route - it can retrieve the route using the go-swagger function: `middleware.MatchedRouteFrom(*http.Request)`. - So no need to parse URL and test the request method. + So no need to parse the URL and test the request method. This route struct contains the route information. If for example, we want to check the scopes that were defined for the current route in the swagger.yaml we can use the code below: diff --git a/tools/swagger/templates/server/builder.gotmpl b/tools/swagger/templates/server/builder.gotmpl index e83d39738ed..bb18b90460e 100644 --- a/tools/swagger/templates/server/builder.gotmpl +++ b/tools/swagger/templates/server/builder.gotmpl @@ -185,7 +185,7 @@ type {{ pascalize .Name }}API struct { PreServerShutdown func() // ServerShutdown is called when the HTTP(S) server is shut down and done - // handling all active connections and does not accept connections any more + // handling all active connections and does not accept connections interface{} more ServerShutdown func() // Custom command line argument groups with their descriptions