diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3cda36eff..ba4e260a4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,8 @@ -# Frontend only for ngui +# Frontend ngui/ @hystax/ui +jira_ui/ @hystax/ui -# Backend for other directories +# Backend auth/ @hystax/backend bi_exporter/ @hystax/backend bumischeduler/ @hystax/backend @@ -13,7 +14,6 @@ gemini/ @hystax/backend herald/ @hystax/backend insider/ @hystax/backend jira_bus/ @hystax/backend -jira_ui/ @hystax/backend katara/ @hystax/backend keeper/ @hystax/backend metroculus/ @hystax/backend diff --git a/.github/workflows/auto-assign-author.yml b/.github/workflows/auto-assign-author.yml index a6983e579..5e83b31d9 100644 --- a/.github/workflows/auto-assign-author.yml +++ b/.github/workflows/auto-assign-author.yml @@ -9,16 +9,50 @@ jobs: runs-on: ubuntu-latest permissions: pull-requests: write + issues: write # Required because assignees API works via issues + contents: read # Minimal read access to repository contents steps: - name: Assign PR author uses: actions/github-script@v8 with: script: | - const reporter = context.actor - await github.rest.issues.addAssignees({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.payload.pull_request.number, - assignees: [reporter] - }) + // Repository owner (organization or user who owns the repo) + const owner = context.repo.owner; + + // Repository name + const repo = context.repo.repo; + + // Login of the pull request author + const prAuthor = context.payload.pull_request.user.login; + + try { + // Check the permission level of the PR author + const { data: perm } = + await github.rest.repos.getCollaboratorPermissionLevel({ + owner, + repo, + username: prAuthor + }); + + // If the author has write/maintain/admin rights → assign them to the PR + if (["write", "maintain", "admin"].includes(perm.permission)) { + await github.rest.issues.addAssignees({ + owner, + repo, + issue_number: context.payload.pull_request.number, + assignees: [prAuthor] + }); + console.log(`Assigned PR to ${prAuthor}`); + } else { + // If the author has insufficient rights → skip assignment + console.log( + `Skipping assignment for ${prAuthor}: permission=${perm.permission}` + ); + } + } catch (error) { + // If the author is not a collaborator (e.g., PR from a fork) → skip without failing + console.log( + `Skipping assignment for ${prAuthor}: not a collaborator` + ); + } diff --git a/.gitignore b/.gitignore index 19166677d..cdb9bd6eb 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,7 @@ rest_api/.clickhouse # jira_ui jira_ui/*/.env jira_ui/*/node_modules -jira_ui/*/build/ \ No newline at end of file +jira_ui/*/build/ + +# Vagrant +optscale-deploy/.vagrant/ diff --git a/build.sh b/build.sh index 11c388527..e6e12da6b 100755 --- a/build.sh +++ b/build.sh @@ -110,6 +110,12 @@ do else echo "Building image for ${COMPONENT}, build tag: ${BUILD_TAG}" $BUILD_TOOL build $FLAGS -t ${COMPONENT}:${BUILD_TAG} -f ${DOCKERFILE} . + + # If the build fails, exit with the same status code as the build command + build_status_code="$?" + if [ "$build_status_code" -gt 0 ]; then + exit $build_status_code + fi fi if use_registry; then diff --git a/bumiworker/bumiworker/modules/archive/instance_subscription.py b/bumiworker/bumiworker/modules/archive/instance_subscription.py index afe0bb19c..4fb6530b2 100644 --- a/bumiworker/bumiworker/modules/archive/instance_subscription.py +++ b/bumiworker/bumiworker/modules/archive/instance_subscription.py @@ -27,12 +27,13 @@ def __init__(self, *args, **kwargs): def supported_cloud_types(self): return SUPPORTED_CLOUD_TYPES - def _has_discounts(self, raw_info): + @staticmethod + def _has_discounts(raw_info): if raw_info.get('cost') == 0: # savings plan applied return True for key in ['coupons_discount', 'resource_package_discount']: - if key in raw_info and float(raw_info[key]): + if key in raw_info and float(raw_info[key] or 0): return True def _get(self, previous_options, optimizations, cloud_accounts_map, diff --git a/docker_images/cleanelkdb/clean-elk-db.sh b/docker_images/cleanelkdb/clean-elk-db.sh index 2838d86f6..aec975465 100644 --- a/docker_images/cleanelkdb/clean-elk-db.sh +++ b/docker_images/cleanelkdb/clean-elk-db.sh @@ -22,7 +22,8 @@ remove_line_from_filebeat() { remove_index_from_elk() { echo "DELETING "$2" INDEX FROM ELK" - curl -s -X DELETE $1':'$ELK_PORT'/'$2 + encoded_index=$(jq -rn --arg index "$2" '$index|@uri') + curl -s -X DELETE $1':'$ELK_PORT'/'$encoded_index } m_total_log_size=$(get_size_of_logs $ELK_IP) @@ -34,12 +35,11 @@ fi echo "SIZE OF LOGS BIGGER "$LOG_SIZE_MAX"Mb -> START TO REMOVE LOGS" curl -s -X GET "$ELK_IP:$ELK_PORT/_cat/indices?v" > curl_test.txt -cat curl_test.txt | awk '/filebeat/ { print $3 }' | sort --reverse > filebeat.txt +grep -oE '(%{[^}]+}|[a-zA-Z_]+)-[0-9]{4}\.[0-9]{2}\.[0-9]{2}' curl_test.txt | sort -t '-' -k2,2 > filebeat.txt while [ $m_total_log_size -gt $LOG_SIZE_MAX ]; do m_filebeat=$(tail -n -1 filebeat.txt) filebeat_date=$(echo $m_filebeat | awk -F '-' '{ print $2 }') - if [ "$m_filebeat" = "" ] ; then break else diff --git a/docker_images/common/install-peer-finder.sh b/docker_images/common/install-peer-finder.sh new file mode 100644 index 000000000..421f7e71b --- /dev/null +++ b/docker_images/common/install-peer-finder.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +# TODO: Instead of this script we should use multi stage docker builds +# but this is good enough until we get arround to it +# Or even better -- see if we need this tool at all or if there is a better +# way to install it (e.g. via a package manager) + +set -x + +arch="$(uname -m)" +dest_bin_path="/usr/local/bin/peer-finder" + +apt-get update +apt-get install -y --no-install-recommends openssl ca-certificates wget +rm -rf /var/lib/apt/lists/* + +if [[ "$arch" == "x86_64" || "$arch" == "amd64" ]]; then + wget -O $dest_bin_path https://storage.googleapis.com/kubernetes-release/pets/peer-finder +elif [[ "$arch" == "aarch64" || "$arch" == "arm64" ]]; then + wget https://github.com/kmodules/peer-finder/releases/download/v1.0.2/peer-finder-linux-arm64.tar.gz \ + -O /tmp/peer-finder-linux-arm64.tar.gz + tar -xzf /tmp/peer-finder-linux-arm64.tar.gz -C /tmp + mv /tmp/peer-finder-linux-arm64 $dest_bin_path +else + echo "Unsupported architecture: $arch" + exit 1 +fi + +chmod +x $dest_bin_path +apt-get purge -y --auto-remove ca-certificates wget + diff --git a/docker_images/error_pages/Dockerfile b/docker_images/error_pages/Dockerfile index 4df9b45bb..f2ad6b273 100644 --- a/docker_images/error_pages/Dockerfile +++ b/docker_images/error_pages/Dockerfile @@ -1,3 +1,10 @@ -FROM ingressnginx/custom-error-pages:v1.2.0 +# TODO: The base image doesn't support arm64 yet but shouldn't be too hard to change that, +# though it will require a change in the `kubernetes/ingress-nginx` repo. +# References: +# * Base image's Dockerfile: https://github.com/kubernetes/ingress-nginx/blob/main/images/custom-error-pages/rootfs/Dockerfile +# * Relevant issue on GitHub: https://github.com/kubernetes/ingress-nginx/issues/10245 + +ARG arch=amd64 +FROM --platform="linux/${arch}" ingressnginx/custom-error-pages:v1.2.0 COPY docker_images/error_pages/www /www diff --git a/docker_images/etcd/Dockerfile b/docker_images/etcd/Dockerfile index 1c550c86d..bb432aaa3 100644 --- a/docker_images/etcd/Dockerfile +++ b/docker_images/etcd/Dockerfile @@ -1,7 +1,18 @@ -FROM gcr.io/etcd-development/etcd:v3.2.13 -RUN apk update -# https://github.com/Yelp/dumb-init/issues/73#issuecomment-240439732 -RUN apk add ca-certificates wget && update-ca-certificates -RUN apk --no-cache add curl -RUN wget $(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/nexusriot/etcd-walker/releases/tags/0.0.11 | grep -Eo 'https://(.*linux_x64_static)') -O /bin/etcd-walker +# etcd is a distroless image starting from v3.5, meaning we don't have access to a shell or package manager. +# this is why we use multi-stage builds to build and copy the binary into the final image. +# ref: https://github.com/GoogleContainerTools/distroless?tab=readme-ov-file#docker + +FROM golang:1.24.6 AS build-etcd-walker + +RUN git clone https://github.com/nexusriot/etcd-walker/ /tmp/etcd-walker-src + +WORKDIR /tmp/etcd-walker-src +RUN git checkout 0.2.1 +RUN go build -ldflags "-linkmode external -extldflags -static" -o etcd-walker cmd/etcd-walker/main.go + +RUN mv etcd-walker /bin/etcd-walker RUN chmod +x /bin/etcd-walker + +# NOTE: v3.6+ require significant changes as they removed support for the V2 API, see https://etcd.io/docs/v3.6/upgrades/upgrade_3_6/ +FROM gcr.io/etcd-development/etcd:v3.2.13 +COPY --from=build-etcd-walker /bin/etcd-walker /bin/etcd-walker diff --git a/docker_images/mariadb/Dockerfile b/docker_images/mariadb/Dockerfile index 707ad28cf..5025591f9 100644 --- a/docker_images/mariadb/Dockerfile +++ b/docker_images/mariadb/Dockerfile @@ -1,11 +1,8 @@ FROM mariadb:10.3 -RUN set -x \ - && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget \ - && rm -rf /var/lib/apt/lists/* \ - && wget -O /usr/local/bin/peer-finder https://storage.googleapis.com/kubernetes-release/pets/peer-finder \ - && chmod +x /usr/local/bin/peer-finder \ - && apt-get purge -y --auto-remove ca-certificates wget +COPY docker_images/common/install-peer-finder.sh /tmp/install-peer-finder.sh +RUN chmod +x /tmp/install-peer-finder.sh +RUN /tmp/install-peer-finder.sh COPY docker_images/mariadb/galera /opt/galera/ COPY docker_images/mariadb/docker-entrypoint.sh /usr/local/bin/ diff --git a/docker_images/mongo/Dockerfile b/docker_images/mongo/Dockerfile index 39b1d0d07..683d3ba27 100644 --- a/docker_images/mongo/Dockerfile +++ b/docker_images/mongo/Dockerfile @@ -1,10 +1,7 @@ FROM mongo:3.6 -RUN set -x \ - && apt-get update && apt-get install -y --no-install-recommends openssl ca-certificates wget \ - && rm -rf /var/lib/apt/lists/* \ - && wget -O /usr/local/bin/peer-finder https://storage.googleapis.com/kubernetes-release/pets/peer-finder \ - && chmod +x /usr/local/bin/peer-finder \ - && apt-get purge -y --auto-remove ca-certificates wget +COPY docker_images/common/install-peer-finder.sh /tmp/install-peer-finder.sh +RUN chmod +x /tmp/install-peer-finder.sh +RUN /tmp/install-peer-finder.sh COPY docker_images/mongo/on-start.sh /on-start.sh diff --git a/documentation/setup_dev_vm.md b/documentation/setup_dev_vm.md new file mode 100644 index 000000000..44469debc --- /dev/null +++ b/documentation/setup_dev_vm.md @@ -0,0 +1,365 @@ +# Set up a virtual machine for development / testing of deployment + +With the help of a few tools we now have the capability to run the whole optscale locally by running a few simple commands, +allowing new developers to contribute immediately as well as explore the codebase freely with quick feedback cycle for their +local changes and requiring minimal knowledge about the deployment process. Virtual Machines also make it possible to have +as close to production-level environment running locally helping with testing and making changes to the deployment process +itself and also allowing developers to use different OS and even CPU architecture than Ubuntu 24.04 running on x86 hardware +(which is a hard requirement at the moment for an Optscale deployment), e.g. Apple Silicon Macs. + +The tools which allow us to do that are: + +1. [Vagrant](https://developer.hashicorp.com/vagrant/) to configure and manage the virtual machines +2. [QEMU](https://www.qemu.org/) as the virtualization engine used to run them +3. [`vagrant-qemu`](https://github.com/ppggff/vagrant-qemu) as the bridge between Vagrant and QEMU +4. **VirtualBox** — optional alternative virtualization provider +5. **`vagrant-disksize` plugin** — required when using VirtualBox to control disk size (not required for QEMU, QEMU disk sizing is controlled by the QEMU provider config (qemu.disk_resize) + +> [!WARNING] +> ## Prefer VirtualBox on Linux Kernel 6.14+ +> +> Starting with **Linux kernel 6.14**, changes in KVM/QEMU interaction may cause +> **QEMU virtual machines to fail, lose acceleration, or break after updates**. +> +> Because of this, it is **strongly recommended** to use **VirtualBox** as the +> virtualization provider on Linux hosts running kernel **6.14 or newer**. +> +> Use VirtualBox explicitly: +> +> ```sh +> ./vm.sh --provider virtualbox start +> ``` +> +> Using QEMU on recent Linux kernels may lead to: +> - VM startup failures +> - Missing KVM acceleration +> - Unstable or crashing VM processes +> - Guest OS boot loops +> +> **VirtualBox remains unaffected and provides stable performance.** + +> [!NOTE] +> ## Nested Virtualization (running VM inside another VM) +> +> If you are using **Vagrant/QEMU/VirtualBox inside a virtual machine** (e.g., running on VMware, Proxmox, Hyper-V, or cloud VPS): +> +> - Your host hypervisor **must support nested virtualization**, +> - AND it must be **explicitly enabled** for your VM. +> +> Without nested virtualization: +> +> - QEMU will run **without KVM acceleration** → extremely slow +> - VirtualBox may **fail to start VMs** or run in pure software mode +> - Provisioning times may increase from 20–30 minutes → **several hours** +> +> ### How to enable nested virtualization (quick reference) +> +> **Proxmox:** +> ```sh +> qm set -cpu host +> echo "options kvm-intel nested=Y" >> /etc/modprobe.d/kvm-intel.conf +> modprobe -r kvm_intel && modprobe kvm_intel +> ``` +> +> **VMware ESXi / Workstation / Fusion:** +> ```sh +> vhv.enable = "TRUE" +> ``` +> +> **Hyper-V:** +> ```powershell +> Set-VMProcessor -VMName "MyVM" -ExposeVirtualizationExtensions $true +> ``` +> +> **VirtualBox (running as host hypervisor):** +> ```sh +> VBoxManage modifyvm --nested-hw-virt on +> ``` +> +> ### Recommendation +> For best performance and compatibility: +> +> - Prefer **bare-metal** environments when possible +> - If running inside a VM, ensure **nested virtualization is enabled** before using `vm.sh` with QEMU or VirtualBox + +`Vagrant` already provides a great CLI to manage and run the VMs but it has a few annoying quirks and it still requires +complicated commands to run common operations specific to Optscale, so we built a wrapper script to make it even easier to +set up and use VMs -- `optscale-deploy/vm.sh`. + +--- + +## Install Prerequisites + +1. **Install `vagrant`** using your system package manager. + +### On MacOS: + +```sh +brew tap hashicorp/tap +brew install hashicorp/tap/hashicorp-vagrant +``` + +### On Ubuntu: + +```sh +wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg +echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \ +https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" \ +| sudo tee /etc/apt/sources.list.d/hashicorp.list +sudo apt update && sudo apt install vagrant +``` + +2. **Install QEMU** + +### On MacOS: + +```sh +brew install qemu +``` + +### On Ubuntu: +(if decided to use qemu, please note warning above) + +```sh +sudo apt-get install qemu-system +``` + +3. **Install the required Vagrant plugins** + +``` +vagrant plugin install vagrant-qemu +vagrant plugin install vagrant-disksize +``` + +> **IMPORTANT:** +> `vagrant-disksize` is **required** when using VirtualBox, and also used in general to configure VM disk size. + +4. **Optional: Install VirtualBox** + +VirtualBox can be used instead of QEMU. +To force using VirtualBox: + +```sh +./vm.sh --provider virtualbox start +``` + +--- + +## Set up the Virtual Machine + +Use the `vm.sh` script in `optscale-deploy` to manage the VM. There are currently two VMs ready for use: `arm` and `x86`. +Use whichever matches your machine's OS but the other one should also work via emulation (note that it will be +_significantly slower_ though). + +You can either explicitly specify it as the first argument like so: + +```sh +./vm.sh x86 start +``` + +or omit it entirely in which case it will default to your host machines' CPU architecture: + +```sh +./vm.sh start +``` + +(running the command above on an M4 Mac will create the ARM-based virtual machine) + +> Creating a virtual machine also copies your local version of this repo into `~/optscale` meaning it's very easy to +> test local changes not yet pushed to GitHub. + +> Feel free to mess around with the `Vagrantfile` itself whether it's to tweak some of the settings or even create new +> virtual machines, it should be fairly straight-forward to do so :) + +--- + +## VM resource configuration (`--cpus`, `--ram`, `--disk`) + +The `vm.sh` helper now supports dynamic resource overrides: + +| Flag | Meaning | Default | +|------|---------|---------| +| `--cpus N` | Number of virtual CPUs | `4` | +| `--ram N` | VM RAM in GB | `10` | +| `--disk N` | VM disk size in GB | `75` | + +Example: + +```sh +./vm.sh x86 --cpus 8 --ram 16 --disk 120 start +``` + +These settings propagate into the Vagrantfile through environment variables: + +- `VM_CPUS` +- `VM_RAM_GB` +- `VM_DISK_GB` + +They apply both to **QEMU** and **VirtualBox**. + +--- + +#### Preparing virtual environment + +Run the following commands: + +``` +virtualenv -p python3 .venv +source .venv/bin/activate +pip install -r requirements.txt +``` +#### Creating user overlay + +Edit file with overlay - [optscale-deploy/overlay/user_template.yml](optscale-deploy/overlay/user_template.yml); see comments in overlay file for guidance. + +## Optional ELK stack (`--with-elk`) + +The `vm.sh` wrapper also supports enabling the **ELK stack** (Elasticsearch, Logstash, Kibana) in the local deployment. + +Global flag: + +- `--with-elk` — enable ELK support for the current command. + +When `--with-elk` is used: + +1. The `elk` container image is built as part of the provisioning process. +2. The Ansible playbook receives `with_elk=true`. +3. `runkube.py` is executed with the `--with-elk` flag for: + - initial provisioning, + - `deploy-service`, + - `update-only`. + +Examples: + +Provision VM with ELK enabled: + +```sh +./vm.sh --with-elk playbook ansible/provision-vm.yaml +``` + +Deploy a single service with ELK-aware configuration: + +```sh +./vm.sh --with-elk deploy-service rest_api +``` +If ELK stack is required, need to set `--with-elk` directly. + +Update existing OptScale release while keeping ELK enabled: + +```sh +./vm.sh --with-elk update-only +``` + +If `--with-elk` is omitted, the behavior is unchanged from the previous default (no ELK components are built or deployed). + +--- + +## Provider Selection + +By default, QEMU is used (especially useful for Apple Silicon and cross-architecture development). +VirtualBox can also be used and works very well on x86 hosts. + +Explicit provider selection: + +```sh +./vm.sh --provider qemu start +./vm.sh --provider virtualbox start +``` + +> **NOTE:** +> When using VirtualBox, `vagrant-disksize` must be installed or Vagrant will fail to start the VM. + +--- + +## Deploy Optscale on the VM + +There is also an ansible playbook specifically built to allow a single command provisioning of Optscale onto a fresh Virtual +Machine: `optscale-deploy/ansible/provision-vm.yaml`. It will do everything -- from installing dependencies, setting up the +cluster, building all the containers (including `elk` when `--with-elk` is used) and creating a new Kubernetes deployment +using `runkube.py`. + +There is nothing VM-specific this playbook does, it largely simply follows the instructions on the `README.md` page +but it's more automated, so that it can all be done in a single command. + +Execute this (or any other) playbook with: + +```sh +./vm.sh arm playbook ansible/provision-vm.yaml +``` + +Or, with ELK enabled: + +```sh +./vm.sh arm --with-elk playbook ansible/provision-vm.yaml +``` + +There is also a `role` command which allows us to run a specific ansible role against the VM. + +--- + +## Accessing the platform + +If everything goes well, you should be able to access the platform soon. + +Keep in mind that the initial provisioning of the VM takes quite some time (~20–30 mins on an M4 Macbook) +mostly due to all the containers that need to be built from scratch. Also note that the Kubernetes cluster +will need some time (~15 mins) to spin all the pods after the playbook's execution is complete. + +Once ready, open your browser and navigate to: + +- `https://localhost:9444` for **ARM VM** +- `https://localhost:9443` for **x86 VM** + +(additional forwards) +- `http://localhost:41080` for **PhpMyadmin** +- `http://localhost:41081` for **Kibana (if enabled)** +- `http://localhost:41082` for **grafana** + +Port values come from the `Vagrantfile`. + +--- + +## Troubleshooting + +The `./vm.sh` script provides useful commands to debug issues: + +* `info` — shows general information about the VM itself: status, name, process ID etc. +* `ssh` — allows you to ssh into the VM and investigate issues or make persistent changes directly. +* `optscale-info` — shows information specific to the Optscale deployment: frontend access URL, k8s cluster + health, pods which are currently failing etc. + +--- + +## Deploying and testing local changes using the VM + +Once your VM is running, you can easily deploy your local changes using the **experimental** `deploy-service` command. + +Example: + +```sh +./vm.sh deploy-service rest_api +``` + +This will: + +1. Sync your local repo changes into the VM +2. Rebuild the selected service +3. Apply changes using `runkube.py` + +The entire process usually takes ~1 minute. + +If ELK is enabled via `--with-elk`, the same command will keep ELK configuration in sync with your updated deployment. + +--- + +## Other commands + +* `stop` — stop the virtual machine (preserves state) + * use `--force` to forcefully terminate VM process +* `restart` — restarts the VM +* `destroy` — stops and deletes the whole VM including data +* `reset` — a convenience command combining `destroy` + `start` +* `update-only` — rebuilds OptScale containers and redeploys without full reprovisioning + +The resource flags (`--cpus`, `--ram`, `--disk`) work with all lifecycle commands. The ELK flag (`--with-elk`) can be +combined with any command that performs provisioning, deployment or update logic. diff --git a/jira_ui/server/package-lock.json b/jira_ui/server/package-lock.json index c636965ae..c8d1f36f3 100644 --- a/jira_ui/server/package-lock.json +++ b/jira_ui/server/package-lock.json @@ -11,7 +11,7 @@ "license": "ISC", "dependencies": { "dotenv": "^16.3.1", - "express": "^4.21.2", + "express": "^4.22.1", "express-rate-limit": "^6.10.0" }, "devDependencies": { @@ -70,28 +70,58 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -119,20 +149,32 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "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==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -214,22 +256,6 @@ "ms": "2.0.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -258,6 +284,20 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "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==", + "license": "MIT", + "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", @@ -272,12 +312,10 @@ } }, "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==", - "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==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -286,6 +324,19 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { "node": ">= 0.4" } @@ -304,38 +355,39 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -438,20 +490,27 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "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" @@ -460,6 +519,19 @@ "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -473,11 +545,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -492,32 +565,11 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -529,6 +581,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -555,6 +608,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -635,6 +689,15 @@ "node": ">=10" } }, + "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==", + "license": "MIT", + "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", @@ -790,9 +853,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -855,11 +919,12 @@ "dev": true }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -877,15 +942,45 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -924,7 +1019,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/semver": { "version": "7.5.4", @@ -991,36 +1087,75 @@ "node": ">= 0.8" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1186,22 +1321,41 @@ "dev": true }, "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "requires": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } } }, "brace-expansion": { @@ -1228,16 +1382,22 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "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-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" } }, "chokidar": { @@ -1293,16 +1453,6 @@ "ms": "2.0.0" } }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1318,6 +1468,16 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" }, + "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", @@ -1329,18 +1489,23 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "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==", - "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==" }, + "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" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1352,38 +1517,38 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -1455,15 +1620,29 @@ "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==", + "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" } }, "glob-parent": { @@ -1476,12 +1655,9 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "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==" }, "has-flag": { "version": "3.0.0", @@ -1489,23 +1665,10 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "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==" - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "hasown": { "version": "2.0.2", @@ -1590,6 +1753,11 @@ "yallist": "^4.0.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", @@ -1693,9 +1861,9 @@ "dev": true }, "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" }, "on-finished": { "version": "2.4.1", @@ -1737,11 +1905,11 @@ "dev": true }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "requires": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" } }, "range-parser": { @@ -1750,14 +1918,33 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } } }, "readdirp": { @@ -1833,33 +2020,53 @@ } } }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "requires": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" } }, "simple-update-notifier": { diff --git a/jira_ui/server/package.json b/jira_ui/server/package.json index 2895c3d1a..729a58e0b 100644 --- a/jira_ui/server/package.json +++ b/jira_ui/server/package.json @@ -14,7 +14,7 @@ "license": "ISC", "dependencies": { "dotenv": "^16.3.1", - "express": "^4.21.2", + "express": "^4.22.1", "express-rate-limit": "^6.10.0" }, "devDependencies": { diff --git a/jira_ui/ui/package-lock.json b/jira_ui/ui/package-lock.json index 98c35541f..b8f7661cc 100644 --- a/jira_ui/ui/package-lock.json +++ b/jira_ui/ui/package-lock.json @@ -20,14 +20,14 @@ "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@vitejs/plugin-react-swc": "^3.9.0", "dotenv": "^16.3.1", - "express": "^4.21.2", + "express": "^4.22.1", "http-proxy-middleware": "^2.0.9", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^9.0.1", - "react-router-dom": "^6.19.0", + "react-router-dom": "^6.30.3", "remark-gfm": "^4.0.0", - "vite": "^6.3.6", + "vite": "^6.4.1", "vite-tsconfig-paths": "^5.1.4" }, "devDependencies": { @@ -1828,9 +1828,10 @@ } }, "node_modules/@remix-run/router": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz", - "integrity": "sha512-2hXv036Bux90e1GXTWSMfNzfDDK8LA8JYEWfyHxzvwdp6GyoWEovKc9cotb3KCKmkdwsIBuFGX7ScTWyiHv7Eg==", + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -2649,22 +2650,23 @@ "integrity": "sha512-O+a5c0D2se/u2VlBJmPRn45IB6R4mYMh1ok3dWxrIZ2pmLqzggBhb875mbq73508ylzofc0+hT9W41x4Y2s8lg==" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -2679,11 +2681,40 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2742,6 +2773,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3852,38 +3884,39 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -4457,6 +4490,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6348,11 +6382,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -6370,15 +6405,45 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6494,11 +6559,12 @@ } }, "node_modules/react-router": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.19.0.tgz", - "integrity": "sha512-0W63PKCZ7+OuQd7Tm+RbkI8kCLmn4GPjDbX61tWljPxWgqTKlEpeQUwPkT1DRjYhF8KSihK0hQpmhU4uxVMcdw==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.12.0" + "@remix-run/router": "1.23.2" }, "engines": { "node": ">=14.0.0" @@ -6508,12 +6574,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.19.0.tgz", - "integrity": "sha512-N6dWlcgL2w0U5HZUUqU2wlmOrSb3ighJmtQ438SWbhB1yuLTXQ8yyTBMK3BSvVjp7gBtKurT554nCtMOgxCZmQ==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.12.0", - "react-router": "6.19.0" + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" }, "engines": { "node": ">=14.0.0" @@ -6809,7 +6876,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/scheduler": { "version": "0.23.0", @@ -7693,9 +7761,9 @@ } }, "node_modules/vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", @@ -9146,9 +9214,9 @@ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@remix-run/router": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz", - "integrity": "sha512-2hXv036Bux90e1GXTWSMfNzfDDK8LA8JYEWfyHxzvwdp6GyoWEovKc9cotb3KCKmkdwsIBuFGX7ScTWyiHv7Eg==" + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==" }, "@rollup/rollup-android-arm-eabi": { "version": "4.34.9", @@ -9659,22 +9727,22 @@ "integrity": "sha512-O+a5c0D2se/u2VlBJmPRn45IB6R4mYMh1ok3dWxrIZ2pmLqzggBhb875mbq73508ylzofc0+hT9W41x4Y2s8lg==" }, "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "requires": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -9685,10 +9753,27 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" } } }, @@ -10515,38 +10600,38 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -12162,11 +12247,11 @@ "dev": true }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "requires": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" } }, "range-parser": { @@ -12175,14 +12260,33 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } } }, "react": { @@ -12265,20 +12369,20 @@ } }, "react-router": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.19.0.tgz", - "integrity": "sha512-0W63PKCZ7+OuQd7Tm+RbkI8kCLmn4GPjDbX61tWljPxWgqTKlEpeQUwPkT1DRjYhF8KSihK0hQpmhU4uxVMcdw==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", "requires": { - "@remix-run/router": "1.12.0" + "@remix-run/router": "1.23.2" } }, "react-router-dom": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.19.0.tgz", - "integrity": "sha512-N6dWlcgL2w0U5HZUUqU2wlmOrSb3ighJmtQ438SWbhB1yuLTXQ8yyTBMK3BSvVjp7gBtKurT554nCtMOgxCZmQ==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", "requires": { - "@remix-run/router": "1.12.0", - "react-router": "6.19.0" + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" } }, "react-select": { @@ -13088,9 +13192,9 @@ } }, "vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.4", diff --git a/jira_ui/ui/package.json b/jira_ui/ui/package.json index f3e5d5697..7fdec2f32 100644 --- a/jira_ui/ui/package.json +++ b/jira_ui/ui/package.json @@ -16,14 +16,14 @@ "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@vitejs/plugin-react-swc": "^3.9.0", "dotenv": "^16.3.1", - "express": "^4.21.2", + "express": "^4.22.1", "http-proxy-middleware": "^2.0.9", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^9.0.1", - "react-router-dom": "^6.19.0", + "react-router-dom": "^6.30.3", "remark-gfm": "^4.0.0", - "vite": "^6.3.6", + "vite": "^6.4.1", "vite-tsconfig-paths": "^5.1.4" }, "scripts": { diff --git a/ngui/package.json b/ngui/package.json index d22bd6891..46da3f9cf 100644 --- a/ngui/package.json +++ b/ngui/package.json @@ -31,7 +31,7 @@ "@types/react-syntax-highlighter": "15.5.13", "@typescript-eslint/eslint-plugin": "8.41.0", "@typescript-eslint/parser": "8.41.0", - "concurrently": "9.2.0", + "concurrently": "9.2.1", "eslint": "9.34.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.31.0", diff --git a/ngui/pnpm-lock.yaml b/ngui/pnpm-lock.yaml index 8ececd788..f59561fe2 100644 --- a/ngui/pnpm-lock.yaml +++ b/ngui/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: 8.41.0 version: 8.41.0(eslint@9.34.0(jiti@2.4.2))(typescript@5.7.2) concurrently: - specifier: 9.2.0 - version: 9.2.0 + specifier: 9.2.1 + version: 9.2.1 eslint: specifier: 9.34.0 version: 9.34.0(jiti@2.4.2) @@ -97,8 +97,8 @@ importers: specifier: 6.4.1 version: 6.4.1(graphql@16.10.0) '@apollo/server': - specifier: 4.11.3 - version: 4.11.3(graphql@16.10.0) + specifier: 4.12.2 + version: 4.12.2(graphql@16.10.0) '@apollo/utils.keyvaluecache': specifier: 3.1.0 version: 3.1.0 @@ -112,17 +112,17 @@ importers: specifier: 10.0.25 version: 10.0.25(graphql@16.10.0) body-parser: - specifier: 1.20.3 - version: 1.20.3 + specifier: 1.20.4 + version: 1.20.4 cors: specifier: 2.8.5 version: 2.8.5 express: - specifier: 4.21.2 - version: 4.21.2 + specifier: 4.22.1 + version: 4.22.1 express-rate-limit: specifier: 8.1.0 - version: 8.1.0(express@4.21.2) + version: 8.1.0(express@4.22.1) graphql: specifier: 16.10.0 version: 16.10.0 @@ -225,10 +225,10 @@ importers: version: 8.7.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@uiw/react-textarea-code-editor': specifier: 2.1.1 - version: 2.1.1(@babel/runtime@7.27.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.1.1(@babel/runtime@7.28.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@vitejs/plugin-react-swc': specifier: 3.10.2 - version: 3.10.2(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.10.2(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) ajv: specifier: 8.12.0 version: 8.12.0 @@ -251,8 +251,8 @@ importers: specifier: 2.29.3 version: 2.29.3 express: - specifier: 4.21.2 - version: 4.21.2 + specifier: 4.22.1 + version: 4.22.1 file-saver: specifier: 2.0.5 version: 2.0.5 @@ -272,11 +272,11 @@ importers: specifier: 1.3.1 version: 1.3.1 jspdf: - specifier: 3.0.2 - version: 3.0.2 + specifier: 4.1.0 + version: 4.1.0 jspdf-autotable: - specifier: 5.0.2 - version: 5.0.2(jspdf@3.0.2) + specifier: 5.0.7 + version: 5.0.7(jspdf@4.1.0) localforage: specifier: 1.10.0 version: 1.10.0 @@ -314,8 +314,8 @@ importers: specifier: 2.5.13 version: 2.5.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-markdown: - specifier: 8.0.5 - version: 8.0.5(@types/react@18.2.45)(react@18.2.0) + specifier: 10.1.0 + version: 10.1.0(@types/react@18.2.45)(react@18.2.0) react-plotly.js: specifier: 2.6.0 version: 2.6.0(plotly.js@3.0.1(mapbox-gl@1.13.3)(webpack@5.100.0(esbuild@0.25.6)))(react@18.2.0) @@ -323,8 +323,8 @@ importers: specifier: 8.0.5 version: 8.0.5(@types/react-dom@18.2.18)(@types/react@18.2.45)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(redux@4.2.0) react-router-dom: - specifier: 6.6.2 - version: 6.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: 6.30.3 + version: 6.30.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-test-renderer: specifier: 18.2.0 version: 18.2.0(react@18.2.0) @@ -337,12 +337,9 @@ importers: redux-persist: specifier: 6.0.0 version: 6.0.0(react@18.2.0)(redux@4.2.0) - remark-directive: - specifier: 3.0.0 - version: 3.0.0 remark-gfm: - specifier: 3.0.1 - version: 3.0.1 + specifier: 4.0.1 + version: 4.0.1 require-context.macro: specifier: 1.2.2 version: 1.2.2(babel-plugin-macros@3.1.0) @@ -358,43 +355,40 @@ importers: tss-react: specifier: 4.5.2 version: 4.5.2(@emotion/react@11.14.0(@types/react@18.2.45)(react@18.2.0))(react@18.2.0) - unist-util-visit: - specifier: 5.0.0 - version: 5.0.0 uuid: specifier: 9.0.0 version: 9.0.0 vite: - specifier: 6.3.6 - version: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + specifier: 6.4.1 + version: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.7.2)(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.7.2)(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) devDependencies: '@storybook/addon-actions': - specifier: 8.6.6 - version: 8.6.6(storybook@8.6.6(prettier@3.3.3)) + specifier: 8.6.15 + version: 8.6.15(storybook@8.6.15(prettier@3.3.3)) '@storybook/addon-backgrounds': - specifier: 8.6.6 - version: 8.6.6(storybook@8.6.6(prettier@3.3.3)) + specifier: 8.6.15 + version: 8.6.15(storybook@8.6.15(prettier@3.3.3)) '@storybook/addon-controls': - specifier: 8.6.6 - version: 8.6.6(storybook@8.6.6(prettier@3.3.3)) + specifier: 8.6.15 + version: 8.6.15(storybook@8.6.15(prettier@3.3.3)) '@storybook/addon-links': - specifier: 8.6.6 - version: 8.6.6(react@18.2.0)(storybook@8.6.6(prettier@3.3.3)) + specifier: 8.6.15 + version: 8.6.15(react@18.2.0)(storybook@8.6.15(prettier@3.3.3)) '@storybook/manager-api': - specifier: 8.6.6 - version: 8.6.6(storybook@8.6.6(prettier@3.3.3)) + specifier: 8.6.14 + version: 8.6.14(storybook@8.6.15(prettier@3.3.3)) '@storybook/react': - specifier: 8.6.6 - version: 8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.6(prettier@3.3.3))(typescript@5.7.2) + specifier: 8.6.15 + version: 8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.3.3))(typescript@5.7.2) '@storybook/react-vite': - specifier: 8.6.6 - version: 8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.44.2)(storybook@8.6.6(prettier@3.3.3))(typescript@5.7.2)(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + specifier: 8.6.15 + version: 8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.44.2)(storybook@8.6.15(prettier@3.3.3))(typescript@5.7.2)(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@storybook/theming': - specifier: 8.6.6 - version: 8.6.6(storybook@8.6.6(prettier@3.3.3)) + specifier: ^8.6.14 + version: 8.6.14(storybook@8.6.15(prettier@3.3.3)) glob: specifier: 10.3.10 version: 10.3.10 @@ -405,8 +399,8 @@ importers: specifier: 2.1.0 version: 2.1.0 storybook: - specifier: 8.6.6 - version: 8.6.6(prettier@3.3.3) + specifier: ^8.6.15 + version: 8.6.15(prettier@3.3.3) vitest: specifier: 3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@22.10.5)(jiti@2.4.2)(jsdom@22.1.0)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) @@ -480,8 +474,8 @@ packages: peerDependencies: graphql: 14.x || 15.x || 16.x - '@apollo/server@4.11.3': - resolution: {integrity: sha512-mW8idE2q0/BN14mimfJU5DAnoPHZRrAWgwsVLBEdACds+mxapIYxIbI6AH4AsOpxfrpvHts3PCYDbopy1XPW1g==} + '@apollo/server@4.12.2': + resolution: {integrity: sha512-jKRlf+sBMMdKYrjMoiWKne42Eb6paBfDOr08KJnUaeaiyWFj+/040FjVPQI7YGLfdwnYIsl1NUUqS2UdgezJDg==} engines: {node: '>=14.16.0'} deprecated: Apollo Server v4 is deprecated and will transition to end-of-life on January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v5 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details. peerDependencies: @@ -848,6 +842,10 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -2016,9 +2014,9 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@remix-run/router@1.2.1': - resolution: {integrity: sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==} - engines: {node: '>=14'} + '@remix-run/router@1.23.2': + resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} + engines: {node: '>=14.0.0'} '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} @@ -2146,95 +2144,100 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@storybook/addon-actions@8.6.6': - resolution: {integrity: sha512-RSutBNSwh0KDAGAEUME4GuhrzmdBYnZOWNRsFuKKsgpeDiVEBWafiCQEf39PxzsMThzFvvRx5Pie4968EDy27w==} + '@storybook/addon-actions@8.6.15': + resolution: {integrity: sha512-zc600PBJqP9hCyRY5escKgKf6Zt9kdNZfm+Jwb46k5/NMSO4tNVeOPGBFxW9kSsIYk8j55sNske+Yh60G+8bcw==} peerDependencies: - storybook: ^8.6.6 + storybook: ^8.6.15 - '@storybook/addon-backgrounds@8.6.6': - resolution: {integrity: sha512-nhGy/JumrqFxMDdOF33b7p4ZrAZ9dAc1661AyHxJg0UULvV6HUq4BAzmYFEoZGOntEh6HUSw8hxLzF76TL2mVA==} + '@storybook/addon-backgrounds@8.6.15': + resolution: {integrity: sha512-W36uEzMWPO/K3+8vV1R/GozdaFrIix0qqmxX0qoAT6/o4+zqHiloZkTF+2iuUTx/VmuztLcAoSaPDh8UPy3Q+g==} peerDependencies: - storybook: ^8.6.6 + storybook: ^8.6.15 - '@storybook/addon-controls@8.6.6': - resolution: {integrity: sha512-QVuUY+cveqWSaSMCRY4nM1ilA19T6ya28qTAUGaJW1undy0ig5vH3zbBAkMJnXKvraCjl9UlciyERplb8ljjxg==} + '@storybook/addon-controls@8.6.15': + resolution: {integrity: sha512-CgV8WqGxQrqSKs1a/Y1v4mrsBJXGFmO5u4kvdhPbftRVfln11W4Hvc1SFmgXwGvmcwekAKH79Uwwkjhj3l6gzA==} peerDependencies: - storybook: ^8.6.6 + storybook: ^8.6.15 - '@storybook/addon-links@8.6.6': - resolution: {integrity: sha512-tDKoKhJsyfLUIWhHw0gLtOQcdaMrbj/fvBAaLKOSH/SysyiHAHe8A8MBVheLXJac/PfajSkV7YtULL36AeOzTQ==} + '@storybook/addon-links@8.6.15': + resolution: {integrity: sha512-abRWnDPBTwnj6sQYfAjUnYCNuUQbrVLLOyuormbDUqOcvZ+OqehNYo4BKXx0/lz61h0A2dOD1IuDo40uWyYVFQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.6 + storybook: ^8.6.15 peerDependenciesMeta: react: optional: true - '@storybook/builder-vite@8.6.6': - resolution: {integrity: sha512-1/RZMdzg4QvrLA7lsN21+ofcf/Uwne+R6RM+sE+AzkTRS2EREa+KwFPBCP8n+iIrhmOU0IG8XnNDiReLzi5alA==} + '@storybook/builder-vite@8.6.15': + resolution: {integrity: sha512-9Y05/ndZE6/eI7ZIUCD/QtH2htRIUs9j1gxE6oW0zRo9TJO1iqxfLNwgzd59KEkId7gdZxPei0l+LGTUGXYKRg==} peerDependencies: - storybook: ^8.6.6 + storybook: ^8.6.15 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - '@storybook/components@8.6.6': - resolution: {integrity: sha512-YiUPqrp76//r6tkfosHwkpERPEnZfI2Io0e3A9MLG1mYOWeMsHi5XcZum/7Opt1BF2nACDn5aTkg2GMGc9H+Vg==} + '@storybook/components@8.6.15': + resolution: {integrity: sha512-+9GVKXPEW8Kl9zvNSTm9+VrJtx/puMZiO7gxCML63nK4aTWJXHQr4t9YUoGammSBM3AV1JglsKm6dBgJEeCoiA==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/core@8.6.6': - resolution: {integrity: sha512-XvVFrIWcNAE564S3D8228HBlTrZtbvBeBZwVtVeLFJEOzSVp/7EbXOuoVWqeqAUV8AQPjPWDQUYdA8hqYUntHg==} + '@storybook/core@8.6.15': + resolution: {integrity: sha512-VFpKcphNurJpSC4fpUfKL3GTXVoL53oytghGR30QIw5jKWwaT50HVbTyb41BLOUuZjmMhUQA8weiQEew6RX0gw==} peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: prettier: optional: true - '@storybook/csf-plugin@8.6.6': - resolution: {integrity: sha512-gOPcLjjPQn/CVIUVJ32HU8bAnem/Uc554BGrn+aI2z8vTRA32t8fEDfACqHp8SsVUwBK1gD/O/LiQggS9U4KuQ==} + '@storybook/csf-plugin@8.6.15': + resolution: {integrity: sha512-ZLz/mtOoE1Jj2lE4pK3U7MmYrv5+lot3mGtwxGb832tcABMc97j9O+reCVxZYc7DeFbBuuEdMT9rBL/O3kXYmw==} peerDependencies: - storybook: ^8.6.6 + storybook: ^8.6.15 '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/manager-api@8.6.6': - resolution: {integrity: sha512-Wm/PvY9IZuCGxlqg2Rt6M95WaXnCPl0wHunTD6vDIgnnjzEzLUeigrsHOSh617tIOQ1F9i3J9UegaslImuqXGg==} + '@storybook/manager-api@8.6.14': + resolution: {integrity: sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/preview-api@8.6.6': - resolution: {integrity: sha512-My6lrZ89DWFAjLYAhTztHFxOlS0z8SD7yYsAHMD7oUYF31O/h6aveT3n7da5Vlc8MuNVzuGeXh4zBWkJawTYxg==} + '@storybook/manager-api@8.6.15': + resolution: {integrity: sha512-ZOFtH821vFcwzECbFYFTKtSVO96Cvwwg45dMh3M/9bZIdN7klsloX7YNKw8OKvwE6XLFLsi2OvsNNcmTW6g88w==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/react-dom-shim@8.6.6': - resolution: {integrity: sha512-1+hpswa55PVmH0X9GBKsD6KUwWPzsX9ifI/NKVJNTW/qKOFIdBdaKf6rsX5wOUnEsvoM9eiaPIPfNCOu3OP20g==} + '@storybook/preview-api@8.6.15': + resolution: {integrity: sha512-oqsp8f7QekB9RzpDqOXZQcPPRXXd/mTsnZSdAAQB/pBVqUpC9h/y5hgovbYnJ6DWXcpODbMwH+wbJHZu5lvm+w==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/react-dom-shim@8.6.15': + resolution: {integrity: sha512-m2trBmmd4iom1qwrp1F109zjRDc0cPaHYhDQxZR4Qqdz8pYevYJTlipDbH/K4NVB6Rn687RT29OoOPfJh6vkFA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.6 + storybook: ^8.6.15 - '@storybook/react-vite@8.6.6': - resolution: {integrity: sha512-1Ssn+26kLSbmPMTeB8WoDdKbt1xNr5KsbSJa98fCWE4XyD2uagEvRJwzZ89UL2KbsNyb7dhFQuFemBXuS7Ke1w==} + '@storybook/react-vite@8.6.15': + resolution: {integrity: sha512-9st+2NCemzzBwmindpDrRLEqYJmwwd2RnXMoj+Wt4Y1r4MGoRe1l837ciT2tmstaqekY2mVUSYd6879NzeeMYw==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.6.6 + '@storybook/test': 8.6.15 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.6 + storybook: ^8.6.15 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: '@storybook/test': optional: true - '@storybook/react@8.6.6': - resolution: {integrity: sha512-IQA9SCxVoUZNfsCdxJvcqZyTuFJQXoxVkLeRnD8rJ6hc/uW3kD0yUzX9Gb6XhfKyT2mW9os4F6Z+ZcYJj+UM5w==} + '@storybook/react@8.6.15': + resolution: {integrity: sha512-hdnhlJg+YkpPMOw2hvK7+mhdxAbguA+TFTIAzVV9CeUYoHDIZAsgeKVhRmgZGN20NGjRN5ZcwkplAMJnF9v+6w==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.6.6 + '@storybook/test': 8.6.15 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.6 + storybook: ^8.6.15 typescript: '>= 4.2.x' peerDependenciesMeta: '@storybook/test': @@ -2242,8 +2245,13 @@ packages: typescript: optional: true - '@storybook/theming@8.6.6': - resolution: {integrity: sha512-Ms5myBwNZYkytCIqwOD6sIvi+o6vKBUqPuG+YiQ2jb76PT0HIuQJBfoAvowtMA2BO2vxAa5A7rgAYRzP5jKInw==} + '@storybook/theming@8.6.14': + resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + + '@storybook/theming@8.6.15': + resolution: {integrity: sha512-dAbL0XOekyT6XsF49R6Etj3WxQ/LpdJDIswUUeHgVJ6/yd2opZOGbPxnwA3zlmAh1c0tvpPyhSDXxSG79u8e4Q==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 @@ -2427,6 +2435,9 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -2451,6 +2462,9 @@ packages: '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hoist-non-react-statics@3.3.6': resolution: {integrity: sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==} @@ -2496,9 +2510,6 @@ packages: '@types/mapbox__vector-tile@1.3.4': resolution: {integrity: sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -2679,6 +2690,9 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitejs/plugin-react-swc@3.10.2': resolution: {integrity: sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==} peerDependencies: @@ -3045,8 +3059,8 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} brace-expansion@1.1.12: @@ -3273,8 +3287,8 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} - concurrently@9.2.0: - resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} engines: {node: '>=18'} hasBin: true @@ -3636,10 +3650,6 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3663,8 +3673,8 @@ packages: engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead - dompurify@3.2.6: - resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -3971,6 +3981,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -4009,8 +4022,8 @@ packages: peerDependencies: express: '>= 4.11' - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} ext@1.7.0: @@ -4254,11 +4267,12 @@ packages: glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-prefix@4.0.0: resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==} @@ -4461,6 +4475,9 @@ packages: hast-util-to-html@8.0.4: resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@7.1.0: resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} @@ -4470,6 +4487,9 @@ packages: hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} @@ -4483,6 +4503,9 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@2.0.1: resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} @@ -4497,6 +4520,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -4591,8 +4618,8 @@ packages: resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} @@ -4968,13 +4995,13 @@ packages: engines: {node: '>=6'} hasBin: true - jspdf-autotable@5.0.2: - resolution: {integrity: sha512-YNKeB7qmx3pxOLcNeoqAv3qTS7KuvVwkFe5AduCawpop3NOkBUtqDToxNc225MlNecxT4kP2Zy3z/y/yvGdXUQ==} + jspdf-autotable@5.0.7: + resolution: {integrity: sha512-2wr7H6liNDBYNwt25hMQwXkEWFOEopgKIvR1Eukuw6Zmprm/ZcnmLTQEjW7Xx3FCbD3v7pflLcnMAv/h1jFDQw==} peerDependencies: - jspdf: ^2 || ^3 + jspdf: ^2 || ^3 || ^4 - jspdf@3.0.2: - resolution: {integrity: sha512-G0fQDJ5fAm6UW78HG6lNXyq09l0PrA1rpNY5i+ly17Zb1fMMFSmS+3lw4cnrAPGyouv2Y0ylujbY2Ieq3DSlKA==} + jspdf@4.1.0: + resolution: {integrity: sha512-xd1d/XRkwqnsq6FP3zH1Q+Ejqn2ULIJeDZ+FTKpaabVpZREjsJKRJwuokTNgdqOU+fl55KgbvgZ1pRTSWCP2kQ==} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} @@ -4993,10 +5020,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5035,8 +5058,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -5053,8 +5076,8 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -5140,57 +5163,48 @@ packages: math.gl@3.6.3: resolution: {integrity: sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==} - mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - - mdast-util-directive@3.1.0: - resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} - - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} @@ -5227,153 +5241,87 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - micromark-extension-directive@3.0.2: - resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} - - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - micromark-util-chunked@2.0.1: resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - micromark-util-classify-character@2.0.1: resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - micromark-util-decode-numeric-character-reference@2.0.2: resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - micromark-util-normalize-identifier@2.0.1: resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - micromark-util-resolve-all@2.0.1: resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - micromark-util-subtokenize@2.1.0: resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - micromark-util-types@2.0.2: resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} @@ -5438,10 +5386,6 @@ packages: mouse-wheel@1.2.0: resolution: {integrity: sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -5864,6 +5808,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + protocol-buffers-schema@3.6.0: resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} @@ -5884,8 +5831,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} query-string@9.1.1: @@ -5914,8 +5861,8 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} react-big-calendar@1.5.2: @@ -5976,11 +5923,11 @@ packages: react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - react-markdown@8.0.5: - resolution: {integrity: sha512-jGJolWWmOWAvzf+xMdB9zwStViODyyFQhNB/bwCerbBKmrTmgmA599CGiOlP58OId1IMoIRsA8UdI1Lod4zb5A==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: - '@types/react': '>=16' - react: '>=16' + '@types/react': '>=18' + react: '>=18' react-overlays@5.2.1: resolution: {integrity: sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==} @@ -6015,16 +5962,16 @@ packages: redux: optional: true - react-router-dom@6.6.2: - resolution: {integrity: sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA==} - engines: {node: '>=14'} + react-router-dom@6.30.3: + resolution: {integrity: sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==} + engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.6.2: - resolution: {integrity: sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ==} - engines: {node: '>=14'} + react-router@6.30.3: + resolution: {integrity: sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==} + engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -6149,17 +6096,17 @@ packages: relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} - remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} remedial@1.0.8: resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} @@ -6271,10 +6218,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -6485,6 +6428,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -6492,8 +6439,8 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - storybook@8.6.6: - resolution: {integrity: sha512-naFEI4a2pKgJUgXDwAUtSKlYmxtwpFlyzbHPvboIgA6EUQ11yGYaQtTmZ8y/Y0IT23umu/+lOYvqgXnEHf/Pzw==} + storybook@8.6.15: + resolution: {integrity: sha512-Ob7DMlwWx8s7dMvcQ3xPc02TvUeralb+xX3oaPRk9wY9Hc6M1IBC/7cEoITkSmRS2v38DHubC+mtEKNc1u2gQg==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -6588,8 +6535,11 @@ packages: peerDependencies: webpack: ^5.27.0 - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -6927,9 +6877,6 @@ packages: unist-util-filter@4.0.1: resolution: {integrity: sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q==} - unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} @@ -6939,6 +6886,9 @@ packages: unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} @@ -7028,11 +6978,6 @@ packages: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} engines: {node: '>=12'} @@ -7069,8 +7014,8 @@ packages: vite: optional: true - vite@6.3.6: - resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -7194,6 +7139,7 @@ packages: whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} @@ -7453,7 +7399,7 @@ snapshots: '@apollo/utils.logger': 2.0.1 graphql: 16.10.0 - '@apollo/server@4.11.3(graphql@16.10.0)': + '@apollo/server@4.12.2(graphql@16.10.0)': dependencies: '@apollo/cache-control-types': 1.0.3(graphql@16.10.0) '@apollo/server-gateway-interface': 1.1.1(graphql@16.10.0) @@ -7471,7 +7417,7 @@ snapshots: '@types/node-fetch': 2.6.12 async-retry: 1.3.3 cors: 2.8.5 - express: 4.21.2 + express: 4.22.1 graphql: 16.10.0 loglevel: 1.9.2 lru-cache: 7.18.3 @@ -7620,7 +7566,7 @@ snapshots: '@babel/traverse': 7.28.0 '@babel/types': 7.28.0 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7900,6 +7846,8 @@ snapshots: '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.6': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -7914,7 +7862,7 @@ snapshots: '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/types': 7.28.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -8367,7 +8315,7 @@ snapshots: common-tags: 1.8.2 graphql: 16.10.0 import-from: 4.0.0 - lodash: 4.17.21 + lodash: 4.17.23 tslib: 2.4.1 '@graphql-codegen/plugin-helpers@5.1.1(graphql@16.10.0)': @@ -8377,7 +8325,7 @@ snapshots: common-tags: 1.8.2 graphql: 16.10.0 import-from: 4.0.0 - lodash: 4.17.21 + lodash: 4.17.23 tslib: 2.6.3 '@graphql-codegen/schema-ast@4.1.0(graphql@16.10.0)': @@ -8733,7 +8681,7 @@ snapshots: https-proxy-agent: 7.0.6 jose: 5.10.0 js-yaml: 4.1.0 - lodash: 4.17.21 + lodash: 4.17.23 scuid: 1.1.0 tslib: 2.8.1 yaml-ast-parser: 0.0.43 @@ -8880,12 +8828,12 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.7.2)(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.7.2)(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: glob: 10.3.10 magic-string: 0.27.0 react-docgen-typescript: 2.4.0(typescript@5.7.2) - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) optionalDependencies: typescript: 5.7.2 @@ -9135,7 +9083,7 @@ snapshots: '@nivo/core': 0.99.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@nivo/theming': 0.99.0(react@18.2.0) '@react-spring/web': 9.7.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 transitivePeerDependencies: - react-dom @@ -9186,7 +9134,7 @@ snapshots: '@types/d3-shape': 3.1.7 d3-scale: 4.0.2 d3-shape: 3.2.0 - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 transitivePeerDependencies: - react-dom @@ -9203,7 +9151,7 @@ snapshots: d3-color: 3.1.0 d3-scale: 4.0.2 d3-scale-chromatic: 3.1.0 - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 transitivePeerDependencies: - react-dom @@ -9221,7 +9169,7 @@ snapshots: d3-scale-chromatic: 3.1.0 d3-shape: 3.2.0 d3-time-format: 3.0.0 - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 react-virtualized-auto-sizer: 1.0.26(react-dom@18.2.0(react@18.2.0))(react@18.2.0) use-debounce: 10.0.6(react@18.2.0) @@ -9282,7 +9230,7 @@ snapshots: d3-scale: 4.0.2 d3-time: 1.1.0 d3-time-format: 3.0.0 - lodash: 4.17.21 + lodash: 4.17.23 '@nivo/text@0.99.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -9295,7 +9243,7 @@ snapshots: '@nivo/theming@0.99.0(react@18.2.0)': dependencies: - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 '@nivo/tooltip@0.99.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -9524,7 +9472,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@remix-run/router@1.2.1': {} + '@remix-run/router@1.23.2': {} '@repeaterjs/repeater@3.0.6': {} @@ -9607,52 +9555,52 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@storybook/addon-actions@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/addon-actions@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) uuid: 9.0.0 - '@storybook/addon-backgrounds@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/addon-backgrounds@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/addon-controls@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) ts-dedent: 2.2.0 - '@storybook/addon-links@8.6.6(react@18.2.0)(storybook@8.6.6(prettier@3.3.3))': + '@storybook/addon-links@8.6.15(react@18.2.0)(storybook@8.6.15(prettier@3.3.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 - '@storybook/builder-vite@8.6.6(storybook@8.6.6(prettier@3.3.3))(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@storybook/builder-vite@8.6.15(storybook@8.6.15(prettier@3.3.3))(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@storybook/csf-plugin': 8.6.6(storybook@8.6.6(prettier@3.3.3)) + '@storybook/csf-plugin': 8.6.15(storybook@8.6.15(prettier@3.3.3)) browser-assert: 1.2.1 - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) ts-dedent: 2.2.0 - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - '@storybook/components@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/components@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) - '@storybook/core@8.6.6(prettier@3.3.3)(storybook@8.6.6(prettier@3.3.3))': + '@storybook/core@8.6.15(prettier@3.3.3)(storybook@8.6.15(prettier@3.3.3))': dependencies: - '@storybook/theming': 8.6.6(storybook@8.6.6(prettier@3.3.3)) + '@storybook/theming': 8.6.15(storybook@8.6.15(prettier@3.3.3)) better-opn: 3.0.2 browser-assert: 1.2.1 esbuild: 0.25.6 @@ -9671,64 +9619,72 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/csf-plugin@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) unplugin: 1.16.1 '@storybook/global@5.0.0': {} - '@storybook/manager-api@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/manager-api@8.6.14(storybook@8.6.15(prettier@3.3.3))': dependencies: - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) - '@storybook/preview-api@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/manager-api@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) - '@storybook/react-dom-shim@8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.6(prettier@3.3.3))': + '@storybook/preview-api@8.6.15(storybook@8.6.15(prettier@3.3.3))': + dependencies: + storybook: 8.6.15(prettier@3.3.3) + + '@storybook/react-dom-shim@8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.3.3))': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) - '@storybook/react-vite@8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.44.2)(storybook@8.6.6(prettier@3.3.3))(typescript@5.7.2)(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@storybook/react-vite@8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.44.2)(storybook@8.6.15(prettier@3.3.3))(typescript@5.7.2)(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.7.2)(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.7.2)(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@rollup/pluginutils': 5.2.0(rollup@4.44.2) - '@storybook/builder-vite': 8.6.6(storybook@8.6.6(prettier@3.3.3))(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - '@storybook/react': 8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.6(prettier@3.3.3))(typescript@5.7.2) + '@storybook/builder-vite': 8.6.15(storybook@8.6.15(prettier@3.3.3))(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@storybook/react': 8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.3.3))(typescript@5.7.2) find-up: 5.0.0 magic-string: 0.30.17 react: 18.2.0 react-docgen: 7.1.1 react-dom: 18.2.0(react@18.2.0) resolve: 1.22.10 - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) tsconfig-paths: 4.2.0 - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.6(prettier@3.3.3))(typescript@5.7.2)': + '@storybook/react@8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.3.3))(typescript@5.7.2)': dependencies: - '@storybook/components': 8.6.6(storybook@8.6.6(prettier@3.3.3)) + '@storybook/components': 8.6.15(storybook@8.6.15(prettier@3.3.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.6(storybook@8.6.6(prettier@3.3.3)) - '@storybook/preview-api': 8.6.6(storybook@8.6.6(prettier@3.3.3)) - '@storybook/react-dom-shim': 8.6.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.6(prettier@3.3.3)) - '@storybook/theming': 8.6.6(storybook@8.6.6(prettier@3.3.3)) + '@storybook/manager-api': 8.6.15(storybook@8.6.15(prettier@3.3.3)) + '@storybook/preview-api': 8.6.15(storybook@8.6.15(prettier@3.3.3)) + '@storybook/react-dom-shim': 8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.3.3)) + '@storybook/theming': 8.6.15(storybook@8.6.15(prettier@3.3.3)) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) optionalDependencies: typescript: 5.7.2 - '@storybook/theming@8.6.6(storybook@8.6.6(prettier@3.3.3))': + '@storybook/theming@8.6.14(storybook@8.6.15(prettier@3.3.3))': + dependencies: + storybook: 8.6.15(prettier@3.3.3) + + '@storybook/theming@8.6.15(storybook@8.6.15(prettier@3.3.3))': dependencies: - storybook: 8.6.6(prettier@3.3.3) + storybook: 8.6.15(prettier@3.3.3) '@swc/core-darwin-arm64@1.12.11': optional: true @@ -9907,6 +9863,10 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} '@types/express-serve-static-core@4.19.6': @@ -9937,6 +9897,10 @@ snapshots: dependencies: '@types/unist': 2.0.11 + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/hoist-non-react-statics@3.3.6': dependencies: '@types/react': 18.2.45 @@ -9983,10 +9947,6 @@ snapshots: '@types/mapbox__point-geometry': 0.1.4 '@types/pbf': 3.0.5 - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.11 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -10190,19 +10150,21 @@ snapshots: '@typescript-eslint/types': 8.41.0 eslint-visitor-keys: 4.2.1 - '@uiw/react-textarea-code-editor@2.1.1(@babel/runtime@7.27.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@uiw/react-textarea-code-editor@2.1.1(@babel/runtime@7.28.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.6 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) rehype: 12.0.1 rehype-prism-plus: 1.5.0 - '@vitejs/plugin-react-swc@3.10.2(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react-swc@3.10.2(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.11 '@swc/core': 1.12.11 - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@swc/helpers' @@ -10214,13 +10176,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -10400,7 +10362,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -10657,18 +10619,18 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@1.20.3: + body-parser@1.20.4: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 + qs: 6.14.1 + raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: @@ -10749,7 +10711,7 @@ snapshots: canvg@3.0.11: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.6 '@types/raf': 3.4.3 core-js: 3.27.2 raf: 3.4.1 @@ -10936,10 +10898,9 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 - concurrently@9.2.0: + concurrently@9.2.1: dependencies: chalk: 4.1.2 - lodash: 4.17.21 rxjs: 7.8.2 shell-quote: 1.8.3 supports-color: 8.1.1 @@ -11216,6 +11177,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + debug@4.4.1(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -11282,8 +11247,6 @@ snapshots: diff-sequences@29.6.3: {} - diff@5.2.0: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -11307,7 +11270,7 @@ snapshots: dependencies: webidl-conversions: 7.0.0 - dompurify@3.2.6: + dompurify@3.3.1: optionalDependencies: '@types/trusted-types': 2.0.7 optional: true @@ -11518,7 +11481,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.6): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 esbuild: 0.25.6 transitivePeerDependencies: - supports-color @@ -11757,6 +11720,8 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -11786,16 +11751,16 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express-rate-limit@8.1.0(express@4.21.2): + express-rate-limit@8.1.0(express@4.22.1): dependencies: - express: 4.21.2 + express: 4.22.1 ip-address: 10.0.1 - express@4.21.2: + express@4.22.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.3 + body-parser: 1.20.4 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.1 @@ -11807,20 +11772,20 @@ snapshots: etag: 1.8.1 finalhandler: 1.3.1 fresh: 0.5.2 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.14.1 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 serve-static: 1.16.2 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 @@ -12381,6 +12346,26 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + hast-util-to-parse5@7.1.0: dependencies: '@types/hast': 2.3.10 @@ -12396,6 +12381,10 @@ snapshots: hast-util-whitespace@2.0.1: {} + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hastscript@7.2.0: dependencies: '@types/hast': 2.3.10 @@ -12417,6 +12406,8 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 + html-url-attributes@3.0.1: {} + html-void-elements@2.0.1: {} html2canvas@1.4.1: @@ -12435,11 +12426,19 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -12473,7 +12472,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -12530,7 +12529,7 @@ snapshots: ini@4.1.3: {} - inline-style-parser@0.1.1: {} + inline-style-parser@0.2.7: {} inquirer@8.2.6: dependencies: @@ -12540,7 +12539,7 @@ snapshots: cli-width: 3.0.0 external-editor: 3.1.0 figures: 3.2.0 - lodash: 4.17.21 + lodash: 4.17.23 mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 @@ -12914,19 +12913,19 @@ snapshots: json5@2.2.3: {} - jspdf-autotable@5.0.2(jspdf@3.0.2): + jspdf-autotable@5.0.7(jspdf@4.1.0): dependencies: - jspdf: 3.0.2 + jspdf: 4.1.0 - jspdf@3.0.2: + jspdf@4.1.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.6 fast-png: 6.4.0 fflate: 0.8.2 optionalDependencies: canvg: 3.0.11 core-js: 3.27.2 - dompurify: 3.2.6 + dompurify: 3.3.1 html2canvas: 1.4.1 jsx-ast-utils@3.3.5: @@ -12946,8 +12945,6 @@ snapshots: kind-of@6.0.3: {} - kleur@4.1.5: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -12986,7 +12983,7 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} + lodash-es@4.17.23: {} lodash.camelcase@4.3.0: {} @@ -12998,7 +12995,7 @@ snapshots: lodash.sortby@4.7.0: {} - lodash@4.17.21: {} + lodash@4.17.23: {} log-symbols@4.1.0: dependencies: @@ -13122,49 +13119,12 @@ snapshots: dependencies: '@math.gl/core': 3.6.3 - mdast-util-definitions@5.1.2: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - unist-util-visit: 4.1.2 - - mdast-util-directive@3.1.0: + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-find-and-replace@2.2.2: - dependencies: - '@types/mdast': 3.0.15 escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - - mdast-util-from-markdown@1.3.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - decode-named-character-reference: 1.2.0 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 mdast-util-from-markdown@2.0.2: dependencies: @@ -13183,81 +13143,118 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@1.0.3: + mdast-util-gfm-autolink-literal@2.0.1: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 4.0.4 ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@1.0.2: + mdast-util-gfm-footnote@2.1.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color - mdast-util-gfm-strikethrough@1.0.3: + mdast-util-gfm-strikethrough@2.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-gfm-table@1.0.7: + mdast-util-gfm-table@2.0.0: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 4.0.4 + devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@1.0.2: + mdast-util-gfm-task-list-item@2.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-gfm@2.0.2: + mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-phrasing@3.0.1: + mdast-util-mdx-expression@2.0.1: dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 - mdast-util-to-hast@12.3.0: + mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - - mdast-util-to-markdown@1.5.0: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 mdast-util-to-markdown@2.1.2: dependencies: @@ -13271,10 +13268,6 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 - mdast-util-to-string@3.2.0: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 @@ -13299,25 +13292,6 @@ snapshots: methods@1.1.2: {} - micromark-core-commonmark@1.1.0: - dependencies: - decode-named-character-reference: 1.2.0 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -13337,79 +13311,63 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-directive@3.0.2: + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-factory-whitespace: 2.0.1 micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - parse-entities: 4.0.2 - - micromark-extension-gfm-autolink-literal@1.0.5: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - micromark-extension-gfm-footnote@1.1.2: + micromark-extension-gfm-footnote@2.1.0: dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-gfm-strikethrough@1.0.7: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-table@1.0.7: + micromark-extension-gfm-strikethrough@2.1.0: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-tagfilter@1.0.2: + micromark-extension-gfm-table@2.1.1: dependencies: - micromark-util-types: 1.1.0 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-task-list-item@1.0.5: + micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + micromark-util-types: 2.0.2 - micromark-extension-gfm@2.0.3: + micromark-extension-gfm-task-list-item@2.1.0: dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-destination@1.1.0: + micromark-extension-gfm@3.0.0: dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-destination@2.0.1: dependencies: @@ -13417,13 +13375,6 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-factory-label@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 @@ -13431,23 +13382,11 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-factory-space@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-types: 2.0.2 - micromark-factory-title@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -13455,13 +13394,6 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-factory-whitespace@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -13469,61 +13401,30 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-util-character@1.2.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-util-chunked@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-chunked@2.0.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-classify-character@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - micromark-util-classify-character@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-util-combine-extensions@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 micromark-util-types: 2.0.2 - micromark-util-decode-numeric-character-reference@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-decode-numeric-character-reference@2.0.2: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-decode-string@1.1.0: - dependencies: - decode-named-character-reference: 1.2.0 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.2.0 @@ -13531,49 +13432,24 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-encode@1.1.0: {} - micromark-util-encode@2.0.1: {} - micromark-util-html-tag-name@1.2.0: {} - micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-normalize-identifier@2.0.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@1.1.0: - dependencies: - micromark-util-types: 1.1.0 - micromark-util-resolve-all@2.0.1: dependencies: micromark-util-types: 2.0.2 - micromark-util-sanitize-uri@1.2.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-sanitize-uri@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 @@ -13581,40 +13457,14 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-util-symbol@1.1.0: {} - micromark-util-symbol@2.0.1: {} - micromark-util-types@1.1.0: {} - micromark-util-types@2.0.2: {} - micromark@3.2.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) - decode-named-character-reference: 1.2.0 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -13687,8 +13537,6 @@ snapshots: signum: 1.0.0 to-px: 1.0.1 - mri@1.2.0: {} - ms@2.0.0: {} ms@2.1.3: {} @@ -14177,6 +14025,8 @@ snapshots: property-information@6.5.0: {} + property-information@7.1.0: {} + protocol-buffers-schema@3.6.0: {} proxy-addr@2.0.7: @@ -14194,7 +14044,7 @@ snapshots: punycode@2.3.1: {} - qs@6.13.0: + qs@6.14.1: dependencies: side-channel: 1.1.0 @@ -14222,10 +14072,10 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.2: + raw-body@2.5.3: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 unpipe: 1.0.0 @@ -14237,8 +14087,8 @@ snapshots: dom-helpers: 5.2.1 globalize: 0.1.1 invariant: 2.2.4 - lodash: 4.17.21 - lodash-es: 4.17.21 + lodash: 4.17.23 + lodash-es: 4.17.23 luxon: 2.5.2 memoize-one: 6.0.0 moment: 2.30.1 @@ -14314,25 +14164,21 @@ snapshots: react-lifecycles-compat@3.0.4: {} - react-markdown@8.0.5(@types/react@18.2.45)(react@18.2.0): + react-markdown@10.1.0(@types/react@18.2.45)(react@18.2.0): dependencies: - '@types/hast': 2.3.10 - '@types/prop-types': 15.7.15 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 '@types/react': 18.2.45 - '@types/unist': 2.0.11 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 2.0.1 - prop-types: 15.8.1 - property-information: 6.5.0 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 react: 18.2.0 - react-is: 18.3.1 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -14370,16 +14216,16 @@ snapshots: react-dom: 18.2.0(react@18.2.0) redux: 4.2.0 - react-router-dom@6.6.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.30.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@remix-run/router': 1.2.1 + '@remix-run/router': 1.23.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.6.2(react@18.2.0) + react-router: 6.30.3(react@18.2.0) - react-router@6.6.2(react@18.2.0): + react-router@6.30.3(react@18.2.0): dependencies: - '@remix-run/router': 1.2.1 + '@remix-run/router': 1.23.2 react: 18.2.0 react-shallow-renderer@16.15.0(react@18.2.0): @@ -14596,38 +14442,39 @@ snapshots: transitivePeerDependencies: - encoding - remark-directive@3.0.0: + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-directive: 3.1.0 - micromark-extension-directive: 3.0.2 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-gfm@3.0.1: + remark-parse@11.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-parse@10.0.2: + remark-rehype@11.1.2: dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 - remark-rehype@10.1.0: + remark-stringify@11.0.0: dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 remedial@1.0.8: {} @@ -14736,10 +14583,6 @@ snapshots: dependencies: tslib: 2.8.1 - sade@1.8.1: - dependencies: - mri: 1.2.0 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -14978,6 +14821,8 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: {} + std-env@3.9.0: {} stop-iteration-iterator@1.1.0: @@ -14985,9 +14830,9 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@8.6.6(prettier@3.3.3): + storybook@8.6.15(prettier@3.3.3): dependencies: - '@storybook/core': 8.6.6(prettier@3.3.3)(storybook@8.6.6(prettier@3.3.3)) + '@storybook/core': 8.6.15(prettier@3.3.3)(storybook@8.6.15(prettier@3.3.3)) optionalDependencies: prettier: 3.3.3 transitivePeerDependencies: @@ -15106,9 +14951,13 @@ snapshots: dependencies: webpack: 5.100.0(esbuild@0.25.6) - style-to-object@0.4.4: + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: dependencies: - inline-style-parser: 0.1.1 + inline-style-parser: 0.2.7 stylis@4.2.0: {} @@ -15459,8 +15308,6 @@ snapshots: unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - unist-util-generated@2.0.1: {} - unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.11 @@ -15473,6 +15320,10 @@ snapshots: dependencies: '@types/unist': 2.0.11 + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.11 @@ -15572,13 +15423,6 @@ snapshots: uuid@9.0.0: {} - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.2.0 - kleur: 4.1.5 - sade: 1.8.1 - value-or-promise@1.0.12: {} vary@1.1.2: {} @@ -15613,10 +15457,10 @@ snapshots: vite-node@3.2.4(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -15631,18 +15475,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.7.2) optionalDependencies: - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) @@ -15663,14 +15507,14 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 chai: 5.2.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1 expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 @@ -15681,7 +15525,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.4.1(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) vite-node: 3.2.4(@types/node@22.10.5)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/ngui/server/package.json b/ngui/server/package.json index 2f51e6729..b004c298a 100644 --- a/ngui/server/package.json +++ b/ngui/server/package.json @@ -32,14 +32,14 @@ "homepage": "https://gitlab.com/hystax/ngui_server#readme", "dependencies": { "@apollo/datasource-rest": "6.4.1", - "@apollo/server": "4.11.3", + "@apollo/server": "4.12.2", "@apollo/utils.keyvaluecache": "3.1.0", "@graphql-tools/load-files": "7.0.0", "@graphql-tools/merge": "9.0.17", "@graphql-tools/schema": "10.0.25", - "body-parser": "1.20.3", + "body-parser": "1.20.4", "cors": "2.8.5", - "express": "4.21.2", + "express": "4.22.1", "express-rate-limit": "8.1.0", "graphql": "16.10.0", "graphql-scalars": "1.24.0", diff --git a/ngui/ui/package.json b/ngui/ui/package.json index d92a8510d..7b0df367a 100644 --- a/ngui/ui/package.json +++ b/ngui/ui/package.json @@ -40,15 +40,15 @@ "d3-array": "3.2.4", "d3-scale": "4.0.2", "date-fns": "2.29.3", - "express": "4.21.2", + "express": "4.22.1", "file-saver": "2.0.5", "github-buttons": "2.27.0", "google-map-react": "2.2.1", "graphql": "16.10.0", "graphql-ws": "5.16.0", "intl-pluralrules": "1.3.1", - "jspdf": "3.0.2", - "jspdf-autotable": "5.0.2", + "jspdf": "4.1.0", + "jspdf-autotable": "5.0.7", "localforage": "1.10.0", "node-macaroons": "0.0.6", "plotly.js-gl2d-dist-min": "2.35.2", @@ -61,24 +61,22 @@ "react-hook-form": "7.51.3", "react-intl": "6.5.5", "react-json-editor-ajrm": "2.5.13", - "react-markdown": "8.0.5", + "react-markdown": "10.1.0", "react-plotly.js": "2.6.0", "react-redux": "8.0.5", - "react-router-dom": "6.6.2", + "react-router-dom": "6.30.3", "react-test-renderer": "18.2.0", "redux": "4.2.0", "redux-mock-store": "1.5.4", "redux-persist": "6.0.0", - "remark-directive": "3.0.0", - "remark-gfm": "3.0.1", + "remark-gfm": "4.0.1", "require-context.macro": "1.2.2", "reselect": "4.1.7", "resize-observer-polyfill": "1.5.1", "text-security": "3.2.1", "tss-react": "4.5.2", - "unist-util-visit": "5.0.0", "uuid": "9.0.0", - "vite": "6.3.6", + "vite": "6.4.1", "vite-tsconfig-paths": "5.1.4" }, "scripts": { @@ -115,18 +113,18 @@ ] }, "devDependencies": { - "@storybook/addon-actions": "8.6.6", - "@storybook/addon-backgrounds": "8.6.6", - "@storybook/addon-controls": "8.6.6", - "@storybook/addon-links": "8.6.6", - "@storybook/manager-api": "8.6.6", - "@storybook/react": "8.6.6", - "@storybook/react-vite": "8.6.6", - "@storybook/theming": "8.6.6", + "@storybook/addon-actions": "8.6.15", + "@storybook/addon-backgrounds": "8.6.15", + "@storybook/addon-controls": "8.6.15", + "@storybook/addon-links": "8.6.15", + "@storybook/manager-api": "8.6.14", + "@storybook/react": "8.6.15", + "@storybook/react-vite": "8.6.15", + "@storybook/theming": "^8.6.14", "glob": "10.3.10", "jsdom": "22.1.0", "redux-immutable-state-invariant": "2.1.0", - "storybook": "8.6.6", + "storybook": "^8.6.15", "vitest": "3.2.4" } } diff --git a/ngui/ui/src/components/ApolloProvider/ApolloProvider.tsx b/ngui/ui/src/components/ApolloProvider/ApolloProvider.tsx index 42b55e534..fcf0e9db1 100644 --- a/ngui/ui/src/components/ApolloProvider/ApolloProvider.tsx +++ b/ngui/ui/src/components/ApolloProvider/ApolloProvider.tsx @@ -1,3 +1,4 @@ +import type { ReactNode } from "react"; import { ApolloClient, ApolloProvider, InMemoryCache, split, HttpLink, from } from "@apollo/client"; import { onError, type ErrorResponse } from "@apollo/client/link/error"; import { RetryLink } from "@apollo/client/link/retry"; @@ -10,10 +11,14 @@ import { useSignOut } from "hooks/useSignOut"; import { processGraphQLErrorData } from "utils/apollo"; import { getEnvironmentVariable } from "utils/env"; +type ApolloClientProviderProps = { + children: ReactNode; +}; + const httpBase = getEnvironmentVariable("VITE_APOLLO_HTTP_BASE"); const wsBase = getEnvironmentVariable("VITE_APOLLO_WS_BASE"); -const ApolloClientProvider = ({ children }) => { +const ApolloClientProvider = ({ children }: ApolloClientProviderProps) => { const { token } = useGetToken(); const signOut = useSignOut(); @@ -21,7 +26,7 @@ const ApolloClientProvider = ({ children }) => { const cache = new InMemoryCache(); const httpLink = new HttpLink({ - uri: `${httpBase}/api`, + uri: (operation) => `${httpBase}/api?op=${operation.operationName}`, headers: { "x-optscale-token": token } diff --git a/ngui/ui/src/components/ArchivedRecommendationAccordion/ArchivedRecommendationAccordion.tsx b/ngui/ui/src/components/ArchivedRecommendationAccordion/ArchivedRecommendationAccordion.tsx index 8b3a33699..49760409b 100644 --- a/ngui/ui/src/components/ArchivedRecommendationAccordion/ArchivedRecommendationAccordion.tsx +++ b/ngui/ui/src/components/ArchivedRecommendationAccordion/ArchivedRecommendationAccordion.tsx @@ -38,7 +38,7 @@ const ArchivedRecommendationAccordion = ({ reason }); - const allRecommendations = useAllRecommendations(); + const allRecommendations = useAllRecommendations({ withDeprecated: true }); useEffect(() => { if (isExpanded && shouldInvoke) { diff --git a/ngui/ui/src/components/ArtifactsTable/ArtifactsTable.tsx b/ngui/ui/src/components/ArtifactsTable/ArtifactsTable.tsx index fe0cc5807..6472aa23e 100644 --- a/ngui/ui/src/components/ArtifactsTable/ArtifactsTable.tsx +++ b/ngui/ui/src/components/ArtifactsTable/ArtifactsTable.tsx @@ -5,7 +5,7 @@ import { Stack } from "@mui/material"; import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; import LinearSelector from "components/LinearSelector"; -import { TABS } from "components/MlTaskRun/Components/Tabs"; +import { TABS } from "components/MlTaskRun/components/Tabs"; import { MlDeleteArtifactModal } from "components/SideModalManager/SideModals"; import Table from "components/Table"; import TableCellActions from "components/TableCellActions"; diff --git a/ngui/ui/src/components/BIExport/BIExport.tsx b/ngui/ui/src/components/BIExport/BIExport.tsx index cfe340bb4..b32ff3939 100644 --- a/ngui/ui/src/components/BIExport/BIExport.tsx +++ b/ngui/ui/src/components/BIExport/BIExport.tsx @@ -7,8 +7,7 @@ import ActionBar from "components/ActionBar"; import PageContentWrapper from "components/PageContentWrapper"; import { BI_EXPORTS, INTEGRATIONS, getEditBIExportUrl } from "urls"; import { getBIExportActivityStatus, getBIExportStatus } from "utils/biExport"; -import { FilesSummaryList, TargetStorageSummaryList } from "./Components"; -import DetailsSummaryList from "./Components/DetailsSummaryList"; +import { FilesSummaryList, TargetStorageSummaryList, DetailsSummaryList } from "./components"; const BIExport = ({ biExport, isLoading = false }) => { const { diff --git a/ngui/ui/src/components/BIExport/Components/index.ts b/ngui/ui/src/components/BIExport/Components/index.ts deleted file mode 100644 index 12c270520..000000000 --- a/ngui/ui/src/components/BIExport/Components/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import FilesSummaryList from "./FilesSummaryList"; -import TargetStorageSummaryList from "./TargetStorageSummaryList"; - -export { FilesSummaryList, TargetStorageSummaryList }; diff --git a/ngui/ui/src/components/BIExport/Components/DetailsSummaryList/DetailsSummaryList.tsx b/ngui/ui/src/components/BIExport/components/DetailsSummaryList/DetailsSummaryList.tsx similarity index 100% rename from ngui/ui/src/components/BIExport/Components/DetailsSummaryList/DetailsSummaryList.tsx rename to ngui/ui/src/components/BIExport/components/DetailsSummaryList/DetailsSummaryList.tsx diff --git a/ngui/ui/src/components/BIExport/Components/DetailsSummaryList/index.ts b/ngui/ui/src/components/BIExport/components/DetailsSummaryList/index.ts similarity index 100% rename from ngui/ui/src/components/BIExport/Components/DetailsSummaryList/index.ts rename to ngui/ui/src/components/BIExport/components/DetailsSummaryList/index.ts diff --git a/ngui/ui/src/components/BIExport/Components/FilesSummaryList/FilesSummaryList.tsx b/ngui/ui/src/components/BIExport/components/FilesSummaryList/FilesSummaryList.tsx similarity index 100% rename from ngui/ui/src/components/BIExport/Components/FilesSummaryList/FilesSummaryList.tsx rename to ngui/ui/src/components/BIExport/components/FilesSummaryList/FilesSummaryList.tsx diff --git a/ngui/ui/src/components/BIExport/Components/FilesSummaryList/index.ts b/ngui/ui/src/components/BIExport/components/FilesSummaryList/index.ts similarity index 100% rename from ngui/ui/src/components/BIExport/Components/FilesSummaryList/index.ts rename to ngui/ui/src/components/BIExport/components/FilesSummaryList/index.ts diff --git a/ngui/ui/src/components/BIExport/Components/TargetStorageSummaryList/TargetStorageSummaryList.tsx b/ngui/ui/src/components/BIExport/components/TargetStorageSummaryList/TargetStorageSummaryList.tsx similarity index 100% rename from ngui/ui/src/components/BIExport/Components/TargetStorageSummaryList/TargetStorageSummaryList.tsx rename to ngui/ui/src/components/BIExport/components/TargetStorageSummaryList/TargetStorageSummaryList.tsx diff --git a/ngui/ui/src/components/BIExport/Components/TargetStorageSummaryList/index.ts b/ngui/ui/src/components/BIExport/components/TargetStorageSummaryList/index.ts similarity index 100% rename from ngui/ui/src/components/BIExport/Components/TargetStorageSummaryList/index.ts rename to ngui/ui/src/components/BIExport/components/TargetStorageSummaryList/index.ts diff --git a/ngui/ui/src/components/BIExport/components/index.ts b/ngui/ui/src/components/BIExport/components/index.ts new file mode 100644 index 000000000..aa52765aa --- /dev/null +++ b/ngui/ui/src/components/BIExport/components/index.ts @@ -0,0 +1,5 @@ +import DetailsSummaryList from "./DetailsSummaryList"; +import FilesSummaryList from "./FilesSummaryList"; +import TargetStorageSummaryList from "./TargetStorageSummaryList"; + +export { FilesSummaryList, TargetStorageSummaryList, DetailsSummaryList }; diff --git a/ngui/ui/src/components/JsonView/JsonView.tsx b/ngui/ui/src/components/JsonView/JsonView.tsx index 96cbbe026..095de1757 100644 --- a/ngui/ui/src/components/JsonView/JsonView.tsx +++ b/ngui/ui/src/components/JsonView/JsonView.tsx @@ -13,7 +13,7 @@ const JsonView = ({ value, onChange, id, viewOnly = false }) => { height="auto" width="100%" onChange={onChange} - waitAfterKeyPress={0} + waitAfterKeyPress={1000} confirmGood={false} colors={theme.palette.json} viewOnly={viewOnly} diff --git a/ngui/ui/src/components/Markdown/Markdown.tsx b/ngui/ui/src/components/Markdown/Markdown.tsx index ed90d8379..b823ddd4b 100644 --- a/ngui/ui/src/components/Markdown/Markdown.tsx +++ b/ngui/ui/src/components/Markdown/Markdown.tsx @@ -1,11 +1,10 @@ +import { isValidElement } from "react"; import { Box } from "@mui/material"; import Link from "@mui/material/Link"; import Typography from "@mui/material/Typography"; import { Highlight, themes } from "prism-react-renderer"; import ReactMarkdown from "react-markdown"; -import remarkDirective from "remark-directive"; import remarkGfm from "remark-gfm"; -import { visit } from "unist-util-visit"; import { v4 as uuidv4 } from "uuid"; import CopyText from "components/CopyText"; import { MarkdownProps } from "./types"; @@ -13,22 +12,7 @@ import { MarkdownProps } from "./types"; const THEME = themes.github; const PADDING = "0.5em"; -function reactMarkdownRemarkDirective() { - return (tree) => { - visit(tree, ["textDirective", "leafDirective", "containerDirective"], (node) => { - // won't work without reassign. - // eslint-disable-next-line no-param-reassign - node.data = { - hName: node.name, - hProperties: node.attributes, - ...node.data - }; - return node; - }); - }; -} - -const Markdown = ({ children, transformImageUri }: MarkdownProps) => ( +const Markdown = ({ children, urlTransform }: MarkdownProps) => ( :last-child": { @@ -37,8 +21,7 @@ const Markdown = ({ children, transformImageUri }: MarkdownProps) => ( }} > (typeof transformImageUri === "function" ? transformImageUri(uri) : uri)} - linkTarget="_blank" + urlTransform={urlTransform} components={{ a: ({ children: markdownChildren, href }) => ( @@ -84,8 +67,7 @@ const Markdown = ({ children, transformImageUri }: MarkdownProps) => ( ), pre: ({ children: pChildren }) => { - const codeText = pChildren[0].props.children; - + const codeText = isValidElement(pChildren) ? pChildren.props.children : String(pChildren); return ( ( ); }, - code: ({ inline, className, children: codeChildren }) => { + code: ({ className, children: codeChildren }) => { const match = /language-(\w+)/.exec(className || ""); // Block code - if (!inline && match) { + if (match) { return ( {({ style, tokens, getLineProps, getTokenProps }) => ( @@ -154,7 +136,7 @@ const Markdown = ({ children, transformImageUri }: MarkdownProps) => ( ); } }} - remarkPlugins={[remarkGfm, remarkDirective, reactMarkdownRemarkDirective]} + remarkPlugins={[remarkGfm]} > {children} diff --git a/ngui/ui/src/components/Markdown/types.ts b/ngui/ui/src/components/Markdown/types.ts index e3e253faf..9524ba1c3 100644 --- a/ngui/ui/src/components/Markdown/types.ts +++ b/ngui/ui/src/components/Markdown/types.ts @@ -1,4 +1,4 @@ export type MarkdownProps = { children: string; - transformImageUri?: (uri: string) => string; + urlTransform?: (url: string) => string; }; diff --git a/ngui/ui/src/components/MlRunsetOverview/MlRunsetOverview.tsx b/ngui/ui/src/components/MlRunsetOverview/MlRunsetOverview.tsx index 80d2d17b6..9f6d09569 100644 --- a/ngui/ui/src/components/MlRunsetOverview/MlRunsetOverview.tsx +++ b/ngui/ui/src/components/MlRunsetOverview/MlRunsetOverview.tsx @@ -16,8 +16,7 @@ import { ML_RUNSET_TEMPLATES, getMlTaskDetailsUrl, getMlRunsetTemplateUrl } from import { getColorScale } from "utils/charts"; import { SPACING_1 } from "utils/layouts"; import { formatRunFullName } from "utils/ml"; -import { InputParameters, SummaryCards, Tabs } from "./Components"; -import Correlations from "./Components/Correlations"; +import { InputParameters, SummaryCards, Tabs, Correlations } from "./components"; const MlRunsetOverview = ({ runset, diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Correlations/Correlations.styles.ts b/ngui/ui/src/components/MlRunsetOverview/components/Correlations/Correlations.styles.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Correlations/Correlations.styles.ts rename to ngui/ui/src/components/MlRunsetOverview/components/Correlations/Correlations.styles.ts diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Correlations/Correlations.tsx b/ngui/ui/src/components/MlRunsetOverview/components/Correlations/Correlations.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Correlations/Correlations.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/Correlations/Correlations.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Correlations/index.ts b/ngui/ui/src/components/MlRunsetOverview/components/Correlations/index.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Correlations/index.ts rename to ngui/ui/src/components/MlRunsetOverview/components/Correlations/index.ts diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Correlations/utils.ts b/ngui/ui/src/components/MlRunsetOverview/components/Correlations/utils.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Correlations/utils.ts rename to ngui/ui/src/components/MlRunsetOverview/components/Correlations/utils.ts diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/GoalsSelector.tsx b/ngui/ui/src/components/MlRunsetOverview/components/GoalsSelector.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/GoalsSelector.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/GoalsSelector.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/InputParameters.tsx b/ngui/ui/src/components/MlRunsetOverview/components/InputParameters.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/InputParameters.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/InputParameters.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/SummaryCards.tsx b/ngui/ui/src/components/MlRunsetOverview/components/SummaryCards.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/SummaryCards.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/SummaryCards.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Executors/Executors.tsx b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Executors/Executors.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Executors/Executors.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Executors/Executors.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Executors/index.ts b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Executors/index.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Executors/index.ts rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Executors/index.ts diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/Runs.tsx b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/Runs.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/Runs.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/Runs.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/RunsFilter.tsx b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/RunsFilter.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/RunsFilter.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/RunsFilter.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/RunsTable.tsx b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/RunsTable.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/RunsTable.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/RunsTable.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/index.ts b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/index.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Runs/index.ts rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Runs/index.ts diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Tabs.tsx b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/Tabs.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/Tabs.tsx rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/Tabs.tsx diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/Tabs/index.ts b/ngui/ui/src/components/MlRunsetOverview/components/Tabs/index.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetOverview/Components/Tabs/index.ts rename to ngui/ui/src/components/MlRunsetOverview/components/Tabs/index.ts diff --git a/ngui/ui/src/components/MlRunsetOverview/Components/index.ts b/ngui/ui/src/components/MlRunsetOverview/components/index.ts similarity index 53% rename from ngui/ui/src/components/MlRunsetOverview/Components/index.ts rename to ngui/ui/src/components/MlRunsetOverview/components/index.ts index 86c16003f..74f14afb2 100644 --- a/ngui/ui/src/components/MlRunsetOverview/Components/index.ts +++ b/ngui/ui/src/components/MlRunsetOverview/components/index.ts @@ -1,5 +1,6 @@ +import Correlations from "./Correlations"; import InputParameters from "./InputParameters"; import SummaryCards from "./SummaryCards"; import Tabs from "./Tabs"; -export { Tabs, InputParameters, SummaryCards }; +export { Tabs, InputParameters, SummaryCards, Correlations }; diff --git a/ngui/ui/src/components/MlRunsetTemplate/MlRunsetTemplate.tsx b/ngui/ui/src/components/MlRunsetTemplate/MlRunsetTemplate.tsx index e2096b21f..a9d12ec4e 100644 --- a/ngui/ui/src/components/MlRunsetTemplate/MlRunsetTemplate.tsx +++ b/ngui/ui/src/components/MlRunsetTemplate/MlRunsetTemplate.tsx @@ -10,7 +10,7 @@ import PageContentWrapper from "components/PageContentWrapper"; import { useRefetchApis } from "hooks/useRefetchApis"; import { getMlEditRunsetTemplateUrl, getMlRunsetConfigurationUrl, ML_RUNSET_TEMPLATES } from "urls"; import { SPACING_2 } from "utils/layouts"; -import { RunsetsTable, Summary, Details } from "./Components"; +import { RunsetsTable, Summary, Details } from "./components"; const MlRunsetTemplate = ({ runsetTemplate, diff --git a/ngui/ui/src/components/MlRunsetTemplate/Components/Details.tsx b/ngui/ui/src/components/MlRunsetTemplate/components/Details.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetTemplate/Components/Details.tsx rename to ngui/ui/src/components/MlRunsetTemplate/components/Details.tsx diff --git a/ngui/ui/src/components/MlRunsetTemplate/Components/RunsetsTable.tsx b/ngui/ui/src/components/MlRunsetTemplate/components/RunsetsTable.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetTemplate/Components/RunsetsTable.tsx rename to ngui/ui/src/components/MlRunsetTemplate/components/RunsetsTable.tsx diff --git a/ngui/ui/src/components/MlRunsetTemplate/Components/Summary.tsx b/ngui/ui/src/components/MlRunsetTemplate/components/Summary.tsx similarity index 100% rename from ngui/ui/src/components/MlRunsetTemplate/Components/Summary.tsx rename to ngui/ui/src/components/MlRunsetTemplate/components/Summary.tsx diff --git a/ngui/ui/src/components/MlRunsetTemplate/Components/index.ts b/ngui/ui/src/components/MlRunsetTemplate/components/index.ts similarity index 100% rename from ngui/ui/src/components/MlRunsetTemplate/Components/index.ts rename to ngui/ui/src/components/MlRunsetTemplate/components/index.ts diff --git a/ngui/ui/src/components/MlTaskRun/MlTaskRun.tsx b/ngui/ui/src/components/MlTaskRun/MlTaskRun.tsx index 34734ae07..ee4b0ed57 100644 --- a/ngui/ui/src/components/MlTaskRun/MlTaskRun.tsx +++ b/ngui/ui/src/components/MlTaskRun/MlTaskRun.tsx @@ -14,7 +14,7 @@ import { useRefetchApis } from "hooks/useRefetchApis"; import { ML_TASKS, getMlTaskDetailsUrl } from "urls"; import { SPACING_2 } from "utils/layouts"; import { formatRunFullName } from "utils/ml"; -import { Charts, Executors, Overview, Status, Tabs } from "./Components"; +import { Charts, Executors, Overview, Status, Tabs } from "./components"; const MlTaskRun = ({ run, diff --git a/ngui/ui/src/components/MlTaskRun/Components/Charts/Charts.tsx b/ngui/ui/src/components/MlTaskRun/components/Charts/Charts.tsx similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/Charts/Charts.tsx rename to ngui/ui/src/components/MlTaskRun/components/Charts/Charts.tsx diff --git a/ngui/ui/src/components/MlTaskRun/Components/Charts/utils.ts b/ngui/ui/src/components/MlTaskRun/components/Charts/utils.ts similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/Charts/utils.ts rename to ngui/ui/src/components/MlTaskRun/components/Charts/utils.ts diff --git a/ngui/ui/src/components/MlTaskRun/Components/Executors/Executors.tsx b/ngui/ui/src/components/MlTaskRun/components/Executors/Executors.tsx similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/Executors/Executors.tsx rename to ngui/ui/src/components/MlTaskRun/components/Executors/Executors.tsx diff --git a/ngui/ui/src/components/MlTaskRun/Components/Overview/Overview.tsx b/ngui/ui/src/components/MlTaskRun/components/Overview/Overview.tsx similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/Overview/Overview.tsx rename to ngui/ui/src/components/MlTaskRun/components/Overview/Overview.tsx diff --git a/ngui/ui/src/components/MlTaskRun/Components/Status/Status.tsx b/ngui/ui/src/components/MlTaskRun/components/Status/Status.tsx similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/Status/Status.tsx rename to ngui/ui/src/components/MlTaskRun/components/Status/Status.tsx diff --git a/ngui/ui/src/components/MlTaskRun/Components/Tabs.tsx b/ngui/ui/src/components/MlTaskRun/components/Tabs.tsx similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/Tabs.tsx rename to ngui/ui/src/components/MlTaskRun/components/Tabs.tsx diff --git a/ngui/ui/src/components/MlTaskRun/Components/index.ts b/ngui/ui/src/components/MlTaskRun/components/index.ts similarity index 100% rename from ngui/ui/src/components/MlTaskRun/Components/index.ts rename to ngui/ui/src/components/MlTaskRun/components/index.ts diff --git a/ngui/ui/src/components/OrganizationOptions/OrganizationOptions.tsx b/ngui/ui/src/components/OrganizationOptions/OrganizationOptions.tsx index af86d1ec5..c4e887fa8 100644 --- a/ngui/ui/src/components/OrganizationOptions/OrganizationOptions.tsx +++ b/ngui/ui/src/components/OrganizationOptions/OrganizationOptions.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import AddOutlinedIcon from "@mui/icons-material/AddOutlined"; import { CircularProgress } from "@mui/material"; import Box from "@mui/material/Box"; @@ -39,6 +39,10 @@ const OrganizationOptions = ({ const openSideModal = useOpenSideModal(); + useEffect(() => { + setUpdatedValue(value); + }, [value]); + const onJsonChange = ({ error, jsObject }) => { setUpdatedValue(jsObject); setIsValidJson(error === false); diff --git a/ngui/ui/src/components/PowerScheduleSummaryCards/PowerScheduleSummaryCards.tsx b/ngui/ui/src/components/PowerScheduleSummaryCards/PowerScheduleSummaryCards.tsx index 5925729f9..de58b9508 100644 --- a/ngui/ui/src/components/PowerScheduleSummaryCards/PowerScheduleSummaryCards.tsx +++ b/ngui/ui/src/components/PowerScheduleSummaryCards/PowerScheduleSummaryCards.tsx @@ -6,11 +6,12 @@ import PowerScheduleValidityPeriod from "components/PowerScheduleValidityPeriod" import QuestionMark from "components/QuestionMark"; import SummaryGrid from "components/SummaryGrid"; import { SUMMARY_VALUE_COMPONENT_TYPES } from "utils/constants"; +import { isPowerScheduleExpired } from "utils/poweSchedules"; type PowerScheduleSummaryCardsProps = { timeZone: string; - startDate: string; - endDate: string; + startDate: number; + endDate: number; lastRun: number; lastRunError: string; resourcesOnSchedule: number; @@ -83,6 +84,7 @@ const PowerScheduleSummaryCards = ({ dataTestIds: { cardTestId: "card_time_zone" }, + color: isPowerScheduleExpired(endDate) ? "warning" : "primary", isLoading, renderCondition: () => !!startDate || !!endDate } diff --git a/ngui/ui/src/components/PowerScheduleValidityPeriod/PowerScheduleValidityPeriod.tsx b/ngui/ui/src/components/PowerScheduleValidityPeriod/PowerScheduleValidityPeriod.tsx index 4ab597eb5..0a0d84a54 100644 --- a/ngui/ui/src/components/PowerScheduleValidityPeriod/PowerScheduleValidityPeriod.tsx +++ b/ngui/ui/src/components/PowerScheduleValidityPeriod/PowerScheduleValidityPeriod.tsx @@ -1,10 +1,15 @@ +import WarningAmberOutlinedIcon from "@mui/icons-material/WarningAmberOutlined"; +import { Box, SvgIconProps } from "@mui/material"; import { FormattedMessage } from "react-intl"; +import QuestionMark from "components/QuestionMark"; import { intl } from "translations/react-intl-config"; import { EN_FORMAT, unixTimestampToDateTime } from "utils/datetime"; +import { isPowerScheduleExpired } from "utils/poweSchedules"; type PowerScheduleValidityPeriodProps = { startDate: number; endDate: number; + iconFontSize?: SvgIconProps["fontSize"]; }; const stringifiedPowerScheduleValidityPeriod = ({ startDate, endDate }: PowerScheduleValidityPeriodProps) => { @@ -23,19 +28,29 @@ const stringifiedPowerScheduleValidityPeriod = ({ startDate, endDate }: PowerSch ); }; -const PowerScheduleValidityPeriod = ({ startDate, endDate }: PowerScheduleValidityPeriodProps) => { +const PowerScheduleValidityPeriod = ({ startDate, endDate, iconFontSize = "medium" }: PowerScheduleValidityPeriodProps) => { if (!endDate) { return `${intl.formatMessage({ id: "since" })} ${unixTimestampToDateTime(startDate, EN_FORMAT)}`; } return ( - + + + {isPowerScheduleExpired(endDate) && ( + + )} + ); }; diff --git a/ngui/ui/src/components/RecommendationsCard/RecommendationsCard.tsx b/ngui/ui/src/components/RecommendationsCard/RecommendationsCard.tsx index d7db25ea0..e2431df40 100644 --- a/ngui/ui/src/components/RecommendationsCard/RecommendationsCard.tsx +++ b/ngui/ui/src/components/RecommendationsCard/RecommendationsCard.tsx @@ -11,7 +11,7 @@ import { CATEGORY } from "containers/RecommendationsOverviewContainer/recommenda import { ALL_SERVICES } from "hooks/useRecommendationServices"; import { RECOMMENDATIONS, RECOMMENDATION_CATEGORY_QUERY_PARAMETER, RECOMMENDATION_SERVICE_QUERY_PARAMETER } from "urls"; import { SPACING_2 } from "utils/layouts"; -import { InfoCard, PossibleSavingsCard } from "./Components"; +import { InfoCard, PossibleSavingsCard } from "./components"; const RecommendationsCard = ({ isLoading, diff --git a/ngui/ui/src/components/RecommendationsCard/Components/InfoCard/InfoCard.styles.ts b/ngui/ui/src/components/RecommendationsCard/components/InfoCard/InfoCard.styles.ts similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/InfoCard/InfoCard.styles.ts rename to ngui/ui/src/components/RecommendationsCard/components/InfoCard/InfoCard.styles.ts diff --git a/ngui/ui/src/components/RecommendationsCard/Components/InfoCard/InfoCard.tsx b/ngui/ui/src/components/RecommendationsCard/components/InfoCard/InfoCard.tsx similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/InfoCard/InfoCard.tsx rename to ngui/ui/src/components/RecommendationsCard/components/InfoCard/InfoCard.tsx diff --git a/ngui/ui/src/components/RecommendationsCard/Components/InfoCard/index.ts b/ngui/ui/src/components/RecommendationsCard/components/InfoCard/index.ts similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/InfoCard/index.ts rename to ngui/ui/src/components/RecommendationsCard/components/InfoCard/index.ts diff --git a/ngui/ui/src/components/RecommendationsCard/Components/PossibleSavingsCard/PossibleSavingsCard.styles.ts b/ngui/ui/src/components/RecommendationsCard/components/PossibleSavingsCard/PossibleSavingsCard.styles.ts similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/PossibleSavingsCard/PossibleSavingsCard.styles.ts rename to ngui/ui/src/components/RecommendationsCard/components/PossibleSavingsCard/PossibleSavingsCard.styles.ts diff --git a/ngui/ui/src/components/RecommendationsCard/Components/PossibleSavingsCard/PossibleSavingsCard.tsx b/ngui/ui/src/components/RecommendationsCard/components/PossibleSavingsCard/PossibleSavingsCard.tsx similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/PossibleSavingsCard/PossibleSavingsCard.tsx rename to ngui/ui/src/components/RecommendationsCard/components/PossibleSavingsCard/PossibleSavingsCard.tsx diff --git a/ngui/ui/src/components/RecommendationsCard/Components/PossibleSavingsCard/index.ts b/ngui/ui/src/components/RecommendationsCard/components/PossibleSavingsCard/index.ts similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/PossibleSavingsCard/index.ts rename to ngui/ui/src/components/RecommendationsCard/components/PossibleSavingsCard/index.ts diff --git a/ngui/ui/src/components/RecommendationsCard/Components/index.ts b/ngui/ui/src/components/RecommendationsCard/components/index.ts similarity index 100% rename from ngui/ui/src/components/RecommendationsCard/Components/index.ts rename to ngui/ui/src/components/RecommendationsCard/components/index.ts diff --git a/ngui/ui/src/components/Resources/filterConfigs.tsx b/ngui/ui/src/components/Resources/filterConfigs.tsx index 8e0d3bbb8..82c6e70ae 100644 --- a/ngui/ui/src/components/Resources/filterConfigs.tsx +++ b/ngui/ui/src/components/Resources/filterConfigs.tsx @@ -128,6 +128,10 @@ export const FILTER_CONFIGS = { type: { type: "string", enum: CLOUD_ACCOUNT_TYPES_LIST + }, + account_id: { + type: "string", + nullable: true } } } diff --git a/ngui/ui/src/components/SideModalManager/SideModals/recommendations/ObsoleteImagesModal.tsx b/ngui/ui/src/components/SideModalManager/SideModals/recommendations/ObsoleteImagesModal.tsx index 26fe29894..0c58ae309 100644 --- a/ngui/ui/src/components/SideModalManager/SideModals/recommendations/ObsoleteImagesModal.tsx +++ b/ngui/ui/src/components/SideModalManager/SideModals/recommendations/ObsoleteImagesModal.tsx @@ -2,6 +2,11 @@ import BaseSideModal from "../BaseSideModal"; import DaysThreshold from "./components/DaysThreshold"; import InformationWrapper from "./components/InformationWrapper"; +/** + * @deprecated OSN-1266. + * `ObsoleteImagesModal` is deprecated because `ObsoleteImages` was replaced with `SnapshotsWithNonUsedImages`. + */ + class ObsoleteImagesModal extends BaseSideModal { headerProps = { messageId: "obsoleteImagesTitle", diff --git a/ngui/ui/src/containers/MlCreateRunArtifactContainer/MlCreateRunArtifactContainer.tsx b/ngui/ui/src/containers/MlCreateRunArtifactContainer/MlCreateRunArtifactContainer.tsx index fdc7e8a0d..85e86ede3 100644 --- a/ngui/ui/src/containers/MlCreateRunArtifactContainer/MlCreateRunArtifactContainer.tsx +++ b/ngui/ui/src/containers/MlCreateRunArtifactContainer/MlCreateRunArtifactContainer.tsx @@ -3,7 +3,7 @@ import { FormattedMessage } from "react-intl"; import { useParams, Link as RouterLink, useNavigate } from "react-router-dom"; import ActionBar from "components/ActionBar"; import { MlCreateArtifactForm } from "components/forms/MlArtifactForm"; -import { TABS } from "components/MlTaskRun/Components/Tabs"; +import { TABS } from "components/MlTaskRun/components/Tabs"; import PageContentWrapper from "components/PageContentWrapper"; import { useOrganizationInfo } from "hooks/useOrganizationInfo"; import MlArtifactsService from "services/MlArtifactsService"; diff --git a/ngui/ui/src/containers/MlEditRunArtifactContainer/MlEditRunArtifactContainer.tsx b/ngui/ui/src/containers/MlEditRunArtifactContainer/MlEditRunArtifactContainer.tsx index 73c9b7884..83f1c701c 100644 --- a/ngui/ui/src/containers/MlEditRunArtifactContainer/MlEditRunArtifactContainer.tsx +++ b/ngui/ui/src/containers/MlEditRunArtifactContainer/MlEditRunArtifactContainer.tsx @@ -3,7 +3,7 @@ import { FormattedMessage } from "react-intl"; import { useParams, Link as RouterLink, useNavigate } from "react-router-dom"; import ActionBar from "components/ActionBar"; import { MlEditArtifactForm } from "components/forms/MlArtifactForm"; -import { TABS } from "components/MlTaskRun/Components/Tabs"; +import { TABS } from "components/MlTaskRun/components/Tabs"; import PageContentWrapper from "components/PageContentWrapper"; import { useOrganizationInfo } from "hooks/useOrganizationInfo"; import MlArtifactsService from "services/MlArtifactsService"; diff --git a/ngui/ui/src/containers/MlRunsetExecutorsContainer/MlRunsetExecutorsContainer.tsx b/ngui/ui/src/containers/MlRunsetExecutorsContainer/MlRunsetExecutorsContainer.tsx index 0debc3a1b..a4df186d8 100644 --- a/ngui/ui/src/containers/MlRunsetExecutorsContainer/MlRunsetExecutorsContainer.tsx +++ b/ngui/ui/src/containers/MlRunsetExecutorsContainer/MlRunsetExecutorsContainer.tsx @@ -1,5 +1,5 @@ import { useParams } from "react-router-dom"; -import Executors from "components/MlRunsetOverview/Components/Tabs/Executors"; +import Executors from "components/MlRunsetOverview/components/Tabs/Executors"; import MlRunsetsService from "services/MlRunsetsService"; const MlRunsetExecutorsContainer = () => { diff --git a/ngui/ui/src/containers/RecommendationsOverviewContainer/RecommendationsOverview.tsx b/ngui/ui/src/containers/RecommendationsOverviewContainer/RecommendationsOverview.tsx index 54f783237..d6fb70340 100644 --- a/ngui/ui/src/containers/RecommendationsOverviewContainer/RecommendationsOverview.tsx +++ b/ngui/ui/src/containers/RecommendationsOverviewContainer/RecommendationsOverview.tsx @@ -93,9 +93,6 @@ const RecommendationsOverview = ({ .filter(serviceFilter(service)) .filter(searchFilter(search)) .filter(appliedDataSourcesFilter(selectedDataSourceTypes)) - // TODO : Remove obsolete_images recommendation but keep it in archived recommendations - // discuss solutions - .filter((rec) => rec.type !== "obsolete_images") .sort(sortRecommendation); return ( diff --git a/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/InstanceSubscription.tsx b/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/InstanceSubscription.tsx index 030c3776d..d76ee4473 100644 --- a/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/InstanceSubscription.tsx +++ b/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/InstanceSubscription.tsx @@ -49,6 +49,12 @@ class InstanceSubscription extends BaseRecommendation { descriptionMessageId = "instanceSubscriptionDescription"; + get descriptionMessageValues() { + const { days_threshold: daysThreshold } = this.options; + + return { daysThreshold }; + } + emptyMessageId = "noInstanceSubscription"; services = [ALIBABA_ECS]; diff --git a/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/ObsoleteImages.tsx b/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/ObsoleteImages.tsx index ca6c51a89..c5affa212 100644 --- a/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/ObsoleteImages.tsx +++ b/ngui/ui/src/containers/RecommendationsOverviewContainer/recommendations/ObsoleteImages.tsx @@ -61,6 +61,12 @@ const columns = [ }) ]; +/** + * @deprecated + * OSN-1266. `ObsoleteImages` is deprecated but still used on the Archived Recommendations page. + * Use `SnapshotsWithNonUsedImages` instead. + */ + class ObsoleteImages extends BaseRecommendation { type = "obsolete_images"; diff --git a/ngui/ui/src/hooks/useAllRecommendations.ts b/ngui/ui/src/hooks/useAllRecommendations.ts index a2484d91a..ba7fb5149 100644 --- a/ngui/ui/src/hooks/useAllRecommendations.ts +++ b/ngui/ui/src/hooks/useAllRecommendations.ts @@ -15,8 +15,8 @@ const ML_RECOMMENDATIONS = Object.fromEntries( ) ); -export const useAllRecommendations = () => { - const optscaleRecommendation = useOptscaleRecommendations(); +export const useAllRecommendations = ({ withDeprecated = false }: { withDeprecated?: boolean } = {}) => { + const optscaleRecommendation = useOptscaleRecommendations({ withDeprecated }); return useMemo(() => ({ ...ML_RECOMMENDATIONS, ...optscaleRecommendation }), [optscaleRecommendation]); }; diff --git a/ngui/ui/src/hooks/useOptscaleRecommendations.ts b/ngui/ui/src/hooks/useOptscaleRecommendations.ts index 277b996bc..944a13f39 100644 --- a/ngui/ui/src/hooks/useOptscaleRecommendations.ts +++ b/ngui/ui/src/hooks/useOptscaleRecommendations.ts @@ -31,9 +31,11 @@ import { useIsNebiusConnectionEnabled } from "hooks/useIsNebiusConnectionEnabled const NEBIUS_RECOMMENDATIONS = [CvocAgreementOpportunities, AbandonedNebiusS3Buckets, NebiusMigration]; +const DEPRECATED_RECOMMENDATIONS = [ObsoleteImages]; + export const NEBIUS_RECOMMENDATION_TYPES = NEBIUS_RECOMMENDATIONS.map((Recommendation) => new Recommendation().type); -export const useOptscaleRecommendations = () => { +export const useOptscaleRecommendations = ({ withDeprecated = false }: { withDeprecated?: boolean } = {}) => { const isNebiusConnectionEnabled = useIsNebiusConnectionEnabled(); return useMemo(() => { @@ -43,7 +45,6 @@ export const useOptscaleRecommendations = () => { RightsizingRdsInstances, RightsizingInstances, ReservedInstances, - ObsoleteImages, ObsoleteSnapshots, ObsoleteSnapshotChains, ObsoleteIps, @@ -63,9 +64,10 @@ export const useOptscaleRecommendations = () => { PublicS3Buckets, SnapshotsWithNonUsedImages, AbandonedImages, - ...(isNebiusConnectionEnabled ? NEBIUS_RECOMMENDATIONS : []) + ...(isNebiusConnectionEnabled ? NEBIUS_RECOMMENDATIONS : []), + ...(withDeprecated ? DEPRECATED_RECOMMENDATIONS : []) ]; return Object.fromEntries(recommendations.map((Rec) => [new Rec().type, Rec])); - }, [isNebiusConnectionEnabled]); + }, [isNebiusConnectionEnabled, withDeprecated]); }; diff --git a/ngui/ui/src/translations/en-US/app.json b/ngui/ui/src/translations/en-US/app.json index f65652f5d..d230451bf 100644 --- a/ngui/ui/src/translations/en-US/app.json +++ b/ngui/ui/src/translations/en-US/app.json @@ -1009,7 +1009,7 @@ "instanceMigrationTitle": "Instances with migration opportunities", "instanceSize": "Instance size", "instanceSubscription": "Subscription instances", - "instanceSubscriptionDescription": "Some of your active instances have been detected as sustainable (for more than 90 days) compute consumers but have not been covered with Subscription or Saving Plans. Consider purchasing Subscriptions to save on compute usage.", + "instanceSubscriptionDescription": "Some of your active instances have been detected as sustainable (for more than {daysThreshold} {daysThreshold, plural,\n =1 {day}\n other {days}\n}) compute consumers but have not been covered with Subscription or Saving Plans. Consider purchasing Subscriptions to save on compute usage.", "instanceSubscriptionResourceRecommendation": "This instance is eligible for Subscription Instances usage.", "instanceSubscriptionSavingOpportunitiesTitle": "Instances with Subscription opportunities", "instanceType": "Instance type", @@ -1745,6 +1745,7 @@ "powerOff": "Power off", "powerOn": "Power on", "powerSchedule": "Power schedule", + "powerScheduleExpired": "This Power Schedule is expired", "powerSchedulesTitle": "Power Schedules", "preferredCurrency": "Preferred currency", "preparingLiveDemoMessage": "OptScale is preparing your live demo experience. Please stand by.", diff --git a/ngui/ui/src/utils/columns/powerScheduleValidityPeriod.tsx b/ngui/ui/src/utils/columns/powerScheduleValidityPeriod.tsx index c825bebb0..0abffc536 100644 --- a/ngui/ui/src/utils/columns/powerScheduleValidityPeriod.tsx +++ b/ngui/ui/src/utils/columns/powerScheduleValidityPeriod.tsx @@ -20,7 +20,7 @@ const powerScheduleValidityPeriod = ({ startDateAccessor, endDateAccessor }) => cell: ({ row: { original } }) => { const { [startDateAccessor]: startDate, [endDateAccessor]: endDate } = original; - return ; + return ; } }); diff --git a/ngui/ui/src/utils/poweSchedules.ts b/ngui/ui/src/utils/poweSchedules.ts new file mode 100644 index 000000000..deaef832c --- /dev/null +++ b/ngui/ui/src/utils/poweSchedules.ts @@ -0,0 +1,3 @@ +import { isPast, secondsToMilliseconds } from "utils/datetime"; + +export const isPowerScheduleExpired = (endDate: number) => endDate && isPast(secondsToMilliseconds(endDate)); diff --git a/optscale-deploy/Vagrantfile b/optscale-deploy/Vagrantfile new file mode 100644 index 000000000..0602de52a --- /dev/null +++ b/optscale-deploy/Vagrantfile @@ -0,0 +1,177 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +selected_provider = ENV["VAGRANT_DEFAULT_PROVIDER"].to_s.strip +if selected_provider == "qemu" && !Vagrant.has_plugin?("vagrant-qemu") + warn "WARNING: vagrant-qemu plugin is missing. QEMU provider won't be available. " \ + "Install it with 'vagrant plugin install vagrant-qemu' if you want to use the qemu provider." +end + +X86_64_ARCHITECTURES = ["x86_64", "amd64"].freeze +ARM_64_ARCHITECTURES = ["arm64", "aarch64", "aarch64_be", "armv8b", "armv8l"].freeze +VM_CPUS = (ENV["VM_CPUS"] || "4").to_i +VM_RAM_GB = (ENV["VM_RAM_GB"] || "10").to_i +VM_DISK_GB = (ENV["VM_DISK_GB"] || "75").to_i + +def cpu_emulated?(guest_cpu_arch) + host_cpu_arch = `uname -m`.strip + + [X86_64_ARCHITECTURES, ARM_64_ARCHITECTURES].each do |aliases| + if aliases.include?(host_cpu_arch) + return !aliases.include?(guest_cpu_arch) + end + end + + raise RuntimeError, "Unknown host CPU architecture: #{host_cpu_arch}" +end + +def define_vm(config, name:, arch:, base_box:, ports:) + opts = { + primary: !cpu_emulated?(arch), + autostart: !cpu_emulated?(arch), + } + + config.vm.define name, opts do |vm_config| + vm_config.vm.box = base_box + + if X86_64_ARCHITECTURES.include?(arch) + vm_config.vm.box_architecture = "amd64" + elsif ARM_64_ARCHITECTURES.include?(arch) + vm_config.vm.box_architecture = "arm64" + else + raise RuntimeError, "Unsupported architecture: #{arch}" + end + + vm_config.vm.hostname = name + + # Port forwarding + vm_config.vm.network "forwarded_port", guest: 80, host: ports[:http] + vm_config.vm.network "forwarded_port", guest: 443, host: ports[:https] + + # - For QEMU (vagrant-qemu): SSH forwarding is handled by qemu.ssh_port + selected_provider = ENV["VAGRANT_DEFAULT_PROVIDER"].to_s.strip + if selected_provider == "virtualbox" + vm_config.vm.network "forwarded_port", + guest: 22, host: ports[:ssh], + id: "ssh_#{name}" + end + + # DB / Kibana / Grafana + vm_config.vm.network "forwarded_port", guest: 30080, host: 41080, id: "db_#{name}" + vm_config.vm.network "forwarded_port", guest: 30081, host: 41081, id: "kibana_#{name}" + vm_config.vm.network "forwarded_port", guest: 30082, host: 41082, id: "grafana_#{name}" + + # QEMU provider (only if plugin is installed) + if Vagrant.has_plugin?("vagrant-qemu") + vm_config.vagrant.plugins = "vagrant-qemu" + + vm_config.vm.provider "qemu" do |qemu| + qemu.memory = "#{VM_RAM_GB}G" + qemu.net_device = "virtio-net-pci" + qemu.disk_resize = "#{VM_DISK_GB}G" + + # default to OS install, but also support homebrew + if Dir.exist?("/usr/share/qemu") + qemu.qemu_dir = "/usr/share/qemu" + elsif ENV["HOMEBREW_PREFIX"] && Dir.exist?("#{ENV["HOMEBREW_PREFIX"]}/share/qemu") + qemu.qemu_dir = "#{ENV["HOMEBREW_PREFIX"]}/share/qemu" + else + raise RuntimeError, "QEMU directory not found. Please ensure QEMU is installed." + end + + if cpu_emulated?(arch) + qemu.cpu = "max" + accelerator = "tcg,thread=multi,tb-size=512" + else + qemu.cpu = "host" + + if Vagrant::Util::Platform.linux? + accelerator = "kvm" + elsif Vagrant::Util::Platform.darwin? + accelerator = "hvf" + else + raise RuntimeError, "Unsupported platform: #{Vagrant::Util::Platform.platform}" + end + end + + qemu.extra_qemu_args = ["-accel", accelerator] + + qemu.ssh_port = ports[:ssh] + + if X86_64_ARCHITECTURES.include?(arch) + qemu.arch = "x86_64" + qemu.machine = "q35" + qemu.smp = "cpus=#{VM_CPUS},sockets=1,cores=#{VM_CPUS},threads=1" + elsif ARM_64_ARCHITECTURES.include?(arch) + qemu.arch = "aarch64" + qemu.machine = "virt,gic-version=3" + qemu.smp = "cores=#{VM_CPUS},threads=1" + else + raise RuntimeError, "Unsupported architecture: #{arch}" + end + end + end + + # VirtualBox provider + vm_config.vm.provider "virtualbox" do |vb| + vb.name = name + vb.memory = VM_RAM_GB * 1024 + vb.cpus = VM_CPUS + + # ioapic required + vb.customize ["modifyvm", :id, "--ioapic", "on"] + + # Optional tweaks; comment out if not wanted + vb.customize ["modifyvm", :id, "--audio", "none"] + vb.customize ["modifyvm", :id, "--nictype1", "virtio"] + vb.customize ["modifyvm", :id, "--graphicscontroller", "vmsvga"] + end + end +end + + +Vagrant.configure(2) do |config| + + selected_provider = ENV["VAGRANT_DEFAULT_PROVIDER"].to_s.strip + + # Require vagrant-disksize for VirtualBox resizing + if selected_provider == "virtualbox" + if Vagrant.has_plugin?("vagrant-disksize") + config.disksize.size = "#{VM_DISK_GB}GB" + else + raise Vagrant::Errors::VagrantError.new, + "The 'vagrant-disksize' plugin is required for VirtualBox. " \ + "Install it:\n\n vagrant plugin install vagrant-disksize" + end + end + + config.vm.synced_folder "..", "/home/vagrant/optscale", type: "rsync", + rsync__exclude: [ + "*/.venv/", + "optscale-deploy/.vagrant/", + ] + + define_vm( + config, + name: "ubuntu-2404-arm-64", + arch: "arm64", + base_box: "cloud-image/ubuntu-24.04", + ports: { + http: 9081, + https: 9444, + ssh: 50223, + } + ) + + define_vm( + config, + name: "ubuntu-2404-x86-64", + arch: "x86_64", + base_box: "cloud-image/ubuntu-24.04", + ports: { + http: 9080, + https: 9443, + ssh: 50222, + } + ) +end diff --git a/optscale-deploy/ansible/inventories/vm-arm.yaml b/optscale-deploy/ansible/inventories/vm-arm.yaml new file mode 100644 index 000000000..bb556cf08 --- /dev/null +++ b/optscale-deploy/ansible/inventories/vm-arm.yaml @@ -0,0 +1,19 @@ +--- +all: + children: + local: + hosts: + ubuntu-2404-arm-64: + # generated from the output of `vagrant ssh-config` + ansible_host: 127.0.0.1 + ansible_port: "50223" + ansible_user: vagrant + ansible_ssh_user: vagrant + + # Use provider-specific private key (qemu / virtualbox) + ansible_ssh_private_key_file: ".vagrant/machines/ubuntu-2404-arm-64/{{ lookup('env', 'VAGRANT_DEFAULT_PROVIDER') | default('qemu') }}/private_key" + + ansible_ssh_common_args: >- + -o StrictHostKeyChecking=no + -o UserKnownHostsFile=/dev/null + -o LogLevel=FATAL diff --git a/optscale-deploy/ansible/inventories/vm-x86.yaml b/optscale-deploy/ansible/inventories/vm-x86.yaml new file mode 100644 index 000000000..9497796ae --- /dev/null +++ b/optscale-deploy/ansible/inventories/vm-x86.yaml @@ -0,0 +1,19 @@ +--- +all: + children: + local: + hosts: + ubuntu-2404-x86-64: + # generated from the output of `vagrant ssh-config` + ansible_host: 127.0.0.1 + ansible_port: "50222" + ansible_user: vagrant + ansible_ssh_user: vagrant + + # Use provider-specific private key (qemu / virtualbox) + ansible_ssh_private_key_file: ".vagrant/machines/ubuntu-2404-x86-64/{{ lookup('env', 'VAGRANT_DEFAULT_PROVIDER') | default('qemu') }}/private_key" + + ansible_ssh_common_args: >- + -o StrictHostKeyChecking=no + -o UserKnownHostsFile=/dev/null + -o LogLevel=FATAL diff --git a/optscale-deploy/ansible/provision-vm.yaml b/optscale-deploy/ansible/provision-vm.yaml new file mode 100644 index 000000000..ce6a234bd --- /dev/null +++ b/optscale-deploy/ansible/provision-vm.yaml @@ -0,0 +1,137 @@ +--- +- import_playbook: k8s-master.yaml + +- hosts: all + gather_facts: yes + vars: + k8s_deployment_name: optscale + optscale_dir: "{{ ansible_env.HOME }}/optscale" + optscale_deploy_dir: "{{ optscale_dir }}/optscale-deploy" + + user_template_overlay: "{{ optscale_deploy_dir }}/overlay/user_template.yml" + user_thanos_overlay: "{{ optscale_deploy_dir }}/overlay/user_thanos_disabled.yml" + + tasks: + - name: get the container images that need to be rebuilt + command: + argv: + - find + - "{{ optscale_dir }}" + - -mindepth + - 2 + - -maxdepth + - 3 + - -name + - Dockerfile + - -exec + - sh + - -c + - echo $(basename $(dirname $0)) + - {} + - ; + register: containers_to_build + + # Building the containers one by one instead of just using `./build.sh --use-nerdctl` to display the progress + # when running the playbook. Also in case of failure it will be clear exactly which item failed + - name: build the container images (this will take awhile, be patient :)) + command: "{{ optscale_dir }}/build.sh --use-nerdctl {{ item }} local" + args: + chdir: "{{ optscale_dir }}" + environment: + PATH: "{{ ansible_env.HOME }}/.local/bin:{{ ansible_env.HOME }}/bin:{{ ansible_env.PATH }}" + loop: "{{ containers_to_build.stdout_lines }}" + when: item != 'elk' + + - name: build elk container image when enabled + command: "{{ optscale_dir }}/build.sh --use-nerdctl elk local" + args: + chdir: "{{ optscale_dir }}" + environment: + PATH: "{{ ansible_env.HOME }}/.local/bin:{{ ansible_env.HOME }}/bin:{{ ansible_env.PATH }}" + when: with_elk | default(false) | bool + + - name: build runkube extra args + set_fact: + runkube_extra_args: >- + {{ + (with_elk | default(false) | bool) + | ternary(['--with-elk'], []) + }} + + - name: install the system packages to run the deployment + apt: + name: + - python3-pip + - sshpass + - git + - python3-virtualenv + - python3 + - python3-venv + - python3-dev + - wget + - curl + - mc + - htop + - bpytop + - nmap + - bmon + state: present + update_cache: yes + become: true + + - name: install bash-completion package + apt: + name: + - bash-completion + state: present + update_cache: yes + become: true + + - name: configure bash completion and prompt in user .bashrc + blockinfile: + path: "{{ ansible_env.HOME }}/.bashrc" + create: yes + marker: "# {mark} ANSIBLE OPTSCALE BASH SETTINGS" + block: | + # Enable bash-completion if available + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi + + # Nice prompt: user@hostname:cwd$ + export PS1='\u@\h:\w\$ ' + # No become here so it edits the actual user's ~/.bashrc (e.g. vagrant) + become: false + + - name: install the python dependancies for Optscale-deploy + pip: + requirements: "{{ optscale_deploy_dir }}/requirements.txt" + virtualenv: "{{ optscale_deploy_dir }}/.venv" + + + - name: build overlay list for runkube + set_fact: + runkube_overlays: >- + {{ + [user_template_overlay] + + (disable_thanos | default(false) | bool | ternary([user_thanos_overlay], [])) + }} + + - name: run the k8s cluster setup script + command: + argv: >- + {{ + [optscale_deploy_dir + '/.venv/bin/python', + 'runkube.py'] + + runkube_extra_args + + ['--no-pull', + '-o'] + + runkube_overlays + + ['--', k8s_deployment_name, 'local'] + }} + args: + chdir: "{{ optscale_deploy_dir }}" + environment: + PATH: "{{ ansible_env.HOME }}/.local/bin:{{ ansible_env.HOME }}/bin:{{ ansible_env.PATH }}" diff --git a/optscale-deploy/ansible/roles/common/defaults/main.yaml b/optscale-deploy/ansible/roles/common/defaults/main.yaml index 89d571506..fa9d4ad0d 100644 --- a/optscale-deploy/ansible/roles/common/defaults/main.yaml +++ b/optscale-deploy/ansible/roles/common/defaults/main.yaml @@ -52,3 +52,13 @@ etcd_restore_tools: open_docker_port: true log_to_elk: true syslog_rotation_size: 100M + +# the architecture returned by `uname -m` (which is the canonical way to get it and it's what +# the `ansible_architecture` variable uses) can return either x86_64 and amd64 even though they +# refer to the same CPU architecture (and same for the other aliases). However when we're installing +# packages only amd64 and arm64 are valid, thus this mapping and the `os_arch` variable bellow +os_arch_aliases: + x86_64: amd64 + aarch64: arm64 + +os_arch: "{{ os_arch_aliases.get(ansible_architecture, ansible_architecture) }}" diff --git a/optscale-deploy/ansible/roles/common/tasks/kubernetes.yaml b/optscale-deploy/ansible/roles/common/tasks/kubernetes.yaml index 46a9f8882..c19e45d88 100644 --- a/optscale-deploy/ansible/roles/common/tasks/kubernetes.yaml +++ b/optscale-deploy/ansible/roles/common/tasks/kubernetes.yaml @@ -30,7 +30,7 @@ - name: add Docker's APT repository apt_repository: - repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-apt-keyring.asc] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable" + repo: "deb [arch={{ os_arch }} signed-by=/etc/apt/keyrings/docker-apt-keyring.asc] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable" state: present update_cache: yes become: yes diff --git a/optscale-deploy/ansible/roles/common/tasks/nerdctl.yaml b/optscale-deploy/ansible/roles/common/tasks/nerdctl.yaml index 37d2c26c4..71eff4b70 100644 --- a/optscale-deploy/ansible/roles/common/tasks/nerdctl.yaml +++ b/optscale-deploy/ansible/roles/common/tasks/nerdctl.yaml @@ -2,11 +2,11 @@ block: - name: Download nerdctl get_url: - url: https://github.com/containerd/nerdctl/releases/download/v{{ nerdctl_version }}/nerdctl-{{ nerdctl_version }}-linux-amd64.tar.gz - dest: /tmp/nerdctl-{{ nerdctl_version }}-linux-amd64.tar.gz + url: https://github.com/containerd/nerdctl/releases/download/v{{ nerdctl_version }}/nerdctl-{{ nerdctl_version }}-linux-{{ os_arch }}.tar.gz + dest: /tmp/nerdctl-{{ nerdctl_version }}-linux-{{ os_arch }}.tar.gz - name: Extract nerdctl - shell: tar Cxzf /usr/local/bin /tmp/nerdctl-{{ nerdctl_version }}-linux-amd64.tar.gz + shell: tar Cxzf /usr/local/bin /tmp/nerdctl-{{ nerdctl_version }}-linux-{{ os_arch }}.tar.gz become: yes - name: Create bin directory in the user's home @@ -31,7 +31,7 @@ - name: Cleanup temporary file file: - path: /tmp/nerdctl-{{ nerdctl_version }}-linux-amd64.tar.gz + path: /tmp/nerdctl-{{ nerdctl_version }}-linux-{{ os_arch }}.tar.gz state: absent - name: Create conf directory @@ -53,11 +53,11 @@ block: - name: Download buildkit get_url: - url: https://github.com/moby/buildkit/releases/download/v{{ buildkit_version }}/buildkit-v{{ buildkit_version }}.linux-amd64.tar.gz - dest: /tmp/buildkit-{{ buildkit_version }}-linux-amd64.tar.gz + url: https://github.com/moby/buildkit/releases/download/v{{ buildkit_version }}/buildkit-v{{ buildkit_version }}.linux-{{ os_arch }}.tar.gz + dest: /tmp/buildkit-{{ buildkit_version }}-linux-{{ os_arch }}.tar.gz - name: Extract buildkit - shell: tar Cxzf {{ ansible_env.HOME }} /tmp/buildkit-{{ buildkit_version }}-linux-amd64.tar.gz + shell: tar Cxzf {{ ansible_env.HOME }} /tmp/buildkit-{{ buildkit_version }}-linux-{{ os_arch }}.tar.gz - name: Create systemd unit file template: @@ -74,4 +74,4 @@ name: buildkit.service enabled: true state: started - become: yes \ No newline at end of file + become: yes diff --git a/optscale-deploy/overlay/user_thanos_disabled.yml b/optscale-deploy/overlay/user_thanos_disabled.yml new file mode 100644 index 000000000..16c8c7c7f --- /dev/null +++ b/optscale-deploy/overlay/user_thanos_disabled.yml @@ -0,0 +1,16 @@ +# overlay/user_thanos_disabled.yml +thanos_compactor: + cronJob: + suspend: true + +thanos_query: + replicaCount: 0 + +thanos_receive: + replicaCount: 0 + +thanos_storegateway: + replicaCount: 0 + +diproxy: + replicaCount: 0 diff --git a/optscale-deploy/runkube.py b/optscale-deploy/runkube.py index 93800c5c0..5782fc2a5 100755 --- a/optscale-deploy/runkube.py +++ b/optscale-deploy/runkube.py @@ -134,12 +134,18 @@ def get_ctrd_cl(self, node): @property def versions_info(self): if self._versions_info is None: - self._versions_info = {'optscale': self.version} + self._versions_info = {'optscale': self.version, 'images': {}} + with open(COMPONENTS_FILE) as f_comp: components_dict = yaml.safe_load(f_comp) - self._versions_info['images'] = { - component: self.version for component in components_dict - } + + for component in components_dict: + if component == 'elk' and not self.with_elk: + LOG.warning("elk specified in components file (%s) but --with-elk is not set, ignoring it", COMPONENTS_FILE) + continue + + self._versions_info['images'][component] = self.version + return self._versions_info def _pull_image(self, ctrd_cl, image_name, tag, auth_config): diff --git a/optscale-deploy/vm.sh b/optscale-deploy/vm.sh new file mode 100755 index 000000000..3ceb19c4e --- /dev/null +++ b/optscale-deploy/vm.sh @@ -0,0 +1,622 @@ +#!/usr/bin/env bash + +set -euo pipefail + +SCRIPT_DIR="$(dirname "$(realpath "$0")")" + +STATE_DIR="$SCRIPT_DIR/.vagrant/.vm-state" +PROVIDER_FILE="$STATE_DIR/provider" +ARCH_FILE="$STATE_DIR/arch" +CPUS_FILE="$STATE_DIR/cpus" +RAM_FILE="$STATE_DIR/ram_gb" +DISK_FILE="$STATE_DIR/disk_gb" + +_save_state_kv() { + local file="$1" + local val="$2" + mkdir -p "$STATE_DIR" + printf '%s\n' "$val" > "$file" +} + +_load_state_kv() { + local file="$1" + if [[ -f "$file" ]]; then + cat "$file" + else + echo "" + fi +} + +save_cpus() { _save_state_kv "$CPUS_FILE" "$1"; } +load_cpus() { _load_state_kv "$CPUS_FILE"; } + +save_ram_gb() { _save_state_kv "$RAM_FILE" "$1"; } +load_ram_gb() { _load_state_kv "$RAM_FILE"; } + +save_disk_gb() { _save_state_kv "$DISK_FILE" "$1"; } +load_disk_gb() { _load_state_kv "$DISK_FILE"; } + + +save_provider() { + mkdir -p "$STATE_DIR" + printf '%s\n' "$1" > "$PROVIDER_FILE" +} + +load_provider() { + if [[ -f "$PROVIDER_FILE" ]]; then + cat "$PROVIDER_FILE" + else + echo "" + fi +} + +save_arch() { + mkdir -p "$STATE_DIR" + printf '%s\n' "$1" > "$ARCH_FILE" +} + +load_arch() { + if [[ -f "$ARCH_FILE" ]]; then + cat "$ARCH_FILE" + else + echo "" + fi +} + +clear_state() { + rm -rf "$STATE_DIR" +} + + +function host_arch_family { + local host_arch + host_arch="$(uname -m)" + + case "$host_arch" in + x86_64|amd64) echo "x86" ;; + aarch64|arm64) echo "arm" ;; + *) + echo "Error: Unsupported host architecture '$host_arch'." >&2 + exit 1 + ;; + esac +} + +function arch_is_suitable { + local requested="$1" + local host + host="$(host_arch_family)" + + [[ "$requested" == "$host" ]] +} + +print_help() { + cat <] [--no-thanos] [...] + +Available commands: + info show vm status and info + optscale-info show optscale cluster info + start, up start the vm + stop, down stop the vm + destroy destroy the vm + restart stop and start the vm + reset destroy and start the vm + ssh ssh into the vm + playbook run an ansible playbook + role run an ansible role + deploy-service deploy a service inside the vm + update-only rebuild images and update existing optscale release + +Global options: + --provider qemu|virtualbox force specific Vagrant provider + --allow-emulation allow starting non-native architecture VM (emulation) + --cpus N set VM vCPUs (default: 4) + --ram N set VM RAM in GB (default: 10) + --disk N set VM disk size in GB (default: 75) + --no-thanos disable thanos components (passed to ansible & runkube) + --with-elk enable ELK stack (build elk image, pass --with-elk to runkube) + --help, -h show this help message + +EOF +} + +# check if --help or -h is passed as any argument regardless of its position +if [[ "$@" == *"--help"* || "$@" == *"-h"* ]]; then + print_help + exit 0 +fi + +ALLOW_EMULATION=0 +PROVIDER="" +DISABLE_THANOS=0 +WITH_ELK=0 +CPUS="" +RAM_GB="" +DISK_GB="" + +args=("$@") +clean_args=() + +i=0 +while [[ $i -lt $# ]]; do + arg="${args[$i]}" + + case "$arg" in + --provider) + # next arg must contain provider + if [[ $((i+1)) -ge $# ]]; then + echo "Error: --provider must be followed by qemu or virtualbox" + exit 1 + fi + PROVIDER="${args[$((i+1))]}" + i=$((i+2)) + continue + ;; + --provider=*) + PROVIDER="${arg#*=}" + i=$((i+1)) + continue + ;; + --allow-emulation) + ALLOW_EMULATION=1 + i=$((i+1)) + continue + ;; + --no-thanos|--disable-thanos) + DISABLE_THANOS=1 + i=$((i+1)) + continue + ;; + --cpus) + if [[ $((i+1)) -ge $# ]]; then + echo "Error: --cpus must be followed by a number" + exit 1 + fi + CPUS="${args[$((i+1))]}" + i=$((i+2)) + continue + ;; + --cpus=*) + CPUS="${arg#*=}" + i=$((i+1)) + continue + ;; + --ram) + if [[ $((i+1)) -ge $# ]]; then + echo "Error: --ram must be followed by a number (GB)" + exit 1 + fi + RAM_GB="${args[$((i+1))]}" + i=$((i+2)) + continue + ;; + --ram=*) + RAM_GB="${arg#*=}" + i=$((i+1)) + continue + ;; + --disk) + if [[ $((i+1)) -ge $# ]]; then + echo "Error: --disk must be followed by a number (GB)" + exit 1 + fi + DISK_GB="${args[$((i+1))]}" + i=$((i+2)) + continue + ;; + --with-elk|--elk) + WITH_ELK=1 + i=$((i+1)) + continue + ;; + --disk=*) + DISK_GB="${arg#*=}" + i=$((i+1)) + continue + ;; + *) + clean_args+=("$arg") + ;; + esac + + i=$((i+1)) +done + +# Normalize provider if given; otherwise reuse the last selected provider +if [[ "$PROVIDER" == "qemu" || "$PROVIDER" == "virtualbox" ]]; then + export VAGRANT_DEFAULT_PROVIDER="$PROVIDER" + save_provider "$PROVIDER" +elif [[ -n "$PROVIDER" ]]; then + echo "Error: unsupported provider '$PROVIDER'. Expected 'qemu' or 'virtualbox'." + exit 1 +else + last_provider="$(load_provider)" + if [[ -n "$last_provider" ]]; then + export VAGRANT_DEFAULT_PROVIDER="$last_provider" + fi +fi + +if [[ -z "${VAGRANT_DEFAULT_PROVIDER:-}" ]]; then + export VAGRANT_DEFAULT_PROVIDER="qemu" + save_provider "qemu" +fi + +EFFECTIVE_CPUS="" +EFFECTIVE_RAM_GB="" +EFFECTIVE_DISK_GB="" + +if [[ -n "$CPUS" ]]; then + EFFECTIVE_CPUS="$CPUS" + save_cpus "$EFFECTIVE_CPUS" +else + EFFECTIVE_CPUS="$(load_cpus)" +fi + +if [[ -n "$RAM_GB" ]]; then + EFFECTIVE_RAM_GB="$RAM_GB" + save_ram_gb "$EFFECTIVE_RAM_GB" +else + EFFECTIVE_RAM_GB="$(load_ram_gb)" +fi + +if [[ -n "$DISK_GB" ]]; then + EFFECTIVE_DISK_GB="$DISK_GB" + save_disk_gb "$EFFECTIVE_DISK_GB" +else + EFFECTIVE_DISK_GB="$(load_disk_gb)" +fi + +# Export only if we actually have values +if [[ -n "$EFFECTIVE_CPUS" ]]; then + export VM_CPUS="$EFFECTIVE_CPUS" +fi + +if [[ -n "$EFFECTIVE_RAM_GB" ]]; then + export VM_RAM_GB="$EFFECTIVE_RAM_GB" +fi + +if [[ -n "$EFFECTIVE_DISK_GB" ]]; then + export VM_DISK_GB="$EFFECTIVE_DISK_GB" +fi + +# Replace original args with cleaned ones +set -- "${clean_args[@]}" + +if [[ $# -lt 1 ]]; then + echo "Error: Invalid number of arguments." + print_help + exit 1 +fi + +if [[ "${1:-}" == "x86" || "${1:-}" == "arm" ]]; then + COMMAND_PEEK="${2:-}" +else + COMMAND_PEEK="${1:-}" +fi + +if [[ -z "${COMMAND_PEEK:-}" ]]; then + echo "Error: Missing command." + print_help + exit 1 +fi + +if [[ "$1" == "x86" || "$1" == "arm" ]]; then + VM_ARCH="$1" + + if arch_is_suitable "$VM_ARCH"; then + save_arch "$VM_ARCH" + else + if [[ "$COMMAND_PEEK" == "destroy" || "$COMMAND_PEEK" == "stop" || "$COMMAND_PEEK" == "down" ]]; then + echo "Warning: '$VM_ARCH' is not suitable for this host ($(uname -m)), but allowing '$COMMAND_PEEK'." + echo "Arch will NOT be saved." + elif [[ "${ALLOW_EMULATION:-0}" -eq 1 ]]; then + export ALLOW_EMULATION + echo "Warning: '$VM_ARCH' is not native for this host ($(uname -m)), but --allow-emulation is set." + echo "Arch will NOT be saved." + else + echo "Error: '$VM_ARCH' is not suitable for this host ($(uname -m))." + echo "Hint: add --allow-emulation to run non-native architecture VM." + echo "Tip: use the native arch or run 'destroy'/'stop' to clean up that VM." + exit 2 + fi + fi + + shift +else + last_arch="$(load_arch)" + if [[ -n "$last_arch" ]]; then + VM_ARCH="$last_arch" + echo "VM architecture not provided, using saved: $VM_ARCH" + else + host_os_arch=$(uname -m) + if [[ "$host_os_arch" == "x86_64" || "$host_os_arch" == "amd64" ]]; then + VM_ARCH="x86" + elif [[ "$host_os_arch" == "aarch64" || "$host_os_arch" == "arm64" ]]; then + VM_ARCH="arm" + else + echo "Error: Unsupported host architecture '$host_os_arch'. Provide 'x86' or 'arm'." + exit 1 + fi + save_arch "$VM_ARCH" + echo "VM architecture not provided, using host: $VM_ARCH" + fi +fi + + + +COMMAND="$1" +shift + +if [[ "$VM_ARCH" == "x86" ]]; then + VM_NAME="ubuntu-2404-x86-64" +else + VM_NAME="ubuntu-2404-arm-64" +fi + +INVENTORY_FILE="$SCRIPT_DIR/ansible/inventories/vm-$VM_ARCH.yaml" + +function require_arch_compatible_or_die { + local cmd="$1" + case "$cmd" in + start|up|restart|reset) ;; + *) return 0 ;; + esac + + local host_arch + host_arch="$(uname -m)" + + local host_family="" + case "$host_arch" in + x86_64|amd64) host_family="x86" ;; + aarch64|arm64) host_family="arm" ;; + *) + echo "Error: Unsupported host architecture '$host_arch'." + exit 1 + ;; + esac + + if [[ "$VM_ARCH" != "$host_family" ]]; then + if [[ "${ALLOW_EMULATION:-0}" -eq 1 ]]; then + echo "Warning: starting '$VM_ARCH' VM on '$host_arch' host (non-native), because --allow-emulation is set." + return 0 + fi + + echo "Error: You're trying to start '$VM_ARCH' VM on '$host_arch' host." + echo "This script is configured to fail-fast on non-native architecture." + echo + echo "Fix: run with the native arch:" + echo + echo "Hint: add --allow-emulation to run non-native architecture VM (at own risk)" + + if [[ "$host_family" == "x86" ]]; then + echo " $0 x86 --provider ${VAGRANT_DEFAULT_PROVIDER} up" + else + echo " $0 arm --provider ${VAGRANT_DEFAULT_PROVIDER} up" + fi + exit 2 + fi +} + +function _venv_run { + if [[ -n "${VIRTUAL_ENV:-}" ]]; then + exec "$@" + elif type uv >/dev/null 2>&1; then + uv run --directory "$SCRIPT_DIR" "$@" + else + default_venv_dir="$SCRIPT_DIR/.venv" + if [[ ! -d "$default_venv_dir" ]]; then + echo "Error: No virtualenv found." + exit 1 + fi + exec "$default_venv_dir/bin/$@" + fi +} + +function vm_info { + vm_state=$(vagrant status $VM_NAME --machine-readable | grep ',state,' | cut -d ',' -f4) + vm_qemu_id=$(cat ".vagrant/machines/$VM_NAME/qemu/id" 2>/dev/null || echo "") + vm_vagrant_id=$(cat ".vagrant/machines/$VM_NAME/qemu/index_uuid" 2>/dev/null || echo "") + + vm_process_info=$(ps -eo pid,command | grep "qemu-system-.*$VM_NAME" | grep -v grep || echo "") + vm_qemu_pid=$(echo "$vm_process_info" | cut -d ' ' -f1 || echo "") + vm_qemu_accelerator=$(echo "$vm_process_info" | sed 's/.*-accel \([^ ]*\).*/\1/' || echo "") + + echo "Name: ${VM_NAME}" + echo "State: ${vm_state:-unknown}" + echo "QEMU Machine ID: ${vm_qemu_id:-N/A}" + echo "Vagrant ID: ${vm_vagrant_id:-N/A}" + echo "QEMU Process ID: ${vm_qemu_pid:-N/A}" + echo "QEMU Accelerator: ${vm_qemu_accelerator:-N/A}" + echo "VM_CPUS: ${VM_CPUS:-$(load_cpus):-default}" + echo "VM_RAM_GB: ${VM_RAM_GB:-$(load_ram_gb):-default}" + echo "VM_DISK_GB: ${VM_DISK_GB:-$(load_disk_gb):-default}" +} + +function vm_start { + vagrant up $VM_NAME +} + +function vm_stop { + vagrant halt $VM_NAME "$@" + + if [[ "$@" == *"--force"* ]]; then + pid=$(pgrep -f "qemu-system-.*$VM_NAME" || true) + [[ -n "$pid" ]] && kill "$pid" + fi + + while pgrep -f "qemu-system-.*$VM_NAME" >/dev/null; do + echo "$(date +%X) - Waiting until VM stops" + sleep 1 + done +} + +function vm_destroy { + vm_stop --force + vagrant destroy --force $VM_NAME + clear_state +} + +function vm_ssh { + cmd_to_run="${1:-/bin/bash}" + + if [[ "$TERM" == "xterm-kitty" ]]; then + TERM="xterm-256color" vagrant ssh $VM_NAME -c "$cmd_to_run" + else + vagrant ssh $VM_NAME -c "$cmd_to_run" + fi +} + +function vm_run_ansible_playbook { + local playbook="$1" + shift + + if [[ -f "$playbook" ]]; then + playbook_path="$playbook" + elif [[ -f "$SCRIPT_DIR/ansible/$playbook.yaml" ]]; then + playbook_path="$SCRIPT_DIR/ansible/$playbook.yaml" + else + echo "Error: playbook '$playbook' not found." + exit 1 + fi + + extra_vars=() + if [[ "$DISABLE_THANOS" -eq 1 ]]; then + extra_vars+=(-e disable_thanos=true) + fi + if [[ "$WITH_ELK" -eq 1 ]]; then + extra_vars+=(-e with_elk=true) + fi + + _venv_run ansible-playbook --inventory-file "$INVENTORY_FILE" \ + "${extra_vars[@]}" \ + "$playbook_path" "$@" +} + + +function vm_run_ansible_role { + local role="$1" + shift + + if [[ -d "$SCRIPT_DIR/ansible/roles/$role" ]]; then + role_path="$SCRIPT_DIR/ansible/roles/$role" + else + echo "Error: role '$role' not found." + exit 1 + fi + + _venv_run ansible all \ + --inventory-file "$INVENTORY_FILE" \ + --module-name include_role \ + --args "name=$role_path" \ + "$@" +} + +function vm_show_optscale_info { + cluster_secret=$(vm_ssh "kubectl get secret cluster-secret -o jsonpath='{.data.cluster_secret}' | base64 --decode; echo") + cluster_ip_addr=$(vm_ssh "kubectl get svc ngingress-ingress-nginx-controller -o jsonpath='{.spec.clusterIP}'") + + forwarded_https_port=$(grep -A10 "define_vm" "$SCRIPT_DIR/Vagrantfile" | + grep -A10 "$VM_NAME" | + grep -o "https: [0-9]*" | + awk '{print $2}') + + frontend_url="https://localhost:$forwarded_https_port/" + status_code=$(curl --insecure -L -I "$frontend_url" -sw '%{http_code}\n' -o /dev/null || echo "") + + echo "Frontend URL: $frontend_url [$status_code]" + echo "Cluster IP Address: $cluster_ip_addr" + echo "Cluster Secret: $cluster_secret" + + k8s_pods=$(vm_ssh "kubectl get pods --all-namespaces") + echo "================================" + echo "K8S Pods" + echo "$k8s_pods" +} + +function vm_deploy_service { + vagrant rsync "$VM_NAME" + + if [[ $# -eq 1 ]]; then + service_name="$1" + vm_ssh "cd optscale && ./build.sh --use-nerdctl $service_name local" + fi + + # Build overlay args for runkube + local overlay_args="-o overlay/user_template.yml" + if [[ "$DISABLE_THANOS" -eq 1 ]]; then + overlay_args="$overlay_args overlay/user_thanos_disabled.yml" + fi + + local elk_flag="" + if [[ "$WITH_ELK" -eq 1 ]]; then + elk_flag="--with-elk" + fi + + vm_ssh "cd optscale/optscale-deploy && .venv/bin/python runkube.py --no-pull $elk_flag $overlay_args -- optscale local" +} + +function vm_update_only { + # Find running OptScale release based on chart/name containing "optscale" + local releases release_name + + releases=$(vm_ssh "helm list -o json 2>/dev/null | python3 -c 'import sys, json; data = json.load(sys.stdin); print(\"\\n\".join(r[\"name\"] for r in data if \"optscale\" in r.get(\"chart\", \"\") or \"optscale\" in r.get(\"name\", \"\")))' || true") + releases=$(echo "$releases" | sed '/^$/d') + + if [[ -z "$releases" ]]; then + echo "Error: No running OptScale release with chart/name containing 'optscale' found." + echo "helm list output from VM:" + vm_ssh "helm list 2>/dev/null || true" + exit 1 + fi + + if [[ $(echo "$releases" | wc -l) -ne 1 ]]; then + echo "Error: Multiple OptScale-like releases found:" + echo "$releases" + echo "Please clean up or update the script to select one." + exit 1 + fi + + release_name=$(echo "$releases" | head -n1 | tr -d '\r\n') + echo "Using OptScale release: ${release_name}" + + # Rebuild services (all or specific) + if [[ $# -eq 0 ]]; then + echo "Rebuilding all OptScale images inside VM..." + vm_ssh "cd optscale && ./build.sh --use-nerdctl" + else + for svc in "$@"; do + echo "Rebuilding service: ${svc}" + vm_ssh "cd optscale && ./build.sh --use-nerdctl ${svc} local" + done + fi + + local elk_flag="" + if [[ "$WITH_ELK" -eq 1 ]]; then + elk_flag="--with-elk" + fi + + echo "Running runkube update-only for release '${release_name}'..." + vm_ssh "cd optscale/optscale-deploy && .venv/bin/python runkube.py --update-only --no-pull $elk_flag -- ${release_name} local" +} + +require_arch_compatible_or_die "$COMMAND" +case $COMMAND in + info) vm_info ;; + optscale-info) vm_show_optscale_info ;; + start|up) vm_start ;; + stop|down) vm_stop "$@" ;; + destroy) vm_destroy ;; + restart) vm_stop; vm_start ;; + reset) vm_destroy; vm_start ;; + ssh) vm_ssh "$@" ;; + playbook) vm_run_ansible_playbook "$@" ;; + role) vm_run_ansible_role "$@" ;; + deploy-service) vm_deploy_service "$@" ;; + update-only) vm_update_only "$@" ;; + *) + echo "Error: Invalid command: $COMMAND" + print_help + exit 1 + ;; +esac diff --git a/rest_api/live_demo.tar.xz b/rest_api/live_demo.tar.xz index 276d0e5be..eec46580c 100644 Binary files a/rest_api/live_demo.tar.xz and b/rest_api/live_demo.tar.xz differ diff --git a/tools/cloud_adapter/clouds/alibaba.py b/tools/cloud_adapter/clouds/alibaba.py index a44f66833..907e72d9f 100644 --- a/tools/cloud_adapter/clouds/alibaba.py +++ b/tools/cloud_adapter/clouds/alibaba.py @@ -678,10 +678,10 @@ def _discover_region_lbs(self, region_details, lb_type): for lb in response: lb_id = lb['LoadBalancerId'] if attr_request: - attr_request = attr_request() - attr_request.set_LoadBalancerId(lb_id) + req = attr_request() + req.set_LoadBalancerId(lb_id) attrs = handle_discovery_client_exc( - self._send_request, attr_request, + self._send_request, req, region_id=region_details['RegionId']) security_groups = attrs.get('SecurityGroupIds', []) if 'Tags' in lb and isinstance(lb['Tags'], dict):