From 2f27f2b9810982b8c1a79659271850ba0e560de0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 13 Jul 2026 14:44:04 +0200 Subject: [PATCH 001/196] change error to non-compliant switch arp --- modules/test/conn/python/src/connection_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index b7717730b..6c5d49760 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -116,7 +116,7 @@ def _connection_switch_arp_inspection(self): if self._device_ipv4_addr is None: LOGGER.error('No device IP could be resolved') - return 'Error', 'Could not resolve device IP address' + return False, 'Could not resolve device IP address' no_arp = True From 68c63ce54702d3e2cfb37c281ee12527062cd183 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 13 Jul 2026 16:08:21 +0200 Subject: [PATCH 002/196] return non-compliant result when device does not respond to ping for private address and shared address tests --- modules/test/conn/python/src/connection_module.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index 6c5d49760..18fafbef3 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -770,6 +770,11 @@ def _run_subnet_test(self, config): # Process and return final results final_result = None final_result_details = '' + LOGGER.info(f'====results===={results}') + if not results: + msg = 'Device does not respond to ping' + LOGGER.info(msg) + return False, msg for result in results: if final_result is None: final_result = result['result'] From 6b9027c1292d38d6afb4595944e80a6f255c03e8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 13 Jul 2026 16:24:17 +0200 Subject: [PATCH 003/196] dech disconnect test --- modules/test/conn/python/src/connection_module.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index 18fafbef3..6cd36919f 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -391,7 +391,7 @@ def _connection_dhcp_disconnect(self) -> tuple[str | bool, str]: lease = self._dhcp_util.get_cur_lease(mac_address=self._device_mac, timeout=self._lease_wait_time_sec) if lease is None or not self._dhcp_util.is_lease_active(lease): - return 'Error', 'No active lease available for device' + return False, 'Device does not respond to ping' try: # Disable the device interface iface_down = self.host_client.set_iface_down(dev_iface) @@ -770,7 +770,6 @@ def _run_subnet_test(self, config): # Process and return final results final_result = None final_result_details = '' - LOGGER.info(f'====results===={results}') if not results: msg = 'Device does not respond to ping' LOGGER.info(msg) From d16c81d5c7b45d38e07c28170406385840838da9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 13 Jul 2026 16:47:24 +0200 Subject: [PATCH 004/196] connection dhc ip changed non-comliant result --- modules/test/conn/python/src/connection_module.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index 6cd36919f..168c3ff5f 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -445,8 +445,12 @@ def _connection_dhcp_disconnect_ip_change(self): mac_address=self._device_mac, timeout=self._lease_wait_time_sec) if lease is not None: LOGGER.info('Current device lease resolved') - if self._dhcp_util.is_lease_active(lease): - + if not self._dhcp_util.is_lease_active(lease): + msg = 'Device does not respond to ping' + LOGGER.info(msg) + result = False + description = msg + else: # Add a reserved lease with a different IP ip_address = '10.10.10.30' reserved_lease = self._dhcp_util.add_reserved_lease( From 11540303fb2ae73907f3ccddc337fd8906be35ea Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 13:06:51 +0200 Subject: [PATCH 005/196] docker lint --- .github/workflows/security.yml | 87 ++++++---------------------------- 1 file changed, 14 insertions(+), 73 deletions(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index da04ad625..f8e115ff1 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -49,79 +49,20 @@ jobs: base_dir: "." json_exclude_regex: '.*(tsconfig.*\.json|\.venv|node_modules)' yaml_exclude_regex: '.*(\.venv|node_modules)' - # dockerfile_scan: - # name: Dockerfile Scan - # runs-on: ubuntu-24.04 - # steps: - # - name: Checkout source - # uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - # - name: Run Hadolint - # uses: hadolint/hadolint-action@2332a7b74a6de0dda2e2221d575162eba76ba5e5 #v3.3.0 - # with: - # dockerfile: "*Dockerfile" - # recursive: true - # ignore: DL3007,DL3008,DL3015,DL3059 - # failure-threshold: warning - # shellcheck_scan: - # name: ShellCheck Bash Scan - # runs-on: ubuntu-24.04 - # steps: - # - name: Checkout source - # uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - # - name: Run Shellcheck - # uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 #v2.0.0 - # with: - # ignore_paths: >- - # node_modules - # .venv - # dist - # build - # severity: warning - # trivy_sca_scan: - # name: Trivy SCA Security Scan - # runs-on: ubuntu-24.04 - # steps: - # - name: Checkout source - # uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - # - name: Run Trivy in Filesystem mode - # uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 #0.36.0 - # with: - # scan-type: 'fs' - # scan-ref: '.' - # format: 'table' - # exit-code: '1' - # ignore-unfixed: true - # severity: 'CRITICAL,HIGH' - # bandit_sast_scan: - # name: Bandit Python SAST Scan - # runs-on: ubuntu-24.04 - # steps: - # - name: Checkout source - # uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - # - name: Set up Python - # uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 #v.6.0.3 - # with: - # python-version: '3.13' - # - name: Install Bandit - # run: pip install bandit==1.9.4 - # - name: Run Bandit Analysis - # run: bandit -r . -ll -x ./testing,./modules/ui/node_modules - # semgrep_scan: - # name: Semgrep OSS SAST Scan - # runs-on: ubuntu-24.04 - # container: - # image: semgrep/semgrep:1.169.0 - # steps: - # - name: Checkout source - # uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - # - name: Run Semgrep Security Analiss - # run: | - # semgrep scan \ - # --config=auto \ - # --error \ - # --exclude="**/testing/**" - # --exclude="modules/ui/node_modules" - + dockerfile_scan: + name: Dockerfile Scan + runs-on: ubuntu-24.04 + steps: + - name: Checkout source + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Run Hadolint + uses: hadolint/hadolint-action@2332a7b74a6de0dda2e2221d575162eba76ba5e5 #v3.3.0 + with: + dockerfile: "*Dockerfile" + recursive: true + ignore: DL3007,DL3008,DL3015,DL3059 + failure-threshold: warning + From 707a8d031f7add858907414766b6afca9bfb267e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 15:40:08 +0200 Subject: [PATCH 006/196] fix faux-dev dockerfile --- modules/devices/faux-dev/faux-dev.Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/devices/faux-dev/faux-dev.Dockerfile b/modules/devices/faux-dev/faux-dev.Dockerfile index 18901a2a1..9fef202eb 100644 --- a/modules/devices/faux-dev/faux-dev.Dockerfile +++ b/modules/devices/faux-dev/faux-dev.Dockerfile @@ -19,14 +19,13 @@ ARG MODULE_NAME=faux-dev ARG MODULE_DIR=modules/devices/$MODULE_NAME ARG COMMON_DIR=framework/python/src/common -# Update and get all additional requirements not contained in the base image -RUN apt-get update --fix-missing - # NTP requireds interactive installation so we're going to turn that off ARG DEBIAN_FRONTEND=noninteractive # Install dhcp client and ntp client -RUN apt-get install -y isc-dhcp-client ntp ntpdate +RUN apt-get update --fix-missing && \ +apt-get install -y isc-dhcp-client \ +ntp ntpdate && rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf From 536b8ef2e3b52a275f2c23cda6ec4bb34bac0661 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 16:23:12 +0200 Subject: [PATCH 007/196] fix faux-dev mistake --- modules/devices/faux-dev/faux-dev.Dockerfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/devices/faux-dev/faux-dev.Dockerfile b/modules/devices/faux-dev/faux-dev.Dockerfile index 9fef202eb..6e631aabf 100644 --- a/modules/devices/faux-dev/faux-dev.Dockerfile +++ b/modules/devices/faux-dev/faux-dev.Dockerfile @@ -23,9 +23,12 @@ ARG COMMON_DIR=framework/python/src/common ARG DEBIAN_FRONTEND=noninteractive # Install dhcp client and ntp client -RUN apt-get update --fix-missing && \ -apt-get install -y isc-dhcp-client \ -ntp ntpdate && rm -rf /var/lib/apt/lists/* +RUN DEBIAN_FRONTEND=noninteractive apt-get update --fix-missing && \ + apt-get install -y --no-install-recommends \ + isc-dhcp-client \ + ntp \ + ntpdate && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf From 324dec96e540698df0f0f22f2bbb51f272c7322d Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 18:45:25 +0200 Subject: [PATCH 008/196] base network dockerfile --- modules/network/base/base.Dockerfile | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/network/base/base.Dockerfile b/modules/network/base/base.Dockerfile index 7f6edb409..d2d0611ac 100644 --- a/modules/network/base/base.Dockerfile +++ b/modules/network/base/base.Dockerfile @@ -15,14 +15,23 @@ # Image name: testrun/base FROM ubuntu@sha256:77d57fd89366f7d16615794a5b53e124d742404e20f035c22032233f1826bd6a -RUN apt-get update - ARG MODULE_NAME=base ARG MODULE_DIR=modules/network/$MODULE_NAME ARG COMMON_DIR=framework/python/src/common +ARG DEBIAN_FRONTEND=noninteractive # Install common software -RUN DEBIAN_FRONTEND=noninteractive apt-get install -yq net-tools iputils-ping tzdata tcpdump iproute2 jq python3 python3-pip dos2unix +RUN apt-get update && \ + apt-get install -yq \ + net-tools \ + iputils-ping \ + tzdata \ + tcpdump \ + iproute2 \ + jq \ + python3 \ + python3-pip \ + dos2unix && rm -rf /var/lib/apt/lists/* # Install common python modules COPY $COMMON_DIR/ /testrun/python/src/common From ed1095370e6faec3de977df754804a09f05e1149 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 19:09:00 +0200 Subject: [PATCH 009/196] dchp dockerfiles --- modules/network/base/base.Dockerfile | 4 +++- modules/network/dhcp-1/dhcp-1.Dockerfile | 13 ++++++------- modules/network/dhcp-2/dhcp-2.Dockerfile | 13 ++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/network/base/base.Dockerfile b/modules/network/base/base.Dockerfile index d2d0611ac..82b35bc64 100644 --- a/modules/network/base/base.Dockerfile +++ b/modules/network/base/base.Dockerfile @@ -41,7 +41,9 @@ COPY $MODULE_DIR/python /testrun/python # Install all python requirements for the module # --break-system-packages flag used to bypass PEP668 -RUN pip3 install --break-system-packages -r /testrun/python/requirements.txt +RUN pip3 install --no-cache-dir \ + --break-system-packages -r \ + /testrun/python/requirements.txt # Add the bin files COPY $MODULE_DIR/bin /testrun/bin diff --git a/modules/network/dhcp-1/dhcp-1.Dockerfile b/modules/network/dhcp-1/dhcp-1.Dockerfile index 7df94b4fd..729627cbb 100644 --- a/modules/network/dhcp-1/dhcp-1.Dockerfile +++ b/modules/network/dhcp-1/dhcp-1.Dockerfile @@ -18,14 +18,13 @@ FROM testrun/base:latest ARG MODULE_NAME=dhcp-1 ARG MODULE_DIR=modules/network/$MODULE_NAME -#Update and get all additional requirements not contained in the base image -RUN apt-get update --fix-missing - # Install all necessary packages -RUN apt-get install -y wget - -# Install dhcp server -RUN apt-get install -y isc-dhcp-server radvd systemd +RUN apt-get update --fix-missing && \ + apt-get install -y wget \ + isc-dhcp-server \ + radvd \ + systemd && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/network/dhcp-2/dhcp-2.Dockerfile b/modules/network/dhcp-2/dhcp-2.Dockerfile index 4dcd7a819..4abe093b1 100644 --- a/modules/network/dhcp-2/dhcp-2.Dockerfile +++ b/modules/network/dhcp-2/dhcp-2.Dockerfile @@ -18,14 +18,13 @@ FROM testrun/base:latest ARG MODULE_NAME=dhcp-2 ARG MODULE_DIR=modules/network/$MODULE_NAME -# Update and get all additional requirements not contained in the base image -RUN apt-get update --fix-missing - # Install all necessary packages -RUN apt-get install -y wget - -# Install dhcp server -RUN apt-get install -y isc-dhcp-server radvd systemd +RUN apt-get update --fix-missing && \ + apt-get install -y wget \ + isc-dhcp-server \ + radvd \ + systemd && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf From a1097fa16384b86232644bafcf28dab24dfdfc4f Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 19:18:28 +0200 Subject: [PATCH 010/196] fix dns dockerfile --- modules/network/dns/dns.Dockerfile | 7 +++---- modules/network/gateway/gateway.Dockerfile | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/network/dns/dns.Dockerfile b/modules/network/dns/dns.Dockerfile index 2b46dfb4a..2293f0cd5 100644 --- a/modules/network/dns/dns.Dockerfile +++ b/modules/network/dns/dns.Dockerfile @@ -18,11 +18,10 @@ FROM testrun/base:latest ARG MODULE_NAME=dns ARG MODULE_DIR=modules/network/$MODULE_NAME -#Update and get all additional requirements not contained in the base image -RUN apt-get update --fix-missing - #Install dnsmasq -RUN apt-get install -y dnsmasq +RUN apt-get update --fix-missing && \ + apt-get install -y dnsmasq && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/network/gateway/gateway.Dockerfile b/modules/network/gateway/gateway.Dockerfile index 2b72174ab..58c3f98ab 100644 --- a/modules/network/gateway/gateway.Dockerfile +++ b/modules/network/gateway/gateway.Dockerfile @@ -19,7 +19,10 @@ ARG MODULE_NAME=gateway ARG MODULE_DIR=modules/network/$MODULE_NAME # Install required packages -RUN apt-get update && apt-get install -y iptables isc-dhcp-client +RUN apt-get update && \ + apt-get install -y iptables \ + isc-dhcp-client && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf From ed9f01fc7c63e2755e0e5f1eca1950d5490f4251 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 21:39:39 +0200 Subject: [PATCH 011/196] host ntp radius --- modules/network/host/host.Dockerfile | 8 ++++---- modules/network/ntp/ntp.Dockerfile | 9 +++------ modules/network/radius/radius.Dockerfile | 10 +++++++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/modules/network/host/host.Dockerfile b/modules/network/host/host.Dockerfile index 60c8bf59a..7143ed58b 100644 --- a/modules/network/host/host.Dockerfile +++ b/modules/network/host/host.Dockerfile @@ -18,11 +18,11 @@ FROM testrun/base:latest ARG MODULE_NAME=host ARG MODULE_DIR=modules/network/$MODULE_NAME -#Update and get all additional requirements not contained in the base image -RUN apt-get update --fix-missing - # Install all necessary packages -RUN apt-get install -y net-tools ethtool +RUN apt-get update --fix-missing && \ + apt-get install -y net-tools \ + ethtool && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/network/ntp/ntp.Dockerfile b/modules/network/ntp/ntp.Dockerfile index d047770ef..1fb727ed1 100644 --- a/modules/network/ntp/ntp.Dockerfile +++ b/modules/network/ntp/ntp.Dockerfile @@ -18,13 +18,10 @@ FROM testrun/base:latest ARG MODULE_NAME=ntp ARG MODULE_DIR=modules/network/$MODULE_NAME -# Set DEBIAN_FRONTEND to noninteractive mode -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update - # Install all necessary packages -RUN apt-get install -y chrony +RUN apt-get update && \ + apt-get install -y chrony && \ + rm -rf /var/lib/apt/lists/* # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/network/radius/radius.Dockerfile b/modules/network/radius/radius.Dockerfile index 802480ce9..e7db50b5a 100644 --- a/modules/network/radius/radius.Dockerfile +++ b/modules/network/radius/radius.Dockerfile @@ -19,14 +19,18 @@ ARG MODULE_NAME=radius ARG MODULE_DIR=modules/network/$MODULE_NAME # Install radius and git -RUN apt-get update && apt-get install -y openssl freeradius git +RUN apt-get update && \ + apt-get install -y openssl \ + freeradius \ + git && \ + rm -rf /var/lib/apt/lists/* # Clone chewie from source. RUN git clone --branch 0.0.25 https://github.com/faucetsdn/chewie # Install chewie as Python module # --break-system-packages flag used to bypass PEP668 -RUN pip3 install --break-system-packages chewie/ +RUN pip3 install --no-cache-dir --break-system-packages chewie EXPOSE 1812/udp EXPOSE 1813/udp @@ -42,4 +46,4 @@ COPY $MODULE_DIR/python /testrun/python # Install all python requirements for the module # --break-system-packages flag used to bypass PEP668 -RUN pip3 install --break-system-packages -r /testrun/python/requirements.txt \ No newline at end of file +RUN pip3 install --no-cache-dir --break-system-packages -r /testrun/python/requirements.txt \ No newline at end of file From bb84e1afed35498d43fcde4418458231738ce280 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 22:12:30 +0200 Subject: [PATCH 012/196] tests base conn dns --- modules/network/radius/radius.Dockerfile | 2 +- modules/test/base/base.Dockerfile | 21 +++++++++++++++++---- modules/test/conn/conn.Dockerfile | 6 ++++-- modules/test/dns/dns.Dockerfile | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/modules/network/radius/radius.Dockerfile b/modules/network/radius/radius.Dockerfile index e7db50b5a..1f25ce067 100644 --- a/modules/network/radius/radius.Dockerfile +++ b/modules/network/radius/radius.Dockerfile @@ -30,7 +30,7 @@ RUN git clone --branch 0.0.25 https://github.com/faucetsdn/chewie # Install chewie as Python module # --break-system-packages flag used to bypass PEP668 -RUN pip3 install --no-cache-dir --break-system-packages chewie +RUN pip3 install --no-cache-dir --break-system-packages chewie==0.0.25 EXPOSE 1812/udp EXPOSE 1813/udp diff --git a/modules/test/base/base.Dockerfile b/modules/test/base/base.Dockerfile index bc0357d10..5a4ad801a 100644 --- a/modules/test/base/base.Dockerfile +++ b/modules/test/base/base.Dockerfile @@ -22,7 +22,9 @@ ARG COMMON_DIR=framework/python/src/common # Install additional requirements needed to build python packages RUN apt-get update && \ - apt-get install -y gcc dos2unix + apt-get install -y gcc \ + dos2unix && \ + rm -rf /var/lib/apt/lists/* # Create the virtual environment RUN python -m venv /opt/venv @@ -37,7 +39,7 @@ COPY $COMMON_DIR/ /testrun/python/src/common COPY $MODULE_DIR/python /testrun/python # Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Copy over all binary files COPY $MODULE_DIR/bin /testrun/bin @@ -62,13 +64,24 @@ RUN mkdir -p /usr/local/etc COPY $MODULE_DIR/usr/local/etc/oui.txt /usr/local/etc/oui.txt # Update the oui.txt file from ieee -RUN wget https://standards-oui.ieee.org/oui.txt -O /usr/local/etc/oui.txt || echo "Unable to update the MAC OUI database" +RUN wget --progress=dot:giga https://standards-oui.ieee.org/oui.txt -O /usr/local/etc/oui.txt || echo "Unable to update the MAC OUI database" # Operational stage FROM python:3.13-slim # Install common software -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -yq net-tools iputils-ping tzdata tcpdump iproute2 jq dos2unix nmap wget procps --fix-missing +RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ + apt-get install -yq net-tools \ + iputils-ping \ + tzdata \ + tcpdump \ + iproute2 \ + jq \ + dos2unix \ + nmap \ + wget \ + procps --fix-missing && \ + rm -rf /var/lib/apt/lists/* # Get the virtual environment from builder stage COPY --from=builder /opt/venv /opt/venv diff --git a/modules/test/conn/conn.Dockerfile b/modules/test/conn/conn.Dockerfile index cda0858c9..2feb60387 100644 --- a/modules/test/conn/conn.Dockerfile +++ b/modules/test/conn/conn.Dockerfile @@ -21,13 +21,15 @@ ARG GRPC_PROTO_DIR=/testrun/python/src/grpc/proto/dhcp ARG GRPC_PROTO_FILE="grpc.proto" # Install all necessary packages -RUN apt-get install -y wget tshark +RUN apt-get update && \ + apt-get install -y wget tshark &&\ + rm -rf /var/lib/apt/lists/* # Load the requirements file COPY $MODULE_DIR/python/requirements.txt /testrun/python # Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/test/dns/dns.Dockerfile b/modules/test/dns/dns.Dockerfile index 53f8f31f8..568452f10 100644 --- a/modules/test/dns/dns.Dockerfile +++ b/modules/test/dns/dns.Dockerfile @@ -22,7 +22,7 @@ ARG MODULE_DIR=modules/test/$MODULE_NAME COPY $MODULE_DIR/python/requirements.txt /testrun/python # Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf From 8efe041aacffa0b5d6f67acd45108a98537b2ae9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:03:34 +0200 Subject: [PATCH 013/196] ntp protocol dockerfiles --- modules/test/ntp/ntp.Dockerfile | 6 ++++-- modules/test/protocol/protocol.Dockerfile | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/test/ntp/ntp.Dockerfile b/modules/test/ntp/ntp.Dockerfile index 773bfbeb9..000560d30 100644 --- a/modules/test/ntp/ntp.Dockerfile +++ b/modules/test/ntp/ntp.Dockerfile @@ -19,7 +19,9 @@ FROM testrun/base-test:latest ENV DEBIAN_FRONTEND=noninteractive # Install required software -RUN apt-get update && apt-get install -y tshark +RUN apt-get update && \ + apt-get install -y tshark && \ + rm -rf /var/lib/apt/lists/* ARG MODULE_NAME=ntp ARG MODULE_DIR=modules/test/$MODULE_NAME @@ -28,7 +30,7 @@ ARG MODULE_DIR=modules/test/$MODULE_NAME COPY $MODULE_DIR/python/requirements.txt /testrun/python # Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/test/protocol/protocol.Dockerfile b/modules/test/protocol/protocol.Dockerfile index 4494ae94e..b2e16684a 100644 --- a/modules/test/protocol/protocol.Dockerfile +++ b/modules/test/protocol/protocol.Dockerfile @@ -19,7 +19,9 @@ FROM testrun/base-test:latest ENV DEBIAN_FRONTEND=noninteractive # Install required software -RUN apt-get update && apt-get install -y tshark +RUN apt-get update && \ + apt-get install -y tshark && \ + rm -rf /var/lib/apt/lists/* ARG MODULE_NAME=protocol ARG MODULE_DIR=modules/test/$MODULE_NAME @@ -28,7 +30,7 @@ ARG MODULE_DIR=modules/test/$MODULE_NAME COPY $MODULE_DIR/python/requirements.txt /testrun/python #Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf From db16070417d0c144360566f303aa21c4819eb8a1 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:03:49 +0200 Subject: [PATCH 014/196] services tsl dockerfiles --- modules/test/services/services.Dockerfile | 2 +- modules/test/tls/tls.Dockerfile | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/test/services/services.Dockerfile b/modules/test/services/services.Dockerfile index 1277c2f8d..d90223af3 100644 --- a/modules/test/services/services.Dockerfile +++ b/modules/test/services/services.Dockerfile @@ -22,7 +22,7 @@ ARG MODULE_DIR=modules/test/$MODULE_NAME COPY $MODULE_DIR/python/requirements.txt /testrun/python # Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Copy over all configuration files COPY $MODULE_DIR/conf /testrun/conf diff --git a/modules/test/tls/tls.Dockerfile b/modules/test/tls/tls.Dockerfile index 3d6d66544..05e2c8c2e 100644 --- a/modules/test/tls/tls.Dockerfile +++ b/modules/test/tls/tls.Dockerfile @@ -19,7 +19,9 @@ FROM testrun/base-test:latest ENV DEBIAN_FRONTEND=noninteractive # Install required software -RUN apt-get update && apt-get install -y tshark +RUN apt-get update && \ + apt-get install -y tshark && \ + rm -rf /var/lib/apt/lists/* ARG MODULE_NAME=tls ARG MODULE_DIR=modules/test/$MODULE_NAME @@ -41,13 +43,13 @@ RUN chmod u+x /testrun/bin/* COPY $MODULE_DIR/python /testrun/python # Install all python requirements for the module -RUN pip install -r /testrun/python/requirements.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements.txt # Install all python requirements for the modules unit test -RUN pip install -r /testrun/python/requirements-test.txt +RUN pip install --no-cache-dir -r /testrun/python/requirements-test.txt # Install all python requirements for the modules unit test -RUN pip3 install -r /testrun/python/requirements-test.txt +RUN pip3 install --no-cache-dir -r /testrun/python/requirements-test.txt # Create a directory inside the container to store the root certificates RUN mkdir -p /testrun/root_certs From 89f061d571552534a5bd8a518a7822bb6c894825 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:26:20 +0200 Subject: [PATCH 015/196] ci_baseline and ci_test_device_1 --- testing/docker/ci_baseline/Dockerfile | 14 +++++++++++--- testing/docker/ci_test_device1/Dockerfile | 17 ++++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/testing/docker/ci_baseline/Dockerfile b/testing/docker/ci_baseline/Dockerfile index 2af5ed46a..591412365 100644 --- a/testing/docker/ci_baseline/Dockerfile +++ b/testing/docker/ci_baseline/Dockerfile @@ -15,9 +15,17 @@ FROM ubuntu@sha256:77d57fd89366f7d16615794a5b53e124d742404e20f035c22032233f1826bd6a # Update and get all additional requirements not contained in the base image -RUN apt-get update && apt-get -y upgrade - -RUN apt-get install -y isc-dhcp-client ntpdate coreutils moreutils inetutils-ping curl jq dnsutils +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + ntpdate \ + coreutils \ + moreutils \ + inetutils-ping \ + curl \ + jq \ + dnsutils && \ + rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh diff --git a/testing/docker/ci_test_device1/Dockerfile b/testing/docker/ci_test_device1/Dockerfile index 0279df5ef..4fe0aaaea 100644 --- a/testing/docker/ci_test_device1/Dockerfile +++ b/testing/docker/ci_test_device1/Dockerfile @@ -4,9 +4,20 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive # Update and get all additional requirements not contained in the base image -RUN apt-get update && apt-get -y upgrade - -RUN apt-get update && apt-get install -y isc-dhcp-client ntpdate coreutils moreutils inetutils-ping curl jq dnsutils openssl netcat-openbsd arping +RUN apt-get update && \ + apt-get -y upgradea && \ + apt-get install -y isc-dhcp-client \ + ntpdate \ + coreutils \ + moreutils \ + inetutils-ping \ + curl \ + jq \ + dnsutils \ + openssl \ + netcat-openbsd \ + arping && \ + rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From 00e1cde735481085ea0c25acd9218f4120ccb42a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:45:01 +0200 Subject: [PATCH 016/196] device bacnet compliant --- .../docker/ci_test_device1/bacnet_compliant/Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/testing/docker/ci_test_device1/bacnet_compliant/Dockerfile b/testing/docker/ci_test_device1/bacnet_compliant/Dockerfile index f2ce5abd1..39f6b15bc 100644 --- a/testing/docker/ci_test_device1/bacnet_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/bacnet_compliant/Dockerfile @@ -6,11 +6,16 @@ ENV DEBIAN_FRONTEND=noninteractive # Install dependencies RUN apt-get update && \ - apt-get install -y isc-dhcp-client dnsutils netcat-openbsd arping python3 python3-pip && \ + apt-get install -y isc-dhcp-client \ + dnsutils \ + netcat-openbsd \ + arping \ + python3 \ + python3-pip && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Install dependencies (BAC0) -RUN pip install BAC0==23.7.3 pytz==2024.2 netifaces==0.11.0 +RUN pip install --no-cache-dir BAC0==23.7.3 pytz==2024.2 netifaces==0.11.0 # Copy scripts WORKDIR /app From 51356a1c59cedd0c81611431c8372595a8dd3d3b Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:46:46 +0200 Subject: [PATCH 017/196] dns compliant --- .../ci_test_device1/dns_compliant/Dockerfile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/testing/docker/ci_test_device1/dns_compliant/Dockerfile b/testing/docker/ci_test_device1/dns_compliant/Dockerfile index 307c922f1..f3c2079df 100644 --- a/testing/docker/ci_test_device1/dns_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/dns_compliant/Dockerfile @@ -3,14 +3,15 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive -# Update the package list and upgrade the installed packages to their latest versions -RUN apt-get update && apt-get -y upgrade - # Install the necessary packages -RUN apt-get update && apt-get install -y isc-dhcp-client dnsutils netcat-openbsd arping - -# Clean up the package lists to reduce the image size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + dnsutils \ + netcat-openbsd \ + arping && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From 977e66a3bf52550bb8c8869e03308d9db34f9a1b Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:48:31 +0200 Subject: [PATCH 018/196] dns non-compliant --- .../ci_test_device1/dns_non_compliant/Dockerfile | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/testing/docker/ci_test_device1/dns_non_compliant/Dockerfile b/testing/docker/ci_test_device1/dns_non_compliant/Dockerfile index 6cb71a960..6141e5c56 100644 --- a/testing/docker/ci_test_device1/dns_non_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/dns_non_compliant/Dockerfile @@ -3,14 +3,16 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive -# Update the package list and upgrade the installed packages to their latest versions -RUN apt-get update && apt-get -y upgrade - # Install the necessary packages -RUN apt-get update && apt-get install -y isc-dhcp-client ntp coreutils dnsutils netcat-openbsd arping - -# Clean up the package lists to reduce the image size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + ntp \ + coreutils \ + dnsutils \ + netcat-openbsd \ + arping && \ + apt-get clean && rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From 7ee58934b0444eb4454e64861bdbea33a0e63640 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 20 Jul 2026 23:54:54 +0200 Subject: [PATCH 019/196] ntp_compliant dockerfile --- .../ci_test_device1/ntp_compliant/Dockerfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/testing/docker/ci_test_device1/ntp_compliant/Dockerfile b/testing/docker/ci_test_device1/ntp_compliant/Dockerfile index c29668b3f..7f5a013c4 100644 --- a/testing/docker/ci_test_device1/ntp_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/ntp_compliant/Dockerfile @@ -3,14 +3,14 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive -# Update the package list and upgrade the installed packages to their latest versions -RUN apt-get update && apt-get -y upgrade - # Install the necessary packages -RUN apt-get update && apt-get install -y isc-dhcp-client netcat-openbsd arping ntpdate - -# Clean up the package lists to reduce the image size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + netcat-openbsd \ + arping \ + ntpdate && \ + apt-get clean && rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From 3800362662b1f218a10265e34bda2a0b84a9c51e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Tue, 21 Jul 2026 00:00:11 +0200 Subject: [PATCH 020/196] ntp_non_compliant --- .../ci_test_device1/ntp_non_compliant/Dockerfile | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/testing/docker/ci_test_device1/ntp_non_compliant/Dockerfile b/testing/docker/ci_test_device1/ntp_non_compliant/Dockerfile index 3cc8003fd..2e70d4bd0 100644 --- a/testing/docker/ci_test_device1/ntp_non_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/ntp_non_compliant/Dockerfile @@ -3,14 +3,13 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive -# Update the package list and upgrade the installed packages to their latest versions -RUN apt-get update && apt-get -y upgrade - # Install the necessary packages -RUN apt-get update && apt-get install -y isc-dhcp-client netcat-openbsd arping - -# Clean up the package lists to reduce the image size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + netcat-openbsd \ + arping && \ + apt-get clean && rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From 93ac360e88d4cde1f2850d6bd0201c8690a6ad64 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Tue, 21 Jul 2026 00:05:45 +0200 Subject: [PATCH 021/196] protocol compliant dockerfile --- .../docker/ci_test_device1/protocol_compliant/Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/testing/docker/ci_test_device1/protocol_compliant/Dockerfile b/testing/docker/ci_test_device1/protocol_compliant/Dockerfile index 46b0c51b3..833a21ea9 100644 --- a/testing/docker/ci_test_device1/protocol_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/protocol_compliant/Dockerfile @@ -6,11 +6,16 @@ ENV DEBIAN_FRONTEND=noninteractive # Install dependencies RUN apt-get update && \ - apt-get install -y isc-dhcp-client dnsutils netcat-openbsd arping python3 python3-pip && \ + apt-get install -y isc-dhcp-client \ + dnsutils \ + netcat-openbsd \ + arping \ + python3 \ + python3-pip && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Install dependencies (BAC0) -RUN pip install BAC0==23.7.3 pytz==2024.2 netifaces==0.11.0 pymodbus==3.0.0 pyserial pyserial-asyncio +RUN pip install --no-cache-dir BAC0==23.7.3 pytz==2024.2 netifaces==0.11.0 pymodbus==3.0.0 pyserial==3.5 pyserial-asyncio=0.6 # Copy scripts WORKDIR /app From bc46885c06ae37b86c82af57db8c0c21b979d44a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Tue, 21 Jul 2026 12:53:25 +0200 Subject: [PATCH 022/196] fix mistake --- testing/docker/ci_test_device1/protocol_compliant/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/docker/ci_test_device1/protocol_compliant/Dockerfile b/testing/docker/ci_test_device1/protocol_compliant/Dockerfile index 833a21ea9..80af5704d 100644 --- a/testing/docker/ci_test_device1/protocol_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/protocol_compliant/Dockerfile @@ -15,7 +15,7 @@ RUN apt-get update && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Install dependencies (BAC0) -RUN pip install --no-cache-dir BAC0==23.7.3 pytz==2024.2 netifaces==0.11.0 pymodbus==3.0.0 pyserial==3.5 pyserial-asyncio=0.6 +RUN pip install --no-cache-dir BAC0==23.7.3 pytz==2024.2 netifaces==0.11.0 pymodbus==3.0.0 pyserial==3.5 pyserial-asyncio==0.6 # Copy scripts WORKDIR /app From 561d7470fddbcd7a18e2f1fcfc1c11b029ae61ac Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Tue, 21 Jul 2026 13:19:20 +0200 Subject: [PATCH 023/196] sevices_compliant dockerfile --- .../ci_test_device1/services_compliant/Dockerfile | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/testing/docker/ci_test_device1/services_compliant/Dockerfile b/testing/docker/ci_test_device1/services_compliant/Dockerfile index 307c922f1..8e7d13000 100644 --- a/testing/docker/ci_test_device1/services_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/services_compliant/Dockerfile @@ -3,14 +3,16 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive -# Update the package list and upgrade the installed packages to their latest versions -RUN apt-get update && apt-get -y upgrade # Install the necessary packages -RUN apt-get update && apt-get install -y isc-dhcp-client dnsutils netcat-openbsd arping - -# Clean up the package lists to reduce the image size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + dnsutils \ + netcat-openbsd \ + arping && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From 97205c577538d75c7c0572ea1becaccdd2bbef33 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Tue, 21 Jul 2026 13:20:47 +0200 Subject: [PATCH 024/196] services_non_compliant dockerfile --- .../services_non_compliant/Dockerfile | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/testing/docker/ci_test_device1/services_non_compliant/Dockerfile b/testing/docker/ci_test_device1/services_non_compliant/Dockerfile index 6cb71a960..6141e5c56 100644 --- a/testing/docker/ci_test_device1/services_non_compliant/Dockerfile +++ b/testing/docker/ci_test_device1/services_non_compliant/Dockerfile @@ -3,14 +3,16 @@ FROM ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060 ENV DEBIAN_FRONTEND=noninteractive -# Update the package list and upgrade the installed packages to their latest versions -RUN apt-get update && apt-get -y upgrade - # Install the necessary packages -RUN apt-get update && apt-get install -y isc-dhcp-client ntp coreutils dnsutils netcat-openbsd arping - -# Clean up the package lists to reduce the image size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get install -y isc-dhcp-client \ + ntp \ + coreutils \ + dnsutils \ + netcat-openbsd \ + arping && \ + apt-get clean && rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /entrypoint.sh From c3b01545c3d4a9fef657d88729ca265fafc11a03 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 23 Jul 2026 19:14:18 +0200 Subject: [PATCH 025/196] enable trivy --- .github/workflows/security.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index f8e115ff1..25a90dc8c 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -62,6 +62,21 @@ jobs: recursive: true ignore: DL3007,DL3008,DL3015,DL3059 failure-threshold: warning + trivy_sca_scan: + name: Trivy SCA Security Scan + runs-on: ubuntu-24.04 + steps: + - name: Checkout source + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Run Trivy in Filesystem mode + uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 #0.36.0 + with: + scan-type: 'fs' + scan-ref: '.' + format: 'table' + exit-code: '1' + ignore-unfixed: true + severity: 'CRITICAL,HIGH' From d4ebc7eb822f790f143771ab725587d66b3a7daf Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 23 Jul 2026 11:29:11 +0200 Subject: [PATCH 026/196] update cryptograpy to 49.0.0 --- framework/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/requirements.txt b/framework/requirements.txt index 032823769..ebc4e76aa 100644 --- a/framework/requirements.txt +++ b/framework/requirements.txt @@ -28,7 +28,7 @@ responses==0.25.3 markdown==3.5.2 # Requirements for the session -cryptography==46.0.6 +cryptography==49.0.0 pytz==2024.1 # Requirements for the risk profile From c0e67dd9e88c9cdc8f7e45944c06727afc2c0fc8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 23 Jul 2026 14:44:44 +0200 Subject: [PATCH 027/196] update python-multipart --- framework/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/requirements.txt b/framework/requirements.txt index ebc4e76aa..6beedb9c2 100644 --- a/framework/requirements.txt +++ b/framework/requirements.txt @@ -15,7 +15,7 @@ pydyf==0.11.0 fastapi==0.115.0 psutil==5.9.8 uvicorn==0.27.0 -python-multipart==0.0.22 +python-multipart==0.0.32 pydantic==2.10.0 # Requirements for testing From 1394071a16a9ac74d8c0967126ceb97828980152 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 23 Jul 2026 15:30:17 +0200 Subject: [PATCH 028/196] update brace-expansion --- modules/ui/package-lock.json | 2015 ++++++++-------------------------- 1 file changed, 462 insertions(+), 1553 deletions(-) diff --git a/modules/ui/package-lock.json b/modules/ui/package-lock.json index e7c1a8ee2..0b42198fe 100644 --- a/modules/ui/package-lock.json +++ b/modules/ui/package-lock.json @@ -62,7 +62,6 @@ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.14.1.tgz", "integrity": "sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -78,7 +77,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.48.1.tgz", "integrity": "sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -94,7 +92,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.48.1.tgz", "integrity": "sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -110,7 +107,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.48.1.tgz", "integrity": "sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14.0.0" } @@ -120,7 +116,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.48.1.tgz", "integrity": "sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -136,7 +131,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.48.1.tgz", "integrity": "sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -152,7 +146,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.48.1.tgz", "integrity": "sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -168,7 +161,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.48.1.tgz", "integrity": "sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -184,7 +176,6 @@ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.48.1.tgz", "integrity": "sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -200,7 +191,6 @@ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.48.1.tgz", "integrity": "sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -216,7 +206,6 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.48.1.tgz", "integrity": "sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -232,7 +221,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.48.1.tgz", "integrity": "sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1" }, @@ -245,7 +233,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.48.1.tgz", "integrity": "sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1" }, @@ -258,7 +245,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.48.1.tgz", "integrity": "sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1" }, @@ -271,7 +257,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -281,13 +266,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2102.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.18.tgz", - "integrity": "sha512-bEkF4ApWa6FJ2+ZyFPdhQr05PgJv/oKwx+3goNRa4lSxzJO+O3KXr0ivTyE5zEJ8l4JdV3h93bsCP54Rk3v7Dw==", + "version": "0.2102.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.19.tgz", + "integrity": "sha512-cj4tzUMiloLTg5rNf17E8MsvIxCWYoBiBsaj7ns6dgXqT9XCeG+J0TA2t1M+N9uuqfeLd22U/rYoCkADmcircQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.18", + "@angular-devkit/core": "21.2.19", "rxjs": "7.8.2" }, "bin": { @@ -300,11 +284,10 @@ } }, "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.18.tgz", - "integrity": "sha512-783AuDmzAjFkOBHey7cx1mXd8CTiMg9LvG+BCxEp8i4EB7cOGYrq3lBzkwhKJq6yYpz7dNgM1QgeLk+NcrFBSA==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", + "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -327,46 +310,11 @@ } } }, - "node_modules/@angular-devkit/architect/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@angular-devkit/architect/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/architect/node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">= 12" } @@ -376,7 +324,6 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.27.tgz", "integrity": "sha512-3amNzoCVSKd7ah6l6lBQL4onwwJvqvam7FMoQBILrxtW5LB5ezh8gMSPuA4zJjKjoRzf9uoWdlzqv/84I52xZA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ajv": "8.18.0", @@ -405,7 +352,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.1.0" @@ -416,7 +362,6 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.27.tgz", "integrity": "sha512-/PZmyAlb2NGWPikRRuiWLdfHQd8Wrx6lX4HqvTcaDhlU43M3T0ud4PH2T3QDp7BzHYY92xtD8iPxX2asg67G1A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@angular-devkit/core": "19.2.27", @@ -436,7 +381,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.1.0" @@ -447,7 +391,6 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.0.0-alpha.4.tgz", "integrity": "sha512-iSDl0Hs2fkJJH0aR/RQ80nmickY7o1xv+mucSw/Gy4YwFDJFU0FiV++1OxhjturuEXt3k+TJ115xe4DJa86BMw==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" @@ -457,15 +400,13 @@ "version": "19.0.0-alpha.4", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.0-alpha.4.tgz", "integrity": "sha512-SS2FHqRaGslJzI+cTBNDC7xg/Zx5c0iIXZnpwGa8VjJ/8L82+PlRS+d9CTBhb8tMsR06ifUTK9ym2JQ3VmE2Cg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { "version": "19.0.0-alpha.4", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.0-alpha.4.tgz", "integrity": "sha512-IhBeiUohYLsnUrSJ92riSrhfIkGefuXIrGTgBnagn887WFR45/Go5dIIivVfMGdvTg849dtLpBDXZrycHY3QFA==", "dev": true, - "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4", "@angular-eslint/utils": "19.0.0-alpha.4" @@ -481,7 +422,6 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.0-alpha.4.tgz", "integrity": "sha512-YiFB+tyTZ/mj/w/5DLJHl9J1ABGaHNhGdXJzagI0ufqyrePR0wTYMIyJpIGWOMHr9E5nYPsVuHn+d08dG1R0aQ==", "dev": true, - "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4", "@angular-eslint/utils": "19.0.0-alpha.4", @@ -500,7 +440,6 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.0.0-alpha.4.tgz", "integrity": "sha512-Xv8g2PbNqhm7igTnY3uuY511Fr+FVRBHG+ZHbcUPZT7YDBaFZRJezAzbbPLZ6GdqqhoQJPHdGuEvo22yKhKXag==", "dev": true, - "license": "MIT", "dependencies": { "@angular-eslint/eslint-plugin": "19.0.0-alpha.4", "@angular-eslint/eslint-plugin-template": "19.0.0-alpha.4", @@ -518,7 +457,6 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.0-alpha.4.tgz", "integrity": "sha512-Mvy1kbnqoYBQFFpQtmBB/TkhmmoN97ruSv9xa3mpKzv8JlDdVCkIn7IdqLtzcLwGr+MGcPC7GFPl8o7q12N3BQ==", "dev": true, - "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4", "eslint-scope": "^8.0.2" @@ -533,7 +471,6 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.0-alpha.4.tgz", "integrity": "sha512-6Pxqs3QqSPBcAkP8I/GYijoPoAmqOYqyQvJGvBWd1oKlA3EqmXSi7uaSUa6nUI6BiA8JEJZTBaSOP6O2oyK25Q==", "dev": true, - "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4" }, @@ -544,11 +481,10 @@ } }, "node_modules/@angular/animations": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.17.tgz", - "integrity": "sha512-zOW8FFa9qfbVkZ5TulxDkl1C3+gEjWfAAD5Z2MycA6pjVJQlLYPiTAGq+flOQ3yZfTT0z6kd5rejQMXWI81Dvg==", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.18.tgz", + "integrity": "sha512-zN++Qb4Oz4x/5LYHuW9FItm7aHsV4HBz518GT25QusMvGymh+4io2TWhPYB0C9jx+g5q8GeQLd3c8r42yLrRxw==", "deprecated": "@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -556,18 +492,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.17" + "@angular/core": "21.2.18" } }, "node_modules/@angular/build": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.18.tgz", - "integrity": "sha512-9Jic0Dud6d0ULPR5SceHV86AzZE42cNWPsbLKrK1dUneaAC44GSVRTmLXcaSX/5Exa3gGjFANQw4qashgxUekQ==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.19.tgz", + "integrity": "sha512-emy9mqrTXAwhZzcvx8MaHyz+cUR06PVGxnqy91+bpDxPP9S5x67sPoOkY9y/ETFFhRpB5ULlUxyq0eN/pi6QOg==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.18", + "@angular-devkit/architect": "0.2102.19", "@babel/core": "7.29.7", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -610,7 +545,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.18", + "@angular/ssr": "^21.2.19", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", @@ -664,7 +599,6 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -674,7 +608,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -686,7 +619,6 @@ "version": "21.2.14", "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.14.tgz", "integrity": "sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ==", - "license": "MIT", "dependencies": { "parse5": "^8.0.0", "tslib": "^2.3.0" @@ -699,19 +631,18 @@ } }, "node_modules/@angular/cli": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.18.tgz", - "integrity": "sha512-WOZF4p0SnrmBpNeiOA2pdp9OBvGnOSLWbGdRLXJykyseIiEn7+N+GZp+ZA1aNZB4SWolpYCZfTYwkpo6Sf/LXg==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.19.tgz", + "integrity": "sha512-i78NzvoNonAY17QgzSmqrYnXHmEfraLv4wZ/o/m3efxuz61ZJ+5X/PsCeAhbwBvQfRrPRQaJV2tK9vGjHa+U6w==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2102.18", - "@angular-devkit/core": "21.2.18", - "@angular-devkit/schematics": "21.2.18", + "@angular-devkit/architect": "0.2102.19", + "@angular-devkit/core": "21.2.19", + "@angular-devkit/schematics": "21.2.19", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.2.18", + "@schematics/angular": "21.2.19", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.48.1", "ini": "6.0.0", @@ -734,11 +665,10 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.18.tgz", - "integrity": "sha512-783AuDmzAjFkOBHey7cx1mXd8CTiMg9LvG+BCxEp8i4EB7cOGYrq3lBzkwhKJq6yYpz7dNgM1QgeLk+NcrFBSA==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", + "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -762,13 +692,12 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.18.tgz", - "integrity": "sha512-PakHs+Eefx06KORDFyH4wmkIZ/wm4mI4DqhXe4XFuWJOazMQoYJxPmMeby47BD0HhvJN7BskN61CPS8HCAvICg==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.19.tgz", + "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.18", + "@angular-devkit/core": "21.2.19", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.3.0", @@ -785,7 +714,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -793,30 +721,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@angular/cli/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular/cli/node_modules/cli-spinners": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.20" }, @@ -829,7 +738,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -842,7 +750,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -855,7 +762,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, - "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" @@ -872,7 +778,6 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -882,7 +787,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", @@ -900,28 +804,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular/cli/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -934,16 +821,14 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">= 12" } }, "node_modules/@angular/common": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.17.tgz", - "integrity": "sha512-hqAQxRfi5ldFE42suAXRcY+JCANrUh7fuSQ/DtZ7L896id5BT/exuv6dWNBC1PyAfQmRbpD5Pt6/pd+tNLyhDQ==", - "license": "MIT", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.18.tgz", + "integrity": "sha512-gZugZ8gX/KkACIZ3/ekoImLu5z8a0Iu9O5b84kh8e+++VUjmkmd19IygBsq/8/fF3vKf0UcIKcx3P6A/gb2DJw==", "dependencies": { "tslib": "^2.3.0" }, @@ -951,15 +836,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.17", + "@angular/core": "21.2.18", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.17.tgz", - "integrity": "sha512-p+NdjYiwAz9Zmu2yul0LlMXaFjMISVVa24+/MVMoKFeQeI82QE8jDywPlnOSHQHvdCcQVpS7saeEriZzX3JuBQ==", - "license": "MIT", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.18.tgz", + "integrity": "sha512-ccnDuKLuzIa0ayijR+alarsHNWIksuGV/lxGTZ0t6/0+B6J/RXupz6M2IO6ZHHEcg8r7pcrLCUBTyp3FoiRJrg==", "dependencies": { "tslib": "^2.3.0" }, @@ -968,13 +852,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.17.tgz", - "integrity": "sha512-KithZ3b0HBFH0NbUcswBcjpN9y09vLbarMD7qmGWTnGUBk4W8cn4sbT8zJyv9CRKg9ZcuUBeJYKUfUPn/u/5OQ==", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.18.tgz", + "integrity": "sha512-L5zbIp7YfTTB4I4xT33FgEBanzhppNejzZX0HJOEqKDyDL2jXq+flt83lE0XVuRJ6/zrG+UKj0B+y/CK6Ro7Wg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/core": "7.29.0", + "@babel/core": "7.29.7", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^5.0.0", "convert-source-map": "^1.5.1", @@ -991,7 +874,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.17", + "@angular/compiler": "21.2.18", "typescript": ">=5.9 <6.1" }, "peerDependenciesMeta": { @@ -1000,89 +883,10 @@ } } }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular/compiler-cli/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@angular/compiler-cli/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular/core": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.17.tgz", - "integrity": "sha512-wYHpwIdnUnjQFOJJNqRcGx7LS3u64jT+R9L0TnMR/ViBM9dQgGYImlSikkftg2yrFCNo5aKRxhG2LLskQurVdg==", - "license": "MIT", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.18.tgz", + "integrity": "sha512-AG4bb6GU0+qp+vVBjc/IhSPjgcRX8QsCb8jzN8dDyhnjsyuuG/LlIiU0l6n65BI9SGKE9m6TfsJ1ObkkAiE5KQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1090,7 +894,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.17", + "@angular/compiler": "21.2.18", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -1104,10 +908,9 @@ } }, "node_modules/@angular/forms": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.17.tgz", - "integrity": "sha512-WKu8XeRSNZo+a+aDDZ3M5OtReF7KYqR/PmZ2l1lSf6N5EEAmc+Ky4aqbRhTL/mTSfHrO4+TDJ4C5A2tFmuwIeA==", - "license": "MIT", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.18.tgz", + "integrity": "sha512-TrRuiNjIzrrNtQgpJVH5gultQrvBlawa+tTzIpxBfIqLpkHrTPZLtYu118EUk6jhWzgRhKYUorInjJe+sSxC+w==", "dependencies": { "@standard-schema/spec": "^1.0.0", "tslib": "^2.3.0" @@ -1116,9 +919,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.17", - "@angular/core": "21.2.17", - "@angular/platform-browser": "21.2.17", + "@angular/common": "21.2.18", + "@angular/core": "21.2.18", + "@angular/platform-browser": "21.2.18", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1126,7 +929,6 @@ "version": "21.2.14", "resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.14.tgz", "integrity": "sha512-fMQca8VRtei93JRRG9qQ+u08DCb0nga59Esoakq5yx3+A1NfdpFeUS1tBns56U04o8KAaIAwZK3NBqXz8ZKNqg==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1140,10 +942,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.17.tgz", - "integrity": "sha512-ROdSliejY37g1EphYmweYdm5cHM8HY3X4tbWt4ubxmhTyYgfN3nxrxfGQ/n7Mz5tDY9VXVLIGDgjLOGYOo4uTQ==", - "license": "MIT", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.18.tgz", + "integrity": "sha512-zltF+3HrlgtZbYg8U98LhG0dyGm1aHT3Px8//9wjqi/TUY8UlHsYKByL197QtVWDBjf/dekzXdz5c+iyVtanLQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1151,9 +952,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "21.2.17", - "@angular/common": "21.2.17", - "@angular/core": "21.2.17" + "@angular/animations": "21.2.18", + "@angular/common": "21.2.18", + "@angular/core": "21.2.18" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1162,11 +963,10 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.17.tgz", - "integrity": "sha512-r/BU/T8bOTghP3fIXhzYf5wcMcAmhWnAFv3p4asCCPXomaktoas70wYcMaDH+pK1LAFBxLwzBWHm36MpFlTMFg==", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.18.tgz", + "integrity": "sha512-doTDss6GhDTGjVuuANlzFrdYKBqHQVlWgy2tiTjy9EbrmMTOOHg0D6yUQXh1ZqmUWKDZ3owkUjUNGiXt92rQ6w==", "deprecated": "@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1174,17 +974,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.17", - "@angular/compiler": "21.2.17", - "@angular/core": "21.2.17", - "@angular/platform-browser": "21.2.17" + "@angular/common": "21.2.18", + "@angular/compiler": "21.2.18", + "@angular/core": "21.2.18", + "@angular/platform-browser": "21.2.18" } }, "node_modules/@angular/router": { - "version": "21.2.17", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.17.tgz", - "integrity": "sha512-RSCtK5ppAV6y6wfRLHSK2a9Wc/vm8j0wsC+/j9PH9yQmppWFVXDWsg5E39MKOIpnoYVx2+hI6eak6+wYtZTe1A==", - "license": "MIT", + "version": "21.2.18", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.18.tgz", + "integrity": "sha512-Xix19uG1YthC8IslhWKSfPdhscVWREBGVJZW2OnRmLef8F7DvhF49S6vOywaBo+Uahe0egkmgWDNpEwxAzsgLw==", "dependencies": { "tslib": "^2.3.0" }, @@ -1192,9 +991,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.17", - "@angular/core": "21.2.17", - "@angular/platform-browser": "21.2.17", + "@angular/common": "21.2.18", + "@angular/core": "21.2.18", + "@angular/platform-browser": "21.2.18", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1203,7 +1002,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", @@ -1218,7 +1016,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1228,7 +1025,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1258,15 +1054,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1276,7 +1070,6 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", @@ -1293,7 +1086,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" }, @@ -1306,7 +1098,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", @@ -1323,7 +1114,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1333,7 +1123,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1343,7 +1132,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" @@ -1357,7 +1145,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", @@ -1375,7 +1162,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -1388,7 +1174,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1398,7 +1183,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1408,7 +1192,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1418,7 +1201,6 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" @@ -1432,7 +1214,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -1448,7 +1229,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1461,7 +1241,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1476,7 +1255,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -1485,15 +1263,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -1503,7 +1279,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -1513,7 +1288,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -1526,7 +1300,6 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.29.7" }, @@ -1542,7 +1315,6 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", @@ -1557,7 +1329,6 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1576,7 +1347,6 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" @@ -1590,7 +1360,6 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.1.90" } @@ -1600,7 +1369,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1613,7 +1381,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1625,7 +1392,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1640,7 +1406,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" @@ -1657,7 +1422,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1674,7 +1438,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1691,7 +1454,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -1708,7 +1470,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1725,7 +1486,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1742,7 +1502,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1759,7 +1518,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1776,7 +1534,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1793,7 +1550,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1810,7 +1566,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1827,7 +1582,6 @@ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1844,7 +1598,6 @@ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1861,7 +1614,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1878,7 +1630,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1895,7 +1646,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1912,7 +1662,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -1929,7 +1678,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1946,7 +1694,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1963,7 +1710,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1980,7 +1726,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1997,7 +1742,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -2014,7 +1758,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" @@ -2031,7 +1774,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2048,7 +1790,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2065,7 +1806,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2075,11 +1815,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2098,7 +1837,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2108,7 +1846,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2132,7 +1869,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2148,15 +1884,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2167,7 +1901,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -2176,15 +1909,13 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2197,7 +1928,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2207,7 +1937,6 @@ "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", "dev": true, - "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -2217,7 +1946,6 @@ "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", "dev": true, - "license": "Apache-2.0", "optional": true }, "node_modules/@hono/node-server": { @@ -2225,7 +1953,6 @@ "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.14.1" }, @@ -2239,7 +1966,6 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -2253,15 +1979,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2272,7 +1996,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2285,7 +2008,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2299,15 +2021,13 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } @@ -2317,7 +2037,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2342,7 +2061,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2364,7 +2082,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", @@ -2392,7 +2109,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", @@ -2415,7 +2131,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2438,7 +2153,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, - "license": "MIT", "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" @@ -2460,7 +2174,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } @@ -2470,7 +2183,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2492,7 +2204,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2514,7 +2225,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2537,7 +2247,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", @@ -2567,7 +2276,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2590,7 +2298,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", @@ -2614,7 +2321,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2639,7 +2345,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -2657,7 +2362,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -2670,7 +2374,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2680,7 +2383,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -2691,7 +2393,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -2702,7 +2403,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2711,15 +2411,13 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2730,7 +2428,6 @@ "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", "dev": true, - "license": "MIT", "dependencies": { "@inquirer/type": "^3.0.8" }, @@ -2750,7 +2447,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2764,7 +2460,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2778,7 +2473,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2792,7 +2486,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2806,7 +2499,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2820,7 +2512,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2834,7 +2525,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2845,7 +2535,6 @@ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", "dev": true, - "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", @@ -2889,7 +2578,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2903,7 +2591,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2917,7 +2604,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2931,7 +2617,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2945,7 +2630,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2959,7 +2643,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2970,7 +2653,6 @@ "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -3007,7 +2689,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -3024,7 +2705,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -3041,7 +2721,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3058,7 +2737,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3075,7 +2753,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3092,7 +2769,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3109,7 +2785,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3126,7 +2801,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3143,7 +2817,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3160,7 +2833,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3177,7 +2849,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3194,7 +2865,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3211,7 +2881,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3228,7 +2897,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -3245,7 +2913,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3262,7 +2929,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3279,7 +2945,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3293,7 +2958,6 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" @@ -3311,7 +2975,6 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/@ngrx/component-store/-/component-store-21.0.1.tgz", "integrity": "sha512-aOfudK8MqCZQUuBjMnXAXRxRcr9Qu/+9/2iIh4aLhmGXC5JCpkDi1a82A/39EUFZy2xBbI4lPI7P817b1PQRvQ==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3324,7 +2987,6 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-21.0.1.tgz", "integrity": "sha512-hSdpToAiSYa5FJ/CAygQHpnCaF2S1HO7q/57ob3XvNTWmkofa0VqI/IIe4W57bojh2YOWCJ91SCn3kAjymaV3g==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3338,7 +3000,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/@ngrx/operators/-/operators-21.1.1.tgz", "integrity": "sha512-2ChT1rVi6w8xHrmIAqRFuvY7YLAJiH7idfmbimjOYHzJ7pgaz0+4WVqyCp9pv2UiDEXuvpUOvs3afgS5m1LDNQ==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3350,7 +3011,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/@ngrx/signals/-/signals-21.1.1.tgz", "integrity": "sha512-AXxsvO39cJ4gu2GMvLyUHwx+3qHi35Bn7OUqyIfJW0fffi/Af7ML6h0MPMWDHVROo55FBgxzJrYRswwzdew9VA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3368,7 +3028,6 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-21.0.1.tgz", "integrity": "sha512-2hGnw/c5o8nmKzyx7TrUUM7FXjE2zqjX0EF+wLbw9Oy/L+VdCmx+ZI1BFjuAR4B8PKEWHG2KSbOM13SMNkpZiA==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3382,7 +3041,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3396,7 +3054,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -3406,7 +3063,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3420,7 +3076,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", "dev": true, - "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -3433,11 +3088,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -3447,7 +3101,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "dev": true, - "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -3460,7 +3113,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "dev": true, - "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", @@ -3480,17 +3132,15 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -3500,7 +3150,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, @@ -3516,7 +3165,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "dev": true, - "license": "ISC", "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" @@ -3533,7 +3181,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -3543,7 +3190,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", @@ -3562,7 +3208,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", @@ -3580,7 +3225,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "dev": true, - "license": "ISC", "dependencies": { "which": "^6.0.0" }, @@ -3593,7 +3237,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } @@ -3603,7 +3246,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, @@ -3619,7 +3261,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -3629,7 +3270,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", @@ -3646,24 +3286,22 @@ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.113.0.tgz", "integrity": "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">= 10.0.0" @@ -3673,30 +3311,28 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -3710,14 +3346,13 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3731,14 +3366,13 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3752,14 +3386,13 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3773,14 +3406,13 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3794,14 +3426,13 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3815,14 +3446,13 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3836,14 +3466,13 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3857,14 +3486,13 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3878,14 +3506,13 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -3899,35 +3526,13 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3941,14 +3546,13 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3966,7 +3570,6 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/@pkgr/core": { @@ -3974,7 +3577,6 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, - "license": "MIT", "engines": { "node": "^14.18.0 || >=16.0.0" }, @@ -3990,7 +3592,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -4007,7 +3608,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4024,7 +3624,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4041,7 +3640,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4058,7 +3656,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4075,7 +3672,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4092,7 +3688,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4109,7 +3704,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4126,7 +3720,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4143,7 +3736,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -4160,7 +3752,6 @@ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" @@ -4177,7 +3768,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4194,7 +3784,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4207,8 +3796,7 @@ "version": "1.0.0-rc.4", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.4.tgz", "integrity": "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.62.2", @@ -4218,7 +3806,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -4232,7 +3819,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -4246,7 +3832,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4260,7 +3845,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4274,7 +3858,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4288,7 +3871,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4302,7 +3884,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4316,7 +3897,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4330,7 +3910,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4344,7 +3923,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4358,7 +3936,6 @@ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4372,7 +3949,6 @@ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4386,7 +3962,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4400,7 +3975,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4414,7 +3988,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4428,7 +4001,6 @@ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4442,7 +4014,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4456,7 +4027,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4470,7 +4040,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -4484,7 +4053,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -4498,7 +4066,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -4512,7 +4079,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4526,7 +4092,6 @@ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4540,7 +4105,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4554,21 +4118,19 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@schematics/angular": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.18.tgz", - "integrity": "sha512-XNEWvJSUg/ljLXgGVs7picBOtzVC4abBf2+i/ds9E7GaYYVyH19Mpgk6BOuMHAgRpjPWBAeWiBkTqetiR2Ps5Q==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.19.tgz", + "integrity": "sha512-eL+UU9eizoadhDB4YEctRmmo0A5iwrSmGzeuEa6akrq8nLGVWM8zO91HTJutkPqGQjelF+UOiOShsQSZAU9SIQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.18", - "@angular-devkit/schematics": "21.2.18", + "@angular-devkit/core": "21.2.19", + "@angular-devkit/schematics": "21.2.19", "jsonc-parser": "3.3.1" }, "engines": { @@ -4578,11 +4140,10 @@ } }, "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.18.tgz", - "integrity": "sha512-783AuDmzAjFkOBHey7cx1mXd8CTiMg9LvG+BCxEp8i4EB7cOGYrq3lBzkwhKJq6yYpz7dNgM1QgeLk+NcrFBSA==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", + "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -4606,13 +4167,12 @@ } }, "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { - "version": "21.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.18.tgz", - "integrity": "sha512-PakHs+Eefx06KORDFyH4wmkIZ/wm4mI4DqhXe4XFuWJOazMQoYJxPmMeby47BD0HhvJN7BskN61CPS8HCAvICg==", + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.19.tgz", + "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.18", + "@angular-devkit/core": "21.2.19", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.3.0", @@ -4629,7 +4189,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -4637,30 +4196,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@schematics/angular/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@schematics/angular/node_modules/cli-spinners": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.20" }, @@ -4673,7 +4213,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -4686,7 +4225,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -4699,7 +4237,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, - "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" @@ -4716,7 +4253,6 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -4726,7 +4262,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", @@ -4744,28 +4279,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@schematics/angular/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@schematics/angular/node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">= 12" } @@ -4775,7 +4293,6 @@ "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" }, @@ -4788,7 +4305,6 @@ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz", "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -4798,7 +4314,6 @@ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -4808,7 +4323,6 @@ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", @@ -4826,7 +4340,6 @@ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" @@ -4840,7 +4353,6 @@ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz", "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", @@ -4854,21 +4366,18 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, - "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -4878,7 +4387,6 @@ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "dev": true, - "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" @@ -4892,7 +4400,6 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -4903,7 +4410,6 @@ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4912,36 +4418,31 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/jasmine": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.6.tgz", "integrity": "sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.0.tgz", - "integrity": "sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==", + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", + "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~8.3.0" } @@ -4951,23 +4452,21 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.63.0.tgz", - "integrity": "sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.63.0", - "@typescript-eslint/type-utils": "8.63.0", - "@typescript-eslint/utils": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -4980,17 +4479,16 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.63.0", + "@typescript-eslint/parser": "^8.65.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -5000,7 +4498,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.3", "@typescript-eslint/types": "3.10.1", @@ -5024,7 +4521,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "dev": true, - "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -5038,7 +4534,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "3.10.1", "@typescript-eslint/visitor-keys": "3.10.1", @@ -5067,7 +4562,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -5084,7 +4578,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5098,7 +4591,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -5108,22 +4600,20 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.63.0.tgz", - "integrity": "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.63.0", - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3" }, "engines": { @@ -5139,14 +4629,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.63.0.tgz", - "integrity": "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.63.0", - "@typescript-eslint/types": "^8.63.0", + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", "debug": "^4.4.3" }, "engines": { @@ -5161,14 +4650,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.63.0.tgz", - "integrity": "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0" + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5179,11 +4667,10 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.63.0.tgz", - "integrity": "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5196,15 +4683,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.63.0.tgz", - "integrity": "sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0", - "@typescript-eslint/utils": "8.63.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -5221,11 +4707,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.63.0.tgz", - "integrity": "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5235,16 +4720,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.63.0.tgz", - "integrity": "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.63.0", - "@typescript-eslint/tsconfig-utils": "8.63.0", - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/visitor-keys": "8.63.0", + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -5267,7 +4751,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5276,16 +4759,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.63.0.tgz", - "integrity": "sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.63.0", - "@typescript-eslint/types": "8.63.0", - "@typescript-eslint/typescript-estree": "8.63.0" + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5300,13 +4782,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.63.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.63.0.tgz", - "integrity": "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/types": "8.65.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -5322,7 +4803,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, @@ -5331,18 +4811,16 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", - "dev": true, - "license": "ISC" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "dev": true }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz", "integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, @@ -5354,15 +4832,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/abbrev": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -5372,7 +4848,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -5386,7 +4861,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5399,7 +4873,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -5409,7 +4882,6 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14" } @@ -5419,7 +4891,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5436,7 +4907,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -5454,7 +4924,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.48.1.tgz", "integrity": "sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==", "dev": true, - "license": "MIT", "dependencies": { "@algolia/abtesting": "1.14.1", "@algolia/client-abtesting": "5.48.1", @@ -5480,7 +4949,6 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5490,7 +4958,6 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, - "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -5506,7 +4973,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5516,7 +4982,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5532,7 +4997,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5546,7 +5010,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5558,15 +5021,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -5576,7 +5037,6 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5586,7 +5046,6 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -5596,7 +5055,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT", "engines": { "node": "18 || 20 || >=22" } @@ -5618,25 +5076,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.42", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", - "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.1.tgz", + "integrity": "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A==", "dev": true, - "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" }, @@ -5649,7 +5104,6 @@ "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.4.1.tgz", "integrity": "sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "css-select": "^6.0.0", "css-what": "^7.0.0", @@ -5670,7 +5124,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -5682,7 +5135,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5694,7 +5146,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^2.0.0", @@ -5719,7 +5170,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -5732,20 +5182,18 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -5753,7 +5201,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -5762,9 +5209,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", - "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -5780,12 +5227,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001800", - "electron-to-chromium": "^1.5.387", - "node-releases": "^2.0.50", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -5813,7 +5259,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5822,15 +5267,13 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5840,7 +5283,6 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", @@ -5862,7 +5304,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", @@ -5876,11 +5317,10 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -5890,7 +5330,6 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -5904,7 +5343,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -5921,15 +5359,14 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001803", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", - "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -5944,15 +5381,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5968,20 +5403,18 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, - "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -5992,7 +5425,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -6002,7 +5434,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" }, @@ -6018,7 +5449,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -6032,7 +5462,6 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^8.0.0", "string-width": "^8.2.0" @@ -6049,7 +5478,6 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, - "license": "ISC", "engines": { "node": ">= 12" } @@ -6059,7 +5487,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -6074,7 +5501,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -6087,7 +5513,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -6100,7 +5525,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -6118,7 +5542,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -6134,7 +5557,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -6152,7 +5574,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.8" @@ -6163,7 +5584,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6175,21 +5595,18 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/commist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", - "license": "MIT", "dependencies": { "leven": "^2.1.0", "minimist": "^1.1.0" @@ -6200,7 +5617,6 @@ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -6208,8 +5624,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "2.0.0", @@ -6218,7 +5633,6 @@ "engines": [ "node >= 6.0" ], - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -6231,7 +5645,6 @@ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -6247,7 +5660,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6257,7 +5669,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6267,7 +5678,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -6285,15 +5695,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -6306,7 +5714,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6316,7 +5723,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6330,7 +5736,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6339,15 +5744,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6357,7 +5760,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.6.0" } @@ -6367,7 +5769,6 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dev": true, - "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -6385,7 +5786,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6400,7 +5800,6 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", @@ -6417,7 +5816,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6429,15 +5827,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0" } @@ -6446,7 +5842,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -6463,15 +5858,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "clone": "^1.0.2" @@ -6485,7 +5878,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6495,7 +5887,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6506,7 +5897,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -6516,22 +5906,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6544,7 +5931,6 @@ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, - "license": "MIT", "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", @@ -6557,7 +5943,6 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -6577,15 +5962,13 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -6601,7 +5984,6 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -6616,7 +5998,6 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -6630,7 +6011,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -6642,29 +6022,25 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.388", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.388.tgz", - "integrity": "sha512-Pl/aJaqOOxYxda3vcx1IKSJimwYXHDkEnGn0F+kG2EE68dDtx2uCinaS+Vih8Z91B9t8CSAbiF/HKyWcnXjhzw==", - "dev": true, - "license": "ISC" + "version": "1.5.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", + "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", + "dev": true }, "node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6673,7 +6049,6 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -6683,7 +6058,6 @@ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.9.tgz", "integrity": "sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==", "dev": true, - "license": "MIT", "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", @@ -6705,7 +6079,6 @@ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -6715,7 +6088,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6729,7 +6101,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6739,7 +6110,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6752,17 +6122,15 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6784,7 +6152,6 @@ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -6798,7 +6165,6 @@ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6814,7 +6180,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -6827,7 +6192,6 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -6837,7 +6201,6 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6850,7 +6213,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6860,7 +6222,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6870,7 +6231,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -6884,7 +6244,6 @@ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6925,7 +6284,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -6934,15 +6292,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6956,7 +6312,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7012,7 +6367,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -7025,7 +6379,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.13" @@ -7056,7 +6409,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7073,7 +6425,6 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -7089,7 +6440,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -7099,7 +6449,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7112,7 +6461,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7128,15 +6476,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7147,7 +6493,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7164,7 +6509,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -7173,15 +6517,13 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7194,7 +6536,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -7212,7 +6553,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7226,7 +6566,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -7239,7 +6578,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7252,7 +6590,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -7262,7 +6599,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -7272,7 +6608,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7281,15 +6616,13 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "dev": true, - "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" }, @@ -7302,7 +6635,6 @@ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.0.0" } @@ -7311,15 +6643,13 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -7359,12 +6689,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.0.tgz", + "integrity": "sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==", "dev": true, - "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -7381,41 +6711,36 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "dev": true, "funding": [ { @@ -7426,15 +6751,13 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -7444,7 +6767,6 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -7462,7 +6784,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -7475,7 +6796,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7488,7 +6808,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -7510,7 +6829,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7527,7 +6845,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -7538,11 +6855,10 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.16.0", @@ -7555,7 +6871,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7570,7 +6885,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7580,7 +6894,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7590,7 +6903,6 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -7605,7 +6917,6 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -7616,8 +6927,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -7625,7 +6935,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -7639,7 +6948,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7648,15 +6956,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -7666,7 +6972,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7676,7 +6981,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -7689,7 +6993,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -7714,7 +7017,6 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -7728,7 +7030,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "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", - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7749,7 +7050,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7761,20 +7061,17 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/glob/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "license": "MIT", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7784,7 +7081,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7797,7 +7093,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -7813,7 +7108,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7825,22 +7119,19 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -7853,7 +7144,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7863,7 +7153,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7873,7 +7162,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7886,7 +7174,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -7902,7 +7189,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7914,18 +7200,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", - "license": "MIT", "dependencies": { "glob": "^7.1.6", "readable-stream": "^3.6.0" } }, "node_modules/hono": { - "version": "4.12.28", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.28.tgz", - "integrity": "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA==", + "version": "4.12.31", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.31.tgz", + "integrity": "sha512-zJIHFrl6bq3RDd2YusFNCDlM8qUprxKswyi/OPzPyzKDdyBXDqWx8bZlZ7R+saTdSTatUmb3O7K4SspGPaEOQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=16.9.0" } @@ -7935,7 +7219,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" }, @@ -7944,11 +7227,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -7957,8 +7239,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/htmlparser2": { "version": "10.1.0", @@ -7972,7 +7253,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -7985,7 +7265,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -7997,15 +7276,13 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "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==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -8026,7 +7303,6 @@ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8041,7 +7317,6 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -8055,7 +7330,6 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -8069,7 +7343,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8098,15 +7371,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -8116,7 +7387,6 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, - "license": "ISC", "dependencies": { "minimatch": "^10.0.3" }, @@ -8128,15 +7398,13 @@ "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8153,7 +7421,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -8163,7 +7430,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8173,7 +7439,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8182,15 +7447,13 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -8200,7 +7463,6 @@ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12" } @@ -8210,7 +7472,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -8220,7 +7481,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -8233,7 +7493,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8243,7 +7502,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, - "license": "MIT", "dependencies": { "get-east-asian-width": "^1.3.1" }, @@ -8259,7 +7517,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8272,7 +7529,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -8283,7 +7539,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -8293,7 +7548,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8302,15 +7556,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -8329,7 +7581,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -8343,7 +7594,6 @@ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -8355,15 +7605,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -8373,7 +7621,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -8390,7 +7637,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -8405,7 +7651,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -8420,7 +7665,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -8430,7 +7674,6 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -8443,15 +7686,13 @@ "version": "4.6.1", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz", + "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -8460,7 +7701,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -8470,8 +7710,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-yaml": { "version": "4.3.0", @@ -8488,7 +7727,6 @@ "url": "https://github.com/sponsors/nodeca" } ], - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -8501,7 +7739,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -8513,15 +7750,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "dev": true, - "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -8530,29 +7765,25 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-schema-typed": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -8564,15 +7795,13 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -8584,15 +7813,13 @@ "dev": true, "engines": [ "node >= 0.2.0" - ], - "license": "MIT" + ] }, "node_modules/karma": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, - "license": "MIT", "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -8631,7 +7858,6 @@ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, - "license": "MIT", "dependencies": { "which": "^1.2.1" } @@ -8641,7 +7867,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8654,7 +7879,6 @@ "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, - "license": "MIT", "dependencies": { "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-instrument": "^5.1.0", @@ -8671,15 +7895,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8690,7 +7912,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -8707,7 +7928,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8720,7 +7940,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -8730,7 +7949,6 @@ "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, - "license": "MIT", "dependencies": { "jasmine-core": "^4.1.0" }, @@ -8746,7 +7964,6 @@ "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", "dev": true, - "license": "MIT", "peerDependencies": { "jasmine-core": "^4.0.0 || ^5.0.0", "karma": "^6.0.0", @@ -8757,15 +7974,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/karma/node_modules/body-parser": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", @@ -8786,11 +8001,10 @@ } }, "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8801,7 +8015,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -8826,7 +8039,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -8838,7 +8050,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8847,15 +8058,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/karma/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -8868,7 +8077,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -8881,7 +8089,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8891,7 +8098,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8901,7 +8107,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8911,7 +8116,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -8924,7 +8128,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8936,15 +8139,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/karma/node_modules/picomatch": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -8957,7 +8158,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -8973,7 +8173,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -8986,7 +8185,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -8996,7 +8194,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9011,7 +8208,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -9025,7 +8221,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9043,7 +8238,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9062,7 +8256,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -9072,7 +8265,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -9081,7 +8273,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9091,7 +8282,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -9105,7 +8295,6 @@ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, - "license": "MIT", "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", @@ -9123,7 +8312,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9136,7 +8324,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9148,15 +8335,13 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -9174,7 +8359,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -9190,7 +8374,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -9209,7 +8392,6 @@ "integrity": "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "@harperfast/extended-iterable": "^1.0.3", @@ -9237,7 +8419,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -9252,29 +8433,25 @@ "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.1.0", @@ -9292,7 +8469,6 @@ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", @@ -9312,7 +8488,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9325,7 +8500,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9338,7 +8512,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -9355,7 +8528,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -9373,7 +8545,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -9389,7 +8560,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -9407,7 +8577,6 @@ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -9424,7 +8593,6 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -9438,7 +8606,6 @@ "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^1.1.3", "loglevel": "^1.4.1" @@ -9449,7 +8616,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9459,7 +8625,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9469,7 +8634,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -9486,7 +8650,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -9496,7 +8659,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -9509,7 +8671,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -9519,7 +8680,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -9529,7 +8689,6 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -9540,7 +8699,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -9556,7 +8714,6 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", "dev": true, - "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", @@ -9580,7 +8737,6 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -9590,7 +8746,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9600,7 +8755,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -9613,7 +8767,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -9626,7 +8779,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9636,7 +8788,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, @@ -9653,7 +8804,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -9664,7 +8814,6 @@ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -9677,7 +8826,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" }, @@ -9692,7 +8840,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9702,7 +8849,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9712,7 +8858,6 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -9725,7 +8870,6 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", @@ -9743,7 +8887,6 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "minipass": "^3.0.0" }, @@ -9756,7 +8899,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9768,15 +8910,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9789,7 +8929,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9801,15 +8940,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/minipass-sized": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.1.2" }, @@ -9822,7 +8959,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -9835,7 +8971,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -9847,7 +8982,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", - "license": "MIT", "dependencies": { "commist": "^1.0.0", "concat-stream": "^2.0.0", @@ -9880,7 +9014,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/mqtt-browser/-/mqtt-browser-4.3.7.tgz", "integrity": "sha512-4pxHxa3avIILr2CXhTKlArVpATqfyTu4zr5u2PoUwzgw0GDr5dpzZ0pmPgZyOoQBVgrVDEboCzb/b1Q0yWOm7g==", - "license": "MIT", "dependencies": { "mqtt": "4.3.7" } @@ -9889,7 +9022,6 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", - "license": "MIT", "dependencies": { "bl": "^4.0.2", "debug": "^4.1.1", @@ -9900,7 +9032,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9911,15 +9042,13 @@ "node_modules/mqtt/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -9927,15 +9056,13 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msgpackr": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", "dev": true, - "license": "MIT", "optional": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -9947,7 +9074,6 @@ "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.2.2" @@ -9969,15 +9095,14 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, - "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ { @@ -9985,7 +9110,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9997,15 +9121,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10014,7 +9136,6 @@ "version": "16.4.2", "resolved": "https://registry.npmjs.org/ngx-mask/-/ngx-mask-16.4.2.tgz", "integrity": "sha512-mQjcsTpctGu6HYKLf6/gjEUvW65D+46xvPIMYz0BDZXqHXrqKVluHXR3KF++TNOfdLLXwW6SvuHWd91NZN/C1A==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -10028,7 +9149,6 @@ "version": "17.0.0", "resolved": "https://registry.npmjs.org/ngx-mqtt/-/ngx-mqtt-17.0.0.tgz", "integrity": "sha512-54wVMyDOZkpTZEs0rTMWPP1Yz+6q3rRnHzIBnpqnBkDcyMfNrti45C7ijwnEIaPDzQHMOqVrDgh/6C4ocPPLJQ==", - "license": "MIT", "dependencies": { "mqtt-browser": "4.3.7", "mqtt-packet": "^6.10.0", @@ -10044,7 +9164,6 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/node-gyp": { @@ -10052,7 +9171,6 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", "dev": true, - "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -10077,7 +9195,6 @@ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.1" @@ -10093,7 +9210,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } @@ -10103,7 +9219,6 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.17" } @@ -10113,7 +9228,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, @@ -10125,11 +9239,10 @@ } }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } @@ -10139,7 +9252,6 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "dev": true, - "license": "ISC", "dependencies": { "abbrev": "^4.0.0" }, @@ -10155,7 +9267,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10165,7 +9276,6 @@ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "dev": true, - "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^5.0.0" }, @@ -10178,7 +9288,6 @@ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -10191,7 +9300,6 @@ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -10201,7 +9309,6 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", @@ -10217,7 +9324,6 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "dev": true, - "license": "ISC", "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" @@ -10231,7 +9337,6 @@ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "dev": true, - "license": "ISC", "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", @@ -10247,7 +9352,6 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", @@ -10267,7 +9371,6 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -10279,7 +9382,6 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", - "license": "MIT", "dependencies": { "debug": "^4.3.1", "js-sdsl": "4.3.0" @@ -10290,7 +9392,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10300,7 +9401,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10313,7 +9413,6 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -10325,7 +9424,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -10335,7 +9433,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -10351,7 +9448,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -10369,7 +9465,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "bl": "^4.1.0", @@ -10394,7 +9489,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "restore-cursor": "^3.1.0" @@ -10408,7 +9502,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "mimic-fn": "^2.1.0" @@ -10425,7 +9518,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "onetime": "^5.1.0", @@ -10440,7 +9532,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/ordered-binary": { @@ -10448,7 +9539,6 @@ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/p-limit": { @@ -10456,7 +9546,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10472,7 +9561,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -10484,11 +9572,10 @@ } }, "node_modules/p-map": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.5.tgz", - "integrity": "sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -10501,7 +9588,6 @@ "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz", "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", "dev": true, - "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", @@ -10533,7 +9619,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -10545,7 +9630,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "license": "MIT", "dependencies": { "entities": "^8.0.0" }, @@ -10558,7 +9642,6 @@ "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, - "license": "MIT", "dependencies": { "entities": "^6.0.0", "parse5": "^8.0.0", @@ -10573,7 +9656,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -10586,7 +9668,6 @@ "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, - "license": "MIT", "dependencies": { "parse5": "^8.0.0" }, @@ -10598,7 +9679,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "license": "BSD-2-Clause", "engines": { "node": ">=20.19.0" }, @@ -10611,7 +9691,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10621,7 +9700,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10630,7 +9708,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10640,7 +9717,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10650,7 +9726,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -10663,11 +9738,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -10677,7 +9751,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -10687,15 +9760,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -10708,7 +9779,6 @@ "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.2.0.tgz", "integrity": "sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.x" }, @@ -10721,15 +9791,14 @@ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=16.20.0" } }, "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "version": "8.5.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.22.tgz", + "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==", "dev": true, "funding": [ { @@ -10745,9 +9814,8 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -10759,8 +9827,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/postcss-safe-parser": { "version": "7.0.1", @@ -10781,7 +9848,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "engines": { "node": ">=18.0" }, @@ -10794,17 +9860,15 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.4.tgz", - "integrity": "sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -10820,7 +9884,6 @@ "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-13.0.0.tgz", "integrity": "sha512-P5K31qWgUOQCtJL/3tpvEe28KfP49qbr6MTVEXC7I2k7ci55bP3YDr+glhyCdhIzxGCVp2f8eobfQ5so52RIIA==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^3.0.0", "common-tags": "^1.4.0", @@ -10844,7 +9907,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } @@ -10854,7 +9916,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -10876,7 +9937,6 @@ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -10891,15 +9951,13 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@types/eslint-visitor-keys": "^1.0.0", "@typescript-eslint/experimental-utils": "3.10.1", @@ -10928,7 +9986,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "dev": true, - "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -10942,7 +9999,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "3.10.1", "@typescript-eslint/visitor-keys": "3.10.1", @@ -10971,7 +10027,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -10988,7 +10043,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -11001,7 +10055,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -11018,7 +10071,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -11027,15 +10079,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/prettier-eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11047,7 +10097,6 @@ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -11105,7 +10154,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -11119,7 +10167,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -11129,7 +10176,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10" } @@ -11139,7 +10185,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -11154,7 +10199,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -11164,7 +10208,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -11177,7 +10220,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -11187,7 +10229,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11200,15 +10241,13 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/prettier-eslint/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11221,7 +10260,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -11237,7 +10275,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11251,7 +10288,6 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -11264,7 +10300,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -11275,7 +10310,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -11288,7 +10322,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -11297,15 +10330,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/proc-log": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -11313,15 +10344,13 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -11331,7 +10360,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -11344,7 +10372,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -11354,15 +10381,13 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.9" } @@ -11372,7 +10397,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" @@ -11402,15 +10426,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/range-parser": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" }, @@ -11424,7 +10446,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, - "license": "MIT", "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -11439,7 +10460,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11450,13 +10470,12 @@ } }, "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -11467,15 +10486,13 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -11486,15 +10503,13 @@ "node_modules/reinterval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", - "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", - "license": "MIT" + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11504,7 +10519,6 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11513,22 +10527,19 @@ "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -11538,7 +10549,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, - "license": "MIT", "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" @@ -11555,7 +10565,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -11564,8 +10573,7 @@ "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" }, "node_modules/rimraf": { "version": "3.0.2", @@ -11573,7 +10581,6 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -11589,7 +10596,6 @@ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.4.tgz", "integrity": "sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==", "dev": true, - "license": "MIT", "dependencies": { "@oxc-project/types": "=0.113.0", "@rolldown/pluginutils": "1.0.0-rc.4" @@ -11621,7 +10627,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.9" }, @@ -11666,7 +10671,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -11697,7 +10701,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -11706,7 +10709,6 @@ "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -11728,15 +10730,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11753,15 +10753,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/sass": { "version": "1.97.3", "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -11777,12 +10775,39 @@ "@parcel/watcher": "^2.4.1" } }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -11795,7 +10820,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", @@ -11822,7 +10846,6 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, - "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -11841,15 +10864,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11862,7 +10883,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11872,7 +10892,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", @@ -11892,7 +10911,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" @@ -11909,7 +10927,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11928,7 +10945,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11948,7 +10964,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -11961,7 +10976,6 @@ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", @@ -11979,7 +10993,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" @@ -11996,7 +11009,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12009,7 +11021,6 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -12020,7 +11031,6 @@ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -12039,18 +11049,16 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.8.tgz", "integrity": "sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "~4.4.1", "ws": "~8.21.0" } }, "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -12068,11 +11076,10 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", - "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", + "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", "dev": true, - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" @@ -12086,7 +11093,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -12100,7 +11106,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12110,7 +11115,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -12123,7 +11127,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12133,7 +11136,6 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", "dev": true, - "license": "MIT", "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" @@ -12148,7 +11150,6 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -12163,7 +11164,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">= 8" @@ -12174,7 +11174,6 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12184,7 +11183,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12195,7 +11193,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12204,15 +11201,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" + "dev": true }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -12222,14 +11217,12 @@ "version": "3.0.23", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" + "dev": true }, "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } @@ -12238,15 +11231,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/ssri": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -12259,7 +11250,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12269,7 +11259,6 @@ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -12280,15 +11269,13 @@ "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "license": "MIT" + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" }, "node_modules/streamroller": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, - "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -12302,17 +11289,15 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, - "license": "MIT", "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" @@ -12329,7 +11314,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12342,7 +11326,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -12358,7 +11341,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -12371,7 +11353,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12381,7 +11362,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -12394,7 +11374,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12407,7 +11386,6 @@ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, - "license": "MIT", "dependencies": { "@pkgr/core": "^0.3.6" }, @@ -12423,7 +11401,6 @@ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -12439,15 +11416,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12457,7 +11432,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -12475,7 +11449,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12486,11 +11459,10 @@ } }, "node_modules/tar": { - "version": "7.5.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", - "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", + "version": "7.5.21", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.21.tgz", + "integrity": "sha512-XdhtCvlMywwxpCW8YEq3lOXBJpUPTR2OHHcwLPO3HwsJqOHa2Ok/oJ7ruGzp+JrKoRPVCzJwAdEjqLW/vNRPHA==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -12507,7 +11479,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -12516,15 +11487,13 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -12541,7 +11510,6 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.14" } @@ -12551,7 +11519,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -12564,7 +11531,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6" } @@ -12574,7 +11540,6 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.12" }, @@ -12585,15 +11550,13 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -12608,15 +11571,13 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" + "dev": true }, "node_modules/tuf-js": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "dev": true, - "license": "MIT", "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", @@ -12631,7 +11592,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -12644,7 +11604,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -12657,7 +11616,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "dev": true, - "license": "MIT", "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", @@ -12676,7 +11634,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -12688,15 +11645,13 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12724,7 +11679,6 @@ "url": "https://github.com/sponsors/faisalman" } ], - "license": "MIT", "bin": { "ua-parser-js": "script/cli.js" }, @@ -12737,7 +11691,6 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.18.1" } @@ -12746,15 +11699,13 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -12764,7 +11715,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12788,7 +11738,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -12805,7 +11754,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -12815,7 +11763,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -12823,15 +11770,13 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -12840,15 +11785,13 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "dev": true, - "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -12858,7 +11801,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12868,7 +11810,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", @@ -12943,7 +11884,6 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12953,7 +11893,6 @@ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.1", "eslint-scope": "^5.0.0", @@ -12977,7 +11916,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -12990,7 +11928,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -13004,7 +11941,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -13014,7 +11950,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -13029,7 +11964,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -13039,7 +11973,6 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -13053,7 +11986,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "defaults": "^1.0.3" @@ -13064,7 +11996,6 @@ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/which": { @@ -13072,7 +12003,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -13088,7 +12018,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13098,7 +12027,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13112,15 +12040,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -13130,7 +12056,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13143,14 +12068,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", - "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", - "license": "MIT", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", "engines": { "node": ">=8.3.0" }, @@ -13171,7 +12094,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", "engines": { "node": ">=0.4" } @@ -13181,7 +12103,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -13190,15 +12111,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -13216,7 +12135,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "ISC", "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -13226,7 +12144,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -13239,7 +12156,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -13257,7 +12173,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -13273,7 +12188,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -13286,7 +12200,6 @@ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -13299,7 +12212,6 @@ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -13312,7 +12224,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -13322,7 +12233,6 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", "dev": true, - "license": "ISC", "peerDependencies": { "zod": "^3.25.28 || ^4" } @@ -13330,8 +12240,7 @@ "node_modules/zone.js": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", - "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT" + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==" } } } From 70ad2aefa79ee054e36a3f9682b80aa744ae0bae Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 23 Jul 2026 15:39:59 +0200 Subject: [PATCH 029/196] package-lock --- modules/ui/package-lock.json | 180 ++++++++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 37 deletions(-) diff --git a/modules/ui/package-lock.json b/modules/ui/package-lock.json index 0b42198fe..f1ce59623 100644 --- a/modules/ui/package-lock.json +++ b/modules/ui/package-lock.json @@ -310,6 +310,40 @@ } } }, + "node_modules/@angular-devkit/architect/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/architect/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-devkit/architect/node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -721,6 +755,24 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@angular/cli/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular/cli/node_modules/cli-spinners": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", @@ -804,6 +856,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@angular/cli/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular/cli/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -883,6 +951,36 @@ } } }, + "node_modules/@angular/compiler-cli/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular/compiler-cli/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular/core": { "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.18.tgz", @@ -4196,6 +4294,24 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@schematics/angular/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@schematics/angular/node_modules/cli-spinners": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", @@ -4279,6 +4395,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@schematics/angular/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@schematics/angular/node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -5406,15 +5538,16 @@ "dev": true }, "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "readdirp": "^5.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 20.19.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -10470,12 +10603,13 @@ } }, "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 20.19.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -10775,34 +10909,6 @@ "@parcel/watcher": "^2.4.1" } }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", From db439c4c8af0e826245aa324fd1db290bb90b97a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 23 Jul 2026 16:46:55 +0200 Subject: [PATCH 030/196] fix testsuite --- .github/workflows/package.yml | 4 ++-- .github/workflows/testing.yml | 4 ++-- cmd/prepare | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index e8223de30..bf8b786d3 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -48,7 +48,7 @@ jobs: run: sudo cmd/prepare - name: Install package shell: bash {0} - run: sudo apt install ./testrun*.deb + run: sudo -E DEBIAN_FRONTEND=noninteractive apt install ./testrun*.deb - name: Start testrun shell: bash {0} run: sudo testrun > >(tee testrun_output.log) 2>&1 & @@ -82,7 +82,7 @@ jobs: run: sudo cmd/prepare - name: Install package shell: bash {0} - run: sudo apt install ./testrun*.deb + run: sudo -E DEBIAN_FRONTEND=noninteractive apt install ./testrun*.deb - name: Start testrun shell: bash {0} run: sudo testrun > >(tee testrun_output.log) 2>&1 & diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 6cb02f3f4..718b10812 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -152,8 +152,8 @@ jobs: - name: Install Chromium Browser run: | sudo add-apt-repository ppa:xtradeb/apps -y - sudo apt-get update - sudo apt-get install -y chromium + sudo -E DEBIAN_FRONTEND=noninteractive apt-get update + sudo -E DEBIAN_FRONTEND=noninteractive apt-get install -y chromium - name: Install dependencies run: npm ci diff --git a/cmd/prepare b/cmd/prepare index 9e68f734d..d3d230d51 100755 --- a/cmd/prepare +++ b/cmd/prepare @@ -20,6 +20,7 @@ echo Installing system dependencies # Install system dependencies -sudo apt-get update && sudo apt-get install openvswitch-common openvswitch-switch python3 libpangocairo-1.0-0 ethtool +export DEBIAN_FRONTEND=noninteractive +sudo -E apt-get update && sudo -E apt-get install -y openvswitch-common openvswitch-switch python3 libpangocairo-1.0-0 ethtool echo Finished installing system dependencies From 5fb3bd0c939b8c1646730615ab198f3154ee2315 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Fri, 24 Jul 2026 08:36:55 +0000 Subject: [PATCH 031/196] [TR] - [Github] - Run time of job Network Orchestrator was missed by Error Messages (#1599) * Remove tests for tls v1.3 from tsl v1.2 testing * Fix lint * Fix tests --- modules/test/tls/python/src/tls_module.py | 29 +++++------ testing/unit/tls/tls_module_test.py | 62 ++++++++--------------- 2 files changed, 34 insertions(+), 57 deletions(-) diff --git a/modules/test/tls/python/src/tls_module.py b/modules/test/tls/python/src/tls_module.py index e0cf9f0d3..9b989eb3c 100644 --- a/modules/test/tls/python/src/tls_module.py +++ b/modules/test/tls/python/src/tls_module.py @@ -411,19 +411,19 @@ def _security_tls_v1_2_server(self): LOGGER.info(f'Inspecting Service on port {port}: {service_type}') tls_1_2_results = self._tls_util.validate_tls_server( host=self._device_ipv4_addr, port=port, tls_version='1.2') - tls_1_3_results = self._tls_util.validate_tls_server( - host=self._device_ipv4_addr, port=port, tls_version='1.3') - # If TLS 1.2 is not supported don't process the results if tls_1_2_results[0] is not None: - port_results = self._tls_util.process_tls_server_results( - tls_1_2_results, tls_1_3_results, port=port) - else: - port_results = None - if port_results is not None: - result = port_results[ - 0] if result is None else result and port_results[0] - details.extend(port_results[1]) - if port_results[0]: + if result is None: + result = tls_1_2_results[0] + else: + result = result and tls_1_2_results[0] + status_str = '' if tls_1_2_results[0] else 'not ' + details.append( + f'TLS 1.2 {status_str}validated on port {port}:') + if isinstance(tls_1_2_results[1], list): + details.extend(tls_1_2_results[1]) + else: + details.append(tls_1_2_results[1]) + if tls_1_2_results[0]: ports_valid.append(port) else: ports_invalid.append(port) @@ -439,11 +439,6 @@ def _security_tls_v1_2_server(self): result = 'Feature Not Detected' description = 'TLS 1.2 certificate could not be validated' details.append('TLS 1.2 certificate could not be validated.') - # If TLS 1.2 cert is not valid but TLS 1.3 is valid test is Compliant - elif result and not tls_1_2_results[0] and tls_1_3_results[0]: - ports_csv = ','.join(map(str,ports_valid)) - description = 'TLS 1.2 certificate invalid and ' - description += f'TLS 1.3 certificate valid on ports: {ports_csv}' elif result: ports_csv = ','.join(map(str,ports_valid)) description = f'TLS 1.2 certificate valid on ports: {ports_csv}' diff --git a/testing/unit/tls/tls_module_test.py b/testing/unit/tls/tls_module_test.py index a0364b4ce..fb2f6744b 100644 --- a/testing/unit/tls/tls_module_test.py +++ b/testing/unit/tls/tls_module_test.py @@ -46,7 +46,11 @@ LOCAL_REPORT_EXT = os.path.join(REPORTS_DIR, 'tls_report_ext_local.html') LOCAL_REPORT_NO_CERT = os.path.join(REPORTS_DIR, 'tls_report_no_cert_local.html') -CONF_FILE = 'modules/test/' + MODULE + '/conf/module_config.json' +CONF_FILE = ( + '/testrun/conf/module_config.json' + if os.path.exists('/testrun/conf/module_config.json') + else 'modules/test/' + MODULE + '/conf/module_config.json' +) INTERNET_IFACE = 'eth0' @@ -69,12 +73,14 @@ def setUpClass(cls): # Setup the default ipv4 address and the scan results def setUp(self): - self.tls_module = TLSModule(module=MODULE) + self.tls_module = TLSModule(module=MODULE, conf_file=CONF_FILE) self.tls_module._device_ipv4_addr = None # pylint: disable=W0212 self.tls_module._scan_results = None # pylint: disable=W0212 - def security_tls_v1_2_server_no_ip_test(self): + @patch('tls_module.TLSModule._get_device_ipv4') + def security_tls_v1_2_server_no_ip_test(self, mock_get_device_ipv4): """Test _security_tls_v1_2_server when device IP could not be resolved""" + mock_get_device_ipv4.return_value = None result, description, details = self.tls_module._security_tls_v1_2_server() # pylint: disable=W0212 @@ -162,11 +168,10 @@ def validate_side_effect(**kwargs): self.assertEqual(details, ['TLS 1.2 certificate could not be validated.']) @patch('tls_module.TLSUtil.validate_tls_server') - def security_tls_v1_2_server_compliant_invalid_v1_2_cert_test(self, + def security_tls_v1_2_server_invalid_v1_2_cert_test(self, mock_validate_tls_server): """ - Test _security_tls_v1_2_server when TLS 1.2 cert is invalid but - TLS 1.3 cert is valid + Test _security_tls_v1_2_server when TLS 1.2 cert is invalid """ self.tls_module._device_ipv4_addr = '10.10.10.14' # pylint: disable=W0212 @@ -177,30 +182,21 @@ def validate_side_effect(**kwargs): tls_version = kwargs.get('tls_version') if tls_version == '1.2': return (False, ['Certificate has expired']) - elif tls_version == '1.3': - return (True, ['Time range valid', - 'Public key valid', - 'Signature valid'] - ) mock_validate_tls_server.side_effect = validate_side_effect result, description, details = self.tls_module._security_tls_v1_2_server() # pylint: disable=W0212 - # Expects compliant result - self.assertEqual(result, True) + # Expects non-compliant result + self.assertEqual(result, False) expected_description = ( - 'TLS 1.2 certificate invalid and TLS 1.3 certificate valid on ports: 443' + 'TLS 1.2 certificate invalid on ports: 443' ) self.assertEqual(description, expected_description ) expected_details = [ 'TLS 1.2 not validated on port 443:', - 'Certificate has expired', - 'TLS 1.3 validated on port 443:', - 'Time range valid', - 'Public key valid', - 'Signature valid' + 'Certificate has expired' ] self.assertEqual(details, expected_details) @@ -231,9 +227,7 @@ def validate_side_effect(**kwargs): expected_details = [ 'TLS 1.2 not validated on port 443:', - 'Certificate has expired', - 'TLS 1.3 not validated on port 443:', - 'Device certificate has not been signed' + 'Certificate has expired' ] self.assertEqual(details, expected_details) @@ -265,10 +259,6 @@ def validate_side_effect(**kwargs): 'TLS 1.2 validated on port 443:', 'Time range valid', 'Public key valid', - 'Signature valid', - 'TLS 1.3 validated on port 443:', - 'Time range valid', - 'Public key valid', 'Signature valid' ] self.assertEqual(details, expected_details) @@ -303,18 +293,10 @@ def validate_side_effect(**kwargs): 'Time range valid', 'Public key valid', 'Signature valid', - 'TLS 1.3 validated on port 443:', - 'Time range valid', - 'Public key valid', - 'Signature valid', 'TLS 1.2 validated on port 8443:', 'Time range valid', 'Public key valid', 'Signature valid', - 'TLS 1.3 validated on port 8443:', - 'Time range valid', - 'Public key valid', - 'Signature valid', ] self.assertEqual(details, expected_details) @@ -345,10 +327,6 @@ def validate_side_effect(**kwargs): 'Time range valid', 'Public key valid', 'Signature valid', - 'TLS 1.3 validated on port 443:', - 'Time range valid', - 'Public key valid', - 'Signature valid', 'HTTP service detected on port 80.' ] self.assertEqual(details, expected_details) @@ -640,7 +618,7 @@ def outbound_connections_report_test(self): capture_file = os.path.join(CAPTURES_DIR, 'monitor.pcap') ip_dst = TLS_UTIL.get_all_outbound_connections( device_mac='70:b3:d5:96:c0:00', capture_files=[capture_file]) - tls = TLSModule(module=MODULE) + tls = TLSModule(module=MODULE, conf_file=CONF_FILE) gen_html = tls.generate_outbound_connection_table(ip_dst) print(gen_html) @@ -651,6 +629,7 @@ def tls_module_report_multi_page_test(self): monitor_pcap_file = os.path.join(CAPTURES_DIR, 'multi_page_monitor.pcap') tls_pcap_file = os.path.join(CAPTURES_DIR, 'multi_page_tls.pcap') tls = TLSModule(module=MODULE, + conf_file=CONF_FILE, results_dir=OUTPUT_DIR, startup_capture_file=startup_pcap_file, monitor_capture_file=monitor_pcap_file, @@ -674,6 +653,7 @@ def tls_module_report_test(self): os.environ['DEVICE_MAC'] = '38:d1:35:01:17:fe' pcap_file = os.path.join(CAPTURES_DIR, 'tls.pcap') tls = TLSModule(module=MODULE, + conf_file=CONF_FILE, results_dir=OUTPUT_DIR, startup_capture_file=pcap_file, monitor_capture_file=pcap_file, @@ -692,6 +672,7 @@ def tls_module_report_ext_test(self): os.environ['DEVICE_MAC'] = '28:29:86:27:d6:05' pcap_file = os.path.join(CAPTURES_DIR, 'tls_ext.pcap') tls = TLSModule(module=MODULE, + conf_file=CONF_FILE, results_dir=OUTPUT_DIR, startup_capture_file=pcap_file, monitor_capture_file=pcap_file, @@ -718,6 +699,7 @@ def tls_module_report_no_cert_test(self): os.environ['DEVICE_MAC'] = '' pcap_file = os.path.join(CAPTURES_DIR, 'tls_ext.pcap') tls = TLSModule(module=MODULE, + conf_file=CONF_FILE, results_dir=OUTPUT_DIR, startup_capture_file=pcap_file, monitor_capture_file=pcap_file, @@ -902,7 +884,7 @@ def download_public_cert(self, hostname, port=443): suite.addTest(TLSModuleTest('security_tls_v1_2_multiple_https_servers_test')) suite.addTest(TLSModuleTest('security_tls_v1_2_server_http_test')) suite.addTest( - TLSModuleTest('security_tls_v1_2_server_compliant_invalid_v1_2_cert_test') + TLSModuleTest('security_tls_v1_2_server_invalid_v1_2_cert_test') ) suite.addTest( TLSModuleTest( From 197ee7464700ed0a3a0caafec6f8a3ea2172694e Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Fri, 24 Jul 2026 09:42:48 +0000 Subject: [PATCH 032/196] [TR] The v1.3 information is shown in the test for TLS 1.2 server (#1598) * Remove tests for tls v1.3 from tsl v1.2 testing * Fix lint * Fix tests From 30aa0e35f37b43309eb17226d4ed69c1571808e3 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Mon, 27 Jul 2026 14:59:41 +0000 Subject: [PATCH 033/196] update dependencies (#1609) * update dependencies --- modules/ui/package-lock.json | 1531 ++++++++++++++++++++++++++-------- modules/ui/package.json | 7 +- 2 files changed, 1166 insertions(+), 372 deletions(-) diff --git a/modules/ui/package-lock.json b/modules/ui/package-lock.json index f1ce59623..43a826202 100644 --- a/modules/ui/package-lock.json +++ b/modules/ui/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "test-run-ui", "version": "0.0.0", + "hasInstallScript": true, "dependencies": { "@angular/animations": "^21.1.0", "@angular/cdk": "^21.2.2", @@ -62,6 +63,7 @@ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.14.1.tgz", "integrity": "sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -77,6 +79,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.48.1.tgz", "integrity": "sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -92,6 +95,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.48.1.tgz", "integrity": "sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -107,6 +111,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.48.1.tgz", "integrity": "sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.0.0" } @@ -116,6 +121,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.48.1.tgz", "integrity": "sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -131,6 +137,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.48.1.tgz", "integrity": "sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -146,6 +153,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.48.1.tgz", "integrity": "sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -161,6 +169,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.48.1.tgz", "integrity": "sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -176,6 +185,7 @@ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.48.1.tgz", "integrity": "sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -191,6 +201,7 @@ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.48.1.tgz", "integrity": "sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -206,6 +217,7 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.48.1.tgz", "integrity": "sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1", "@algolia/requester-browser-xhr": "5.48.1", @@ -221,6 +233,7 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.48.1.tgz", "integrity": "sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1" }, @@ -233,6 +246,7 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.48.1.tgz", "integrity": "sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1" }, @@ -245,6 +259,7 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.48.1.tgz", "integrity": "sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/client-common": "5.48.1" }, @@ -257,6 +272,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -270,6 +286,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.19.tgz", "integrity": "sha512-cj4tzUMiloLTg5rNf17E8MsvIxCWYoBiBsaj7ns6dgXqT9XCeG+J0TA2t1M+N9uuqfeLd22U/rYoCkADmcircQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "21.2.19", "rxjs": "7.8.2" @@ -288,6 +305,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -349,6 +367,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 12" } @@ -358,6 +377,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.27.tgz", "integrity": "sha512-3amNzoCVSKd7ah6l6lBQL4onwwJvqvam7FMoQBILrxtW5LB5ezh8gMSPuA4zJjKjoRzf9uoWdlzqv/84I52xZA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ajv": "8.18.0", @@ -386,6 +406,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.1.0" @@ -396,6 +417,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.27.tgz", "integrity": "sha512-/PZmyAlb2NGWPikRRuiWLdfHQd8Wrx6lX4HqvTcaDhlU43M3T0ud4PH2T3QDp7BzHYY92xtD8iPxX2asg67G1A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@angular-devkit/core": "19.2.27", @@ -415,6 +437,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "tslib": "^2.1.0" @@ -425,6 +448,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.0.0-alpha.4.tgz", "integrity": "sha512-iSDl0Hs2fkJJH0aR/RQ80nmickY7o1xv+mucSw/Gy4YwFDJFU0FiV++1OxhjturuEXt3k+TJ115xe4DJa86BMw==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" @@ -434,13 +458,15 @@ "version": "19.0.0-alpha.4", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.0-alpha.4.tgz", "integrity": "sha512-SS2FHqRaGslJzI+cTBNDC7xg/Zx5c0iIXZnpwGa8VjJ/8L82+PlRS+d9CTBhb8tMsR06ifUTK9ym2JQ3VmE2Cg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { "version": "19.0.0-alpha.4", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.0-alpha.4.tgz", "integrity": "sha512-IhBeiUohYLsnUrSJ92riSrhfIkGefuXIrGTgBnagn887WFR45/Go5dIIivVfMGdvTg849dtLpBDXZrycHY3QFA==", "dev": true, + "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4", "@angular-eslint/utils": "19.0.0-alpha.4" @@ -456,6 +482,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.0-alpha.4.tgz", "integrity": "sha512-YiFB+tyTZ/mj/w/5DLJHl9J1ABGaHNhGdXJzagI0ufqyrePR0wTYMIyJpIGWOMHr9E5nYPsVuHn+d08dG1R0aQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4", "@angular-eslint/utils": "19.0.0-alpha.4", @@ -474,6 +501,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.0.0-alpha.4.tgz", "integrity": "sha512-Xv8g2PbNqhm7igTnY3uuY511Fr+FVRBHG+ZHbcUPZT7YDBaFZRJezAzbbPLZ6GdqqhoQJPHdGuEvo22yKhKXag==", "dev": true, + "license": "MIT", "dependencies": { "@angular-eslint/eslint-plugin": "19.0.0-alpha.4", "@angular-eslint/eslint-plugin-template": "19.0.0-alpha.4", @@ -491,6 +519,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.0-alpha.4.tgz", "integrity": "sha512-Mvy1kbnqoYBQFFpQtmBB/TkhmmoN97ruSv9xa3mpKzv8JlDdVCkIn7IdqLtzcLwGr+MGcPC7GFPl8o7q12N3BQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4", "eslint-scope": "^8.0.2" @@ -505,6 +534,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.0-alpha.4.tgz", "integrity": "sha512-6Pxqs3QqSPBcAkP8I/GYijoPoAmqOYqyQvJGvBWd1oKlA3EqmXSi7uaSUa6nUI6BiA8JEJZTBaSOP6O2oyK25Q==", "dev": true, + "license": "MIT", "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.0.0-alpha.4" }, @@ -519,6 +549,7 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.18.tgz", "integrity": "sha512-zN++Qb4Oz4x/5LYHuW9FItm7aHsV4HBz518GT25QusMvGymh+4io2TWhPYB0C9jx+g5q8GeQLd3c8r42yLrRxw==", "deprecated": "@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -534,6 +565,7 @@ "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.19.tgz", "integrity": "sha512-emy9mqrTXAwhZzcvx8MaHyz+cUR06PVGxnqy91+bpDxPP9S5x67sPoOkY9y/ETFFhRpB5ULlUxyq0eN/pi6QOg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.2102.19", @@ -633,6 +665,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -642,6 +675,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -653,6 +687,7 @@ "version": "21.2.14", "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.14.tgz", "integrity": "sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ==", + "license": "MIT", "dependencies": { "parse5": "^8.0.0", "tslib": "^2.3.0" @@ -669,6 +704,7 @@ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.19.tgz", "integrity": "sha512-i78NzvoNonAY17QgzSmqrYnXHmEfraLv4wZ/o/m3efxuz61ZJ+5X/PsCeAhbwBvQfRrPRQaJV2tK9vGjHa+U6w==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.2102.19", "@angular-devkit/core": "21.2.19", @@ -703,6 +739,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -730,6 +767,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.19.tgz", "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "21.2.19", "jsonc-parser": "3.3.1", @@ -748,6 +786,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -778,6 +817,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.20" }, @@ -790,6 +830,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -802,6 +843,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -814,6 +856,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, + "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" @@ -830,6 +873,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -839,6 +883,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", @@ -877,6 +922,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -889,6 +935,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 12" } @@ -897,6 +944,7 @@ "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.18.tgz", "integrity": "sha512-gZugZ8gX/KkACIZ3/ekoImLu5z8a0Iu9O5b84kh8e+++VUjmkmd19IygBsq/8/fF3vKf0UcIKcx3P6A/gb2DJw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -912,6 +960,7 @@ "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.18.tgz", "integrity": "sha512-ccnDuKLuzIa0ayijR+alarsHNWIksuGV/lxGTZ0t6/0+B6J/RXupz6M2IO6ZHHEcg8r7pcrLCUBTyp3FoiRJrg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -924,6 +973,7 @@ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.18.tgz", "integrity": "sha512-L5zbIp7YfTTB4I4xT33FgEBanzhppNejzZX0HJOEqKDyDL2jXq+flt83lE0XVuRJ6/zrG+UKj0B+y/CK6Ro7Wg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "7.29.7", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -985,6 +1035,7 @@ "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.18.tgz", "integrity": "sha512-AG4bb6GU0+qp+vVBjc/IhSPjgcRX8QsCb8jzN8dDyhnjsyuuG/LlIiU0l6n65BI9SGKE9m6TfsJ1ObkkAiE5KQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1009,6 +1060,7 @@ "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.18.tgz", "integrity": "sha512-TrRuiNjIzrrNtQgpJVH5gultQrvBlawa+tTzIpxBfIqLpkHrTPZLtYu118EUk6jhWzgRhKYUorInjJe+sSxC+w==", + "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "tslib": "^2.3.0" @@ -1027,6 +1079,7 @@ "version": "21.2.14", "resolved": "https://registry.npmjs.org/@angular/material/-/material-21.2.14.tgz", "integrity": "sha512-fMQca8VRtei93JRRG9qQ+u08DCb0nga59Esoakq5yx3+A1NfdpFeUS1tBns56U04o8KAaIAwZK3NBqXz8ZKNqg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1043,6 +1096,7 @@ "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.18.tgz", "integrity": "sha512-zltF+3HrlgtZbYg8U98LhG0dyGm1aHT3Px8//9wjqi/TUY8UlHsYKByL197QtVWDBjf/dekzXdz5c+iyVtanLQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1065,6 +1119,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.18.tgz", "integrity": "sha512-doTDss6GhDTGjVuuANlzFrdYKBqHQVlWgy2tiTjy9EbrmMTOOHg0D6yUQXh1ZqmUWKDZ3owkUjUNGiXt92rQ6w==", "deprecated": "@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1082,6 +1137,7 @@ "version": "21.2.18", "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.18.tgz", "integrity": "sha512-Xix19uG1YthC8IslhWKSfPdhscVWREBGVJZW2OnRmLef8F7DvhF49S6vOywaBo+Uahe0egkmgWDNpEwxAzsgLw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -1100,6 +1156,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", @@ -1114,6 +1171,7 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1123,6 +1181,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1152,13 +1211,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1168,6 +1229,7 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", @@ -1184,6 +1246,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" }, @@ -1196,6 +1259,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", @@ -1212,6 +1276,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1221,6 +1286,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1230,6 +1296,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" @@ -1243,6 +1310,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", @@ -1260,6 +1328,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -1272,6 +1341,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1281,6 +1351,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1290,6 +1361,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1299,6 +1371,7 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" @@ -1312,6 +1385,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", @@ -1327,6 +1401,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1339,6 +1414,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1353,6 +1429,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -1361,13 +1438,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -1377,6 +1456,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -1386,6 +1466,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -1398,6 +1479,7 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.29.7" }, @@ -1413,6 +1495,7 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", @@ -1427,6 +1510,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1445,6 +1529,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" @@ -1458,27 +1543,30 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", + "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1486,10 +1574,11 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1504,6 +1593,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -1520,6 +1610,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1536,6 +1627,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1552,6 +1644,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1568,6 +1661,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1584,6 +1678,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1600,6 +1695,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1616,6 +1712,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1632,6 +1729,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1648,6 +1746,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1664,6 +1763,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1680,6 +1780,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1696,6 +1797,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1712,6 +1814,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1728,6 +1831,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1744,6 +1848,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1760,6 +1865,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1776,6 +1882,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1792,6 +1899,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1808,6 +1916,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1824,6 +1933,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1840,6 +1950,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -1856,6 +1967,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -1872,6 +1984,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1888,6 +2001,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1904,6 +2018,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1917,6 +2032,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1935,6 +2051,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1944,6 +2061,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1967,6 +2085,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1978,27 +2097,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -2007,13 +2111,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2026,6 +2132,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2035,6 +2142,7 @@ "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", "dev": true, + "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -2044,15 +2152,17 @@ "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", "dev": true, + "license": "Apache-2.0", "optional": true }, "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.0.12.tgz", + "integrity": "sha512-eWpQYr67tqJLeaSUl0Q+TquuYfUdTibpOJlUMV2FfUP7+KqCC5TufnwnlXL6mobZBJbGAYRd7ZvEBDCbLInjhg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=18.14.1" + "node": ">=20" }, "peerDependencies": { "hono": "^4" @@ -2064,6 +2174,7 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -2073,27 +2184,12 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2106,6 +2202,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2119,13 +2216,15 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -2135,6 +2234,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2159,6 +2259,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2180,6 +2281,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", @@ -2207,6 +2309,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", @@ -2229,6 +2332,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2251,6 +2355,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, + "license": "MIT", "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" @@ -2272,6 +2377,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -2281,6 +2387,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2302,6 +2409,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2323,6 +2431,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2345,6 +2454,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", @@ -2374,6 +2484,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2396,6 +2507,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", @@ -2419,6 +2531,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2443,6 +2556,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2460,6 +2574,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -2472,6 +2587,7 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2481,6 +2597,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -2491,6 +2608,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -2501,6 +2619,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2509,13 +2628,15 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2526,6 +2647,7 @@ "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/type": "^3.0.8" }, @@ -2545,6 +2667,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2558,6 +2681,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2571,6 +2695,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2584,6 +2709,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2597,6 +2723,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2610,6 +2737,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2623,6 +2751,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2633,6 +2762,7 @@ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", "dev": true, + "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", @@ -2676,6 +2806,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2689,6 +2820,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2702,6 +2834,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2715,6 +2848,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2728,6 +2862,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2741,6 +2876,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2751,6 +2887,7 @@ "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -2787,6 +2924,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2803,6 +2941,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2819,6 +2958,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2835,6 +2975,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2851,6 +2992,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2867,6 +3009,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2883,6 +3026,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2899,6 +3043,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2915,6 +3060,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2931,6 +3077,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2947,6 +3094,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2963,6 +3111,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2979,6 +3128,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2995,6 +3145,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -3011,6 +3162,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3027,6 +3179,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3043,6 +3196,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3056,6 +3210,7 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" @@ -3073,6 +3228,7 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/@ngrx/component-store/-/component-store-21.0.1.tgz", "integrity": "sha512-aOfudK8MqCZQUuBjMnXAXRxRcr9Qu/+9/2iIh4aLhmGXC5JCpkDi1a82A/39EUFZy2xBbI4lPI7P817b1PQRvQ==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3085,6 +3241,7 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-21.0.1.tgz", "integrity": "sha512-hSdpToAiSYa5FJ/CAygQHpnCaF2S1HO7q/57ob3XvNTWmkofa0VqI/IIe4W57bojh2YOWCJ91SCn3kAjymaV3g==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3098,6 +3255,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/@ngrx/operators/-/operators-21.1.1.tgz", "integrity": "sha512-2ChT1rVi6w8xHrmIAqRFuvY7YLAJiH7idfmbimjOYHzJ7pgaz0+4WVqyCp9pv2UiDEXuvpUOvs3afgS5m1LDNQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3109,6 +3267,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/@ngrx/signals/-/signals-21.1.1.tgz", "integrity": "sha512-AXxsvO39cJ4gu2GMvLyUHwx+3qHi35Bn7OUqyIfJW0fffi/Af7ML6h0MPMWDHVROo55FBgxzJrYRswwzdew9VA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3126,6 +3285,7 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-21.0.1.tgz", "integrity": "sha512-2hGnw/c5o8nmKzyx7TrUUM7FXjE2zqjX0EF+wLbw9Oy/L+VdCmx+ZI1BFjuAR4B8PKEWHG2KSbOM13SMNkpZiA==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3139,6 +3299,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3152,6 +3313,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -3161,6 +3323,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3174,6 +3337,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", "dev": true, + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -3190,6 +3354,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -3199,6 +3364,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "dev": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -3211,6 +3377,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "dev": true, + "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", @@ -3230,6 +3397,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } @@ -3239,6 +3407,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -3248,6 +3417,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, @@ -3263,6 +3433,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "dev": true, + "license": "ISC", "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" @@ -3279,6 +3450,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -3288,6 +3460,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", @@ -3306,6 +3479,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", @@ -3323,6 +3497,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "dev": true, + "license": "ISC", "dependencies": { "which": "^6.0.0" }, @@ -3335,6 +3510,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } @@ -3344,6 +3520,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, @@ -3359,6 +3536,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -3368,6 +3546,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", @@ -3384,6 +3563,7 @@ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.113.0.tgz", "integrity": "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" } @@ -3394,6 +3574,7 @@ "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.3", @@ -3431,6 +3612,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3451,6 +3633,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3471,6 +3654,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3491,6 +3675,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3511,6 +3696,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3531,6 +3717,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3551,6 +3738,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3571,6 +3759,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3591,6 +3780,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3611,6 +3801,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3631,6 +3822,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3651,6 +3843,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3668,6 +3861,7 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@pkgr/core": { @@ -3675,6 +3869,7 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, + "license": "MIT", "engines": { "node": "^14.18.0 || >=16.0.0" }, @@ -3690,6 +3885,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3706,6 +3902,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3722,6 +3919,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3738,6 +3936,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3754,6 +3953,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3770,6 +3970,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3786,6 +3987,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3802,6 +4004,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3818,6 +4021,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3834,6 +4038,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -3850,6 +4055,7 @@ "wasm32" ], "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" @@ -3866,6 +4072,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3882,6 +4089,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3894,328 +4102,354 @@ "version": "1.0.0-rc.4", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.4.tgz", "integrity": "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz", + "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz", + "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz", + "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz", + "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz", + "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz", + "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz", + "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz", + "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz", + "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz", + "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz", + "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz", + "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz", + "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz", + "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz", + "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz", + "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz", + "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz", + "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz", + "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz", + "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz", + "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz", + "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz", + "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz", + "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz", + "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4226,6 +4460,7 @@ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.19.tgz", "integrity": "sha512-eL+UU9eizoadhDB4YEctRmmo0A5iwrSmGzeuEa6akrq8nLGVWM8zO91HTJutkPqGQjelF+UOiOShsQSZAU9SIQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "21.2.19", "@angular-devkit/schematics": "21.2.19", @@ -4242,6 +4477,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.18.0", "ajv-formats": "3.0.1", @@ -4269,6 +4505,7 @@ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.19.tgz", "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "21.2.19", "jsonc-parser": "3.3.1", @@ -4287,6 +4524,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -4317,6 +4555,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.20" }, @@ -4329,6 +4568,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4341,6 +4581,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4353,6 +4594,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, + "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" @@ -4369,6 +4611,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -4378,6 +4621,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", @@ -4416,6 +4660,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 12" } @@ -4425,6 +4670,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" }, @@ -4437,6 +4683,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz", "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -4446,6 +4693,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -4455,6 +4703,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", @@ -4472,6 +4721,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" @@ -4485,6 +4735,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz", "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", @@ -4498,18 +4749,21 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -4519,6 +4773,7 @@ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" @@ -4532,6 +4787,7 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -4542,6 +4798,7 @@ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4550,31 +4807,36 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/jasmine": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.6.tgz", "integrity": "sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "26.1.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~8.3.0" } @@ -4584,6 +4846,7 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4593,6 +4856,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.65.0", @@ -4621,6 +4885,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -4630,6 +4895,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.3", "@typescript-eslint/types": "3.10.1", @@ -4653,6 +4919,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "dev": true, + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -4666,6 +4933,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "3.10.1", "@typescript-eslint/visitor-keys": "3.10.1", @@ -4694,6 +4962,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -4710,6 +4979,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -4723,6 +4993,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -4732,6 +5003,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -4741,6 +5013,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/types": "8.65.0", @@ -4765,6 +5038,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.65.0", "@typescript-eslint/types": "^8.65.0", @@ -4786,6 +5060,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.0" @@ -4803,6 +5078,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4819,6 +5095,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.65.0", "@typescript-eslint/typescript-estree": "8.65.0", @@ -4843,6 +5120,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4856,6 +5134,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/project-service": "8.65.0", "@typescript-eslint/tsconfig-utils": "8.65.0", @@ -4883,6 +5162,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4895,6 +5175,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.65.0", @@ -4918,6 +5199,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.65.0", "eslint-visitor-keys": "^5.0.0" @@ -4935,6 +5217,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, @@ -4946,13 +5229,15 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz", "integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, @@ -4964,13 +5249,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/abbrev": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -4980,6 +5267,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -4993,6 +5281,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5005,6 +5294,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -5014,6 +5304,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } @@ -5023,6 +5314,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5039,6 +5331,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -5056,6 +5349,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.48.1.tgz", "integrity": "sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/abtesting": "1.14.1", "@algolia/client-abtesting": "5.48.1", @@ -5081,6 +5375,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5090,6 +5385,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, + "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -5105,6 +5401,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5114,6 +5411,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5129,6 +5427,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5142,6 +5441,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5153,13 +5453,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -5169,6 +5471,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5178,6 +5481,7 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -5186,7 +5490,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, + "license": "MIT", "engines": { "node": "18 || 20 || >=22" } @@ -5208,22 +5512,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/baseline-browser-mapping": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.1.tgz", - "integrity": "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A==", + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz", + "integrity": "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==", "dev": true, + "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" }, @@ -5236,6 +5543,7 @@ "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.4.1.tgz", "integrity": "sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "css-select": "^6.0.0", "css-what": "^7.0.0", @@ -5256,6 +5564,7 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5267,6 +5576,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5278,6 +5588,7 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^2.0.0", @@ -5302,6 +5613,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -5314,13 +5626,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", - "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, @@ -5333,6 +5646,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -5359,6 +5673,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", @@ -5391,6 +5706,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5399,13 +5715,15 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5415,6 +5733,7 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", @@ -5436,6 +5755,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", @@ -5453,6 +5773,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -5462,6 +5783,7 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -5475,6 +5797,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -5491,6 +5814,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5513,13 +5837,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5535,7 +5861,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/chokidar": { "version": "4.0.3", @@ -5558,6 +5885,7 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -5567,6 +5895,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" }, @@ -5582,6 +5911,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -5595,6 +5925,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^8.0.0", "string-width": "^8.2.0" @@ -5611,6 +5942,7 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } @@ -5620,6 +5952,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -5634,6 +5967,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5646,6 +5980,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5658,6 +5993,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -5675,6 +6011,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -5690,6 +6027,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -5707,6 +6045,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.8" @@ -5717,6 +6056,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5728,18 +6068,21 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "license": "MIT", "dependencies": { "leven": "^2.1.0", "minimist": "^1.1.0" @@ -5750,15 +6093,11 @@ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, "node_modules/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", @@ -5766,6 +6105,7 @@ "engines": [ "node >= 6.0" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5778,6 +6118,7 @@ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -5793,6 +6134,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5802,6 +6144,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5811,6 +6154,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -5828,13 +6172,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -5847,6 +6193,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5856,6 +6203,7 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -5869,6 +6217,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5877,13 +6226,15 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5893,6 +6244,7 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.6.0" } @@ -5902,6 +6254,7 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "dev": true, + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -5919,6 +6272,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5933,6 +6287,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", @@ -5949,6 +6304,7 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -5960,13 +6316,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } @@ -5975,6 +6333,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -5991,13 +6350,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "clone": "^1.0.2" @@ -6011,6 +6372,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6020,6 +6382,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6030,6 +6393,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -6039,19 +6403,22 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6064,6 +6431,7 @@ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, + "license": "MIT", "dependencies": { "custom-event": "~1.0.0", "ent": "~2.2.0", @@ -6076,6 +6444,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -6095,13 +6464,15 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -6117,6 +6488,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -6131,6 +6503,7 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -6144,6 +6517,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", @@ -6155,25 +6529,29 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.395", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", - "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", - "dev": true + "version": "1.5.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz", + "integrity": "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6182,6 +6560,7 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -6191,6 +6570,7 @@ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.9.tgz", "integrity": "sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==", "dev": true, + "license": "MIT", "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", @@ -6212,6 +6592,7 @@ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -6221,6 +6602,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6234,6 +6616,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6243,6 +6626,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6255,6 +6639,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6264,6 +6649,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6285,6 +6671,7 @@ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -6298,6 +6685,7 @@ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6313,6 +6701,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -6325,6 +6714,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6334,6 +6724,7 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -6346,6 +6737,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6355,6 +6747,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6364,6 +6757,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -6377,6 +6771,7 @@ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6417,6 +6812,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6425,13 +6821,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6445,6 +6843,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6500,6 +6899,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6512,6 +6912,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.13" @@ -6542,6 +6943,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6558,6 +6960,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -6573,6 +6976,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -6582,6 +6986,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6594,6 +6999,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6605,27 +7011,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6642,6 +7033,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -6650,13 +7042,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6669,6 +7063,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -6686,6 +7081,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6699,6 +7095,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -6711,6 +7108,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -6723,6 +7121,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6732,6 +7131,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -6741,6 +7141,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6749,13 +7150,15 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "dev": true, + "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" }, @@ -6768,6 +7171,7 @@ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.0.0" } @@ -6776,13 +7180,15 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -6822,10 +7228,11 @@ } }, "node_modules/express-rate-limit": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.0.tgz", - "integrity": "sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.4.3", "ip-address": "^10.2.0" @@ -6844,31 +7251,36 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.4", @@ -6884,13 +7296,15 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -6900,6 +7314,7 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -6917,6 +7332,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -6929,6 +7345,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6941,6 +7358,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -6962,6 +7380,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6978,6 +7397,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6991,7 +7411,8 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.16.0", @@ -7004,6 +7425,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7018,6 +7440,7 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7027,6 +7450,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7036,6 +7460,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -7050,6 +7475,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -7060,7 +7486,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -7068,6 +7495,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7081,6 +7509,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7089,13 +7518,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -7105,6 +7536,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7114,6 +7546,7 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -7126,6 +7559,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -7150,6 +7584,7 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -7163,6 +7598,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "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", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7183,6 +7619,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7194,26 +7631,14 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7226,6 +7651,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -7241,6 +7667,7 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7252,19 +7679,22 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -7277,6 +7707,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7286,6 +7717,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7295,6 +7727,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7307,6 +7740,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -7322,6 +7756,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7333,16 +7768,18 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "license": "MIT", "dependencies": { "glob": "^7.1.6", "readable-stream": "^3.6.0" } }, "node_modules/hono": { - "version": "4.12.31", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.31.tgz", - "integrity": "sha512-zJIHFrl6bq3RDd2YusFNCDlM8qUprxKswyi/OPzPyzKDdyBXDqWx8bZlZ7R+saTdSTatUmb3O7K4SspGPaEOQg==", + "version": "4.12.32", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", + "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=16.9.0" } @@ -7352,6 +7789,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" }, @@ -7364,6 +7802,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -7372,7 +7811,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/htmlparser2": { "version": "10.1.0", @@ -7386,6 +7826,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -7398,6 +7839,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -7409,13 +7851,15 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -7436,6 +7880,7 @@ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -7450,6 +7895,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -7463,6 +7909,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -7476,6 +7923,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -7504,13 +7952,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -7520,6 +7970,7 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, + "license": "ISC", "dependencies": { "minimatch": "^10.0.3" }, @@ -7531,13 +7982,15 @@ "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7554,6 +8007,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -7563,6 +8017,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7572,6 +8027,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7580,22 +8036,25 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", + "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } @@ -7605,6 +8064,7 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -7614,6 +8074,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7626,6 +8087,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7635,6 +8097,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, + "license": "MIT", "dependencies": { "get-east-asian-width": "^1.3.1" }, @@ -7650,6 +8113,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -7662,6 +8126,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -7672,6 +8137,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -7681,6 +8147,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7689,13 +8156,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -7714,6 +8183,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -7727,6 +8197,7 @@ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -7738,13 +8209,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -7754,6 +8227,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -7770,6 +8244,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -7784,6 +8259,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -7798,6 +8274,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7807,6 +8284,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -7819,13 +8297,15 @@ "version": "4.6.1", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jose": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz", "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -7834,6 +8314,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -7843,7 +8324,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.3.0", @@ -7860,6 +8342,7 @@ "url": "https://github.com/sponsors/nodeca" } ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7872,6 +8355,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -7883,13 +8367,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "dev": true, + "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -7898,25 +8384,29 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -7928,13 +8418,15 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -7946,13 +8438,15 @@ "dev": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/karma": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, + "license": "MIT", "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -7991,6 +8485,7 @@ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, + "license": "MIT", "dependencies": { "which": "^1.2.1" } @@ -8000,6 +8495,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8012,6 +8508,7 @@ "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, + "license": "MIT", "dependencies": { "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-instrument": "^5.1.0", @@ -8024,27 +8521,12 @@ "node": ">=10.0.0" } }, - "node_modules/karma-coverage/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -8061,6 +8543,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8073,6 +8556,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -8082,6 +8566,7 @@ "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, + "license": "MIT", "dependencies": { "jasmine-core": "^4.1.0" }, @@ -8097,23 +8582,19 @@ "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", "dev": true, + "license": "MIT", "peerDependencies": { "jasmine-core": "^4.0.0 || ^5.0.0", "karma": "^6.0.0", "karma-jasmine": "^5.0.0" } }, - "node_modules/karma/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, "node_modules/karma/node_modules/body-parser": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", @@ -8133,21 +8614,12 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/karma/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -8172,6 +8644,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -8183,6 +8656,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8191,13 +8665,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/karma/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -8210,6 +8686,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -8222,6 +8699,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8231,6 +8709,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8240,6 +8719,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8249,6 +8729,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -8261,6 +8742,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8272,13 +8754,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/karma/node_modules/picomatch": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -8291,6 +8775,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -8306,6 +8791,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -8318,6 +8804,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -8327,6 +8814,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8341,6 +8829,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -8354,6 +8843,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8371,6 +8861,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -8389,6 +8880,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -8398,6 +8890,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -8406,6 +8899,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8415,6 +8909,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8428,6 +8923,7 @@ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", @@ -8445,6 +8941,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8457,6 +8954,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8468,13 +8966,15 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -8492,6 +8992,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -8507,6 +9008,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -8525,6 +9027,7 @@ "integrity": "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "@harperfast/extended-iterable": "^1.0.3", @@ -8552,6 +9055,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -8566,25 +9070,29 @@ "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^4.1.0", @@ -8602,6 +9110,7 @@ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", @@ -8621,6 +9130,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8633,6 +9143,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8645,6 +9156,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -8661,6 +9173,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -8678,6 +9191,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -8693,6 +9207,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -8710,6 +9225,7 @@ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -8726,6 +9242,7 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -8739,6 +9256,7 @@ "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^1.1.3", "loglevel": "^1.4.1" @@ -8749,6 +9267,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8758,6 +9277,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8767,6 +9287,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -8783,6 +9304,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -8792,6 +9314,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -8804,6 +9327,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -8813,6 +9337,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -8822,6 +9347,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -8832,6 +9358,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -8847,6 +9374,7 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", "dev": true, + "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", @@ -8870,17 +9398,23 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/merge-descriptors": { @@ -8888,6 +9422,7 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8900,6 +9435,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -8912,6 +9448,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8921,6 +9458,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, @@ -8937,6 +9475,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8947,6 +9486,7 @@ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8959,6 +9499,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" }, @@ -8973,6 +9514,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8982,6 +9524,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -8991,6 +9534,7 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -9003,6 +9547,7 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", @@ -9020,6 +9565,7 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "minipass": "^3.0.0" }, @@ -9032,6 +9578,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9043,13 +9590,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9062,6 +9611,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9073,13 +9623,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minipass-sized": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.1.2" }, @@ -9092,6 +9644,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -9104,6 +9657,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -9115,6 +9669,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", + "license": "MIT", "dependencies": { "commist": "^1.0.0", "concat-stream": "^2.0.0", @@ -9147,6 +9702,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/mqtt-browser/-/mqtt-browser-4.3.7.tgz", "integrity": "sha512-4pxHxa3avIILr2CXhTKlArVpATqfyTu4zr5u2PoUwzgw0GDr5dpzZ0pmPgZyOoQBVgrVDEboCzb/b1Q0yWOm7g==", + "license": "MIT", "dependencies": { "mqtt": "4.3.7" } @@ -9155,6 +9711,7 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "license": "MIT", "dependencies": { "bl": "^4.0.2", "debug": "^4.1.1", @@ -9165,6 +9722,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9175,13 +9733,15 @@ "node_modules/mqtt/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -9189,13 +9749,15 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/msgpackr": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", "dev": true, + "license": "MIT", "optional": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -9207,6 +9769,7 @@ "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "node-gyp-build-optional-packages": "5.2.2" @@ -9228,6 +9791,7 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9243,6 +9807,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9254,13 +9819,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9269,6 +9836,7 @@ "version": "16.4.2", "resolved": "https://registry.npmjs.org/ngx-mask/-/ngx-mask-16.4.2.tgz", "integrity": "sha512-mQjcsTpctGu6HYKLf6/gjEUvW65D+46xvPIMYz0BDZXqHXrqKVluHXR3KF++TNOfdLLXwW6SvuHWd91NZN/C1A==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -9282,6 +9850,7 @@ "version": "17.0.0", "resolved": "https://registry.npmjs.org/ngx-mqtt/-/ngx-mqtt-17.0.0.tgz", "integrity": "sha512-54wVMyDOZkpTZEs0rTMWPP1Yz+6q3rRnHzIBnpqnBkDcyMfNrti45C7ijwnEIaPDzQHMOqVrDgh/6C4ocPPLJQ==", + "license": "MIT", "dependencies": { "mqtt-browser": "4.3.7", "mqtt-packet": "^6.10.0", @@ -9297,6 +9866,7 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/node-gyp": { @@ -9304,6 +9874,7 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -9328,6 +9899,7 @@ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.1" @@ -9343,15 +9915,17 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } }, "node_modules/node-gyp/node_modules/undici": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", - "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.17" } @@ -9361,6 +9935,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, @@ -9376,6 +9951,7 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -9385,6 +9961,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^4.0.0" }, @@ -9400,6 +9977,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9409,6 +9987,7 @@ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "dev": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^5.0.0" }, @@ -9421,6 +10000,7 @@ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -9433,6 +10013,7 @@ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -9442,6 +10023,7 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "dev": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", @@ -9457,6 +10039,7 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "dev": true, + "license": "ISC", "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" @@ -9470,6 +10053,7 @@ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "dev": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", @@ -9485,6 +10069,7 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", @@ -9504,6 +10089,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -9515,6 +10101,7 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "license": "MIT", "dependencies": { "debug": "^4.3.1", "js-sdsl": "4.3.0" @@ -9525,6 +10112,7 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9534,6 +10122,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9546,6 +10135,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -9557,6 +10147,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -9566,6 +10157,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -9581,6 +10173,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -9598,6 +10191,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "bl": "^4.1.0", @@ -9622,6 +10216,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "restore-cursor": "^3.1.0" @@ -9635,6 +10230,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "mimic-fn": "^2.1.0" @@ -9651,6 +10247,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "onetime": "^5.1.0", @@ -9665,6 +10262,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/ordered-binary": { @@ -9672,6 +10270,7 @@ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/p-limit": { @@ -9679,6 +10278,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9694,6 +10294,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -9709,6 +10310,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9721,6 +10323,7 @@ "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz", "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", "dev": true, + "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", @@ -9752,6 +10355,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9763,6 +10367,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", "dependencies": { "entities": "^8.0.0" }, @@ -9775,6 +10380,7 @@ "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^6.0.0", "parse5": "^8.0.0", @@ -9789,6 +10395,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -9801,6 +10408,7 @@ "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", "dev": true, + "license": "MIT", "dependencies": { "parse5": "^8.0.0" }, @@ -9812,6 +10420,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", "engines": { "node": ">=20.19.0" }, @@ -9824,6 +10433,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9833,6 +10443,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9841,6 +10452,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9850,6 +10462,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9859,6 +10472,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -9875,6 +10489,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -9884,6 +10499,7 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -9893,13 +10509,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -9912,6 +10530,7 @@ "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.2.0.tgz", "integrity": "sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=20.x" }, @@ -9924,14 +10543,15 @@ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16.20.0" } }, "node_modules/postcss": { - "version": "8.5.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.22.tgz", - "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "dev": true, "funding": [ { @@ -9947,6 +10567,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", @@ -9960,7 +10581,8 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "7.0.1", @@ -9981,6 +10603,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "engines": { "node": ">=18.0" }, @@ -9993,6 +10616,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -10002,6 +10626,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -10017,6 +10642,7 @@ "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-13.0.0.tgz", "integrity": "sha512-P5K31qWgUOQCtJL/3tpvEe28KfP49qbr6MTVEXC7I2k7ci55bP3YDr+glhyCdhIzxGCVp2f8eobfQ5so52RIIA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^3.0.0", "common-tags": "^1.4.0", @@ -10040,6 +10666,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } @@ -10049,6 +10676,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -10070,6 +10698,7 @@ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -10084,13 +10713,15 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@types/eslint-visitor-keys": "^1.0.0", "@typescript-eslint/experimental-utils": "3.10.1", @@ -10119,6 +10750,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", "dev": true, + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -10132,6 +10764,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "3.10.1", "@typescript-eslint/visitor-keys": "3.10.1", @@ -10160,6 +10793,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -10176,6 +10810,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -10188,6 +10823,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -10204,32 +10840,18 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, - "node_modules/prettier-eslint/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/prettier-eslint/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/prettier-eslint/node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -10287,6 +10909,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -10300,6 +10923,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -10309,6 +10933,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } @@ -10318,6 +10943,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -10332,6 +10958,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -10341,6 +10968,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -10353,6 +10981,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -10362,6 +10991,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -10374,13 +11004,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prettier-eslint/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10393,6 +11025,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -10408,6 +11041,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10421,6 +11055,7 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -10433,6 +11068,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -10443,6 +11079,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -10455,6 +11092,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -10463,13 +11101,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/proc-log": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -10477,13 +11117,15 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -10493,6 +11135,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10505,6 +11148,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -10514,13 +11158,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.9" } @@ -10530,6 +11176,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" @@ -10559,13 +11206,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/range-parser": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" }, @@ -10579,6 +11228,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -10593,6 +11243,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10620,13 +11271,15 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -10637,13 +11290,15 @@ "node_modules/reinterval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", - "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", + "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10653,6 +11308,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10661,19 +11317,22 @@ "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10683,6 +11342,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" @@ -10699,6 +11359,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10707,7 +11368,8 @@ "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", @@ -10715,6 +11377,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -10730,6 +11393,7 @@ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.4.tgz", "integrity": "sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==", "dev": true, + "license": "MIT", "dependencies": { "@oxc-project/types": "=0.113.0", "@rolldown/pluginutils": "1.0.0-rc.4" @@ -10757,10 +11421,11 @@ } }, "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz", + "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.9" }, @@ -10772,31 +11437,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", + "@rollup/rollup-android-arm-eabi": "4.62.3", + "@rollup/rollup-android-arm64": "4.62.3", + "@rollup/rollup-darwin-arm64": "4.62.3", + "@rollup/rollup-darwin-x64": "4.62.3", + "@rollup/rollup-freebsd-arm64": "4.62.3", + "@rollup/rollup-freebsd-x64": "4.62.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", + "@rollup/rollup-linux-arm-musleabihf": "4.62.3", + "@rollup/rollup-linux-arm64-gnu": "4.62.3", + "@rollup/rollup-linux-arm64-musl": "4.62.3", + "@rollup/rollup-linux-loong64-gnu": "4.62.3", + "@rollup/rollup-linux-loong64-musl": "4.62.3", + "@rollup/rollup-linux-ppc64-gnu": "4.62.3", + "@rollup/rollup-linux-ppc64-musl": "4.62.3", + "@rollup/rollup-linux-riscv64-gnu": "4.62.3", + "@rollup/rollup-linux-riscv64-musl": "4.62.3", + "@rollup/rollup-linux-s390x-gnu": "4.62.3", + "@rollup/rollup-linux-x64-gnu": "4.62.3", + "@rollup/rollup-linux-x64-musl": "4.62.3", + "@rollup/rollup-openbsd-x64": "4.62.3", + "@rollup/rollup-openharmony-arm64": "4.62.3", + "@rollup/rollup-win32-arm64-msvc": "4.62.3", + "@rollup/rollup-win32-ia32-msvc": "4.62.3", + "@rollup/rollup-win32-x64-gnu": "4.62.3", + "@rollup/rollup-win32-x64-msvc": "4.62.3", "fsevents": "~2.3.2" } }, @@ -10805,6 +11470,7 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -10835,6 +11501,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -10843,6 +11510,7 @@ "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -10864,13 +11532,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10887,13 +11557,15 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sass": { "version": "1.97.3", "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -10914,6 +11586,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -10926,6 +11599,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", @@ -10952,6 +11626,7 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -10970,13 +11645,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10989,6 +11666,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10998,6 +11676,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", @@ -11017,6 +11696,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" @@ -11033,6 +11713,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11051,6 +11732,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -11070,6 +11752,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -11082,6 +11765,7 @@ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", @@ -11099,6 +11783,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" @@ -11115,6 +11800,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11127,6 +11813,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -11137,6 +11824,7 @@ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -11155,6 +11843,7 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.8.tgz", "integrity": "sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "~4.4.1", "ws": "~8.21.0" @@ -11165,6 +11854,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -11186,6 +11876,7 @@ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", "dev": true, + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" @@ -11199,6 +11890,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -11212,6 +11904,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11221,6 +11914,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -11233,6 +11927,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11242,6 +11937,7 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" @@ -11256,6 +11952,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -11270,6 +11967,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">= 8" @@ -11280,6 +11978,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -11289,6 +11988,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11299,6 +11999,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -11307,13 +12008,15 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -11323,12 +12026,14 @@ "version": "3.0.23", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } @@ -11337,13 +12042,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -11356,6 +12063,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11365,6 +12073,7 @@ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -11375,13 +12084,15 @@ "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" }, "node_modules/streamroller": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, + "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -11395,6 +12106,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -11404,6 +12116,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, + "license": "MIT", "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" @@ -11420,6 +12133,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11432,6 +12146,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -11447,6 +12162,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11459,6 +12175,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -11468,6 +12185,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11480,6 +12198,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11492,6 +12211,7 @@ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/core": "^0.3.6" }, @@ -11507,6 +12227,7 @@ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -11522,13 +12243,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -11538,6 +12261,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -11555,6 +12279,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11565,10 +12290,11 @@ } }, "node_modules/tar": { - "version": "7.5.21", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.21.tgz", - "integrity": "sha512-XdhtCvlMywwxpCW8YEq3lOXBJpUPTR2OHHcwLPO3HwsJqOHa2Ok/oJ7ruGzp+JrKoRPVCzJwAdEjqLW/vNRPHA==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -11585,6 +12311,7 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -11593,13 +12320,15 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -11616,6 +12345,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.14" } @@ -11625,6 +12355,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -11637,6 +12368,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -11646,6 +12378,7 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -11656,13 +12389,15 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -11677,13 +12412,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tuf-js": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", @@ -11698,6 +12435,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -11710,6 +12448,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -11722,6 +12461,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "dev": true, + "license": "MIT", "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", @@ -11740,6 +12480,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -11751,13 +12492,15 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11785,6 +12528,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "bin": { "ua-parser-js": "script/cli.js" }, @@ -11797,6 +12541,7 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "dev": true, + "license": "MIT", "engines": { "node": ">=20.18.1" } @@ -11805,13 +12550,15 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -11821,6 +12568,7 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11844,6 +12592,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -11860,6 +12609,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -11869,6 +12619,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -11876,13 +12627,15 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -11891,13 +12644,15 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "dev": true, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -11907,6 +12662,7 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11916,6 +12672,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", @@ -11990,6 +12747,7 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11999,6 +12757,7 @@ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz", "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "eslint-scope": "^5.0.0", @@ -12022,6 +12781,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -12034,6 +12794,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12047,6 +12808,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -12056,6 +12818,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -12070,6 +12833,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -12079,6 +12843,7 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12092,6 +12857,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "defaults": "^1.0.3" @@ -12102,6 +12868,7 @@ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/which": { @@ -12109,6 +12876,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -12124,6 +12892,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12133,6 +12902,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12146,13 +12916,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -12162,6 +12934,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12174,12 +12947,14 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { "version": "7.5.13", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -12200,6 +12975,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } @@ -12209,6 +12985,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -12217,13 +12994,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -12241,6 +13020,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, + "license": "ISC", "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -12250,6 +13030,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -12262,6 +13043,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12279,6 +13061,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, @@ -12294,6 +13077,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -12302,10 +13086,11 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -12318,6 +13103,7 @@ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -12330,6 +13116,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -12339,6 +13126,7 @@ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", "dev": true, + "license": "ISC", "peerDependencies": { "zod": "^3.25.28 || ^4" } @@ -12346,7 +13134,8 @@ "node_modules/zone.js": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", - "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==" + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT" } } } diff --git a/modules/ui/package.json b/modules/ui/package.json index 4686d03e4..44c02f0d2 100644 --- a/modules/ui/package.json +++ b/modules/ui/package.json @@ -14,7 +14,8 @@ "lint": "ng lint", "lint:fix": "ng lint --fix", "format": "npx prettier --check .", - "format:fix": "npx prettier --write ." + "format:fix": "npx prettier --write .", + "postinstall": "node -e \"const fs=require('fs');const p='node_modules/brace-expansion/dist/commonjs/index.js';if(fs.existsSync(p)&&!fs.readFileSync(p,'utf8').includes('module.exports=Object.assign'))fs.appendFileSync(p,'\\nmodule.exports=Object.assign(expand,exports);\\n')\"" }, "private": true, "dependencies": { @@ -65,5 +66,9 @@ "prettier": "^3.5.3", "prettier-eslint": "^13.0.0", "typescript": "~5.9.3" + }, + "overrides": { + "brace-expansion": "^5.0.8", + "@hono/node-server": "^2.0.5" } } From a621829fae8dc76a3b7f107467dd47a08a3d4d1b Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Tue, 28 Jul 2026 07:32:12 +0000 Subject: [PATCH 034/196] TLS test text should be updated in case nothing was detected (#1607) * Fix TLS 1.3 server validation bug and change undetected TLS message to "No outbound TLS connections detected" --- modules/test/tls/python/src/tls_module.py | 29 +++++++----- testing/unit/tls/tls_module_test.py | 54 ++++++++++++++++++++--- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/modules/test/tls/python/src/tls_module.py b/modules/test/tls/python/src/tls_module.py index 9b989eb3c..77a0a7b5c 100644 --- a/modules/test/tls/python/src/tls_module.py +++ b/modules/test/tls/python/src/tls_module.py @@ -437,8 +437,8 @@ def _security_tls_v1_2_server(self): # Determine results and return proper messaging and details if result is None: result = 'Feature Not Detected' - description = 'TLS 1.2 certificate could not be validated' - details.append('TLS 1.2 certificate could not be validated.') + description = 'No outbound TLS connections detected' + details.append('No outbound TLS connections detected.') elif result: ports_csv = ','.join(map(str,ports_valid)) description = f'TLS 1.2 certificate valid on ports: {ports_csv}' @@ -468,13 +468,21 @@ def _security_tls_v1_3_server(self): for port, service_type in self._scan_results.items(): if 'HTTPS' in service_type: LOGGER.info(f'Inspecting Service on port {port}: {service_type}') - port_results = self._tls_util.validate_tls_server( - self._device_ipv4_addr, tls_version='1.3', port=port) - if port_results is not None: - result = port_results[ - 0] if result is None else result and port_results[0] - details.extend(port_results[1]) - if port_results[0]: + tls_1_3_results = self._tls_util.validate_tls_server( + host=self._device_ipv4_addr, port=port, tls_version='1.3') + if tls_1_3_results[0] is not None: + if result is None: + result = tls_1_3_results[0] + else: + result = result and tls_1_3_results[0] + status_str = '' if tls_1_3_results[0] else 'not ' + details.append( + f'TLS 1.3 {status_str}validated on port {port}:') + if isinstance(tls_1_3_results[1], list): + details.extend(tls_1_3_results[1]) + else: + details.append(tls_1_3_results[1]) + if tls_1_3_results[0]: ports_valid.append(port) else: ports_invalid.append(port) @@ -488,7 +496,8 @@ def _security_tls_v1_3_server(self): # Determine results and return proper messaging and details if result is None: result = 'Feature Not Detected' - description = 'TLS 1.3 certificate could not be validated' + description = 'No outbound TLS connections detected' + details.append('No outbound TLS connections detected.') elif result: ports_csv = ','.join(map(str,ports_valid)) description = f'TLS 1.3 certificate valid on ports: {ports_csv}' diff --git a/testing/unit/tls/tls_module_test.py b/testing/unit/tls/tls_module_test.py index fb2f6744b..3d622a9a7 100644 --- a/testing/unit/tls/tls_module_test.py +++ b/testing/unit/tls/tls_module_test.py @@ -97,8 +97,8 @@ def security_tls_v1_2_server_no_scan_results_test(self): result, description, details = self.tls_module._security_tls_v1_2_server() # pylint: disable=W0212 self.assertEqual(result, 'Feature Not Detected') - self.assertEqual(description, 'TLS 1.2 certificate could not be validated') - self.assertEqual(details, ['TLS 1.2 certificate could not be validated.']) + self.assertEqual(description, 'No outbound TLS connections detected') + self.assertEqual(details, ['No outbound TLS connections detected.']) def security_tls_v1_2_server_scan_failure_test(self): """Tests _security_tls_v1_2_server when scan fails""" @@ -108,8 +108,8 @@ def security_tls_v1_2_server_scan_failure_test(self): result, description, details = self.tls_module._security_tls_v1_2_server() # pylint: disable=W0212 self.assertEqual(result, 'Feature Not Detected') - self.assertEqual(description, 'TLS 1.2 certificate could not be validated') - self.assertEqual(details, ['TLS 1.2 certificate could not be validated.']) + self.assertEqual(description, 'No outbound TLS connections detected') + self.assertEqual(details, ['No outbound TLS connections detected.']) @patch('tls_module.TLSUtil.validate_tls_server') def security_tls_v1_2_server_no_tls_v1_3_test(self, mock_validate_tls_server): @@ -164,8 +164,8 @@ def validate_side_effect(**kwargs): result, description, details = self.tls_module._security_tls_v1_2_server() # pylint: disable=W0212 self.assertEqual(result, 'Feature Not Detected') - self.assertEqual(description, 'TLS 1.2 certificate could not be validated') - self.assertEqual(details, ['TLS 1.2 certificate could not be validated.']) + self.assertEqual(description, 'No outbound TLS connections detected') + self.assertEqual(details, ['No outbound TLS connections detected.']) @patch('tls_module.TLSUtil.validate_tls_server') def security_tls_v1_2_server_invalid_v1_2_cert_test(self, @@ -479,6 +479,44 @@ def security_tls_v1_3_server_test(self): test_results = TLS_UTIL.validate_tls_server('google.com', tls_version='1.3') self.assertTrue(test_results[0]) + def security_tls_v1_3_server_no_scan_results_test(self): + """Tests _security_tls_v1_3_server when scan finds no HTTP/HTTPS ports""" + + self.tls_module._device_ipv4_addr = '10.10.10.14' # pylint: disable=W0212 + self.tls_module._scan_results = {} # pylint: disable=W0212 + + result, description, details = self.tls_module._security_tls_v1_3_server() # pylint: disable=W0212 + + self.assertEqual(result, 'Feature Not Detected') + self.assertEqual(description, 'No outbound TLS connections detected') + self.assertEqual(details, ['No outbound TLS connections detected.']) + + @patch('tls_module.TLSUtil.validate_tls_server') + def security_tls_v1_3_server_no_tls_v1_3_test(self, mock_validate_tls_server): + """Test _security_tls_v1_3_server when TLS 1.3 is not supported""" + + self.tls_module._device_ipv4_addr = '10.10.10.14' # pylint: disable=W0212 + self.tls_module._scan_results = {443 : 'HTTPS'} # pylint: disable=W0212 + + # Mock the result of validate_tls_server from TLSUtil + def validate_side_effect(**kwargs): + tls_version = kwargs.get('tls_version') + if tls_version == '1.3': + return (None, ['Failed to resolve public certificate']) + elif tls_version == '1.2': + return (True, [ + 'Time range valid', + 'Public key valid', + 'Signature valid', + ]) + + mock_validate_tls_server.side_effect = validate_side_effect + result, description, details = self.tls_module._security_tls_v1_3_server() # pylint: disable=W0212 + + self.assertEqual(result, 'Feature Not Detected') + self.assertEqual(description, 'No outbound TLS connections detected') + self.assertEqual(details, ['No outbound TLS connections detected.']) + def security_tls_v1_2_client_test(self): test_results = self.test_client_tls('1.2') print(str(test_results)) @@ -902,6 +940,10 @@ def download_public_cert(self, hostname, port=443): # TLS 1.3 server tests suite.addTest(TLSModuleTest('security_tls_v1_3_server_test')) + suite.addTest( + TLSModuleTest('security_tls_v1_3_server_no_scan_results_test') + ) + suite.addTest(TLSModuleTest('security_tls_v1_3_server_no_tls_v1_3_test')) # TLS client tests suite.addTest(TLSModuleTest('security_tls_v1_2_client_test')) From 6d8b6ec22ca28bdcd5ff67c357509b722ad2c47b Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Tue, 28 Jul 2026 16:15:28 +0000 Subject: [PATCH 035/196] The error occurred on the old risk profile update (#1611) * Check profile path before the removal --- framework/python/src/core/session.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/framework/python/src/core/session.py b/framework/python/src/core/session.py index 035c1b28e..536ac394d 100644 --- a/framework/python/src/core/session.py +++ b/framework/python/src/core/session.py @@ -715,7 +715,15 @@ def update_profile(self, profile_json): old_name = profile_json.get('name') # Delete the original file - os.remove(os.path.join(PROFILES_DIR, old_name + '.json')) + old_file_path = os.path.join(PROFILES_DIR, old_name + '.json') + if os.path.exists(old_file_path): + try: + os.remove(old_file_path) + except OSError as e: + LOGGER.error( + f'An error occurred whilst deleting old profile file ' + f'{old_file_path}: {e}' + ) # Write file to disk with open(os.path.join(PROFILES_DIR, risk_profile.name + '.json'), From 3e6d33252264d7939f788f84a6c531c4ea7bcb0c Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 10:55:30 +0200 Subject: [PATCH 036/196] enable shellcheck --- .github/workflows/security.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 25a90dc8c..df013e9cd 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -77,7 +77,21 @@ jobs: exit-code: '1' ignore-unfixed: true severity: 'CRITICAL,HIGH' - + shellcheck_scan: + name: ShellCheck Bash Scan + runs-on: ubuntu-24.04 + steps: + - name: Checkout source + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Run Shellcheck + uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 #v2.0.0 + with: + ignore_paths: >- + node_modules + .venv + dist + build + severity: warning From 5dfaea6eec77423d9fdf638f5d0fb9cab9ca1525 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 12:53:24 +0200 Subject: [PATCH 037/196] remove dst port --- modules/test/tls/bin/get_ciphers.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/test/tls/bin/get_ciphers.sh b/modules/test/tls/bin/get_ciphers.sh index b05a70cc3..5766aed08 100755 --- a/modules/test/tls/bin/get_ciphers.sh +++ b/modules/test/tls/bin/get_ciphers.sh @@ -16,7 +16,6 @@ CAPTURE_FILE="$1" DST_IP="$2" -DST_PORT="$3" TSHARK_FILTER="ssl.handshake.ciphersuites and ip.dst==$DST_IP" response=$(tshark -r "$CAPTURE_FILE" -Y "$TSHARK_FILTER" -Vx | grep 'Cipher Suite:' | awk '{$1=$1};1' | sed 's/Cipher Suite: //') From 54431ae9a6321f2a03709ea9db1d76244c4d7f5f Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 12:55:57 +0200 Subject: [PATCH 038/196] fix windows svreated file --- .../test/tls/bin/get_handshake_complete.sh | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/modules/test/tls/bin/get_handshake_complete.sh b/modules/test/tls/bin/get_handshake_complete.sh index b36997f6d..9f359e22c 100755 --- a/modules/test/tls/bin/get_handshake_complete.sh +++ b/modules/test/tls/bin/get_handshake_complete.sh @@ -1,39 +1,39 @@ -#!/bin/bash - -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -CAPTURE_FILE="$1" -SRC_IP="$2" -DST_IP="$3" -TLS_VERSION="$4" - -TSHARK_FILTER="ip.src==$SRC_IP and ip.dst==$DST_IP" - -if [[ $TLS_VERSION == '1.0' ]]; then - TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.type==14" -elif [[ $TLS_VERSION == '1.1' ]]; then - TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.type==14" -elif [[ $TLS_VERSION == '1.2' || -z $TLS_VERSION ]]; then - TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.type==14" -elif [[ $TLS_VERSION == '1.3' ]]; then - TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.extensions.supported_version==0x0304" -else - echo "Unsupported TLS version: $TLS_VERSION" - exit 1 -fi - -response=$(tshark -r "$CAPTURE_FILE" $TSHARK_FILTER) - -echo "$response" +#!/bin/bash + +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +CAPTURE_FILE="$1" +SRC_IP="$2" +DST_IP="$3" +TLS_VERSION="$4" + +TSHARK_FILTER="ip.src==$SRC_IP and ip.dst==$DST_IP" + +if [[ $TLS_VERSION == '1.0' ]]; then + TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.type==14" +elif [[ $TLS_VERSION == '1.1' ]]; then + TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.type==14" +elif [[ $TLS_VERSION == '1.2' || -z $TLS_VERSION ]]; then + TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.type==14" +elif [[ $TLS_VERSION == '1.3' ]]; then + TSHARK_FILTER=$TSHARK_FILTER "and ssl.handshake.type==2 and tls.handshake.extensions.supported_version==0x0304" +else + echo "Unsupported TLS version: $TLS_VERSION" + exit 1 +fi + +response=$(tshark -r "$CAPTURE_FILE" $TSHARK_FILTER) + +echo "$response" From d36c4328a1b6d0cbf900ceba6032ca7709fefff9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 12:57:27 +0200 Subject: [PATCH 039/196] fix get_packets_count --- modules/test/conn/bin/get_packet_counts.sh | 104 ++++++++++----------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/modules/test/conn/bin/get_packet_counts.sh b/modules/test/conn/bin/get_packet_counts.sh index fab933a08..aefb10804 100644 --- a/modules/test/conn/bin/get_packet_counts.sh +++ b/modules/test/conn/bin/get_packet_counts.sh @@ -1,52 +1,52 @@ -#!/bin/bash - -# Check if MAC address and pcap file arguments are provided -if [ -z "$1" ] || [ -z "$2" ]; then - echo "Usage: $0 " - exit 1 -fi - -# Assign MAC address and pcap file from arguments -PCAP_FILE="$1" -MAC_ADDRESS="$2" - -# Check if the pcap file exists -if [ ! -f "$PCAP_FILE" ]; then - echo "Error: File $PCAP_FILE does not exist." - exit 1 -fi - -# Count multicast packets from the MAC address -multicast_from_count=$(tshark -r "$PCAP_FILE" -Y "(eth.dst[0] == 1) && eth.src == $MAC_ADDRESS" -T fields -e frame.number | wc -l) - -# Count multicast packets to the MAC address -multicast_to_count=$(tshark -r "$PCAP_FILE" -Y "(eth.dst[0] == 1) && eth.dst == $MAC_ADDRESS" -T fields -e frame.number | wc -l) - -# Count broadcast packets from the MAC address (broadcast MAC address is FF:FF:FF:FF:FF:FF) -broadcast_from_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst == ff:ff:ff:ff:ff:ff && eth.src == $MAC_ADDRESS" -T fields -e frame.number | wc -l) - -# Count broadcast packets to the MAC address -broadcast_to_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst == ff:ff:ff:ff:ff:ff && eth.dst == $MAC_ADDRESS" -T fields -e frame.number | wc -l) - -# Count unicast packets from the MAC address -unicast_from_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst != ff:ff:ff:ff:ff:ff && (eth.dst[0] & 1) == 0 && eth.src == $MAC_ADDRESS" -T fields -e frame.number | wc -l) - -# Count unicast packets to the MAC address -unicast_to_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst != ff:ff:ff:ff:ff:ff && (eth.dst[0] & 1) == 0 && eth.dst == $MAC_ADDRESS" -T fields -e frame.number | wc -l) - -# Output the results as a JSON object -echo "{ - \"mac_address\": \"$MAC_ADDRESS\", - \"multicast\": { - \"from\": $multicast_from_count, - \"to\": $multicast_to_count - }, - \"broadcast\": { - \"from\": $broadcast_from_count, - \"to\": $broadcast_to_count - }, - \"unicast\": { - \"from\": $unicast_from_count, - \"to\": $unicast_to_count - } -}" +#!/bin/bash + +# Check if MAC address and pcap file arguments are provided +if [ -z "$1" ] || [ -z "$2" ]; then + echo "Usage: $0 " + exit 1 +fi + +# Assign MAC address and pcap file from arguments +PCAP_FILE="$1" +MAC_ADDRESS="$2" + +# Check if the pcap file exists +if [ ! -f "$PCAP_FILE" ]; then + echo "Error: File $PCAP_FILE does not exist." + exit 1 +fi + +# Count multicast packets from the MAC address +multicast_from_count=$(tshark -r "$PCAP_FILE" -Y "(eth.dst[0] == 1) && eth.src == $MAC_ADDRESS" -T fields -e frame.number | wc -l) + +# Count multicast packets to the MAC address +multicast_to_count=$(tshark -r "$PCAP_FILE" -Y "(eth.dst[0] == 1) && eth.dst == $MAC_ADDRESS" -T fields -e frame.number | wc -l) + +# Count broadcast packets from the MAC address (broadcast MAC address is FF:FF:FF:FF:FF:FF) +broadcast_from_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst == ff:ff:ff:ff:ff:ff && eth.src == $MAC_ADDRESS" -T fields -e frame.number | wc -l) + +# Count broadcast packets to the MAC address +broadcast_to_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst == ff:ff:ff:ff:ff:ff && eth.dst == $MAC_ADDRESS" -T fields -e frame.number | wc -l) + +# Count unicast packets from the MAC address +unicast_from_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst != ff:ff:ff:ff:ff:ff && (eth.dst[0] & 1) == 0 && eth.src == $MAC_ADDRESS" -T fields -e frame.number | wc -l) + +# Count unicast packets to the MAC address +unicast_to_count=$(tshark -r "$PCAP_FILE" -Y "eth.dst != ff:ff:ff:ff:ff:ff && (eth.dst[0] & 1) == 0 && eth.dst == $MAC_ADDRESS" -T fields -e frame.number | wc -l) + +# Output the results as a JSON object +echo "{ + \"mac_address\": \"$MAC_ADDRESS\", + \"multicast\": { + \"from\": $multicast_from_count, + \"to\": $multicast_to_count + }, + \"broadcast\": { + \"from\": $broadcast_from_count, + \"to\": $broadcast_to_count + }, + \"unicast\": { + \"from\": $unicast_from_count, + \"to\": $unicast_to_count + } +}" From 8aa4100cb6bd2f2349ebed29c22e6fd12578b438 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 19:36:52 +0200 Subject: [PATCH 040/196] refactor entrypoint.sh --- testing/docker/ci_baseline/entrypoint.sh | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/testing/docker/ci_baseline/entrypoint.sh b/testing/docker/ci_baseline/entrypoint.sh index ab43f0dd0..2df94927c 100755 --- a/testing/docker/ci_baseline/entrypoint.sh +++ b/testing/docker/ci_baseline/entrypoint.sh @@ -22,9 +22,9 @@ DNS_SERVER=10.10.10.4 function wout(){ temp=${1//./\".\"} key=${temp:1}\" - echo $key + echo "$key" value=$2 - jq "$key+=\"$value\"" $OUT | sponge $OUT + jq "$key+=\"$value\"" "$OUT" | sponge "$OUT" } @@ -33,9 +33,9 @@ dig @8.8.8.8 +short www.google.com # DHCP ip addr flush dev eth0 PID_FILE=/var/run/dhclient.pid -if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true - rm -f $PID_FILE +if [ -f "$PID_FILE" ]; then + kill -9 "$(cat "$PID_FILE")" || true + rm -f "$PID_FILE" fi # Set MAC address to match the only_baseline @@ -46,32 +46,32 @@ ip link set dev eth0 address $desired_mac dhclient -v eth0 -echo "{}" > $OUT +echo "{}" > "$OUT" # Gen network main_intf=$(ip route | grep '^default' | awk '{print $NF}') -wout .network.main_intf $main_intf -wout .network.gateway $(ip route | head -n 1 | awk '{print $3}') -wout .network.ipv4 $(ip a show $main_intf | grep "inet " | awk '{print $2}') -wout .network.ipv6 $(ip a show $main_intf | grep inet6 | awk '{print $2}') -wout .network.ethmac $(cat /sys/class/net/$main_intf/address) +wout .network.main_intf "$main_intf" +wout .network.gateway "$(ip route | head -n 1 | awk '{print $3}')" +wout .network.ipv4 "$(ip a show "$main_intf" | grep "inet " | awk '{print $2}')" +wout .network.ipv6 "$(ip a show "$main_intf" | grep inet6 | awk '{print $2}')" +wout .network.ethmac "$(cat /sys/class/net/"$main_intf"/address)" -wout .dns_response $(dig @$DNS_SERVER +short www.google.com | tail -1) -wout .ntp_offset $(ntpdate -q $NTP_SERVER | tail -1 | sed -E 's/.*offset ([-=0-9\.]*) sec/\1/') +wout .dns_response "$(dig @"$DNS_SERVER" +short www.google.com | tail -1)" +wout .ntp_offset "$(ntpdate -q "$NTP_SERVER" | tail -1 | sed -E 's/.*offset ([-=0-9\.]*) sec/\1/')" # INTERNET CONNECTION google_com_response=$(curl -LI http://www.google.com -o /dev/null -w '%{http_code}\n' -s) -wout .network.internet $google_com_response +wout .network.internet "$google_com_response" # DHCP LEASE -while read pre name value; do +while read -r pre name value; do if [[ $pre != option ]]; then continue; fi - wout .dhcp.$name $(echo "${value%;}" | tr -d '\"\\') + wout .dhcp."$name" "$(echo "${value%;}" | tr -d '\"\\')" done < <(grep -B 99 -m 1 "}" /var/lib/dhcp/dhclient.leases) -cat $OUT \ No newline at end of file +cat "$OUT" \ No newline at end of file From 4881d256ac0e111cbbb78c71e66c4e14fdf86165 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 20:04:53 +0200 Subject: [PATCH 041/196] fix ci_test_device/ntp_compliant --- testing/docker/ci_test_device1/ntp_compliant/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/docker/ci_test_device1/ntp_compliant/entrypoint.sh b/testing/docker/ci_test_device1/ntp_compliant/entrypoint.sh index e26701a85..2fd72413e 100755 --- a/testing/docker/ci_test_device1/ntp_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/ntp_compliant/entrypoint.sh @@ -11,7 +11,7 @@ INTF=eth0 ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat "$PID_FILE")" || true rm -f $PID_FILE fi dhclient -v $INTF From 9ce8e9bdd398c71320dbf1c823fcfc2371fcd222 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 20:21:15 +0200 Subject: [PATCH 042/196] refactor ci_test_device1 entrypoint.sh --- testing/docker/ci_test_device1/entrypoint.sh | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/testing/docker/ci_test_device1/entrypoint.sh b/testing/docker/ci_test_device1/entrypoint.sh index dee51d50e..72167619d 100755 --- a/testing/docker/ci_test_device1/entrypoint.sh +++ b/testing/docker/ci_test_device1/entrypoint.sh @@ -3,10 +3,10 @@ ip a declare -A options -for option in $*; do +for option in "$@"; do if [[ $option == *"="* ]]; then - k=$(echo $option | cut -d'=' -f1) - v=$(echo $option | cut -d'=' -f2) + k=$(echo "$option" | cut -d'=' -f1) + v=$(echo "$option" | cut -d'=' -f2) options[$k]=$v else options[$option]=$option @@ -15,14 +15,14 @@ done OUT=/out/testrun_ci.json -NTP_SERVER=10.10.10.5 +export NTP_SERVER=10.10.10.5 DNS_SERVER=10.10.10.4 INTF=eth0 function wout(){ temp=${1//./\".\"} - key=${temp:1}\" - echo $key + key="${temp:1}" + echo "$key" value=$2 jq "$key+=\"$value\"" $OUT | sponge $OUT } @@ -34,7 +34,7 @@ dig @8.8.8.8 +short www.google.com ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF @@ -94,12 +94,12 @@ fi # still testing - using fixed if [ -n "${options[ntpv4_dhcp]}" ]; then (while true; do - dhcp_ntp=$(fgrep NTPSERVERS= /run/ntpdate.dhcp) + dhcp_ntp=$(grep -F NTPSERVERS= /run/ntpdate.dhcp) if [ -n "${dhcp_ntp}" ]; then - ntp_server=`echo $dhcp_ntp | cut -d "'" -f 2` - echo NTP server from DHCP $ntp_server + ntp_server=$(echo "$dhcp_ntp" | cut -d "'" -f 2) + echo NTP server from DHCP "$ntp_server" fi - ntpdate -q -p 1 $ntp_server + ntpdate -q -p 1 "$ntp_server" sleep 5 done) & fi @@ -125,7 +125,7 @@ if [ -n "${options[kill_dhcp]}" ]; then echo killing DHCP ipv4=$(ip a show $INTF | grep "inet " | awk '{print $2}') pkill -f dhclient - ip addr change $ipv4 dev $INTF valid_lft forever preferred_lft forever + ip addr change "$ipv4" dev "$INTF" valid_lft forever preferred_lft forever fi if [ -n "${options[request_fixed]}" ]; then From fec92b97c35edf38a7b08793cdddb9c66270ee61 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 21:07:55 +0200 Subject: [PATCH 043/196] fix bacnet services scripts --- testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh | 2 +- testing/docker/ci_test_device1/services_compliant/entrypoint.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh b/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh index 7983a44b0..88b504a89 100755 --- a/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh @@ -17,7 +17,7 @@ DHCP_TPID=$! echo $DHCP_TPID # Start BACnet device -exec python3 /entrypoint.py +python3 /entrypoint.py # Keep network monitoring (can refactor later for other network modules) (while true; do arping 10.10.10.1; sleep 10; done) & diff --git a/testing/docker/ci_test_device1/services_compliant/entrypoint.sh b/testing/docker/ci_test_device1/services_compliant/entrypoint.sh index 86e669748..087f0be8c 100755 --- a/testing/docker/ci_test_device1/services_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/services_compliant/entrypoint.sh @@ -10,7 +10,7 @@ INTF=eth0 ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF From b2d2ca982c234ad49070954b2afd692821ced94f Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 21:18:31 +0200 Subject: [PATCH 044/196] fix service_non_compliant bash script --- .../bacnet_compliant/entrypoint.sh | 2 +- .../services_non_compliant/entrypoint.sh | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh b/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh index 88b504a89..1b149506f 100755 --- a/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/bacnet_compliant/entrypoint.sh @@ -9,7 +9,7 @@ INTF=eth0 ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF diff --git a/testing/docker/ci_test_device1/services_non_compliant/entrypoint.sh b/testing/docker/ci_test_device1/services_non_compliant/entrypoint.sh index b9f155c47..4ab996330 100755 --- a/testing/docker/ci_test_device1/services_non_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/services_non_compliant/entrypoint.sh @@ -13,7 +13,7 @@ ip link show $INTF | grep "state UP" || echo "Warning: $INTF is not up" ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF @@ -24,45 +24,45 @@ echo $DHCP_TPID # Start FTP service echo "Starting FTP on ports 20, 21" -(while true; do nc -l -p 20 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & -(while true; do nc -l -p 21 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 20 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & +(while true; do nc -l -p 21 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start Telnet service echo "Starting Telnet on port 23" -(while true; do nc -l -p 23 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 23 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start SMTP service echo "Starting SMTP on ports 25, 465, and 587" -(while true; do nc -l -p 25 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & -(while true; do nc -l -p 465 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & -(while true; do nc -l -p 587 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 25 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & +(while true; do nc -l -p 465 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & +(while true; do nc -l -p 587 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start HTTP service echo "Starting HTTP on port 80 " -(while true; do nc -l -p 80 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 80 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start POP service echo "Starting POP on ports 109 and 110 " -(while true; do nc -l -p 109 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & -(while true; do nc -l -p 110 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 109 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & +(while true; do nc -l -p 110 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start IMAP service echo "Starting IMAP on port 143 " -(while true; do nc -l -p 143 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 143 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start IMAP service echo "Starting IMAP on port 143 " -(while true; do nc -l -p 123 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 123 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start SNMPv2 service echo "Starting SNMPv2 on ports 161/162 " -(while true; do nc -l -p 161 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & -(while true; do nc -l -p 162 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 161 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & +(while true; do nc -l -p 162 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start TFTP service echo "Starting TFTP on port 69 " -(while true; do nc -l -p 69 < /dev/null | tee /dev/stderr | echo 'Hello TCP!' ; done) & +(while true; do nc -l -p 69 < /dev/null | tee /dev/stderr | cat <(echo 'Hello TCP!') ; done) & # Start NTP service echo "Starting NTP service" From c1dbac1490f1b4894c124cef6b0aca8b27624c7b Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 21:41:19 +0200 Subject: [PATCH 045/196] dns compliant non-compliant bash scripts --- testing/docker/ci_test_device1/dns_compliant/entrypoint.sh | 2 +- testing/docker/ci_test_device1/dns_non_compliant/entrypoint.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/docker/ci_test_device1/dns_compliant/entrypoint.sh b/testing/docker/ci_test_device1/dns_compliant/entrypoint.sh index 669f6d5e6..79a411352 100755 --- a/testing/docker/ci_test_device1/dns_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/dns_compliant/entrypoint.sh @@ -11,7 +11,7 @@ INTF=eth0 ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF diff --git a/testing/docker/ci_test_device1/dns_non_compliant/entrypoint.sh b/testing/docker/ci_test_device1/dns_non_compliant/entrypoint.sh index 4a2781dc6..5e975a144 100755 --- a/testing/docker/ci_test_device1/dns_non_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/dns_non_compliant/entrypoint.sh @@ -14,7 +14,7 @@ ip link show $INTF | grep "state UP" || echo "Warning: $INTF is not up" ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF From 38c3764629dd411227140c94dd72c43820c87f14 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 21:42:26 +0200 Subject: [PATCH 046/196] protocol compliant bash script --- .../docker/ci_test_device1/protocol_compliant/entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/docker/ci_test_device1/protocol_compliant/entrypoint.sh b/testing/docker/ci_test_device1/protocol_compliant/entrypoint.sh index 7983a44b0..1b149506f 100755 --- a/testing/docker/ci_test_device1/protocol_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/protocol_compliant/entrypoint.sh @@ -9,7 +9,7 @@ INTF=eth0 ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF @@ -17,7 +17,7 @@ DHCP_TPID=$! echo $DHCP_TPID # Start BACnet device -exec python3 /entrypoint.py +python3 /entrypoint.py # Keep network monitoring (can refactor later for other network modules) (while true; do arping 10.10.10.1; sleep 10; done) & From 57d0f0da11d7cd0e488ebc4664cefc60561d2adc Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 21:44:57 +0200 Subject: [PATCH 047/196] ntp_non_compliant bash script --- .../docker/ci_test_device1/ntp_non_compliant/entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing/docker/ci_test_device1/ntp_non_compliant/entrypoint.sh b/testing/docker/ci_test_device1/ntp_non_compliant/entrypoint.sh index 3ace1aca7..5cdb651fa 100755 --- a/testing/docker/ci_test_device1/ntp_non_compliant/entrypoint.sh +++ b/testing/docker/ci_test_device1/ntp_non_compliant/entrypoint.sh @@ -4,14 +4,14 @@ ip a # Set paths and servers -NTP_SERVER=10.10.10.5 +export NTP_SERVER=10.10.10.5 INTF=eth0 # DHCP ip addr flush dev $INTF PID_FILE=/var/run/dhclient.pid if [ -f $PID_FILE ]; then - kill -9 $(cat $PID_FILE) || true + kill -9 "$(cat $PID_FILE)" || true rm -f $PID_FILE fi dhclient -v $INTF From c19051d17db5a54288a9c10d033e35346cf3f2da Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 21:59:22 +0200 Subject: [PATCH 048/196] test_tests bash script --- testing/tests/test_tests | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/testing/tests/test_tests b/testing/tests/test_tests index d430f14c0..e19fb8403 100755 --- a/testing/tests/test_tests +++ b/testing/tests/test_tests @@ -30,7 +30,7 @@ TEST_CONTAINERS=( ) # Remove and recreate results directory -rm -rf $TEST_DIR/ +rm -rf "${TEST_DIR:?}/" mkdir -p $TEST_DIR # Setup requirements @@ -50,7 +50,7 @@ sudo /usr/share/openvswitch/scripts/ovs-ctl start # Build the Test Containers for container in "${TEST_CONTAINERS[@]}"; do - sudo docker build ./testing/docker/ci_test_device1/$container -t testrun/$container -f ./testing/docker/ci_test_device1/$container/Dockerfile + sudo docker build ./testing/docker/ci_test_device1/"$container" -t testrun/"$container" -f ./testing/docker/ci_test_device1/"$container"/Dockerfile done # Copy configuration to testrun @@ -65,15 +65,15 @@ for tester in $TESTERS; do # Log file paths testrun_log=$TEST_DIR/${tester}_testrun.log - device_log=$TEST_DIR/${tester}_device.log + export device_log=$TEST_DIR/${tester}_device.log # Extract details from JSON - image=$(jq -r .$tester.image $MATRIX) - ethmac=$(jq -r .$tester.ethmac $MATRIX) + image=$(jq -r ."$tester".image "$MATRIX") + ethmac=$(jq -r ."$tester".ethmac "$MATRIX") # Start the testrun - touch $testrun_log - sudo timeout 2400 bin/testrun --single-intf --no-ui --target $ethmac -fw 1.0 > $testrun_log 2>&1 & + touch "$testrun_log" + sudo timeout 2400 bin/testrun --single-intf --no-ui --target "$ethmac" -fw 1.0 | sudo tee "$testrun_log" 2>&1 & TPID=$! # Time to wait for testrun to be ready From c822e575004531f92df79e2ecca8383d3eacbcc9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 22:07:56 +0200 Subject: [PATCH 049/196] test_baseline script --- testing/baseline/test_baseline | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/baseline/test_baseline b/testing/baseline/test_baseline index 44a17d348..f4d3b60e4 100755 --- a/testing/baseline/test_baseline +++ b/testing/baseline/test_baseline @@ -40,7 +40,7 @@ sudo cp testing/baseline/system.json local/system.json # Copy device configs to testrun sudo cp -r testing/device_configs/* local/devices -sudo bin/testrun --single-intf --no-ui --target 02:42:aa:00:01:01 -fw 1.0 --validate > $TESTRUN_OUT 2>&1 & +sudo bin/testrun --single-intf --no-ui --target 02:42:aa:00:01:01 -fw 1.0 --validate | sudo tee $TESTRUN_OUT 2>&1 & TPID=$! # Time to wait for testrun to be ready From 6322a9decfb5ddddcec419f40e41ebd0191301da Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 22:10:18 +0200 Subject: [PATCH 050/196] package script --- cmd/package | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/package b/cmd/package index 8897e947e..b5e360cd9 100755 --- a/cmd/package +++ b/cmd/package @@ -28,7 +28,7 @@ if ! (id -nGz "$USER" | grep -qzxF "docker"); then exit 1 fi -MAKE_SRC_DIR=make +MAKE_SRC_DIR=$(make) MAKE_CONTROL_DIR=make/DEBIAN/control # Edit the version in make/DEBIAN/control @@ -41,7 +41,7 @@ echo Building package for testrun v${version} # Delete existing make files echo Cleaning up previous build files -rm -rf $MAKE_SRC_DIR/usr +rm -rf "${MAKE_SRC_DIR:?}/usr" # Copy testrun script to /bin mkdir -p $MAKE_SRC_DIR/bin From 237504ffbbd551661f244d4857274856266e2c35 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 22:15:11 +0200 Subject: [PATCH 051/196] install script --- cmd/install | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/install b/cmd/install index e7b0ca81a..5f2116bfa 100755 --- a/cmd/install +++ b/cmd/install @@ -18,10 +18,14 @@ echo Installing application dependencies # Collect command line arguments while getopts ":l" option; do - case $option in - l) # Install Testrun in local directory + case $option in + l) # Install Testrun in local directory TESTRUN_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")"/.. && pwd) - esac + ;; + *) + echo "Ignored unknown option: -${OPTARG:-$option}" >&2 + ;; + esac done # Check if TESTRUN_DIR has been set, otherwise install in /usr/local/testrun From 0fad704763d71ffbbea05a2de605429eb9c26337 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 22:16:14 +0200 Subject: [PATCH 052/196] build script --- cmd/build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/build b/cmd/build index 5d04e049b..0213b2610 100755 --- a/cmd/build +++ b/cmd/build @@ -17,7 +17,7 @@ # Check if Docker is installed if [[ $(which docker) && $(docker --version) ]]; then # Docker is installed - echo Using $(docker --version) + echo Using "$(docker --version)" else # Docker is not installed echo Docker is not installed. Please follow the Get Started guide at https://github.com/google/testrun From ffb63557b7ada6215fcbf69a321e69f06fa19497 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 22:18:51 +0200 Subject: [PATCH 053/196] testrun script --- bin/testrun | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bin/testrun b/bin/testrun index 079f8da7e..27f58efaa 100755 --- a/bin/testrun +++ b/bin/testrun @@ -27,10 +27,12 @@ sudo mkdir -p /var/run/netns FILE_PATH=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) # Check if Testrun was installed as a package -if [ $FILE_PATH == "/usr/bin" ] ; then - export TESTRUN_PATH="/usr/local/testrun" +if [ "$FILE_PATH" = "/usr/bin" ]; then + TESTRUN_PATH="/usr/local/testrun" + export TESTRUN_PATH else - export TESTRUN_PATH=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")"/.. && pwd) + TESTRUN_PATH=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")"/.. && pwd) + export TESTRUN_PATH fi cd $TESTRUN_PATH @@ -43,6 +45,6 @@ source venv/bin/activate # Set the PYTHONPATH to include the "src" directory export PYTHONPATH="$TESTRUN_PATH/framework/python/src" -python -u framework/python/src/core/test_runner.py $@ 2>&1 | tee testrun.log +python -u framework/python/src/core/test_runner.py "$@" 2>&1 | tee testrun.log deactivate \ No newline at end of file From e4a0f312e5a63ca877b636b61655c74a4dd86436 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 22:33:32 +0200 Subject: [PATCH 054/196] Revert "package script" This reverts commit ddb0a518d9bd06b088b89f4f70affb296e078382. --- cmd/package | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/package b/cmd/package index b5e360cd9..8897e947e 100755 --- a/cmd/package +++ b/cmd/package @@ -28,7 +28,7 @@ if ! (id -nGz "$USER" | grep -qzxF "docker"); then exit 1 fi -MAKE_SRC_DIR=$(make) +MAKE_SRC_DIR=make MAKE_CONTROL_DIR=make/DEBIAN/control # Edit the version in make/DEBIAN/control @@ -41,7 +41,7 @@ echo Building package for testrun v${version} # Delete existing make files echo Cleaning up previous build files -rm -rf "${MAKE_SRC_DIR:?}/usr" +rm -rf $MAKE_SRC_DIR/usr # Copy testrun script to /bin mkdir -p $MAKE_SRC_DIR/bin From 30aa47fbf5cc01dcd31a288ce4e83e3b8e101a09 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 23:47:22 +0200 Subject: [PATCH 055/196] package script command warning --- cmd/package | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/package b/cmd/package index 8897e947e..c3f4c69c1 100755 --- a/cmd/package +++ b/cmd/package @@ -28,7 +28,7 @@ if ! (id -nGz "$USER" | grep -qzxF "docker"); then exit 1 fi -MAKE_SRC_DIR=make +MAKE_SRC_DIR=$(make) MAKE_CONTROL_DIR=make/DEBIAN/control # Edit the version in make/DEBIAN/control From 562573df5644e0d11f4cdac3993525933bf2e807 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 27 Jul 2026 23:52:45 +0200 Subject: [PATCH 056/196] disable make check --- cmd/package | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/package b/cmd/package index c3f4c69c1..a0db11667 100755 --- a/cmd/package +++ b/cmd/package @@ -28,7 +28,8 @@ if ! (id -nGz "$USER" | grep -qzxF "docker"); then exit 1 fi -MAKE_SRC_DIR=$(make) +# shellcheck disable=SC2209 +MAKE_SRC_DIR=make MAKE_CONTROL_DIR=make/DEBIAN/control # Edit the version in make/DEBIAN/control @@ -41,7 +42,7 @@ echo Building package for testrun v${version} # Delete existing make files echo Cleaning up previous build files -rm -rf $MAKE_SRC_DIR/usr +rm -rf "${MAKE_SRC_DIR:?}/usr" # Copy testrun script to /bin mkdir -p $MAKE_SRC_DIR/bin From 77d986d14b3e5d35240ccac47ecd648a89ad47fd Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 17:17:39 +0200 Subject: [PATCH 057/196] enable semgrep --- .github/workflows/security.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index df013e9cd..a7881cdc1 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -92,6 +92,21 @@ jobs: dist build severity: warning + semgrep_scan: + name: Semgrep OSS SAST Scan + runs-on: ubuntu-24.04 + container: + image: semgrep/semgrep:1.169.0 + steps: + - name: Checkout source + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Run Semgrep Security Analiss + run: | + semgrep scan \ + --config=auto \ + --error \ + --exclude="**/testing/**" + --exclude="modules/ui/node_modules" From 36a8b099e4c43c6095b11d56b2b158c56ae06b4a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 17:57:07 +0200 Subject: [PATCH 058/196] exclude allow origins --- framework/python/src/api/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index 897d9a735..715a74e45 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -139,7 +139,7 @@ def __init__(self, testrun): methods=["POST"]) # Allow all origins to access the API - origins = ["*"] + origins = ["*"] # nosemgrep: python.fastapi.security.wildcard-cors.wildcard-cors # Scheduler for background periodic tasks self._scheduler = tasks.PeriodicTasks(self._testrun) From 718b569fad84be6d880137bae3e063a2995571a4 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 18:03:12 +0200 Subject: [PATCH 059/196] pylint --- framework/python/src/api/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index 715a74e45..fe1ac5bf2 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -139,7 +139,8 @@ def __init__(self, testrun): methods=["POST"]) # Allow all origins to access the API - origins = ["*"] # nosemgrep: python.fastapi.security.wildcard-cors.wildcard-cors + # nosemgrep: python.fastapi.security.wildcard-cors.wildcard-cors + origins = ["*"] # Scheduler for background periodic tasks self._scheduler = tasks.PeriodicTasks(self._testrun) From 260acf4d25f9077bccea40ae26fb01dc888a668d Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 18:10:28 +0200 Subject: [PATCH 060/196] move disable comment --- framework/python/src/api/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index fe1ac5bf2..e75f341f2 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -139,7 +139,6 @@ def __init__(self, testrun): methods=["POST"]) # Allow all origins to access the API - # nosemgrep: python.fastapi.security.wildcard-cors.wildcard-cors origins = ["*"] # Scheduler for background periodic tasks @@ -154,6 +153,7 @@ def __init__(self, testrun): # Attach CORS middleware self._app.add_middleware( CORSMiddleware, + # nosemgrep: python.fastapi.security.wildcard-cors.wildcard-cors allow_origins=origins, allow_credentials=True, allow_methods=["*"], From ae4889807125d8003f0d3f617dfe4553ed348ffb Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 21:41:25 +0200 Subject: [PATCH 061/196] disab;e semgrep for report template --- framework/python/src/common/testreport.py | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index 5ca78a1ad..f1503122a 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -303,6 +303,7 @@ def to_html(self): template_folder = os.path.join(current_test_pack.path, TEMPLATES_FOLDER) # Jinja template + # nosemgrep template_env = Environment( loader=FileSystemLoader( template_folder From 98f8d080992968aa90c2d6d12e9ca4c69bbe010e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 21:47:17 +0200 Subject: [PATCH 062/196] disable semgrep fot testreport --- framework/python/src/common/testreport.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index f1503122a..cc3d4dfbc 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -349,6 +349,7 @@ def to_html(self): steps_to_resolve_ = logic.get_steps_to_resolve(json_data) module_reports = self._module_reports + # nosemgrep env_module = Environment(loader=BaseLoader()) manufacturer_length = len(json_data['device']['manufacturer']) device_name_length = len(json_data['device']['model']) @@ -366,7 +367,7 @@ def to_html(self): version=self._version, ) for s in self._module_templates ] - + # nosemgrep return self._add_page_counter(template.render(styles=styles, logo=logo, icon=icon, From c54eadc3e451ffdbce1800bd7d89d692c0d769bf Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 22:09:21 +0200 Subject: [PATCH 063/196] add image prefix check --- framework/python/src/core/docker/docker_module.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/python/src/core/docker/docker_module.py b/framework/python/src/core/docker/docker_module.py index d91331aee..6202f17c4 100644 --- a/framework/python/src/core/docker/docker_module.py +++ b/framework/python/src/core/docker/docker_module.py @@ -155,6 +155,8 @@ def start(self, device=None): try: client = docker.from_env() + if not self.image_name.startswith(IMAGE_PREFIX): + raise ValueError(f'Untrusted container image: {self.image_name}') self.container = client.containers.run( self.image_name, auto_remove=True, From bfca8e379abf493905c2131f94a92eca925a500e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 22:16:42 +0200 Subject: [PATCH 064/196] nosemgrep --- framework/python/src/core/docker/docker_module.py | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/python/src/core/docker/docker_module.py b/framework/python/src/core/docker/docker_module.py index 6202f17c4..f7f79bf76 100644 --- a/framework/python/src/core/docker/docker_module.py +++ b/framework/python/src/core/docker/docker_module.py @@ -157,6 +157,7 @@ def start(self, device=None): client = docker.from_env() if not self.image_name.startswith(IMAGE_PREFIX): raise ValueError(f'Untrusted container image: {self.image_name}') + # nosemgrep self.container = client.containers.run( self.image_name, auto_remove=True, From e9c435817227cf2cfcfd32251593253754fe7f58 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 30 Jul 2026 22:29:14 +0200 Subject: [PATCH 065/196] pass container name positionally --- framework/python/src/core/testrun.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/python/src/core/testrun.py b/framework/python/src/core/testrun.py index c5dce3adb..3296939cb 100644 --- a/framework/python/src/core/testrun.py +++ b/framework/python/src/core/testrun.py @@ -597,7 +597,7 @@ def start_ui(self): client = docker.from_env() try: - client.containers.run(image='testrun/ui', + client.containers.run('testrun/ui', auto_remove=True, name='tr-ui', hostname='testrun.io', @@ -636,7 +636,7 @@ def start_ws(self): client = docker.from_env() try: - client.containers.run(image='testrun/ws', + client.containers.run('testrun/ws', auto_remove=True, name='tr-ws', detach=True, From 1a64c804b12dbf9ef91ca2e23ebe13557b789c16 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 11:13:40 +0200 Subject: [PATCH 066/196] refactor ci mac definition --- framework/python/src/net_orc/network_orchestrator.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/python/src/net_orc/network_orchestrator.py b/framework/python/src/net_orc/network_orchestrator.py index 4acd5f3c3..583925985 100644 --- a/framework/python/src/net_orc/network_orchestrator.py +++ b/framework/python/src/net_orc/network_orchestrator.py @@ -367,9 +367,12 @@ def _ci_pre_network_create(self): network creation and flushes internet interface """ LOGGER.info('Pre network create') - self._ethmac = subprocess.check_output( - f'cat /sys/class/net/{self._session.get_internet_interface()}/address', - shell=True).decode('utf-8').strip() + iface = self._session.get_internet_interface() + try: + with open(f'/sys/class/net/{iface}/address', 'r', encoding='utf-8') as f: + self._ethmac = f.read().strip() + except OSError: + self._ethmac = '' self._gateway = subprocess.check_output( 'ip route | head -n 1 | awk \'{print $3}\'', shell=True).decode('utf-8').strip() From b13c6d441becb4ba094eb84d3737b938e35bc477 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 12:08:15 +0200 Subject: [PATCH 067/196] refactor gateway definition --- framework/python/src/net_orc/network_orchestrator.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/framework/python/src/net_orc/network_orchestrator.py b/framework/python/src/net_orc/network_orchestrator.py index 583925985..2e31b6129 100644 --- a/framework/python/src/net_orc/network_orchestrator.py +++ b/framework/python/src/net_orc/network_orchestrator.py @@ -376,6 +376,15 @@ def _ci_pre_network_create(self): self._gateway = subprocess.check_output( 'ip route | head -n 1 | awk \'{print $3}\'', shell=True).decode('utf-8').strip() + self._gateway = '' + try: + route_output = subprocess.check_output(['ip', 'route']).decode('utf-8') + first_line = route_output.strip().splitlines()[0] + parts = first_line.split() + if len(parts) >= 3: + self._gateway = parts[2] + except (subprocess.SubprocessError, IndexError): + pass self._ipv4 = subprocess.check_output( (f'ip a show {self._session.get_internet_interface()} | ' + 'grep \"inet \" | awk \'{{print $2}}\''), From e4c8b65332875144aa174c4e13ce10b141d44be3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 14:21:47 +0200 Subject: [PATCH 068/196] refactor ip definition --- .../src/net_orc/network_orchestrator.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/framework/python/src/net_orc/network_orchestrator.py b/framework/python/src/net_orc/network_orchestrator.py index 2e31b6129..f081931ac 100644 --- a/framework/python/src/net_orc/network_orchestrator.py +++ b/framework/python/src/net_orc/network_orchestrator.py @@ -384,19 +384,28 @@ def _ci_pre_network_create(self): if len(parts) >= 3: self._gateway = parts[2] except (subprocess.SubprocessError, IndexError): - pass - self._ipv4 = subprocess.check_output( - (f'ip a show {self._session.get_internet_interface()} | ' + - 'grep \"inet \" | awk \'{{print $2}}\''), - shell=True).decode('utf-8').strip() - self._ipv6 = subprocess.check_output( - (f'ip a show {self._session.get_internet_interface()} | grep inet6 | ' + - 'awk \'{{print $2}}\''), - shell=True).decode('utf-8').strip() - self._brd = subprocess.check_output( - (f'ip a show {self._session.get_internet_interface()} | grep \"inet \" ' - + '| awk \'{{print $4}}\''), - shell=True).decode('utf-8').strip() + pass + self._ipv4 = '' + self._ipv6 = '' + self._brd = '' + try: + ip_output = subprocess.check_output( + ['ip', 'a', 'show', iface] + ).decode('utf-8') + for line in ip_output.splitlines(): + line = line.strip() + if line.startswith('inet '): + parts = line.split() + if len(parts) >= 2: + self._ipv4 = parts[1] + if len(parts) >= 4: + self._brd = parts[3] + elif line.startswith('inet6 '): + parts = line.split() + if len(parts) >= 2: + self._ipv6 = parts[1] + except subprocess.SubprocessError: + pass def _ci_post_network_create(self): """ Restore network connection in CI environment """ From 924130bd89699a46e62a9bd7bfae59d84adfe6f6 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 14:40:25 +0200 Subject: [PATCH 069/196] disable semgrep --- framework/python/src/net_orc/network_validator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/python/src/net_orc/network_validator.py b/framework/python/src/net_orc/network_validator.py index 8ef700856..c4340f3ca 100644 --- a/framework/python/src/net_orc/network_validator.py +++ b/framework/python/src/net_orc/network_validator.py @@ -153,6 +153,7 @@ def _start_network_device(self, device): try: client = docker.from_env() + # nosemgrep device.container = client.containers.run( device.image_name, auto_remove=True, From 2994f9c1f65d6f264a2cb21d699893ad2243b8e0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 14:47:26 +0200 Subject: [PATCH 070/196] fix semgrep warning --- .../devices/faux-dev/python/src/dns_check.py | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/modules/devices/faux-dev/python/src/dns_check.py b/modules/devices/faux-dev/python/src/dns_check.py index 98dfd42e8..0b609e996 100644 --- a/modules/devices/faux-dev/python/src/dns_check.py +++ b/modules/devices/faux-dev/python/src/dns_check.py @@ -18,6 +18,7 @@ import time import util import subprocess +import shlex LOGGER = None LOG_NAME = 'dns_validator' @@ -98,16 +99,24 @@ def _exec_tcpdump(self, tcpdump_filter): Returns List of packets matching the filter """ - command = f'tcpdump -tttt -n -r {CAPTURE_FILE} {tcpdump_filter}' - - LOGGER.debug('tcpdump command: ' + command) - - with subprocess.Popen(command, - universal_newlines=True, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) as process: - text = str(process.stdout.read()).rstrip() + command = ['tcpdump', '-tttt', '-n', '-r', CAPTURE_FILE] + + # If tcpdump_filter contains multiple space-separated flags or expressions, + # split it into individual arguments safely + if isinstance(tcpdump_filter, str): + command.extend(shlex.split(tcpdump_filter)) + elif isinstance(tcpdump_filter, list): + command.extend(tcpdump_filter) + + LOGGER.debug('tcpdump command: ' + ' '.join(command)) + with subprocess.Popen( + command, + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) as process: + stdout, _ = process.communicate() + text = stdout.rstrip() LOGGER.debug('tcpdump response: ' + text) From 54d0f2de87fc86469ed4475d5a8f6b222c3025fe Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 14:57:46 +0200 Subject: [PATCH 071/196] fix not user cpecifying warning --- modules/test/base/base.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/base/base.Dockerfile b/modules/test/base/base.Dockerfile index 5a4ad801a..0f7cb6524 100644 --- a/modules/test/base/base.Dockerfile +++ b/modules/test/base/base.Dockerfile @@ -122,4 +122,4 @@ COPY resources/report/$CSS_FILE $REPORT_TEMPLATE_PATH/ COPY resources/report/$LOGO_FILE $REPORT_TEMPLATE_PATH/ # Start the test module -ENTRYPOINT [ "/testrun/bin/start" ] \ No newline at end of file +USER non-root ENTRYPOINT [ "/testrun/bin/start" ] \ No newline at end of file From e38be09d1e4fa971e11c0333a242c17c41741f31 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 15:07:09 +0200 Subject: [PATCH 072/196] Revert "fix not user cpecifying warning" This reverts commit 10e4587abff6d8fa264de64f61859a288852a60b. --- modules/test/base/base.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/base/base.Dockerfile b/modules/test/base/base.Dockerfile index 0f7cb6524..5a4ad801a 100644 --- a/modules/test/base/base.Dockerfile +++ b/modules/test/base/base.Dockerfile @@ -122,4 +122,4 @@ COPY resources/report/$CSS_FILE $REPORT_TEMPLATE_PATH/ COPY resources/report/$LOGO_FILE $REPORT_TEMPLATE_PATH/ # Start the test module -USER non-root ENTRYPOINT [ "/testrun/bin/start" ] \ No newline at end of file +ENTRYPOINT [ "/testrun/bin/start" ] \ No newline at end of file From 0a4de3e77af605c9e1c7fe25bee30fc7598a4bd8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 15:16:56 +0200 Subject: [PATCH 073/196] disable semgrep --- modules/network/base/base.Dockerfile | 1 + modules/test/base/base.Dockerfile | 1 + modules/ui/ui.Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/modules/network/base/base.Dockerfile b/modules/network/base/base.Dockerfile index 82b35bc64..cacc3e6f6 100644 --- a/modules/network/base/base.Dockerfile +++ b/modules/network/base/base.Dockerfile @@ -55,4 +55,5 @@ RUN dos2unix /testrun/bin/* RUN chmod u+x /testrun/bin/* # Start the network module +#nosemgrep ENTRYPOINT [ "/testrun/bin/start_module" ] \ No newline at end of file diff --git a/modules/test/base/base.Dockerfile b/modules/test/base/base.Dockerfile index 5a4ad801a..384323a5d 100644 --- a/modules/test/base/base.Dockerfile +++ b/modules/test/base/base.Dockerfile @@ -122,4 +122,5 @@ COPY resources/report/$CSS_FILE $REPORT_TEMPLATE_PATH/ COPY resources/report/$LOGO_FILE $REPORT_TEMPLATE_PATH/ # Start the test module +#nosemgrep ENTRYPOINT [ "/testrun/bin/start" ] \ No newline at end of file diff --git a/modules/ui/ui.Dockerfile b/modules/ui/ui.Dockerfile index c6d691f12..5a8009c56 100644 --- a/modules/ui/ui.Dockerfile +++ b/modules/ui/ui.Dockerfile @@ -19,4 +19,5 @@ COPY modules/ui/dist/browser /usr/share/nginx/html EXPOSE 8080 +#nosemgrep CMD ["nginx", "-g", "daemon off;"] From 74f1ddfd9307db98bbab3f389b3533687d1b496a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 15:20:55 +0200 Subject: [PATCH 074/196] disable semgrep --- test_vm/python/src/modbus_server_non_compliant.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test_vm/python/src/modbus_server_non_compliant.py b/test_vm/python/src/modbus_server_non_compliant.py index 698d0ec85..4d2a5f6c5 100644 --- a/test_vm/python/src/modbus_server_non_compliant.py +++ b/test_vm/python/src/modbus_server_non_compliant.py @@ -38,6 +38,7 @@ def handle_request(conn, data): def run_server(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + #nosemgrep sock.bind(("0.0.0.0", MODBUS_PORT)) sock.listen(5) print(f"Modbus server started on port {MODBUS_PORT}") From bf301641b6d7c8078492c845fd67d8df135fdd78 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 15:22:24 +0200 Subject: [PATCH 075/196] disable semgrep --- test_vm/python/src/modbus_server_non_compliant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_vm/python/src/modbus_server_non_compliant.py b/test_vm/python/src/modbus_server_non_compliant.py index 4d2a5f6c5..5a3c157a7 100644 --- a/test_vm/python/src/modbus_server_non_compliant.py +++ b/test_vm/python/src/modbus_server_non_compliant.py @@ -36,9 +36,9 @@ def handle_request(conn, data): def run_server(): + #nosemgrep sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - #nosemgrep sock.bind(("0.0.0.0", MODBUS_PORT)) sock.listen(5) print(f"Modbus server started on port {MODBUS_PORT}") From 2d7ebeac3d08ef29c3ca95d7c1c02ee8ba320646 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 31 Jul 2026 15:25:53 +0200 Subject: [PATCH 076/196] fix secutiry file error --- .github/workflows/security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index a7881cdc1..df4bd9a75 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -105,7 +105,7 @@ jobs: semgrep scan \ --config=auto \ --error \ - --exclude="**/testing/**" + --exclude="**/testing/**" \ --exclude="modules/ui/node_modules" From 51db3f94db9128f5010a10efd4d789ec908c67e6 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Mon, 3 Aug 2026 08:54:48 +0000 Subject: [PATCH 077/196] Update dependencies (#1612) * Update dependencies --- framework/requirements.txt | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/framework/requirements.txt b/framework/requirements.txt index 6beedb9c2..ec31f17f8 100644 --- a/framework/requirements.txt +++ b/framework/requirements.txt @@ -1,5 +1,6 @@ # Requirements for the core module requests==2.33.0 +urllib3==2.7.0 # Requirements for the net_orc module docker==7.1.0 @@ -7,8 +8,8 @@ ipaddress==1.0.23 netifaces==0.11.0 scapy==2.7.0 -# Requirments for the test_orc module -weasyprint==68.0 +# Requirements for the test_orc module +weasyprint==69.0 pydyf==0.11.0 # Requirements for the API @@ -19,13 +20,12 @@ python-multipart==0.0.32 pydantic==2.10.0 # Requirements for testing -pytest==7.4.4 +pytest==9.0.3 pytest-timeout==2.2.0 responses==0.25.3 - # Requirements for the report -markdown==3.5.2 +markdown==3.8.1 # Requirements for the session cryptography==49.0.0 @@ -44,6 +44,12 @@ APScheduler==3.10.4 Jinja2==3.1.6 beautifulsoup4==4.12.3 html5lib==1.1 +lxml==6.1.0 + +# Timezone +tzlocal==5.4.3 -#timezone -tzlocal==5.4.3 \ No newline at end of file +# Security & dependency updates +idna==3.15 +aiohttp==3.14.1 +pyOpenSSL==26.3.0 \ No newline at end of file From 1486c7f9c5f3c390657d11b153f6b82b22def5be Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Mon, 3 Aug 2026 13:01:27 +0000 Subject: [PATCH 078/196] Adds new fields for metadata (#1615) * Adds new fields for metadata --- framework/python/src/api/api.py | 1 + framework/python/src/common/device.py | 8 ++++ framework/python/src/common/testreport.py | 31 ++++++++++++++++ framework/python/src/core/testrun.py | 3 ++ .../python/src/test_orc/test_orchestrator.py | 5 +++ testing/unit/report/report_test.py | 37 +++++++++++++++++++ 6 files changed, 85 insertions(+) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index e75f341f2..466639a2d 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -454,6 +454,7 @@ async def get_reports(self): "model": report["device"].get("model"), "mac_addr": report["device"].get("mac_addr"), "firmware": report["device"].get("firmware"), + "kernel": report["device"].get("kernel"), "test_pack": report["device"].get("test_pack", "Device Qualification"), } report["delete"] = report["report"] diff --git a/framework/python/src/common/device.py b/framework/python/src/common/device.py index f5082e828..6f88f73b7 100644 --- a/framework/python/src/common/device.py +++ b/framework/python/src/common/device.py @@ -40,6 +40,7 @@ class Device(): test_modules: Dict = field(default_factory=dict) ip_addr: str = None firmware: str = None + kernel: str = None device_folder: str = None reports: List[TestReport] = field(default_factory=list) max_device_reports: int = None @@ -101,6 +102,9 @@ def to_dict(self): if self.firmware is not None: device_json['firmware'] = self.firmware + if self.kernel is not None: + device_json['kernel'] = self.kernel + device_json['test_modules'] = self.test_modules device_json['reports'] = [ report.to_json() for report in self.reports] if self.reports else [] @@ -120,6 +124,10 @@ def to_config_json(self): device_json['additional_info'] = self.additional_info device_json['created_at'] = self.created_at.isoformat() device_json['modified_at'] = self.modified_at.isoformat() + + if self.kernel is not None: + device_json['kernel'] = self.kernel + device_json['reports'] = [ report.to_json() for report in self.reports] if self.reports else [] diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index cc3d4dfbc..b92a1f87f 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -71,6 +71,7 @@ def __init__(self, finished=None, total_tests=0): self._device = {} + self._host = {} self._mac_addr = None self._status: TestrunStatus = TestrunStatus.COMPLETE self._result: TestrunResult = result @@ -92,6 +93,14 @@ def update_device_info(self, device): self._device['manufacturer'] = device.manufacturer self._device['model'] = device.model self._device['device_profile'] = device.additional_info + if hasattr(device, 'kernel') and device.kernel is not None: + self._device['kernel'] = device.kernel + + def get_host(self): + return self._host + + def set_host(self, host): + self._host = host def add_module_reports(self, module_reports): self._module_reports = module_reports @@ -161,6 +170,7 @@ def to_json(self): report_json['mac_addr'] = self._mac_addr report_json['device'] = copy.deepcopy(self._device) + report_json['host'] = copy.deepcopy(self._host) report_json['status'] = self._status report_json['result'] = self._result report_json['started'] = self._started.strftime(DATE_TIME_FORMAT) @@ -217,6 +227,12 @@ def from_json(self, json_file): if 'firmware' in json_file['device']: self._device['firmware'] = json_file['device']['firmware'] + # Kernel is a device feature + if 'kernel' in json_file['device']: + self._device['kernel'] = json_file['device']['kernel'] + elif 'kernel' in json_file: + self._device['kernel'] = json_file['kernel'] + if 'test_modules' in json_file['device']: self._device['test_modules'] = json_file['device']['test_modules'] @@ -233,6 +249,19 @@ def from_json(self, json_file): if 'device_profile' in json_file['device']: self._device['device_profile'] = json_file['device']['device_profile'] + if 'host' in json_file and isinstance(json_file['host'], dict): + self._host = copy.deepcopy(json_file['host']) + else: + self._host = {} + if 'location' in json_file: + self._host['location'] = json_file['location'] + if 'linux_env' in json_file: + self._host['linux_env'] = json_file['linux_env'] + if 'python_version' in json_file: + self._host['python_version'] = json_file['python_version'] + elif 'python' in json_file: + self._host['python_version'] = json_file['python'] + self._status = json_file['status'] if 'result' in json_file: @@ -277,6 +306,8 @@ def to_json_updated(self, device): json_data['device']['manufacturer'] = device.manufacturer json_data['device']['model'] = device.model json_data['device']['device_profile'] = device.additional_info + if hasattr(device, 'kernel') and device.kernel is not None: + json_data['device']['kernel'] = device.kernel return json_data # Create a pdf file in memory and return the bytes diff --git a/framework/python/src/core/testrun.py b/framework/python/src/core/testrun.py index 3296939cb..39abf3e31 100644 --- a/framework/python/src/core/testrun.py +++ b/framework/python/src/core/testrun.py @@ -271,6 +271,9 @@ def _load_devices(self, device_dir): ) # Load in the additional fields + if 'kernel' in device_config_json: + device.kernel = device_config_json.get('kernel') + if DEVICE_TYPE_KEY in device_config_json: device.type = device_config_json.get(DEVICE_TYPE_KEY) diff --git a/framework/python/src/test_orc/test_orchestrator.py b/framework/python/src/test_orc/test_orchestrator.py index 20ed052dc..c057b1145 100644 --- a/framework/python/src/test_orc/test_orchestrator.py +++ b/framework/python/src/test_orc/test_orchestrator.py @@ -254,6 +254,11 @@ def _generate_report(self): report["mac_addr"] = device.mac_addr report["device"] = device.to_dict() + report["host"] = { + "location": "", + "linux_env": "", + "python_version": "" + } report["started"] = self.get_session().get_started().strftime( "%Y-%m-%d %H:%M:%S") report["finished"] = self.get_session().get_finished().strftime( diff --git a/testing/unit/report/report_test.py b/testing/unit/report/report_test.py index d1093ff28..e29f26262 100644 --- a/testing/unit/report/report_test.py +++ b/testing/unit/report/report_test.py @@ -218,6 +218,42 @@ def get_module_html_report(self, module): report = file.read() return report + def test_report_host_and_device_kernel(self): + """Test host object and device kernel in TestReport""" + report = TestReport() + report_json = { + 'testrun': {'version': '2.2.2'}, + 'mac_addr': 'aa:bb:cc:dd:ee:ff', + 'device': { + 'mac_addr': 'aa:bb:cc:dd:ee:ff', + 'manufacturer': 'Testrun', + 'model': 'Faux', + 'firmware': '1.0.0', + 'kernel': 'Linux 6.8.0-40-generic', + 'test_pack': 'Device Qualification' + }, + 'host': { + 'location': 'Data Center Alpha - Rack 12, Bay B', + 'linux_env': 'Ubuntu 24.04 LTS (x86_64)', + 'python_version': '3.11.2' + }, + 'status': 'Complete', + 'result': 'Compliant', + 'started': '2026-02-02 17:24:52', + 'finished': '2026-02-02 17:34:58', + 'tests': {'total': 0, 'results': []} + } + report.from_json(report_json) + out_json = report.to_json() + self.assertEqual(out_json['device'].get('kernel'), 'Linux 6.8.0-40-generic') + self.assertEqual( + out_json['host'].get('location'), + 'Data Center Alpha - Rack 12, Bay B') + self.assertEqual( + out_json['host'].get('linux_env'), + 'Ubuntu 24.04 LTS (x86_64)') + self.assertEqual(out_json['host'].get('python_version'), '3.11.2') + if __name__ == '__main__': @@ -227,6 +263,7 @@ def get_module_html_report(self, module): suite.addTest(ReportTest('pilot_proceed_compliant_test')) suite.addTest(ReportTest('pilot_proceed_noncompliant_test')) suite.addTest(ReportTest('pilot_do_not_proceed_noncompliant_test')) + suite.addTest(ReportTest('test_report_host_and_device_kernel')) # Create html test reports for each module in 'output' dir suite.addTest(ReportTest('report_formatting')) From 87c43c2dd83fe3e4ea6e15e8e1c6ae9ffc064143 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 14:22:26 +0200 Subject: [PATCH 079/196] rename device to models --- framework/python/src/api/api.py | 2 +- framework/python/src/common/models.py | 165 ++++++++++++++++++ framework/python/src/core/session.py | 2 +- framework/python/src/core/testrun.py | 2 +- .../python/src/test_orc/test_orchestrator.py | 2 +- 5 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 framework/python/src/common/models.py diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index 466639a2d..b4b537c2e 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -27,7 +27,7 @@ from core import tasks from common import logger -from common.device import Device +from common.models import Device from common.statuses import TestrunStatus LOGGER = logger.get_logger("api") diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py new file mode 100644 index 000000000..6f88f73b7 --- /dev/null +++ b/framework/python/src/common/models.py @@ -0,0 +1,165 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Track device object information.""" + +import json +import os +from typing import List, Dict +from dataclasses import dataclass, field +from common.testreport import TestReport +from datetime import datetime + +_LOCAL_DEVICES_DIR = 'local/devices' +_DEVICE_CONFIG_FILE = 'device_config.json' + +@dataclass +class Device(): + """Represents a physical device and it's configuration.""" + + status: str = 'Valid' + folder_url: str = None + mac_addr: str = None + manufacturer: str = None + model: str = None + type: str = None + technology: str = None + test_pack: str = 'Device Qualification' + additional_info: List[dict] = field(default_factory=list) + test_modules: Dict = field(default_factory=dict) + ip_addr: str = None + firmware: str = None + kernel: str = None + device_folder: str = None + reports: List[TestReport] = field(default_factory=list) + max_device_reports: int = None + created_at: datetime = field(default_factory=datetime.now) + modified_at: datetime = field(default_factory=datetime.now) + + # Store the original values to detect changes + _initial_values: dict = field(init=False, repr=False, default_factory=dict) + + def add_report(self, report): + self.reports.append(report) + + def get_report_by_folder_name(self, folder_name: str) -> TestReport | None: + for report in self.reports: + report_folder_name = report.get_folder_name() + if report_folder_name == folder_name: + return report + if report_folder_name is None or report_folder_name == '': + if report.get_report_url().split('/')[-1] == folder_name: + report.set_report_url(folder_name) + return report + return None + + def get_reports(self): + return self.reports + + def sort_reports(self): + self.reports.sort(key=lambda r: r.get_started() or datetime.min) + + def clear_reports(self): + self.reports = [] + + def remove_report(self, report: TestReport): + if report in self.reports: + self.reports.remove(report) + report.delete_folder() + self.export_config_json() + + def remove_reports(self): + for report in self.reports: + report.delete_folder() + self.clear_reports() + + def to_dict(self): + """Returns the device as a python dictionary. This is used for the + system status API endpoint and in the report.""" + device_json = {} + device_json['status'] = self.status + device_json['mac_addr'] = self.mac_addr + device_json['manufacturer'] = self.manufacturer + device_json['model'] = self.model + device_json['type'] = self.type + device_json['technology'] = self.technology + device_json['test_pack'] = self.test_pack + device_json['additional_info'] = self.additional_info + device_json['created_at'] = self.created_at.isoformat() + device_json['modified_at'] = self.modified_at.isoformat() + + if self.firmware is not None: + device_json['firmware'] = self.firmware + + if self.kernel is not None: + device_json['kernel'] = self.kernel + + device_json['test_modules'] = self.test_modules + device_json['reports'] = [ + report.to_json() for report in self.reports] if self.reports else [] + return device_json + + def to_config_json(self): + """Returns the device as a python dictionary. Fields relevant to the device + config json file are exported.""" + device_json = {} + device_json['mac_addr'] = self.mac_addr + device_json['manufacturer'] = self.manufacturer + device_json['model'] = self.model + device_json['type'] = self.type + device_json['technology'] = self.technology + device_json['test_pack'] = self.test_pack + device_json['test_modules'] = self.test_modules + device_json['additional_info'] = self.additional_info + device_json['created_at'] = self.created_at.isoformat() + device_json['modified_at'] = self.modified_at.isoformat() + + if self.kernel is not None: + device_json['kernel'] = self.kernel + + device_json['reports'] = [ + report.to_json() for report in self.reports] if self.reports else [] + + return device_json + + def export_config_json(self): + """Exports the device config as a json file to the specified path.""" + # Locate parent directory + current_dir = os.path.dirname(os.path.realpath(__file__)) + root_dir = os.path.dirname( + os.path.dirname(os.path.dirname(os.path.dirname(current_dir)))) + config_file_path = os.path.join(root_dir, _LOCAL_DEVICES_DIR, + self.device_folder, _DEVICE_CONFIG_FILE) + + with open(config_file_path, 'w+', encoding='utf-8') as config_file: + config_file.writelines(json.dumps(self.to_config_json(), indent=4)) + + def __post_init__(self): + # Store initial values after creation + for f in self.__dataclass_fields__: + if f not in ['created_at', 'modified_at', '_initial_values']: + self._initial_values[f] = getattr(self, f) + + def __setattr__(self, name: str, value: any) -> None: + if (name not in ['created_at', 'modified_at', '_initial_values'] and + hasattr(self, name) and getattr(self, name) != value): + # Update the last_updated timestamp + super().__setattr__('modified_at', datetime.now()) + super().__setattr__(name, value) + + +@dataclass +class DeviceWithReport(): + device: Device | None = None + report: TestReport | None = None diff --git a/framework/python/src/core/session.py b/framework/python/src/core/session.py index 536ac394d..9022ecda1 100644 --- a/framework/python/src/core/session.py +++ b/framework/python/src/core/session.py @@ -21,7 +21,7 @@ from common import util, logger, mqtt from common.risk_profile import RiskProfile from common.statuses import TestrunStatus, TestResult, TestrunResult -from common.device import Device, DeviceWithReport +from common.models import Device, DeviceWithReport from net_orc.ip_control import IPControl # Certificate dependencies diff --git a/framework/python/src/core/testrun.py b/framework/python/src/core/testrun.py index 39abf3e31..ef642feac 100644 --- a/framework/python/src/core/testrun.py +++ b/framework/python/src/core/testrun.py @@ -25,7 +25,7 @@ import docker.errors from common import logger, util, mqtt -from common.device import Device +from common.models import Device from common.testreport import TestReport from common.statuses import TestrunStatus from session import TestrunSession diff --git a/framework/python/src/test_orc/test_orchestrator.py b/framework/python/src/test_orc/test_orchestrator.py index c057b1145..858348fc1 100644 --- a/framework/python/src/test_orc/test_orchestrator.py +++ b/framework/python/src/test_orc/test_orchestrator.py @@ -23,7 +23,7 @@ from common import logger, util, risk_profile from common.testreport import TestReport from common.statuses import TestrunStatus, TestrunResult, TestResult -from common.device import Device +from common.models import Device from core.testrun import REPORTS_FOLDER, DEVICE_REPORT_NAME_FORMAT from core.docker.test_docker_module import TestModule from test_orc.test_case import TestCase From 0faa69e4d5f366a9fc2a1caa5c32682c79625428 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 14:24:51 +0200 Subject: [PATCH 080/196] remove device.py --- framework/python/src/common/device.py | 165 -------------------------- 1 file changed, 165 deletions(-) delete mode 100644 framework/python/src/common/device.py diff --git a/framework/python/src/common/device.py b/framework/python/src/common/device.py deleted file mode 100644 index 6f88f73b7..000000000 --- a/framework/python/src/common/device.py +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright 2023 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Track device object information.""" - -import json -import os -from typing import List, Dict -from dataclasses import dataclass, field -from common.testreport import TestReport -from datetime import datetime - -_LOCAL_DEVICES_DIR = 'local/devices' -_DEVICE_CONFIG_FILE = 'device_config.json' - -@dataclass -class Device(): - """Represents a physical device and it's configuration.""" - - status: str = 'Valid' - folder_url: str = None - mac_addr: str = None - manufacturer: str = None - model: str = None - type: str = None - technology: str = None - test_pack: str = 'Device Qualification' - additional_info: List[dict] = field(default_factory=list) - test_modules: Dict = field(default_factory=dict) - ip_addr: str = None - firmware: str = None - kernel: str = None - device_folder: str = None - reports: List[TestReport] = field(default_factory=list) - max_device_reports: int = None - created_at: datetime = field(default_factory=datetime.now) - modified_at: datetime = field(default_factory=datetime.now) - - # Store the original values to detect changes - _initial_values: dict = field(init=False, repr=False, default_factory=dict) - - def add_report(self, report): - self.reports.append(report) - - def get_report_by_folder_name(self, folder_name: str) -> TestReport | None: - for report in self.reports: - report_folder_name = report.get_folder_name() - if report_folder_name == folder_name: - return report - if report_folder_name is None or report_folder_name == '': - if report.get_report_url().split('/')[-1] == folder_name: - report.set_report_url(folder_name) - return report - return None - - def get_reports(self): - return self.reports - - def sort_reports(self): - self.reports.sort(key=lambda r: r.get_started() or datetime.min) - - def clear_reports(self): - self.reports = [] - - def remove_report(self, report: TestReport): - if report in self.reports: - self.reports.remove(report) - report.delete_folder() - self.export_config_json() - - def remove_reports(self): - for report in self.reports: - report.delete_folder() - self.clear_reports() - - def to_dict(self): - """Returns the device as a python dictionary. This is used for the - system status API endpoint and in the report.""" - device_json = {} - device_json['status'] = self.status - device_json['mac_addr'] = self.mac_addr - device_json['manufacturer'] = self.manufacturer - device_json['model'] = self.model - device_json['type'] = self.type - device_json['technology'] = self.technology - device_json['test_pack'] = self.test_pack - device_json['additional_info'] = self.additional_info - device_json['created_at'] = self.created_at.isoformat() - device_json['modified_at'] = self.modified_at.isoformat() - - if self.firmware is not None: - device_json['firmware'] = self.firmware - - if self.kernel is not None: - device_json['kernel'] = self.kernel - - device_json['test_modules'] = self.test_modules - device_json['reports'] = [ - report.to_json() for report in self.reports] if self.reports else [] - return device_json - - def to_config_json(self): - """Returns the device as a python dictionary. Fields relevant to the device - config json file are exported.""" - device_json = {} - device_json['mac_addr'] = self.mac_addr - device_json['manufacturer'] = self.manufacturer - device_json['model'] = self.model - device_json['type'] = self.type - device_json['technology'] = self.technology - device_json['test_pack'] = self.test_pack - device_json['test_modules'] = self.test_modules - device_json['additional_info'] = self.additional_info - device_json['created_at'] = self.created_at.isoformat() - device_json['modified_at'] = self.modified_at.isoformat() - - if self.kernel is not None: - device_json['kernel'] = self.kernel - - device_json['reports'] = [ - report.to_json() for report in self.reports] if self.reports else [] - - return device_json - - def export_config_json(self): - """Exports the device config as a json file to the specified path.""" - # Locate parent directory - current_dir = os.path.dirname(os.path.realpath(__file__)) - root_dir = os.path.dirname( - os.path.dirname(os.path.dirname(os.path.dirname(current_dir)))) - config_file_path = os.path.join(root_dir, _LOCAL_DEVICES_DIR, - self.device_folder, _DEVICE_CONFIG_FILE) - - with open(config_file_path, 'w+', encoding='utf-8') as config_file: - config_file.writelines(json.dumps(self.to_config_json(), indent=4)) - - def __post_init__(self): - # Store initial values after creation - for f in self.__dataclass_fields__: - if f not in ['created_at', 'modified_at', '_initial_values']: - self._initial_values[f] = getattr(self, f) - - def __setattr__(self, name: str, value: any) -> None: - if (name not in ['created_at', 'modified_at', '_initial_values'] and - hasattr(self, name) and getattr(self, name) != value): - # Update the last_updated timestamp - super().__setattr__('modified_at', datetime.now()) - super().__setattr__(name, value) - - -@dataclass -class DeviceWithReport(): - device: Device | None = None - report: TestReport | None = None From 43c806811e7d784f4a542600c9fa5e1eedd0a77e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 14:30:18 +0200 Subject: [PATCH 081/196] fix deps warnings --- framework/requirements.txt | 4 ++-- modules/test/conn/python/requirements.txt | 2 +- modules/test/ntp/python/requirements.txt | 2 +- modules/test/tls/python/requirements.txt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/requirements.txt b/framework/requirements.txt index ec31f17f8..2cc7e11c1 100644 --- a/framework/requirements.txt +++ b/framework/requirements.txt @@ -28,7 +28,7 @@ responses==0.25.3 markdown==3.8.1 # Requirements for the session -cryptography==49.0.0 +cryptography==50.0.0 pytz==2024.1 # Requirements for the risk profile @@ -51,5 +51,5 @@ tzlocal==5.4.3 # Security & dependency updates idna==3.15 -aiohttp==3.14.1 +aiohttp==3.14.3 pyOpenSSL==26.3.0 \ No newline at end of file diff --git a/modules/test/conn/python/requirements.txt b/modules/test/conn/python/requirements.txt index 25c6c5d1c..eb587cc9a 100644 --- a/modules/test/conn/python/requirements.txt +++ b/modules/test/conn/python/requirements.txt @@ -2,7 +2,7 @@ # Package dependencies should always be defined before the user defined # packages to prevent auto-upgrades of stable dependencies cffi==2.0.0 -cryptography==48.0.1 +cryptography==50.0.0 pycparser==3.0 six==1.17.0 diff --git a/modules/test/ntp/python/requirements.txt b/modules/test/ntp/python/requirements.txt index c9b5d21f4..cd6545d93 100644 --- a/modules/test/ntp/python/requirements.txt +++ b/modules/test/ntp/python/requirements.txt @@ -5,5 +5,5 @@ # User defined packages scapy==2.7.0 pyshark==0.6 -aiohttp==3.14.1 +aiohttp==3.14.3 ntplib==0.4.0 \ No newline at end of file diff --git a/modules/test/tls/python/requirements.txt b/modules/test/tls/python/requirements.txt index d45d59d12..b1ef7f7fd 100644 --- a/modules/test/tls/python/requirements.txt +++ b/modules/test/tls/python/requirements.txt @@ -13,7 +13,7 @@ termcolor==3.3.0 urllib3==2.7.0 # User defined packages -cryptography==48.0.1 +cryptography==50.0.0 pyOpenSSL==26.2.0 lxml==6.1.1 requests==2.34.2 From 98cb7bb55656685dd4f3bbb2147da0ea7673e00d Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 14:44:41 +0200 Subject: [PATCH 082/196] update pyopenssl --- framework/requirements.txt | 2 +- modules/test/conn/python/requirements.txt | 2 +- modules/test/tls/python/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/requirements.txt b/framework/requirements.txt index 2cc7e11c1..11a4f12c9 100644 --- a/framework/requirements.txt +++ b/framework/requirements.txt @@ -52,4 +52,4 @@ tzlocal==5.4.3 # Security & dependency updates idna==3.15 aiohttp==3.14.3 -pyOpenSSL==26.3.0 \ No newline at end of file +pyOpenSSL==26.4.0 \ No newline at end of file diff --git a/modules/test/conn/python/requirements.txt b/modules/test/conn/python/requirements.txt index eb587cc9a..f954ff36a 100644 --- a/modules/test/conn/python/requirements.txt +++ b/modules/test/conn/python/requirements.txt @@ -7,6 +7,6 @@ pycparser==3.0 six==1.17.0 # User defined packages -pyOpenSSL==26.2.0 +pyOpenSSL==26.4.0 scapy==2.7.0 python-dateutil==2.9.0.post0 diff --git a/modules/test/tls/python/requirements.txt b/modules/test/tls/python/requirements.txt index b1ef7f7fd..2e87fe8e4 100644 --- a/modules/test/tls/python/requirements.txt +++ b/modules/test/tls/python/requirements.txt @@ -14,7 +14,7 @@ urllib3==2.7.0 # User defined packages cryptography==50.0.0 -pyOpenSSL==26.2.0 +pyOpenSSL==26.4.0 lxml==6.1.1 requests==2.34.2 python-nmap==0.7.1 From b1d8779044cb3e9acb1599c7db780308940360f7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 14:55:19 +0200 Subject: [PATCH 083/196] skip node --- .github/workflows/security.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index df4bd9a75..c12b8b2dd 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -69,7 +69,7 @@ jobs: - name: Checkout source uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Run Trivy in Filesystem mode - uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 #0.36.0 + uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # 0.36.0 with: scan-type: 'fs' scan-ref: '.' @@ -77,6 +77,8 @@ jobs: exit-code: '1' ignore-unfixed: true severity: 'CRITICAL,HIGH' + skip-dirs: 'node_modules' + skip-files: 'package-lock.json,yarn.lock,pnpm-lock.yaml,package.json' shellcheck_scan: name: ShellCheck Bash Scan runs-on: ubuntu-24.04 From abed4434d932c52c3a6958be7de05171e75d94f7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:01:00 +0200 Subject: [PATCH 084/196] trivy config --- trivy.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 trivy.yaml diff --git a/trivy.yaml b/trivy.yaml new file mode 100644 index 000000000..445eca9c7 --- /dev/null +++ b/trivy.yaml @@ -0,0 +1,5 @@ +scan: + pkg-types: + - os + - pip + - gobinary \ No newline at end of file From 0c0a01bd6db5c7375470a8bf8023aee0ad8f6d40 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:03:13 +0200 Subject: [PATCH 085/196] Revert "trivy config" This reverts commit 1ad8e9fbadebab8c420fca67b333f226f5e9e24c. --- trivy.yaml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 trivy.yaml diff --git a/trivy.yaml b/trivy.yaml deleted file mode 100644 index 445eca9c7..000000000 --- a/trivy.yaml +++ /dev/null @@ -1,5 +0,0 @@ -scan: - pkg-types: - - os - - pip - - gobinary \ No newline at end of file From ff1217286fcd91abb0590fc501723a90fdabbd0d Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:03:56 +0200 Subject: [PATCH 086/196] trivy options --- .github/workflows/security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index c12b8b2dd..8e0303732 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -78,7 +78,7 @@ jobs: ignore-unfixed: true severity: 'CRITICAL,HIGH' skip-dirs: 'node_modules' - skip-files: 'package-lock.json,yarn.lock,pnpm-lock.yaml,package.json' + trivy-options: '--disabled-analyzers npm,yarn,pnpm,package-json' shellcheck_scan: name: ShellCheck Bash Scan runs-on: ubuntu-24.04 From cc5fb578b3acef1e6e4302a77030e73b0fc3aed3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:29:06 +0200 Subject: [PATCH 087/196] fix import --- testing/unit/framework/session_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/unit/framework/session_test.py b/testing/unit/framework/session_test.py index d1207e66d..9d1ca62c7 100644 --- a/testing/unit/framework/session_test.py +++ b/testing/unit/framework/session_test.py @@ -21,7 +21,7 @@ from unittest.mock import patch, MagicMock, mock_open from common.statuses import TestResult -from common.device import Device +from common.models import Device from core import session From 944df811a3bc8c7e7707945efaa0e3043d4f2384 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:32:54 +0200 Subject: [PATCH 088/196] disable trivy for node --- .github/workflows/security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 8e0303732..fbe6c2ece 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -78,7 +78,7 @@ jobs: ignore-unfixed: true severity: 'CRITICAL,HIGH' skip-dirs: 'node_modules' - trivy-options: '--disabled-analyzers npm,yarn,pnpm,package-json' + trivy-options: '--disabled-analyzers npm-pkg-lock,yarn,pnpm,node-pkg' shellcheck_scan: name: ShellCheck Bash Scan runs-on: ubuntu-24.04 From a7498f7e1d81afd9e1f6500b313fd54f472c7333 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:42:10 +0200 Subject: [PATCH 089/196] remove lock files before scan --- .github/workflows/security.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index fbe6c2ece..c8af2b79a 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -68,6 +68,8 @@ jobs: steps: - name: Checkout source uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Remove Node.js lockfiles for scan + run: find . -type f \( -name "package-lock.json" -o -name "yarn.lock" -o -name "pnpm-lock.yaml" \) -delete - name: Run Trivy in Filesystem mode uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # 0.36.0 with: From 85adef5bcf5578162a833b9facc971df649674be Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 15:48:56 +0200 Subject: [PATCH 090/196] host model --- framework/python/src/common/models.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 6f88f73b7..f26cab2c8 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -163,3 +163,11 @@ def __setattr__(self, name: str, value: any) -> None: class DeviceWithReport(): device: Device | None = None report: TestReport | None = None + + +@dataclass +class Host(): + """Testrun host metadata""" + python_version: str + os: str | None = None + location: str | None = None From 1d0d36c14a5b3a608bee87f6c5cb25f0dec9aa31 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 16:24:27 +0200 Subject: [PATCH 091/196] to dict method --- framework/python/src/common/models.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index f26cab2c8..c3196ebb3 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -16,7 +16,7 @@ import json import os -from typing import List, Dict +from typing import List, Dict, Mapping from dataclasses import dataclass, field from common.testreport import TestReport from datetime import datetime @@ -171,3 +171,12 @@ class Host(): python_version: str os: str | None = None location: str | None = None + + def to_dict(self) -> Mapping: + """Returns the host metadata as a python dictionary""" + host_json = {} + host_json['python_version'] = self.python_version + host_json['os'] = self.os + host_json['location'] = self.location + return host_json + From 7c947bc16b51a12d987ac07ca80b68eae274e461 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 17:45:40 +0200 Subject: [PATCH 092/196] pass host info to the session object --- framework/python/src/common/models.py | 8 ++++++++ framework/python/src/core/session.py | 6 +++++- framework/requirements.txt | 4 +++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index c3196ebb3..6d2f4e679 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -16,10 +16,12 @@ import json import os +import platform from typing import List, Dict, Mapping from dataclasses import dataclass, field from common.testreport import TestReport from datetime import datetime +import distro _LOCAL_DEVICES_DIR = 'local/devices' _DEVICE_CONFIG_FILE = 'device_config.json' @@ -172,6 +174,11 @@ class Host(): os: str | None = None location: str | None = None + @classmethod + def get_host_metadata(cls) -> 'Host': + """Returns the host metadata as a Host object""" + return cls(python_version=platform.python_version(), os=distro.name(pretty=True)) + def to_dict(self) -> Mapping: """Returns the host metadata as a python dictionary""" host_json = {} @@ -180,3 +187,4 @@ def to_dict(self) -> Mapping: host_json['location'] = self.location return host_json + diff --git a/framework/python/src/core/session.py b/framework/python/src/core/session.py index 9022ecda1..d6751fb83 100644 --- a/framework/python/src/core/session.py +++ b/framework/python/src/core/session.py @@ -21,7 +21,7 @@ from common import util, logger, mqtt from common.risk_profile import RiskProfile from common.statuses import TestrunStatus, TestResult, TestrunResult -from common.models import Device, DeviceWithReport +from common.models import Device, DeviceWithReport, Host from net_orc.ip_control import IPControl # Certificate dependencies @@ -164,6 +164,10 @@ def __init__(self, root_dir): self._certs = [] self.load_certs() + # Load host metadata + self._host = Host.get_host_metadata() + LOGGER.info(f'Host metadata: {self._host.to_dict()}') + # Fetch the timezone of the host system try: self._timezone = str(tzlocal.get_localzone()) diff --git a/framework/requirements.txt b/framework/requirements.txt index 11a4f12c9..9834c6d54 100644 --- a/framework/requirements.txt +++ b/framework/requirements.txt @@ -26,6 +26,7 @@ responses==0.25.3 # Requirements for the report markdown==3.8.1 +distro==1.9.0 # Requirements for the session cryptography==50.0.0 @@ -52,4 +53,5 @@ tzlocal==5.4.3 # Security & dependency updates idna==3.15 aiohttp==3.14.3 -pyOpenSSL==26.4.0 \ No newline at end of file +pyOpenSSL==26.4.0 + From 318d1657a1bf98e7007a7c926946e2ae2e37d0fa Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 17:46:01 +0200 Subject: [PATCH 093/196] pylint --- framework/python/src/common/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 6d2f4e679..0323bcc03 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -177,7 +177,10 @@ class Host(): @classmethod def get_host_metadata(cls) -> 'Host': """Returns the host metadata as a Host object""" - return cls(python_version=platform.python_version(), os=distro.name(pretty=True)) + return cls( + python_version=platform.python_version(), + os=distro.name(pretty=True) + ) def to_dict(self) -> Mapping: """Returns the host metadata as a python dictionary""" From 1f5dbf344861837dd3b9b3ff08596da9eff7d5cb Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 5 Aug 2026 17:48:37 +0200 Subject: [PATCH 094/196] get host metadata method --- framework/python/src/core/session.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/python/src/core/session.py b/framework/python/src/core/session.py index d6751fb83..1d5f1dae0 100644 --- a/framework/python/src/core/session.py +++ b/framework/python/src/core/session.py @@ -166,7 +166,7 @@ def __init__(self, root_dir): # Load host metadata self._host = Host.get_host_metadata() - LOGGER.info(f'Host metadata: {self._host.to_dict()}') + LOGGER.debug(f'Host metadata: {self._host.to_dict()}') # Fetch the timezone of the host system try: @@ -1102,3 +1102,6 @@ def get_mqtt_client(self): def get_ifaces(self): return self._ifaces + + def get_host_metadata(self): + return self._host From cd966713e0a90d26c3cd3f7bf2c036ca25221bc8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 13:23:05 +0200 Subject: [PATCH 095/196] provide host metadata --- framework/python/src/common/models.py | 8 ++++---- framework/python/src/common/testreport.py | 4 ++-- framework/python/src/test_orc/test_orchestrator.py | 7 ++----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 0323bcc03..5b17d457b 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -171,22 +171,22 @@ class DeviceWithReport(): class Host(): """Testrun host metadata""" python_version: str - os: str | None = None - location: str | None = None + linux_env: str | None = '' + location: str | None = '' @classmethod def get_host_metadata(cls) -> 'Host': """Returns the host metadata as a Host object""" return cls( python_version=platform.python_version(), - os=distro.name(pretty=True) + linux_env=distro.name(pretty=True) ) def to_dict(self) -> Mapping: """Returns the host metadata as a python dictionary""" host_json = {} host_json['python_version'] = self.python_version - host_json['os'] = self.os + host_json['linux_env'] = self.linux_env host_json['location'] = self.location return host_json diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index b92a1f87f..56e2c26c5 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -96,10 +96,10 @@ def update_device_info(self, device): if hasattr(device, 'kernel') and device.kernel is not None: self._device['kernel'] = device.kernel - def get_host(self): + def get_host(self) -> dict: return self._host - def set_host(self, host): + def set_host(self, host: dict): self._host = host def add_module_reports(self, module_reports): diff --git a/framework/python/src/test_orc/test_orchestrator.py b/framework/python/src/test_orc/test_orchestrator.py index 858348fc1..d573dbba7 100644 --- a/framework/python/src/test_orc/test_orchestrator.py +++ b/framework/python/src/test_orc/test_orchestrator.py @@ -246,6 +246,7 @@ def _write_reports(self, test_report): def _generate_report(self): device = self.get_session().get_target_device() + host = self.get_session().get_host_metadata().to_dict() test_pack_name = device.test_pack test_pack = self.get_test_pack(test_pack_name) @@ -254,11 +255,7 @@ def _generate_report(self): report["mac_addr"] = device.mac_addr report["device"] = device.to_dict() - report["host"] = { - "location": "", - "linux_env": "", - "python_version": "" - } + report["host"] = host report["started"] = self.get_session().get_started().strftime( "%Y-%m-%d %H:%M:%S") report["finished"] = self.get_session().get_finished().strftime( From e7c2244b635a8b3a9fc6cab0b43e4210be293866 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 14:25:52 +0200 Subject: [PATCH 096/196] location --- framework/python/src/common/models.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 5b17d457b..c858578ab 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -22,6 +22,7 @@ from common.testreport import TestReport from datetime import datetime import distro +import requests _LOCAL_DEVICES_DIR = 'local/devices' _DEVICE_CONFIG_FILE = 'device_config.json' @@ -174,6 +175,19 @@ class Host(): linux_env: str | None = '' location: str | None = '' + @classmethod + def get_location(cls) -> str: + """Fetches the location of the host system using an external API.""" + try: + response = requests.get('https://ipinfo.io/json', timeout=5) + if response.status_code == 200: + data = response.json() + return f'{data['country']}/{data['region']}/{data['city']}' + else: + return '' + except Exception: + return '' + @classmethod def get_host_metadata(cls) -> 'Host': """Returns the host metadata as a Host object""" @@ -187,7 +201,7 @@ def to_dict(self) -> Mapping: host_json = {} host_json['python_version'] = self.python_version host_json['linux_env'] = self.linux_env - host_json['location'] = self.location + host_json['location'] = Host.get_location() return host_json From 5b0c31250e712c219d2fb9bc27049448460db7ad Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 14:31:55 +0200 Subject: [PATCH 097/196] Host unit tests --- testing/unit/framework/models_test.py | 72 +++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 testing/unit/framework/models_test.py diff --git a/testing/unit/framework/models_test.py b/testing/unit/framework/models_test.py new file mode 100644 index 000000000..fda249e2e --- /dev/null +++ b/testing/unit/framework/models_test.py @@ -0,0 +1,72 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Host metadata tests.""" + +from unittest.mock import patch, MagicMock + +from common.models import Host + + +def test_get_location_success(): + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = { + 'country': 'US', + 'region': 'California', + 'city': 'San Jose' + } + + with patch('common.models.requests.get', return_value=mock_response): + assert Host.get_location() == 'US/California/San Jose' + + +def test_get_location_returns_empty_when_api_unavailable(): + mock_response = MagicMock() + mock_response.status_code = 500 + + with patch('common.models.requests.get', return_value=mock_response): + assert Host.get_location() == '' + + +def test_get_location_returns_empty_on_exception(): + with patch('common.models.requests.get', side_effect=Exception('network')): + assert Host.get_location() == '' + + +@patch('common.models.distro.name', return_value='Ubuntu 24.04 LTS') +@patch('common.models.platform.python_version', return_value='3.12.0') +def test_get_host_metadata_returns_expected_host( + mock_python_version: MagicMock, #pylint: disable=W0613, W0621 + mock_distro_name: MagicMock #pylint: disable=W0613, W0621 +): + host = Host.get_host_metadata() + + assert host.python_version == '3.12.0' + assert host.linux_env == 'Ubuntu 24.04 LTS' + assert host.location == '' + + +def test_host_to_dict_includes_location(): + host = Host(python_version='3.12.0', linux_env='Ubuntu 24.04 LTS') + + with patch.object(Host, + 'get_location', + return_value='US/California/San Jose' + ): + host_dict = host.to_dict() + + assert host_dict['python_version'] == '3.12.0' + assert host_dict['linux_env'] == 'Ubuntu 24.04 LTS' + assert host_dict['location'] == 'US/California/San Jose' From ed05c188e882905fc50d5a60c7c5f8f85e0bbaf5 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 14:46:54 +0200 Subject: [PATCH 098/196] refactor location string --- framework/python/src/common/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index c858578ab..792aad0f9 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -182,7 +182,7 @@ def get_location(cls) -> str: response = requests.get('https://ipinfo.io/json', timeout=5) if response.status_code == 200: data = response.json() - return f'{data['country']}/{data['region']}/{data['city']}' + return '{country}/{region}/{city}'.format(**data) else: return '' except Exception: From 2956a989155e914f1c7615a47aed3eb8c3c84c1d Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 14:50:20 +0200 Subject: [PATCH 099/196] refactor string to be compliant with pylint --- framework/python/src/common/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 792aad0f9..7cc4b0e05 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -182,7 +182,10 @@ def get_location(cls) -> str: response = requests.get('https://ipinfo.io/json', timeout=5) if response.status_code == 200: data = response.json() - return '{country}/{region}/{city}'.format(**data) + country = data['country'] + region = data['region'] + city = data['city'] + return f'{country}/{region}/{city}' else: return '' except Exception: From 310d280341959a559d0b14c4a18924c869897de6 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 16:52:49 +0200 Subject: [PATCH 100/196] cover get metadata mthods with exceptions to return empty data on any error --- framework/python/src/common/models.py | 16 ++++++-- testing/unit/framework/models_test.py | 53 +++++++++++++-------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 7cc4b0e05..ec1b19911 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -194,9 +194,19 @@ def get_location(cls) -> str: @classmethod def get_host_metadata(cls) -> 'Host': """Returns the host metadata as a Host object""" - return cls( - python_version=platform.python_version(), + try: + python_version = platform.python_version() + except Exception: + python_version = '' + try: linux_env=distro.name(pretty=True) + except Exception: + linux_env = '' + location = Host.get_location() + return cls( + python_version=python_version, + linux_env=linux_env, + location=location ) def to_dict(self) -> Mapping: @@ -204,7 +214,7 @@ def to_dict(self) -> Mapping: host_json = {} host_json['python_version'] = self.python_version host_json['linux_env'] = self.linux_env - host_json['location'] = Host.get_location() + host_json['location'] = self.location return host_json diff --git a/testing/unit/framework/models_test.py b/testing/unit/framework/models_test.py index fda249e2e..99cff8540 100644 --- a/testing/unit/framework/models_test.py +++ b/testing/unit/framework/models_test.py @@ -14,30 +14,27 @@ """Host metadata tests.""" +import pytest from unittest.mock import patch, MagicMock from common.models import Host -def test_get_location_success(): - mock_response = MagicMock() - mock_response.status_code = 200 - mock_response.json.return_value = { - 'country': 'US', - 'region': 'California', - 'city': 'San Jose' - } - - with patch('common.models.requests.get', return_value=mock_response): - assert Host.get_location() == 'US/California/San Jose' - - -def test_get_location_returns_empty_when_api_unavailable(): +@pytest.mark.parametrize('status_code, json_value, expected', [ + (200, {'country': 'US', 'region': 'California', 'city': 'San Jose'}, 'US/California/San Jose'), + (500, {}, ''), +]) +def test_get_location_returns_expected_string( + status_code: int, + json_value: dict, + expected: str +): mock_response = MagicMock() - mock_response.status_code = 500 + mock_response.status_code = status_code + mock_response.json.return_value = json_value with patch('common.models.requests.get', return_value=mock_response): - assert Host.get_location() == '' + assert Host.get_location() == expected def test_get_location_returns_empty_on_exception(): @@ -47,7 +44,9 @@ def test_get_location_returns_empty_on_exception(): @patch('common.models.distro.name', return_value='Ubuntu 24.04 LTS') @patch('common.models.platform.python_version', return_value='3.12.0') +@patch.object(Host, 'get_location', return_value='') def test_get_host_metadata_returns_expected_host( + mock_get_location: MagicMock, #pylint: disable=W0613, W0621 mock_python_version: MagicMock, #pylint: disable=W0613, W0621 mock_distro_name: MagicMock #pylint: disable=W0613, W0621 ): @@ -59,14 +58,14 @@ def test_get_host_metadata_returns_expected_host( def test_host_to_dict_includes_location(): - host = Host(python_version='3.12.0', linux_env='Ubuntu 24.04 LTS') - - with patch.object(Host, - 'get_location', - return_value='US/California/San Jose' - ): - host_dict = host.to_dict() - - assert host_dict['python_version'] == '3.12.0' - assert host_dict['linux_env'] == 'Ubuntu 24.04 LTS' - assert host_dict['location'] == 'US/California/San Jose' + host = Host( + python_version='3.12.0', + linux_env='Ubuntu 24.04 LTS', + location='US/California/San Jose' + ) + + assert host.to_dict() == { + 'python_version': '3.12.0', + 'linux_env': 'Ubuntu 24.04 LTS', + 'location': 'US/California/San Jose' + } From 0e93b11062d7b8ce7a3f7e958eccecd3766a507a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 16:55:34 +0200 Subject: [PATCH 101/196] pylint --- testing/unit/framework/models_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testing/unit/framework/models_test.py b/testing/unit/framework/models_test.py index 99cff8540..5126365e8 100644 --- a/testing/unit/framework/models_test.py +++ b/testing/unit/framework/models_test.py @@ -33,7 +33,8 @@ def test_get_location_returns_expected_string( mock_response.status_code = status_code mock_response.json.return_value = json_value - with patch('common.models.requests.get', return_value=mock_response): + with patch('common.models.requests.get', + return_value=mock_response): assert Host.get_location() == expected From c50f7fb863554def673f1b0f21aaeaffe8718dbf Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 6 Aug 2026 17:00:27 +0200 Subject: [PATCH 102/196] pylint --- testing/unit/framework/models_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/testing/unit/framework/models_test.py b/testing/unit/framework/models_test.py index 5126365e8..96dfec00f 100644 --- a/testing/unit/framework/models_test.py +++ b/testing/unit/framework/models_test.py @@ -21,7 +21,11 @@ @pytest.mark.parametrize('status_code, json_value, expected', [ - (200, {'country': 'US', 'region': 'California', 'city': 'San Jose'}, 'US/California/San Jose'), + (200, + {'country': 'US', + 'region': 'California', + 'city': 'San Jose'}, + 'US/California/San Jose'), (500, {}, ''), ]) def test_get_location_returns_expected_string( From ec43a3d3896eac9051b6a1f1e2f01521512c9b1f Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Mon, 10 Aug 2026 09:33:15 +0000 Subject: [PATCH 103/196] Adds report metadata (#1625) --- docs/dev/mockoon.json | 42 ++- modules/ui/package.json | 1 + modules/ui/src/app/mocks/reports.mock.ts | 50 ++++ modules/ui/src/app/model/device.ts | 1 + modules/ui/src/app/model/filters.ts | 2 + modules/ui/src/app/model/testrun-status.ts | 7 + .../delete-report.component.html | 1 + .../filter-chips/filter-chips.component.html | 24 +- .../filter-chips.component.spec.ts | 58 +++- .../filter-chips/filter-chips.component.ts | 52 +++- .../filter-header.component.html | 10 +- .../app/pages/reports/reports.component.html | 151 +++++++++- .../app/pages/reports/reports.component.scss | 215 ++++++++++----- .../pages/reports/reports.component.spec.ts | 260 +++++++++++++++++- .../app/pages/reports/reports.component.ts | 91 +++++- .../app/pages/reports/reports.store.spec.ts | 202 +++++++++++++- .../ui/src/app/pages/reports/reports.store.ts | 58 +++- 17 files changed, 1123 insertions(+), 102 deletions(-) diff --git a/docs/dev/mockoon.json b/docs/dev/mockoon.json index 7f0fd3ede..8f5f5e3bd 100644 --- a/docs/dev/mockoon.json +++ b/docs/dev/mockoon.json @@ -605,7 +605,7 @@ "responses": [ { "uuid": "26c16650-9195-4fce-b76f-f00c9192689b", - "body": "[\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\"\n }\n]", + "body": "[\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\"\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n }\n]", "latency": 0, "statusCode": 200, "label": "", @@ -618,6 +618,44 @@ "rulesOperator": "OR", "disableTemplating": false, "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "71070377-1c8d-4354-afac-b674b07d1dcb", + "body": "[\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"host\": {\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n \"python_version\": \"3.11.2\"\n },\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\"\n }\n]", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "26107a65-25f9-446f-895f-eb8bb9e33f88", + "body": "[\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '1'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Krakow, PL\",\n\n \"linux_env\": \"Ubuntu 240.04 LTS (x86_64)\",\n\n \"python_version\": \"3.11.2\"\n\n }\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '2'}},\n \"status\": \"Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"host\": {\n\n \"location\": \"Wroclaw, PL\",\n\n \"linux_env\": \"Fedora 44.0.0\",\n\n \"python_version\": \"3.11.2\"\n\n }\n }\n]", + "latency": 0, + "statusCode": 200, + "label": "Big data", + "headers": [], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, "default": true, "crudKey": "id", "callbacks": [] @@ -1814,7 +1852,7 @@ "id": "cntg", "name": "device_list", "documentation": "", - "value": "[\n {\n \"mac_addr\": \"00:1e:42:35:73:c4\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Teltonika\",\n \"model\": \"TRB 140\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Hardware - Air quality\",\n \"test_pack\": \"Pilot Assessment\",\n \"firmware\": \"3.14 omega\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"dns\": {\n \"enabled\": false\n },\n \"connection\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"nmap\": {\n \"enabled\": false\n }\n }\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:ff\",\n \"status\": \"Invalid\",\n \"manufacturer\": \"Manufacturer X\",\n \"model\": \"Device X\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\"enabled\": true},\n \"dns\" : {\"enabled\": true},\n \"ntp\": {\"enabled\": true},\n \"protocol\": {\"enabled\": false},\n \"services\": {\"enabled\": true},\n \"tls\": {\"enabled\": false}\n }\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:fa\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Manufacturer Y\",\n \"model\": \"Device y\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"Yes\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\"enabled\": false},\n \"dns\" : {\"enabled\": true},\n \"ntp\": {\"enabled\": false},\n \"protocol\": {\"enabled\": false},\n \"services\": {\"enabled\": false},\n \"tls\": {\"enabled\": false}\n }\n }\n]" + "value": "[\n {\n \"mac_addr\": \"00:1e:42:35:73:c4\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Teltonika\",\n \"model\": \"TRB 140\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Hardware - Air quality\",\n \"test_pack\": \"Pilot Assessment\",\n \"firmware\": \"3.14 omega\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"dns\": {\n \"enabled\": false\n },\n \"connection\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"nmap\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.8.0-40-generic\"\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:ff\",\n \"status\": \"Invalid\",\n \"manufacturer\": \"Manufacturer X\",\n \"model\": \"Device X\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\n \"enabled\": true\n },\n \"dns\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": true\n },\n \"protocol\": {\n \"enabled\": false\n },\n \"services\": {\n \"enabled\": true\n },\n \"tls\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.10.0-40-generic\"\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:fa\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Manufacturer Y\",\n \"model\": \"Device y\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"Yes\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\n \"enabled\": false\n },\n \"dns\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"protocol\": {\n \"enabled\": false\n },\n \"services\": {\n \"enabled\": false\n },\n \"tls\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.8.0-40\"\n }\n]" } ], "callbacks": [] diff --git a/modules/ui/package.json b/modules/ui/package.json index 44c02f0d2..417cf2b66 100644 --- a/modules/ui/package.json +++ b/modules/ui/package.json @@ -68,6 +68,7 @@ "typescript": "~5.9.3" }, "overrides": { + "@babel/core": "^7.29.7", "brace-expansion": "^5.0.8", "@hono/node-server": "^2.0.5" } diff --git a/modules/ui/src/app/mocks/reports.mock.ts b/modules/ui/src/app/mocks/reports.mock.ts index af72f5346..a6974efa3 100644 --- a/modules/ui/src/app/mocks/reports.mock.ts +++ b/modules/ui/src/app/mocks/reports.mock.ts @@ -12,8 +12,14 @@ export const HISTORY = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:06', firmware: '1.2.2', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/123', export: '/export/123', delete: '/report/123', @@ -29,8 +35,14 @@ export const HISTORY = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:07', firmware: '1.2.3', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/1234', export: '/export/1234', delete: '/report/1234', @@ -46,8 +58,14 @@ export const HISTORY = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:08', firmware: '1.2.2', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/12345', export: '/export/12345', delete: '/report/12345', @@ -66,8 +84,14 @@ export const HISTORY_AFTER_REMOVE = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:06', firmware: '1.2.2', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/123', export: '/export/123', delete: '/report/123', @@ -83,8 +107,14 @@ export const HISTORY_AFTER_REMOVE = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:08', firmware: '1.2.2', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/12345', export: '/export/12345', delete: '/report/12345', @@ -103,8 +133,14 @@ export const FORMATTED_HISTORY = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:06', firmware: '1.2.2', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/123', export: '/export/123', delete: '/report/123', @@ -125,8 +161,14 @@ export const FORMATTED_HISTORY = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:07', firmware: '1.2.3', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/1234', export: '/export/1234', delete: '/report/1234', @@ -147,8 +189,14 @@ export const FORMATTED_HISTORY = [ model: '03-DIN-SRC', mac_addr: '01:02:03:04:05:08', firmware: '1.2.2', + kernel: 'Linux 6.8.0-40-generic', test_pack: TestingType.Qualification, }, + host: { + location: 'Data Center Alpha - Rack 12, Bay B', + linux_env: 'Ubuntu 24.04 LTS (x86_64)', + python_version: '3.11.2', + }, report: '/report/12345', export: '/export/12345', delete: '/report/12345', @@ -167,12 +215,14 @@ export const FILTERS = { deviceFirmware: 'test', results: ['test'], dateRange: 'test', + quickSearch: 'test', }; export const EMPTY_FILTERS = { deviceInfo: '', deviceFirmware: '', results: [''], dateRange: '', + quickSearch: '', }; export const DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY = diff --git a/modules/ui/src/app/model/device.ts b/modules/ui/src/app/model/device.ts index 919603479..b59f50363 100644 --- a/modules/ui/src/app/model/device.ts +++ b/modules/ui/src/app/model/device.ts @@ -21,6 +21,7 @@ export interface Device { mac_addr: string; test_modules?: TestModules; firmware?: string; + kernel?: string; status?: DeviceStatus; type?: string; technology?: string; diff --git a/modules/ui/src/app/model/filters.ts b/modules/ui/src/app/model/filters.ts index b85ebbc52..8d7359895 100644 --- a/modules/ui/src/app/model/filters.ts +++ b/modules/ui/src/app/model/filters.ts @@ -19,6 +19,7 @@ export enum FilterName { Results = 'results', Started = 'started', DateRange = 'dateRange', + QuickSearch = 'quickSearch', } export enum FilterTitle { @@ -57,6 +58,7 @@ export class Filters { deviceFirmware = ''; results: string[] = []; dateRange: DateRange | string = ''; + quickSearch = ''; } function getDateString(date: string | Date) { diff --git a/modules/ui/src/app/model/testrun-status.ts b/modules/ui/src/app/model/testrun-status.ts index 4559f25ac..4a8b0e345 100644 --- a/modules/ui/src/app/model/testrun-status.ts +++ b/modules/ui/src/app/model/testrun-status.ts @@ -19,9 +19,16 @@ interface TestRun { version: string; } +export interface HostInfo { + location?: string | null; + linux_env?: string | null; + python_version?: string | null; +} + export interface TestrunReport { testrun: TestRun; device: IDevice; + host?: HostInfo | null; status: StatusOfTestrun; result: ResultOfTestrun; started: string; diff --git a/modules/ui/src/app/pages/reports/components/delete-report/delete-report.component.html b/modules/ui/src/app/pages/reports/components/delete-report/delete-report.component.html index 1385366a7..e24f64085 100644 --- a/modules/ui/src/app/pages/reports/components/delete-report/delete-report.component.html +++ b/modules/ui/src/app/pages/reports/components/delete-report/delete-report.component.html @@ -17,6 +17,7 @@ - @if (item.key === 'deviceInfo') { - Device contains "{{ item.value }}" - } - @if (item.key === 'deviceFirmware') { - Firmware contains "{{ item.value }}" - } - @if (item.key !== 'deviceFirmware' && item.key !== 'deviceInfo') { - {{ item.value }} - } + {{ getFilterChipLabel(item.key, item.value) }} } @@ -42,12 +36,12 @@
-
Clear all filters
+
Clear all filters
diff --git a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts index ec48d528a..0644f8ef4 100644 --- a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts +++ b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts @@ -42,10 +42,11 @@ describe('FilterChipsComponent', () => { deviceFirmware: '03', results: ['Compliant'], dateRange: { start: '10/2/2024', end: '11/2/2024' }, + quickSearch: 'Krakow', }; beforeEach(() => { - component.filters = MOCK_FILTERS; + component.filters = { ...MOCK_FILTERS }; }); it(`should clear deviceFirmware filter`, () => { @@ -68,6 +69,13 @@ describe('FilterChipsComponent', () => { expect(component.filters).toEqual(clearedFilters); }); + + it(`should clear quickSearch filter`, () => { + const clearedFilters = { ...MOCK_FILTERS, quickSearch: '' }; + component.clearFilter('quickSearch'); + + expect(component.filters).toEqual(clearedFilters); + }); }); describe('DOM tests', () => { @@ -97,6 +105,7 @@ describe('FilterChipsComponent', () => { deviceFirmware: '', results: [], dateRange: '', + quickSearch: '', }; fixture.detectChanges(); }); @@ -114,13 +123,23 @@ describe('FilterChipsComponent', () => { deviceFirmware: '03', results: ['Compliant'], dateRange: '', + quickSearch: 'Krakow', }; fixture.detectChanges(); }); it('should be displayed', () => { const chips = compiled.querySelectorAll('.filter-chip'); - expect(chips.length).toEqual(3); + expect(chips.length).toEqual(4); + }); + + it('should render search tag for quickSearch filter', () => { + const chips = compiled.querySelectorAll('.filter-chip'); + const quickSearchChip = Array.from(chips).find(c => + c.textContent?.includes('search:') + ); + expect(quickSearchChip).toBeTruthy(); + expect(quickSearchChip?.textContent).toContain('search: "Krakow"'); }); it('should call clearFilter on close button click', () => { @@ -143,6 +162,7 @@ describe('FilterChipsComponent', () => { deviceFirmware: '03', results: ['Compliant'], dateRange: '', + quickSearch: 'Krakow', }; fixture.detectChanges(); }); @@ -155,10 +175,11 @@ describe('FilterChipsComponent', () => { deviceFirmware: '', results: [], dateRange: '', + quickSearch: '', }); }); - it('should filter by kay on clearFilter', () => { + it('should filter by key on clearFilter', () => { component.clearFilter('deviceInfo'); expect(component.filters).toEqual({ @@ -166,7 +187,38 @@ describe('FilterChipsComponent', () => { deviceFirmware: '03', results: ['Compliant'], dateRange: '', + quickSearch: 'Krakow', }); }); + + it('should format filter chip labels correctly', () => { + expect(component.getFilterChipLabel('quickSearch', 'Krakow')).toBe( + 'search: "Krakow"' + ); + expect(component.getFilterChipLabel('deviceInfo', 'Pixel')).toBe( + 'Device contains "Pixel"' + ); + expect(component.getFilterChipLabel('deviceFirmware', '1.0')).toBe( + 'Firmware contains "1.0"' + ); + expect( + component.getFilterChipLabel('dateRange', { + start: '01/01/2024', + end: '01/05/2024', + }) + ).toBe('01/01/2024 - 01/05/2024'); + expect( + component.getFilterChipLabel('results', ['Compliant', 'Non-Compliant']) + ).toBe('Compliant, Non-Compliant'); + }); + + it('should generate accessible remove button aria-labels', () => { + expect(component.getRemoveFilterAriaLabel('quickSearch', 'Krakow')).toBe( + 'Clear filter: search: "Krakow"' + ); + expect(component.getRemoveFilterAriaLabel('deviceInfo', 'Pixel')).toBe( + 'Clear filter: Device contains "Pixel"' + ); + }); }); }); diff --git a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts index f2d64a93d..27c9ff271 100644 --- a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts +++ b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts @@ -20,11 +20,17 @@ import { CommonModule, KeyValuePipe } from '@angular/common'; import { DateRange, FilterName, Filters } from '../../../../model/filters'; import { MatButtonModule } from '@angular/material/button'; +export type FilterValue = + | string + | string[] + | DateRange + | { start?: string | Date | null; end?: string | Date | null } + | null; + @Component({ selector: 'app-filter-chips', templateUrl: './filter-chips.component.html', styleUrls: ['./filter-chips.component.scss'], - imports: [ MatIconModule, MatChipsModule, @@ -38,11 +44,45 @@ export class FilterChipsComponent { @Output() filterCleared = new EventEmitter(); - isValueEmpty(value: string | string[] | DateRange) { - if (value instanceof DateRange) { + isValueEmpty(value: FilterValue) { + if ( + value instanceof DateRange || + (typeof value === 'object' && value !== null && !Array.isArray(value)) + ) { return !value.start && !value.end; } - return value === null || value.length === 0; + return value === null || value === undefined || value.length === 0; + } + + getFilterChipLabel(key: string, value: FilterValue): string { + if (key === FilterName.QuickSearch) { + return `search: "${value}"`; + } + if (key === FilterName.DeviceInfo) { + return `Device contains "${value}"`; + } + if (key === FilterName.DeviceFirmware) { + return `Firmware contains "${value}"`; + } + if (key === FilterName.DateRange) { + if ( + typeof value === 'object' && + value && + !Array.isArray(value) && + (value.start || value.end) + ) { + return `${value.start || ''} - ${value.end || ''}`; + } + return String(value ?? ''); + } + if (Array.isArray(value)) { + return value.join(', '); + } + return String(value ?? ''); + } + + getRemoveFilterAriaLabel(key: string, value: FilterValue): string { + return `Clear filter: ${this.getFilterChipLabel(key, value)}`; } clearFilter(filter: string) { @@ -59,6 +99,9 @@ export class FilterChipsComponent { case FilterName.DateRange: this.filters.dateRange = ''; break; + case FilterName.QuickSearch: + this.filters.quickSearch = ''; + break; } this.filterCleared.emit(this.filters); } @@ -68,6 +111,7 @@ export class FilterChipsComponent { this.filters.deviceFirmware = ''; this.filters.results = []; this.filters.dateRange = ''; + this.filters.quickSearch = ''; this.filterCleared.emit(this.filters); } } diff --git a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html b/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html index bbc4469dd..f97391eb9 100644 --- a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html +++ b/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html @@ -25,6 +25,7 @@ let-filterOpened="filterOpened" let-activeFilter="activeFilter"> diff --git a/modules/ui/src/app/pages/reports/reports.component.html b/modules/ui/src/app/pages/reports/reports.component.html index 970b1487f..64424d718 100644 --- a/modules/ui/src/app/pages/reports/reports.component.html +++ b/modules/ui/src/app/pages/reports/reports.component.html @@ -16,10 +16,13 @@ @if (viewModel$ | async; as vm) { @if (vm.dataLoaded) { -

Reports

+

Reports

Reports [dataSource]="vm.dataSource" [trackBy]="trackByStarted" mat-table + multiTemplateDataRows matSort [matSortActive]="FilterName.Started" matSortDirection="desc" + aria-labelledby="reports-heading" tabindex="0"> + + + + + + + Reports + fontSet="material-symbols-outlined" + aria-hidden="true"> lab_profile @@ -151,7 +184,8 @@

Reports

+ fontSet="material-symbols-outlined" + aria-hidden="true"> archive @@ -163,7 +197,8 @@

Reports

(removeDevice)="removeReport(data)"> + fontSet="material-symbols-outlined" + aria-hidden="true"> delete @@ -183,6 +218,94 @@

Reports

+ + + + + + + + + + Reports (click)="selectRow(rowElement)" (keydown.enter)="selectRow(rowElement)" (keydown.space)="selectRow(rowElement)"> + } @@ -227,3 +358,15 @@

Reports

[message]="message"> + + + + + {{ EMPTY_DETAIL_TEXT }} + + diff --git a/modules/ui/src/app/pages/reports/reports.component.scss b/modules/ui/src/app/pages/reports/reports.component.scss index 37ae5a8b2..bf6c6fca2 100644 --- a/modules/ui/src/app/pages/reports/reports.component.scss +++ b/modules/ui/src/app/pages/reports/reports.component.scss @@ -19,6 +19,8 @@ @use 'mixins'; @use 'variables'; +$column-expand-width: 56px; + :host { overflow: hidden; display: flex; @@ -59,6 +61,16 @@ --mat-table-row-item-label-text-color: #{colors.$on-surface-variant}; --mat-table-row-item-outline-color: #{colors.$outline-variant}; + .mat-column-expand, + .mat-column-expandedDetailSpacer { + width: $column-expand-width; + min-width: $column-expand-width; + max-width: $column-expand-width; + padding: 0; + text-align: center; + box-sizing: border-box; + } + .table-cell-actions-container { display: flex; gap: 8px; @@ -68,30 +80,6 @@ padding-left: 8px; white-space: nowrap; } - - .filter-button { - display: flex; - width: 24px; - height: 24px; - justify-content: center; - align-items: center; - flex-shrink: 0; - margin: 0 2px 0 12px; - padding: 0; - border: none; - background: colors.$white; - cursor: pointer; - &:hover { - background-color: rgba(0, 0, 0, 0.04); - } - &:active { - background-color: rgba(0, 0, 0, 0.12); - } - } - - .filter-button.active .mat-icon { - color: mat.get-theme-color($light-theme, primary, 35); - } } @container history-content (width < 770px) { @@ -99,6 +87,14 @@ td { padding: 0 8px; } + + .metadata-accordion-detail .metadata-card { + padding-left: 8px; + + .metadata-grid { + gap: 0.5rem 0.75rem; + } + } } @container history-content (width < 680px) { @@ -106,6 +102,14 @@ td { padding: 0 4px; } + + .metadata-accordion-detail .metadata-card { + padding-left: 4px; + + .metadata-grid { + gap: 0.5rem 0.5rem; + } + } } @container history-content (width < 632px) { @@ -113,67 +117,154 @@ td { padding: 0 2px; } + + .metadata-accordion-detail .metadata-card { + padding-left: 2px; + + .metadata-grid { + gap: 0.5rem 0.35rem; + } + } } -.results-content-empty, .results-content-filter-empty { display: flex; align-items: center; justify-content: center; } -.results-content-empty { - @include mixins.content-empty; +::ng-deep .download-report-icon, +.delete-report-icon { + color: var(--mat-table-row-item-label-text-color); } -.results-content-empty-message { - display: flex; - flex-direction: column; - align-items: center; - gap: 16px; +.hidden { + display: none; } -.results-content-empty-message-header { - font-weight: 400; - line-height: 28px; - font-size: 22px; - color: colors.$black; +.download-report-zip-icon-container { + @include mixins.report-action; } -.results-content-empty-message-main { - font-family: variables.$font-secondary; - font-weight: 400; - font-size: 16px; - line-height: 24px; - letter-spacing: 0.1px; - color: #202124; +::ng-deep .mat-sort-header-container { + padding-bottom: 4px; + height: variables.$reports-table-header-size; } -::ng-deep .download-report-icon, -.delete-report-icon { - color: var(--mat-table-row-item-label-text-color); +.expand-row-button { + &:focus-visible { + outline: 2px solid colors.$primary; + outline-offset: 2px; + } } -.hidden { - display: none; +.history-content { + &:focus-visible { + outline: 2px solid colors.$primary; + outline-offset: -2px; + } } -.results-content-empty-message-img { - width: 293px; - height: 154px; - background-image: url(/assets/icons/desktop.svg); -} +tr.detail-row { + height: 0; + + td.expanded-detail-spacer-cell, + td.expanded-detail-cell { + padding: 0; + border-bottom: none; + } -.results-content-filter-empty .results-content-empty-message-main { - line-height: 20px; - font-size: 14px; + &.expanded-row { + td.expanded-detail-spacer-cell, + td.expanded-detail-cell { + border-bottom: 1px solid #c4c7c5; + } + } } -.download-report-zip-icon-container { - @include mixins.report-action; +.metadata-accordion-detail { + overflow: hidden; + + .metadata-card { + padding: 16px 20px 16px 16px; + + dl.metadata-grid { + margin: 0; + padding: 0; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 0.85rem 1.25rem; + + .metadata-item { + display: flex; + flex-direction: column; + gap: 0.2rem; + min-width: 0; + + .meta-label { + display: flex; + align-items: center; + gap: 0.3rem; + font-family: variables.$font-secondary; + font-weight: 500; + font-size: 12px; + line-height: 16px; + color: colors.$on-surface-variant; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .meta-value-container { + margin: 0; + padding: 0; + min-width: 0; + } + + .meta-value { + font-family: variables.$font-secondary; + font-weight: 400; + font-size: 14px; + line-height: 20px; + color: colors.$on-surface; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-word; + overflow-wrap: break-word; + + &.meta-value-missing { + display: inline-flex; + align-items: center; + gap: 4px; + + .missing-icon { + font-size: 16px; + width: 16px; + height: 16px; + line-height: 16px; + color: mat.get-theme-color($light-theme, neutral, 40); + background-color: colors.$white; + border-radius: 50%; + flex-shrink: 0; + font-variation-settings: + 'FILL' 1, + 'wght' 400, + 'GRAD' 0, + 'opsz' 24; + } + } + } + } + } + } } -::ng-deep .mat-sort-header-container { - padding-bottom: 4px; - height: variables.$reports-table-header-size; +@media (prefers-reduced-motion: reduce) { + .metadata-accordion-detail { + transition: none !important; + animation: none !important; + } } diff --git a/modules/ui/src/app/pages/reports/reports.component.spec.ts b/modules/ui/src/app/pages/reports/reports.component.spec.ts index d95d381fc..2e19bf002 100644 --- a/modules/ui/src/app/pages/reports/reports.component.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.component.spec.ts @@ -28,15 +28,17 @@ import { LiveAnnouncer } from '@angular/cdk/a11y'; import { MatDialogRef } from '@angular/material/dialog'; import { FilterDialogComponent } from './components/filter-dialog/filter-dialog.component'; import { ElementRef } from '@angular/core'; -import { FilterName, FilterTitle } from '../../model/filters'; +import { FilterName, FilterTitle, Filters } from '../../model/filters'; import SpyObj = jasmine.SpyObj; import { DATA_SOURCE_INITIAL_VALUE, ReportsStore } from './reports.store'; import { DATA_SOURCE_FOR_EMPTY_FILTERS, DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY, + FORMATTED_HISTORY, HISTORY, } from '../../mocks/reports.mock'; import { MatTableDataSource } from '@angular/material/table'; +import { MatSort } from '@angular/material/sort'; import { HistoryTestrun } from '../../model/testrun-status'; describe('ReportsComponent', () => { @@ -53,6 +55,7 @@ describe('ReportsComponent', () => { ) => { return of({ displayedColumns: [ + 'expand', 'started', 'duration', 'deviceInfo', @@ -69,6 +72,7 @@ describe('ReportsComponent', () => { deviceFirmware: '', results: ['compliant'], dateRange: '', + quickSearch: '', }, dataLoaded: dataLoaded, selectedRow: null, @@ -85,6 +89,7 @@ describe('ReportsComponent', () => { 'setFilteredValuesDateRange', 'setFilteredValuesDeviceFirmware', 'setFilteredValuesDeviceInfo', + 'setFilteredValuesQuickSearch', 'setFilteredValuesResults', 'setActiveFiler', 'setFilterOpened', @@ -121,11 +126,24 @@ describe('ReportsComponent', () => { expect(mockReportsStore.fetchReports).toHaveBeenCalled(); })); + + it('should update sort if sort viewChild is available', () => { + const mockSort = new MatSort(); + spyOn(component, 'sort').and.returnValue(mockSort); + + component.ngOnInit(); + + expect(mockReportsStore.updateSort).toHaveBeenCalledWith(mockSort); + }); }); - it('#sortData should call liveAnnouncer with sorted direction message', () => { + it('#sortData should call liveAnnouncer with sorted direction message and update sort', () => { + const mockSort = new MatSort(); + spyOn(component, 'sort').and.returnValue(mockSort); + component.sortData({ active: '', direction: 'desc' }); + expect(mockReportsStore.updateSort).toHaveBeenCalledWith(mockSort); expect(mockLiveAnnouncer.announce).toHaveBeenCalledWith( 'Sorted descending' ); @@ -267,9 +285,12 @@ describe('ReportsComponent', () => { it('should focus next active element if exist', fakeAsync(() => { const row = window.document.querySelector('tbody tr') as HTMLElement; row.classList.add('report-selected'); - const nextButton = window.document.querySelector( - '.report-selected + tr a' - ) as HTMLButtonElement; + const nextButton = (window.document.querySelector( + '.report-selected + tr + tr a' + ) || + window.document.querySelector( + '.report-selected + tr a' + )) as HTMLButtonElement; const buttonFocusSpy = spyOn(nextButton, 'focus'); component.focusNextButton(); @@ -298,6 +319,174 @@ describe('ReportsComponent', () => { component.removeReport(data); expect(mockReportsStore.deleteReport).toHaveBeenCalledWith('/report/123'); }); + + describe('search query methods', () => { + it('applySearchQuery should call setFilteredValuesQuickSearch', () => { + component.searchQuery = 'testSearch'; + component.applySearchQuery(); + + expect( + mockReportsStore.setFilteredValuesQuickSearch + ).toHaveBeenCalledWith('testSearch'); + }); + + it('addSearchTag should set searchQuery and call applySearchQuery', () => { + component.addSearchTag('tagSearch'); + + expect(component.searchQuery).toBe('tagSearch'); + expect( + mockReportsStore.setFilteredValuesQuickSearch + ).toHaveBeenCalledWith('tagSearch'); + }); + + it('clearSearchQuery should reset searchQuery and call applySearchQuery', () => { + component.searchQuery = 'someQuery'; + component.clearSearchQuery(); + + expect(component.searchQuery).toBe(''); + expect( + mockReportsStore.setFilteredValuesQuickSearch + ).toHaveBeenCalledWith(''); + }); + }); + + describe('Row expansion methods', () => { + it('toggleRowExpand should add and delete row from expandedRows and announce to screen reader', () => { + const item = FORMATTED_HISTORY[0]; + expect(component.isExpanded(item)).toBeFalse(); + + component.toggleRowExpand(item); + expect(component.isExpanded(item)).toBeTrue(); + expect(mockLiveAnnouncer.announce).toHaveBeenCalledWith( + `Metadata expanded for ${item.deviceInfo}` + ); + + component.toggleRowExpand(item); + expect(component.isExpanded(item)).toBeFalse(); + expect(mockLiveAnnouncer.announce).toHaveBeenCalledWith( + `Metadata collapsed for ${item.deviceInfo}` + ); + }); + + it('toggleRowExpand should stop event propagation when event is provided', () => { + const item = FORMATTED_HISTORY[0]; + const event = jasmine.createSpyObj('Event', [ + 'preventDefault', + 'stopPropagation', + ]); + + component.toggleRowExpand(item, event); + + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopPropagation).toHaveBeenCalled(); + expect(component.isExpanded(item)).toBeTrue(); + }); + + it('getRowId should return sanitized identifier', () => { + const item = { + ...FORMATTED_HISTORY[0], + started: '2023-06-23T10:11:00', + deviceInfo: 'Raspberry Pi / 4', + }; + const id = component.getRowId(item); + expect(id).toBe('2023-06-23T10_11_00-Raspberry_Pi___4'); + }); + }); + + describe('filterCleared', () => { + it('should update searchQuery and call store.setFilteredValues', () => { + const filters = { + deviceInfo: '', + deviceFirmware: '', + results: [], + dateRange: '', + quickSearch: 'searchKeyword', + }; + + component.filterCleared(filters); + + expect(component.searchQuery).toBe('searchKeyword'); + expect(mockReportsStore.setFilteredValues).toHaveBeenCalledWith( + filters + ); + }); + + it('should fallback to empty searchQuery if quickSearch is missing in filters', () => { + const filters = { + deviceInfo: '', + deviceFirmware: '', + results: [], + dateRange: '', + }; + + component.filterCleared(filters as unknown as Filters); + + expect(component.searchQuery).toBe(''); + expect(mockReportsStore.setFilteredValues).toHaveBeenCalledWith( + filters as unknown as Filters + ); + }); + }); + + describe('selectRow and trackByStarted', () => { + it('selectRow should call store.setSelectedRow', () => { + const row = {} as HistoryTestrun; + component.selectRow(row); + expect(mockReportsStore.setSelectedRow).toHaveBeenCalledWith(row); + }); + + it('trackByStarted should return started date of item', () => { + expect(component.trackByStarted(0, FORMATTED_HISTORY[0])).toBe( + FORMATTED_HISTORY[0].started + ); + }); + }); + + describe('Metadata helper methods', () => { + it('should return location from host object', () => { + expect(component.getLocation(HISTORY[0])).toBe( + 'Data Center Alpha - Rack 12, Bay B' + ); + + const itemWithoutHost = { + ...HISTORY[0], + host: null, + } as HistoryTestrun; + expect(component.getLocation(itemWithoutHost)).toBeUndefined(); + }); + + it('should return linux_env from host object', () => { + expect(component.getLinuxEnv(HISTORY[0])).toBe( + 'Ubuntu 24.04 LTS (x86_64)' + ); + + const itemWithoutHost = { + ...HISTORY[0], + host: null, + } as HistoryTestrun; + expect(component.getLinuxEnv(itemWithoutHost)).toBeUndefined(); + }); + + it('should return kernel from device object', () => { + expect(component.getKernel(HISTORY[0])).toBe('Linux 6.8.0-40-generic'); + + const itemWithoutDevice = { + ...HISTORY[0], + device: null, + } as unknown as HistoryTestrun; + expect(component.getKernel(itemWithoutDevice)).toBeUndefined(); + }); + + it('should return python_version from host object', () => { + expect(component.getPythonVersion(HISTORY[0])).toBe('3.11.2'); + + const itemWithoutHost = { + ...HISTORY[0], + host: null, + } as HistoryTestrun; + expect(component.getPythonVersion(itemWithoutHost)).toBeUndefined(); + }); + }); }); describe('DOM tests', () => { @@ -403,6 +592,67 @@ describe('ReportsComponent', () => { expect(mockReportsStore.setSelectedRow).toHaveBeenCalled(); }); + + it('should render detail row with spacer cell and expanded detail cell with accessibility attributes', () => { + const detailRow = compiled.querySelector('tr.detail-row'); + const spacerCell = detailRow?.querySelector( + '.expanded-detail-spacer-cell' + ); + const detailCell = detailRow?.querySelector('.expanded-detail-cell'); + const metadataDetail = detailRow?.querySelector( + '.metadata-accordion-detail' + ); + const metadataGrid = detailRow?.querySelector('dl.metadata-grid'); + const expandButton = compiled.querySelector('.expand-row-button'); + + expect(detailRow).toBeTruthy(); + expect(spacerCell).toBeTruthy(); + expect(detailCell).toBeTruthy(); + expect(metadataDetail).toBeTruthy(); + expect(metadataGrid).toBeTruthy(); + expect(detailCell?.getAttribute('colspan')).toBe('6'); + expect(expandButton?.getAttribute('aria-expanded')).toBe('false'); + expect(metadataDetail?.getAttribute('role')).toBe('region'); + expect(expandButton?.getAttribute('aria-controls')).toBeTruthy(); + }); + + it('should add expanded-row class to detail row when row is expanded', () => { + const detailRow = compiled.querySelector('tr.detail-row'); + expect(detailRow?.classList).not.toContain('expanded-row'); + + component.toggleRowExpand(DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY.data[0]); + fixture.detectChanges(); + + expect(detailRow?.classList).toContain('expanded-row'); + }); + + it('should render metadata values when present', () => { + const detailRow = compiled.querySelector('tr.detail-row'); + const metaValues = detailRow?.querySelectorAll('.meta-value'); + expect(metaValues?.length).toBeGreaterThanOrEqual(4); + }); + + it('should render "Could not fetch details" with error icon when metadata is missing', () => { + const itemWithoutMeta = { + ...DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY.data[0], + host: null, + location: null, + device: { + ...DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY.data[0].device, + kernel: undefined, + location: undefined, + linux_env: undefined, + }, + kernel: null, + linux_env: null, + python_version: null, + } as HistoryTestrun; + + expect(component.getLocation(itemWithoutMeta)).toBeFalsy(); + expect(component.getLinuxEnv(itemWithoutMeta)).toBeFalsy(); + expect(component.getKernel(itemWithoutMeta)).toBeFalsy(); + expect(component.getPythonVersion(itemWithoutMeta)).toBeFalsy(); + }); }); }); }); diff --git a/modules/ui/src/app/pages/reports/reports.component.ts b/modules/ui/src/app/pages/reports/reports.component.ts index a530f97f1..4a1d0857a 100644 --- a/modules/ui/src/app/pages/reports/reports.component.ts +++ b/modules/ui/src/app/pages/reports/reports.component.ts @@ -29,10 +29,13 @@ import { TestrunReport, } from '../../model/testrun-status'; import { CommonModule, DatePipe } from '@angular/common'; +import { FormsModule } from '@angular/forms'; import { MatSort, MatSortModule, Sort } from '@angular/material/sort'; import { Subject, takeUntil, timer } from 'rxjs'; import { MatRow, MatTableModule } from '@angular/material/table'; import { MatDialog } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { MatInputModule } from '@angular/material/input'; import { tap } from 'rxjs/internal/operators/tap'; import { FilterName, FilterTitle, Filters } from '../../model/filters'; import { ReportsStore } from './reports.store'; @@ -49,6 +52,7 @@ import { DeleteReportComponent } from './components/delete-report/delete-report. import { FilterDialogComponent } from './components/filter-dialog/filter-dialog.component'; import { EmptyMessageComponent } from '../../components/empty-message/empty-message.component'; import { MatTooltipModule } from '@angular/material/tooltip'; +import { state, style, trigger } from '@angular/animations'; @Component({ selector: 'app-history', @@ -56,10 +60,13 @@ import { MatTooltipModule } from '@angular/material/tooltip'; styleUrls: ['./reports.component.scss'], imports: [ CommonModule, + FormsModule, MatTableModule, MatIconModule, MatToolbarModule, MatSortModule, + MatButtonModule, + MatInputModule, FilterChipsComponent, DeleteReportComponent, DownloadReportZipComponent, @@ -71,8 +78,18 @@ import { MatTooltipModule } from '@angular/material/tooltip'; MatTooltipModule, ], providers: [ReportsStore, DatePipe], + animations: [ + trigger('detailExpand', [ + state( + 'collapsed,void', + style({ height: '0px', minHeight: '0', display: 'none' }) + ), + state('expanded', style({ height: '*' })), + ]), + ], }) export class ReportsComponent implements OnInit, OnDestroy { + EMPTY_DETAIL_TEXT = 'Could not fetch details'; private testRunService = inject(TestRunService); private datePipe = inject(DatePipe); private liveAnnouncer = inject(LiveAnnouncer); @@ -93,6 +110,70 @@ export class ReportsComponent implements OnInit, OnDestroy { } } + public expandedRows: Set = new Set(); + public searchQuery: string = ''; + + getRowId(data: HistoryTestrun | TestrunReport): string { + const rawId = + (data as { id?: string })?.id || + `${data.started || ''}-${(data as HistoryTestrun).deviceInfo || data.device?.model || ''}`; + return rawId.toString().replace(/[^a-zA-Z0-9_-]/g, '_'); + } + + toggleRowExpand(data: HistoryTestrun, event?: Event) { + if (event) { + event.preventDefault(); + event.stopPropagation(); + } + if (this.expandedRows.has(data)) { + this.expandedRows.delete(data); + this.liveAnnouncer.announce( + `Metadata collapsed for ${data.deviceInfo || 'test run'}` + ); + } else { + this.expandedRows.add(data); + this.liveAnnouncer.announce( + `Metadata expanded for ${data.deviceInfo || 'test run'}` + ); + } + } + + isExpanded(data: HistoryTestrun): boolean { + return this.expandedRows.has(data); + } + + getLocation(data: HistoryTestrun | TestrunReport): string | null | undefined { + return data.host?.location; + } + + getLinuxEnv(data: HistoryTestrun | TestrunReport): string | null | undefined { + return data.host?.linux_env; + } + + getKernel(data: HistoryTestrun | TestrunReport): string | null | undefined { + return data.device?.kernel; + } + + getPythonVersion( + data: HistoryTestrun | TestrunReport + ): string | null | undefined { + return data.host?.python_version; + } + + applySearchQuery() { + this.store.setFilteredValuesQuickSearch(this.searchQuery); + } + + addSearchTag(tag: string) { + this.searchQuery = tag; + this.applySearchQuery(); + } + + clearSearchQuery() { + this.searchQuery = ''; + this.applySearchQuery(); + } + getFormattedDateString(date: string | null) { return date ? this.datePipe.transform(date, 'd MMM y H:mm') : ''; } @@ -172,6 +253,7 @@ export class ReportsComponent implements OnInit, OnDestroy { } filterCleared(filters: Filters) { + this.searchQuery = filters.quickSearch || ''; this.store.setFilteredValues(filters); } @@ -190,9 +272,12 @@ export class ReportsComponent implements OnInit, OnDestroy { focusNextButton() { // Try to focus next interactive element, if exists - const next = window.document.querySelector( - '.report-selected + tr a' - ) as HTMLButtonElement; + const next = (window.document.querySelector( + '.report-selected + tr + tr a' + ) || + window.document.querySelector( + '.report-selected + tr a' + )) as HTMLButtonElement; if (next) { timer(50).subscribe(() => { next.focus(); diff --git a/modules/ui/src/app/pages/reports/reports.store.spec.ts b/modules/ui/src/app/pages/reports/reports.store.spec.ts index fc76a45a7..c2878c341 100644 --- a/modules/ui/src/app/pages/reports/reports.store.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.store.spec.ts @@ -19,7 +19,9 @@ import SpyObj = jasmine.SpyObj; import { TestBed } from '@angular/core/testing'; import { skip, take } from 'rxjs'; import { of } from 'rxjs/internal/observable/of'; -import { ReportsStore } from './reports.store'; +import { ReportsComponentState, ReportsStore } from './reports.store'; +import { DateRange } from '../../model/filters'; +import { HistoryTestrun } from '../../model/testrun-status'; import { EMPTY_FILTERS, FILTERS, @@ -34,6 +36,7 @@ import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { selectReports, selectRiskProfiles } from '../../store/selectors'; import { AppState } from '../../store/state'; import { setReports } from '../../store/actions'; +import { TestingType } from '../../model/device'; describe('ReportsStore', () => { let reportsStore: ReportsStore; @@ -132,6 +135,7 @@ describe('ReportsStore', () => { reportsStore.viewModel$.pipe(take(1)).subscribe(store => { expect(store).toEqual({ displayedColumns: [ + 'expand', 'started', 'duration', 'deviceInfo', @@ -149,6 +153,7 @@ describe('ReportsStore', () => { deviceFirmware: '', results: [], dateRange: '', + quickSearch: '', }, dataLoaded: true, selectedRow: null, @@ -253,6 +258,74 @@ describe('ReportsStore', () => { }); }); + describe('setFilteredValuesQuickSearch', () => { + it('should update store', done => { + const updatedFilters = { ...FILTERS, ...{ quickSearch: 'test2' } }; + store.overrideSelector(selectReports, [...HISTORY]); + reportsStore.setFilteredValues({ ...FILTERS }); + + reportsStore.setFilteredValuesQuickSearch('test2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.filteredValues).toEqual(updatedFilters); + expect(store.dataSource.filter).toEqual( + JSON.stringify(updatedFilters) + ); + done(); + }); + }); + + it('should filter by location, kernel, or linux_env', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch('Data Center Alpha'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(3); + done(); + }); + }); + + it('should filter by kernel', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch('Linux 6.8'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(3); + done(); + }); + }); + + it('should filter by linux_env', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch('Ubuntu 24.04'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(3); + done(); + }); + }); + + it('should filter by python_version', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch('3.11.2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(3); + done(); + }); + }); + + it('should filter by mac address', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch('05:07'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(1); + done(); + }); + }); + }); + describe('setFilteredValuesDeviceFirmware', () => { it('should update store', done => { const updatedFilters = { ...FILTERS, ...{ deviceFirmware: 'test2' } }; @@ -306,5 +379,132 @@ describe('ReportsStore', () => { }); }); }); + + describe('fetchReports', () => { + it('should dispatch fetchReports action', () => { + reportsStore.fetchReports(); + expect(store.dispatch).toHaveBeenCalled(); + }); + }); + + describe('sortingDataAccessor and formatting helpers', () => { + it('sortingDataAccessor should handle string and non-string values', () => { + reportsStore.setDataSource([...HISTORY]); + const dataSource = ( + reportsStore as unknown as { get: () => ReportsComponentState } + ).get().dataSource; + + expect( + dataSource.sortingDataAccessor( + { deviceInfo: 'Raspberry Pi' } as HistoryTestrun, + 'deviceInfo' + ) + ).toBe('raspberry pi'); + expect( + dataSource.sortingDataAccessor( + { count: 123 } as unknown as HistoryTestrun, + 'count' + ) + ).toBe(123); + }); + + it('should handle Pilot test pack and non-complete qualification in test results', done => { + const pilotItem = { + ...HISTORY[0], + device: { + ...HISTORY[0].device, + test_pack: TestingType.Pilot, + }, + status: 'In Progress', + }; + const incompleteQualItem = { + ...HISTORY[0], + device: { + ...HISTORY[0].device, + test_pack: TestingType.Qualification, + }, + status: 'Running', + result: null, + }; + + reportsStore.setDataSource([ + pilotItem as unknown as HistoryTestrun, + incompleteQualItem as unknown as HistoryTestrun, + ]); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.data[0].testResult).toBe('In Progress'); + expect(vm.dataSource.data[1].testResult).toBe('Running'); + done(); + }); + }); + + it('should handle missing started or finished dates in duration calculation', done => { + const itemWithoutDates = { + ...HISTORY[0], + started: null, + finished: null, + }; + + reportsStore.setDataSource([ + itemWithoutDates as unknown as HistoryTestrun, + ]); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.data[0].duration).toBe(''); + done(); + }); + }); + }); + + describe('DateRange and search query filter variations', () => { + it('should filter by date strings in dateRange', done => { + reportsStore.setDataSource([...HISTORY]); + + reportsStore.setFilteredValuesDateRange({ + start: '2023-06-20T00:00:00Z', + end: '2023-06-25T23:59:59Z', + } as unknown as DateRange); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.filteredData.length).toBe(2); + done(); + }); + }); + + it('should filter out items outside DateRange', done => { + reportsStore.setDataSource([...HISTORY]); + + reportsStore.setFilteredValuesDateRange({ + start: '2024-01-01T00:00:00Z', + end: '2024-01-05T23:59:59Z', + } as unknown as DateRange); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.filteredData.length).toBe(0); + done(); + }); + }); + + it('should filter by folder_name, report URL, and export URL in quickSearch', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch('12345'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.filteredData.length).toBe(1); + done(); + }); + }); + + it('should return all items when quickSearch is empty or contains only whitespace', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch(' '); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.filteredData.length).toBe(3); + done(); + }); + }); + }); }); }); diff --git a/modules/ui/src/app/pages/reports/reports.store.ts b/modules/ui/src/app/pages/reports/reports.store.ts index 6dce5e217..4be683c1b 100644 --- a/modules/ui/src/app/pages/reports/reports.store.ts +++ b/modules/ui/src/app/pages/reports/reports.store.ts @@ -159,6 +159,18 @@ export class ReportsStore extends ComponentStore { ); }); + setFilteredValuesQuickSearch = this.effect(quickSearch$ => { + return quickSearch$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([quickSearch, filteredValues, dataSource]) => { + this.updateFilters(dataSource, { + ...filteredValues, + quickSearch, + }); + }) + ); + }); + setFilteredValuesDeviceInfo = this.effect(deviceInfo$ => { return deviceInfo$.pipe( withLatestFrom(this.filteredValues$, this.dataSource$), @@ -298,6 +310,10 @@ export class ReportsStore extends ComponentStore { data.deviceInfo, searchString.deviceInfo ); + const isIncludeSearchQuery = this.filterSearchQuery( + data, + searchString.quickSearch + ); const isIncludeDeviceFirmware = this.filterStringData( data.deviceFirmware, searchString.deviceFirmware @@ -312,6 +328,7 @@ export class ReportsStore extends ComponentStore { ); return ( + isIncludeSearchQuery && isIncludeDeviceInfo && isIncludeDeviceFirmware && isIncludeStatus && @@ -321,7 +338,44 @@ export class ReportsStore extends ComponentStore { return filterPredicate; } - private filterStringData(data: string, searchString: string): boolean { + private filterSearchQuery( + data: HistoryTestrun, + searchQuery: string = '' + ): boolean { + if (!searchQuery || !searchQuery.trim()) { + return true; + } + const query = searchQuery.trim().toLowerCase(); + const searchableFields = [ + data.deviceInfo, + data.deviceFirmware, + data.device?.manufacturer, + data.device?.model, + data.device?.mac_addr, + data.device?.firmware, + data.device?.kernel, + data.device?.test_pack, + data.program, + data.status, + data.testResult, + data.result, + data.started, + data.finished, + data.duration, + data.folder_name, + data.report, + data.export, + data.host?.location, + data.host?.linux_env, + data.host?.python_version, + ]; + + return searchableFields.some( + field => field && field.toString().toLowerCase().includes(query) + ); + } + + private filterStringData(data: string = '', searchString: string): boolean { return ( data .toString() @@ -375,6 +429,7 @@ export class ReportsStore extends ComponentStore { constructor() { super({ displayedColumns: [ + 'expand', 'started', 'duration', 'deviceInfo', @@ -392,6 +447,7 @@ export class ReportsStore extends ComponentStore { deviceFirmware: '', results: [], dateRange: '', + quickSearch: '', }, dataLoaded: false, selectedRow: null, From 62ed10e471d451eae461017fbe706ca23b28a9be Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Sat, 8 Aug 2026 16:59:17 +0200 Subject: [PATCH 104/196] get device os over ssh --- framework/python/src/common/util.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/framework/python/src/common/util.py b/framework/python/src/common/util.py index 3ef8827dc..a5482971f 100644 --- a/framework/python/src/common/util.py +++ b/framework/python/src/common/util.py @@ -153,3 +153,16 @@ def diff_dicts(d1: t.Dict[t.Any, t.Any], d2: t.Dict[t.Any, t.Any]) -> t.Dict: if items_added: diff['items_added'] = items_added return diff + + +def get_device_os_ssh(ip): + """Attempts to determine the OS of a device via SSH""" + try: + cmd = f'timeout 10 docker exec tr-ct-gateway nc -v -w 2 {ip} 22' + output, _ = run_command(cmd) + if output: + return output.split(' ')[-1].strip() + return '' + except Exception as e: + LOGGER.error(f'Error determining device OS via SSH: {e}') + return '' From be922d06305fc42f79fd377d25332dfa8a3fa663 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Sat, 8 Aug 2026 17:03:42 +0200 Subject: [PATCH 105/196] pylint --- framework/python/src/common/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/python/src/common/util.py b/framework/python/src/common/util.py index a5482971f..339bb90e0 100644 --- a/framework/python/src/common/util.py +++ b/framework/python/src/common/util.py @@ -155,13 +155,13 @@ def diff_dicts(d1: t.Dict[t.Any, t.Any], d2: t.Dict[t.Any, t.Any]) -> t.Dict: return diff -def get_device_os_ssh(ip): +def get_device_os_ssh(ip: str) -> str: """Attempts to determine the OS of a device via SSH""" try: cmd = f'timeout 10 docker exec tr-ct-gateway nc -v -w 2 {ip} 22' output, _ = run_command(cmd) if output: - return output.split(' ')[-1].strip() + return output.rsplit(' ', maxsplit=1)[-1].strip() return '' except Exception as e: LOGGER.error(f'Error determining device OS via SSH: {e}') From 55af300aa3acfaf44620f82e11691e61eea7b81b Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 13:14:58 +0200 Subject: [PATCH 106/196] chenge default value --- framework/python/src/common/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index ec1b19911..73057629c 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -43,7 +43,7 @@ class Device(): test_modules: Dict = field(default_factory=dict) ip_addr: str = None firmware: str = None - kernel: str = None + kernel: str = '' device_folder: str = None reports: List[TestReport] = field(default_factory=list) max_device_reports: int = None From d4ef7fe0cfbc378d1c5c0afe44c9c309e283ba21 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 13:17:32 +0200 Subject: [PATCH 107/196] get device os with nmap --- framework/python/src/common/util.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/framework/python/src/common/util.py b/framework/python/src/common/util.py index 339bb90e0..2db7113fb 100644 --- a/framework/python/src/common/util.py +++ b/framework/python/src/common/util.py @@ -159,10 +159,28 @@ def get_device_os_ssh(ip: str) -> str: """Attempts to determine the OS of a device via SSH""" try: cmd = f'timeout 10 docker exec tr-ct-gateway nc -v -w 2 {ip} 22' - output, _ = run_command(cmd) - if output: - return output.rsplit(' ', maxsplit=1)[-1].strip() + command_result = run_command(cmd, output=True, timeout=10) + if isinstance(command_result, tuple): + output, _ = command_result + if output: + return output.rsplit(' ', maxsplit=1)[-1].strip() return '' except Exception as e: LOGGER.error(f'Error determining device OS via SSH: {e}') return '' + +def get_device_os_nmap(ip: str) -> str: + """Attempts to determine the OS of a device via Nmap""" + try: + cmd = f'docker exec tr-ct-gateway nmap -Pn -O -F -T4 --max-retries 1 {ip}' + command_result = run_command(cmd, output=True, timeout=10) + if isinstance(command_result, tuple): + output, _ = command_result + if output: + for line in output.splitlines(): + if 'OS details:' in line: + return line.split('OS details:')[1].strip() + return '' + except Exception as e: + LOGGER.error(f'Error determining device OS via Nmap: {e}') + return '' From c9e9a36801461b7df3453b6140c9d3e065de4fa8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 13:17:44 +0200 Subject: [PATCH 108/196] set device kernel --- framework/python/src/core/session.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/python/src/core/session.py b/framework/python/src/core/session.py index 1d5f1dae0..425667ecd 100644 --- a/framework/python/src/core/session.py +++ b/framework/python/src/core/session.py @@ -432,6 +432,10 @@ def get_ipv4_subnet(self): def get_ipv6_subnet(self): return self._ipv6_subnet + def set_device_kernel(self, kernel: str): + if self._device is not None: + self._device.kernel = kernel + def get_status(self) -> TestrunStatus: return self._status From 206d918de55adb9b1b1d031b0579e54c147e7bfa Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 13:17:58 +0200 Subject: [PATCH 109/196] install ncat nmap --- modules/network/gateway/gateway.Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/network/gateway/gateway.Dockerfile b/modules/network/gateway/gateway.Dockerfile index 58c3f98ab..d26784272 100644 --- a/modules/network/gateway/gateway.Dockerfile +++ b/modules/network/gateway/gateway.Dockerfile @@ -21,6 +21,8 @@ ARG MODULE_DIR=modules/network/$MODULE_NAME # Install required packages RUN apt-get update && \ apt-get install -y iptables \ + netcat-openbsd \ + nmap \ isc-dhcp-client && \ rm -rf /var/lib/apt/lists/* From 4c9c760944d6c413f7fa8d311ff42833f25d3a75 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 13:18:58 +0200 Subject: [PATCH 110/196] grab device os --- framework/python/src/net_orc/network_orchestrator.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/framework/python/src/net_orc/network_orchestrator.py b/framework/python/src/net_orc/network_orchestrator.py index f081931ac..9e551bb5c 100644 --- a/framework/python/src/net_orc/network_orchestrator.py +++ b/framework/python/src/net_orc/network_orchestrator.py @@ -311,9 +311,19 @@ def _start_device_monitor(self, device): prn=self._monitor_packet_callback) sniffer.start() + device_os_discover_attempts = 3 + device_os = '' while sniffer.running: time.sleep(1) + # Discovering device OS + if device_os_discover_attempts > 0: + device_os = util.get_device_os_nmap(device.ip_addr) + if not device_os: + device_os = util.get_device_os_ssh(device.ip_addr) + device_os_discover_attempts -= 1 + self._session.set_device_kernel(device_os) + # Check Testrun hasn't been cancelled if self._session.get_status() in (TestrunStatus.STOPPING, TestrunStatus.CANCELLED): @@ -330,6 +340,8 @@ def _start_device_monitor(self, device): self._session.set_status(TestrunStatus.CANCELLED) LOGGER.error('Device interface disconnected, cancelling Testrun') + + LOGGER.debug('Writing packets to monitor.pcap') wrpcap(os.path.join(device_runtime_dir, 'monitor.pcap'), self._monitor_packets) From bf72d9a74dc8c619c339c61b92b3ee20ebe71ecc Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 13:39:48 +0200 Subject: [PATCH 111/196] pylint --- framework/python/src/net_orc/network_orchestrator.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/python/src/net_orc/network_orchestrator.py b/framework/python/src/net_orc/network_orchestrator.py index 9e551bb5c..bd696c791 100644 --- a/framework/python/src/net_orc/network_orchestrator.py +++ b/framework/python/src/net_orc/network_orchestrator.py @@ -340,8 +340,6 @@ def _start_device_monitor(self, device): self._session.set_status(TestrunStatus.CANCELLED) LOGGER.error('Device interface disconnected, cancelling Testrun') - - LOGGER.debug('Writing packets to monitor.pcap') wrpcap(os.path.join(device_runtime_dir, 'monitor.pcap'), self._monitor_packets) From 5ecc351c58c11e523db6255fad483d6e8fdf48b1 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 10 Aug 2026 20:26:47 +0200 Subject: [PATCH 112/196] refactor kernel grab function --- framework/python/src/net_orc/network_orchestrator.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/framework/python/src/net_orc/network_orchestrator.py b/framework/python/src/net_orc/network_orchestrator.py index bd696c791..0a54e2dc5 100644 --- a/framework/python/src/net_orc/network_orchestrator.py +++ b/framework/python/src/net_orc/network_orchestrator.py @@ -321,8 +321,11 @@ def _start_device_monitor(self, device): device_os = util.get_device_os_nmap(device.ip_addr) if not device_os: device_os = util.get_device_os_ssh(device.ip_addr) - device_os_discover_attempts -= 1 - self._session.set_device_kernel(device_os) + if device_os: + self._session.set_device_kernel(device_os) + device_os_discover_attempts = 0 + else: + device_os_discover_attempts -= 1 # Check Testrun hasn't been cancelled if self._session.get_status() in (TestrunStatus.STOPPING, From be45e12b6a4845f3d0b506cf706a2343ea9cc47a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 14:56:33 +0200 Subject: [PATCH 113/196] change location service --- framework/python/src/common/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 73057629c..9aeda3a3b 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -179,11 +179,11 @@ class Host(): def get_location(cls) -> str: """Fetches the location of the host system using an external API.""" try: - response = requests.get('https://ipinfo.io/json', timeout=5) + response = requests.get('http://ip-api.com/json/?lang=en', timeout=5) if response.status_code == 200: data = response.json() country = data['country'] - region = data['region'] + region = data['regionName'] city = data['city'] return f'{country}/{region}/{city}' else: From 95c7ad8b5b843a27679917be4cf48a10595a9b03 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Thu, 13 Aug 2026 13:30:42 +0000 Subject: [PATCH 114/196] Change required tls test (#1627) --- resources/test_packs/pilot/test_pack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/test_packs/pilot/test_pack.py b/resources/test_packs/pilot/test_pack.py index 35174a536..9faf61438 100644 --- a/resources/test_packs/pilot/test_pack.py +++ b/resources/test_packs/pilot/test_pack.py @@ -30,7 +30,7 @@ def calculate_status(result, json): # pylint: disable=unused-argument required_tests = [ "connection.dhcp_address", - "security.tls.v1_0_client" + "security.tls.v1_2_client" ] for test_result in json: From 811a2b5fde3418e2931d3eff7374938015b7ba75 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 14:35:15 +0200 Subject: [PATCH 115/196] enable bandit security --- .github/workflows/security.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index c8af2b79a..016a879be 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -111,6 +111,20 @@ jobs: --error \ --exclude="**/testing/**" \ --exclude="modules/ui/node_modules" + bandit_sast_scan: + name: Bandit Python SAST Scan + runs-on: ubuntu-24.04 + steps: + - name: Checkout source + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Set up Python + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 #v.6.0.3 + with: + python-version: '3.13' + - name: Install Bandit + run: pip install bandit==1.9.4 + - name: Run Bandit Analysis + run: bandit -r . -ll -x ./testing,./modules/ui/node_modules From 3b383e520b0072aca8d8b626ac34ae57d36fd017 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 15:14:49 +0200 Subject: [PATCH 116/196] disable semgrep --- framework/python/src/common/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/python/src/common/models.py b/framework/python/src/common/models.py index 9aeda3a3b..9a256da5c 100644 --- a/framework/python/src/common/models.py +++ b/framework/python/src/common/models.py @@ -179,6 +179,7 @@ class Host(): def get_location(cls) -> str: """Fetches the location of the host system using an external API.""" try: + # nosemgrep response = requests.get('http://ip-api.com/json/?lang=en', timeout=5) if response.status_code == 200: data = response.json() From 36bac56555588da7586d57cb48cc65a570bf0f44 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 15:17:38 +0200 Subject: [PATCH 117/196] disable bandit scan for an interface --- framework/python/src/api/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index b4b537c2e..15807b995 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -189,7 +189,7 @@ def start(self): def _start(self): uvicorn.run(self._app, log_config=None, - host="0.0.0.0", + host="0.0.0.0", # nosec B104 port=self._session.get_api_port()) def stop(self): From 46fac944acfb726685a98db0684ec4eb6296cfdb Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 15:24:34 +0200 Subject: [PATCH 118/196] disable bandit scan for jinja because it used only for report generation --- framework/python/src/common/testreport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index 56e2c26c5..84d21b162 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -335,7 +335,7 @@ def to_html(self): TEMPLATES_FOLDER) # Jinja template # nosemgrep - template_env = Environment( + template_env = Environment( # nosec B701 loader=FileSystemLoader( template_folder ), From bf195343c3808ce9ee7d057b33bffb052046896c Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 15:27:42 +0200 Subject: [PATCH 119/196] disable for jinja --- framework/python/src/common/testreport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index 84d21b162..1e37dee6a 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -381,7 +381,7 @@ def to_html(self): module_reports = self._module_reports # nosemgrep - env_module = Environment(loader=BaseLoader()) + env_module = Environment(loader=BaseLoader()) # nosec B701 manufacturer_length = len(json_data['device']['manufacturer']) device_name_length = len(json_data['device']['model']) title_length = manufacturer_length + device_name_length + 1 From 4313785a3c2723259e3554878b138488732639b0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 18:34:59 +0200 Subject: [PATCH 120/196] fix unit tests --- testing/unit/framework/models_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/unit/framework/models_test.py b/testing/unit/framework/models_test.py index 96dfec00f..aa267d5d3 100644 --- a/testing/unit/framework/models_test.py +++ b/testing/unit/framework/models_test.py @@ -23,7 +23,7 @@ @pytest.mark.parametrize('status_code, json_value, expected', [ (200, {'country': 'US', - 'region': 'California', + 'regionName': 'California', 'city': 'San Jose'}, 'US/California/San Jose'), (500, {}, ''), From 75b9b9ba1773d80903570bc4a967d714fc946659 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 18:47:56 +0200 Subject: [PATCH 121/196] disable bandit scan for ovs control --- framework/python/src/net_orc/ovs_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/python/src/net_orc/ovs_control.py b/framework/python/src/net_orc/ovs_control.py index 2c1e17776..5d233e86c 100644 --- a/framework/python/src/net_orc/ovs_control.py +++ b/framework/python/src/net_orc/ovs_control.py @@ -134,7 +134,7 @@ def create_baseline_net(self, verify=True): # Remove IP from internet adapter if not 'single_intf' in self._session.get_runtime_params(): self.set_interface_ip(interface=self._session.get_internet_interface(), - ip_addr='0.0.0.0') + ip_addr='0.0.0.0') # nosec B104 self.add_port(self._session.get_internet_interface(), INTERNET_BRIDGE) # Enable forwarding of eapol packets From 37c1ee1f9505e5b2517af36ceea80d411d577907 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 20:33:31 +0200 Subject: [PATCH 122/196] refactor zip creation --- framework/python/src/api/api.py | 11 ++++-- .../python/src/test_orc/test_orchestrator.py | 36 ++++++++++++------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index 15807b995..ec29d4f6c 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -21,9 +21,11 @@ import os import psutil import requests +import shutil import signal import threading import uvicorn +import tempfile from core import tasks from common import logger @@ -731,18 +733,23 @@ async def get_results( device = device_with_report.device report = device_with_report.report + temp_dir = tempfile.mkdtemp(prefix="testrun_") + zip_file_path = self._get_testrun().get_test_orc().zip_results( - device, report, profile) + device, report, profile, temp_dir) if zip_file_path is None: response.status_code = status.HTTP_500_INTERNAL_SERVER_ERROR + shutil.rmtree(temp_dir, ignore_errors=True) return self._generate_msg( False, "An error occurred whilst archiving test results") if os.path.isfile(zip_file_path): - return FileResponse(zip_file_path) + return FileResponse(zip_file_path, media_type="application/zip", + filename=os.path.basename(zip_file_path)) else: LOGGER.info("Test results could not be found, returning 404") + shutil.rmtree(temp_dir, ignore_errors=True) response.status_code = 404 return self._generate_msg(False, "Test results could not be found") diff --git a/framework/python/src/test_orc/test_orchestrator.py b/framework/python/src/test_orc/test_orchestrator.py index d573dbba7..769d2bbc1 100644 --- a/framework/python/src/test_orc/test_orchestrator.py +++ b/framework/python/src/test_orc/test_orchestrator.py @@ -338,7 +338,9 @@ def _copy_report_to_common_folder(self, device: Device) -> str: def zip_results( self, device: Device, report: TestReport, - profile: risk_profile.RiskProfile) -> str: + profile: risk_profile.RiskProfile, + tmp_dir: str + ) -> str | None: try: LOGGER.debug("Archiving test results") @@ -346,18 +348,22 @@ def zip_results( src_path = os.path.join( LOCAL_DEVICE_REPORTS, report.get_folder_name()) + if not os.path.exists(src_path): + LOGGER.error(f"Source path does not exist: {src_path}") + return None + # Regenerate the report if the device profile has been updated self._regenerate_report_files(device, report) # Define temp directory to store files before zipping - results_dir = os.path.join(f"/tmp/testrun/{time.time()}") + results_dir = os.path.join(tmp_dir, f"results_{time.time()}") # Define where to save the zip file - zip_location = os.path.join("/tmp/testrun", report.get_folder_name()) + zip_location = os.path.join(tmp_dir, report.get_folder_name()) # Delete zip_temp if it already exists if os.path.exists(results_dir): - os.remove(results_dir) + shutil.rmtree(results_dir) # Delete ZIP if it already exists if os.path.exists(zip_location + ".zip"): @@ -382,15 +388,15 @@ def zip_results( # Check that the ZIP was successfully created zip_file = zip_location + ".zip" - LOGGER.info(f"""Archive {"created at " + zip_file - if os.path.exists(zip_file) - else "creation failed"}""") - - return zip_file + if os.path.exists(zip_file): + LOGGER.info(f"Archive created at {zip_file}") + return zip_file + else: + LOGGER.error(f"Archive creation failed: {zip_file} was not created") + return None except Exception as error: # pylint: disable=W0703 - LOGGER.error("Failed to create zip file") - LOGGER.debug(error) + LOGGER.error(f"Failed to create zip file: {error}") return None def regenerate_pdf(self, device: Device, report: TestReport) -> str: @@ -744,11 +750,12 @@ def _load_test_modules(self): if self._get_test_module(module_dir) is None: loaded_module = self._load_test_module(module_dir) - loaded_modules += loaded_module.dir_name + " " + if loaded_module is not None: + loaded_modules += loaded_module.dir_name + " " LOGGER.info(loaded_modules) - def _load_test_module(self, module_dir): + def _load_test_module(self, module_dir) -> TestModule | None: """Import module configuration from module_config.json.""" # Resolve the main docker interface (docker0) for host interaction @@ -776,6 +783,9 @@ def _load_test_module(self, module_dir): self._test_modules.append(module) return module + else: + # Return existing module if already loaded + return self._get_test_module(module_dir) def get_test_packs(self) -> List[TestPack]: return self._test_packs From 1b712f9d3fade7f7f2af9e6928762d196e3d780c Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 23:02:46 +0200 Subject: [PATCH 123/196] disable jinja warnings --- modules/test/base/python/src/test_module.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/test/base/python/src/test_module.py b/modules/test/base/python/src/test_module.py index 52677b5b6..b230de6cb 100644 --- a/modules/test/base/python/src/test_module.py +++ b/modules/test/base/python/src/test_module.py @@ -266,13 +266,13 @@ def _render_styled_report(self, jinja_report, result_path): logo = base64.b64encode(f.read()).decode('utf-8') loader=FileSystemLoader(self._report_template_folder) - template = Environment( + template = Environment( # nosec B701 loader=loader, trim_blocks=True, lstrip_blocks=True ).get_template(self._base_template_styled_file) - module_template = Environment(loader=BaseLoader() + module_template = Environment(loader=BaseLoader() # nosec B701 ).from_string(jinja_report).render( title = 'Testrun report', logo=logo, From 5a5db95fcc4b95a452fb0d6ba0eaef20af182f21 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 12 Aug 2026 23:03:28 +0200 Subject: [PATCH 124/196] disable bind all ports --- modules/test/conn/python/src/connection_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index 168c3ff5f..dc1857262 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -139,7 +139,7 @@ def _connection_switch_arp_inspection(self): # Check MAC address matches IP address if (arp_packet.hwsrc == self._device_mac - and (arp_packet.psrc not in (self._device_ipv4_addr, '0.0.0.0')) + and (arp_packet.psrc not in (self._device_ipv4_addr, '0.0.0.0')) # nosec B104 and not arp_packet.psrc.startswith('169.254')): LOGGER.info(f'Bad ARP packet detected for MAC: {self._device_mac}') LOGGER.info(f'''ARP packet from IP {arp_packet.psrc} From b5ae399690460d7f941e63800d7ed4f78d1d7fea Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 00:44:53 +0200 Subject: [PATCH 125/196] pylint --- modules/test/conn/python/src/connection_module.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index dc1857262..8967da5c8 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -139,7 +139,12 @@ def _connection_switch_arp_inspection(self): # Check MAC address matches IP address if (arp_packet.hwsrc == self._device_mac - and (arp_packet.psrc not in (self._device_ipv4_addr, '0.0.0.0')) # nosec B104 + and ( + arp_packet.psrc not in ( + self._device_ipv4_addr, + '0.0.0.0' # nosec B104 + ) + ) and not arp_packet.psrc.startswith('169.254')): LOGGER.info(f'Bad ARP packet detected for MAC: {self._device_mac}') LOGGER.info(f'''ARP packet from IP {arp_packet.psrc} From 83b38dd7b0ea1e9d909e6564122253a5e77f4847 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:04:36 +0200 Subject: [PATCH 126/196] change eval to ast.literal _eval --- modules/test/conn/python/src/dhcp_util.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/test/conn/python/src/dhcp_util.py b/modules/test/conn/python/src/dhcp_util.py index c6bc074a9..0cae86c35 100644 --- a/modules/test/conn/python/src/dhcp_util.py +++ b/modules/test/conn/python/src/dhcp_util.py @@ -19,6 +19,7 @@ from datetime import datetime import util from dateutil import tz +import ast LOG_NAME = 'dhcp_util' LOGGER = None @@ -117,7 +118,7 @@ def get_dhcp_server_status(self, dhcp_server_primary=True): response = self.get_dhcp_client(dhcp_server_primary).get_status() if response.code == 200: LOGGER.debug(f'DHCP {server_name} server status: {response.message}') - status = eval(response.message) # pylint: disable=W0123 + status = ast.literal_eval(response.message) # pylint: disable=W0123 return status['dhcpStatus'] else: return False From b6a9c67b8e9f8ac171e8ab6e7e205cbc052ec74b Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:05:26 +0200 Subject: [PATCH 127/196] fix unsecure function --- modules/test/conn/python/src/dhcp_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/conn/python/src/dhcp_util.py b/modules/test/conn/python/src/dhcp_util.py index 0cae86c35..8dee86fc6 100644 --- a/modules/test/conn/python/src/dhcp_util.py +++ b/modules/test/conn/python/src/dhcp_util.py @@ -190,7 +190,7 @@ def _get_cur_lease_from_server(self, mac_address, dhcp_server_primary=True): response = self.get_dhcp_client(dhcp_server_primary).get_lease( mac_address) if response.code == 200: - lease_resp = eval(response.message) # pylint: disable=W0123 + lease_resp = ast.literal_eval(response.message) # pylint: disable=W0123 if lease_resp: # Check if non-empty lease lease = lease_resp return lease From 3160410e96ef6f462f4437cb7eda63744617fd8e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:08:13 +0200 Subject: [PATCH 128/196] disable jinja warnings --- modules/test/dns/python/src/dns_module.py | 2 +- modules/test/ntp/python/src/ntp_module.py | 2 +- modules/test/services/python/src/services_module.py | 2 +- modules/test/tls/python/src/tls_module.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/test/dns/python/src/dns_module.py b/modules/test/dns/python/src/dns_module.py index 0756d32a5..785cd5523 100644 --- a/modules/test/dns/python/src/dns_module.py +++ b/modules/test/dns/python/src/dns_module.py @@ -57,7 +57,7 @@ def generate_module_report(self): header_height = 48 summary_height = 135 loader=FileSystemLoader(self._report_template_folder) - template = Environment( + template = Environment( # nosec B701 loader=loader, trim_blocks=True, lstrip_blocks=True diff --git a/modules/test/ntp/python/src/ntp_module.py b/modules/test/ntp/python/src/ntp_module.py index e40f66e9d..c45347582 100644 --- a/modules/test/ntp/python/src/ntp_module.py +++ b/modules/test/ntp/python/src/ntp_module.py @@ -63,7 +63,7 @@ def generate_module_report(self): summary_height = 135 row_height = 42 loader = FileSystemLoader(self._report_template_folder) - template = Environment( + template = Environment( # nosec B701 loader=loader, trim_blocks=True, lstrip_blocks=True, diff --git a/modules/test/services/python/src/services_module.py b/modules/test/services/python/src/services_module.py index ea925b6e9..ffb3fb9a9 100644 --- a/modules/test/services/python/src/services_module.py +++ b/modules/test/services/python/src/services_module.py @@ -57,7 +57,7 @@ def __init__(self, # pylint: disable=R0917 def generate_module_report(self): # Load Jinja2 template loader=FileSystemLoader(self._report_template_folder) - template = Environment( + template = Environment( # nosec B701 loader=loader, trim_blocks=True, lstrip_blocks=True diff --git a/modules/test/tls/python/src/tls_module.py b/modules/test/tls/python/src/tls_module.py index 77a0a7b5c..1b4b275b8 100644 --- a/modules/test/tls/python/src/tls_module.py +++ b/modules/test/tls/python/src/tls_module.py @@ -67,7 +67,7 @@ def __init__(self, # pylint: disable=R0917 def generate_module_report(self): # Load Jinja2 template loader=FileSystemLoader(self._report_template_folder) - template = Environment( + template = Environment( # nosec B701 loader=loader, trim_blocks=True, lstrip_blocks=True From da04d258f0d57f2e36afbbb1b74ef0d72bff4f4e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:13:43 +0200 Subject: [PATCH 129/196] pylint --- modules/test/conn/python/src/connection_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/conn/python/src/connection_module.py b/modules/test/conn/python/src/connection_module.py index 8967da5c8..63cd003b0 100644 --- a/modules/test/conn/python/src/connection_module.py +++ b/modules/test/conn/python/src/connection_module.py @@ -141,7 +141,7 @@ def _connection_switch_arp_inspection(self): if (arp_packet.hwsrc == self._device_mac and ( arp_packet.psrc not in ( - self._device_ipv4_addr, + self._device_ipv4_addr, '0.0.0.0' # nosec B104 ) ) From bd9318e740f4be3ff4a5ce6da52637df89591554 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:44:32 +0200 Subject: [PATCH 130/196] fix subprocess warning --- modules/test/dns/python/src/dns_module.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/test/dns/python/src/dns_module.py b/modules/test/dns/python/src/dns_module.py index 785cd5523..8b1b61da9 100644 --- a/modules/test/dns/python/src/dns_module.py +++ b/modules/test/dns/python/src/dns_module.py @@ -364,13 +364,12 @@ def _exec_tcpdump(self, tcpdump_filter, capture_file): Returns List of packets matching the filter """ - command = f'tcpdump -tttt -n -r {capture_file} {tcpdump_filter}' + command = ['tcpdump', '-tttt', '-n', '-r', capture_file, tcpdump_filter] - LOGGER.debug('tcpdump command: ' + command) + LOGGER.debug('tcpdump command: ' + str(command)) with subprocess.Popen(command, - universal_newlines=True, - shell=True, + text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as process: text = str(process.stdout.read()).rstrip() From 7a04e162803749c5a23c042649e4970c20ec4c5a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:45:16 +0200 Subject: [PATCH 131/196] disable requests warning --- modules/test/tls/python/src/http_scan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/tls/python/src/http_scan.py b/modules/test/tls/python/src/http_scan.py index cc0860f23..3935ee72d 100644 --- a/modules/test/tls/python/src/http_scan.py +++ b/modules/test/tls/python/src/http_scan.py @@ -62,7 +62,7 @@ def is_https(self, ip, port): # Try HTTPS first try: - requests.head(f'https://{ip}:{port}', verify=False, timeout=5) + requests.head(f'https://{ip}:{port}', verify=False, timeout=5) # nosec B501 LOGGER.info(f'Port {port} supports HTTPS.') return 'HTTPS' except requests.exceptions.SSLError as e: From 9f993995354f5e78dee2d98765ce168d27256beb Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:46:33 +0200 Subject: [PATCH 132/196] disable warnigns in test vm code --- test_vm/python/src/modbus_server.py | 2 +- test_vm/python/src/modbus_server_non_compliant.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test_vm/python/src/modbus_server.py b/test_vm/python/src/modbus_server.py index cc47e019c..6d39d06d7 100644 --- a/test_vm/python/src/modbus_server.py +++ b/test_vm/python/src/modbus_server.py @@ -4,7 +4,7 @@ if __name__ == "__main__": # Run server on port 502 - server = ModbusServer(host="0.0.0.0", port=502, no_block=True) + server = ModbusServer(host="0.0.0.0", port=502, no_block=True) # nosec B104 server.start() print("Modbus TCP server started on port 502") diff --git a/test_vm/python/src/modbus_server_non_compliant.py b/test_vm/python/src/modbus_server_non_compliant.py index 5a3c157a7..d69d18d51 100644 --- a/test_vm/python/src/modbus_server_non_compliant.py +++ b/test_vm/python/src/modbus_server_non_compliant.py @@ -39,7 +39,7 @@ def run_server(): #nosemgrep sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.bind(("0.0.0.0", MODBUS_PORT)) + sock.bind(("0.0.0.0", MODBUS_PORT)) # nosec B104 sock.listen(5) print(f"Modbus server started on port {MODBUS_PORT}") while True: From ff45b2b329e47054aa8a5c08bf125e7c171c1653 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 13 Aug 2026 02:48:30 +0200 Subject: [PATCH 133/196] pylint --- modules/test/tls/python/src/http_scan.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/test/tls/python/src/http_scan.py b/modules/test/tls/python/src/http_scan.py index 3935ee72d..6cdd99c0e 100644 --- a/modules/test/tls/python/src/http_scan.py +++ b/modules/test/tls/python/src/http_scan.py @@ -62,7 +62,10 @@ def is_https(self, ip, port): # Try HTTPS first try: - requests.head(f'https://{ip}:{port}', verify=False, timeout=5) # nosec B501 + requests.head( # nosec B501 + f'https://{ip}:{port}', + verify=False, + timeout=5) LOGGER.info(f'Port {port} supports HTTPS.') return 'HTTPS' except requests.exceptions.SSLError as e: From a1e82108e3e2b59c01dc2308d92ee30f7c2b265f Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 3 Aug 2026 16:18:52 +0200 Subject: [PATCH 134/196] refactor is_https method --- modules/test/tls/python/src/http_scan.py | 45 ++++++++++++++++-------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/modules/test/tls/python/src/http_scan.py b/modules/test/tls/python/src/http_scan.py index 6cdd99c0e..a627e7e99 100644 --- a/modules/test/tls/python/src/http_scan.py +++ b/modules/test/tls/python/src/http_scan.py @@ -59,14 +59,41 @@ def is_https(self, ip, port): Detects if the port serves HTTPS, HTTP, or neither. Returns 'HTTPS', 'HTTP' or 'UNKNOWN'. """ + result = 'UNKNOWN' - # Try HTTPS first + # try HTTP first try: - requests.head( # nosec B501 + response = requests.get(f'http://{ip}:{port}', timeout=20, stream=True) + content = '' + if response.status_code == 400: + content = response.raw.read(512).decode( + 'utf-8', errors='ignore' + ).lower() + response.close() + if ('sent to http port' in content or + 'ssl' in content or + 'https' in content + ): + LOGGER.info(f'Port {port} returned HTTPS-redirection.') + result = 'HTTPS' + else: + LOGGER.info(f'Port {port} supports HTTP.') + return 'HTTP' + except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): + LOGGER.info(f'Port {port} does not support HTTP.') + except Exception as e: + LOGGER.error(f'An unexpected error occurred during HTTP check: {e}') + + # Try HTTPS + try: + response = requests.get( f'https://{ip}:{port}', verify=False, - timeout=5) + timeout=20, + stream=True + ) LOGGER.info(f'Port {port} supports HTTPS.') + response.close() return 'HTTPS' except requests.exceptions.SSLError as e: # This error occurs if the SSL handshake fails for any reason @@ -81,17 +108,7 @@ def is_https(self, ip, port): except Exception as e: LOGGER.error(f'An unexpected error occurred during HTTPS check: {e}') - # try HTTP - try: - requests.head(f'http://{ip}:{port}', timeout=5) - LOGGER.info(f'Port {port} supports HTTP.') - return 'HTTP' - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): - LOGGER.info(f'Port {port} does not support HTTP.') - except Exception as e: - LOGGER.error(f'An unexpected error occurred during HTTP check: {e}') - - return 'UNKNOWN' + return result def verify_http_or_https(self, ip, ports): """Classifies each port as HTTP, HTTPS, or UNKNOWN.""" From eeb5835af270e3e2b61043c15d441c44a4270a8e Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 14 Aug 2026 15:31:41 +0200 Subject: [PATCH 135/196] fix security issue --- modules/test/tls/python/src/http_scan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/test/tls/python/src/http_scan.py b/modules/test/tls/python/src/http_scan.py index a627e7e99..8df21d26e 100644 --- a/modules/test/tls/python/src/http_scan.py +++ b/modules/test/tls/python/src/http_scan.py @@ -88,7 +88,7 @@ def is_https(self, ip, port): try: response = requests.get( f'https://{ip}:{port}', - verify=False, + verify=False, # nosec B501 timeout=20, stream=True ) From 14e18403b216247528262c0fe5edbb88b4371917 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Wed, 19 Aug 2026 14:26:39 +0000 Subject: [PATCH 136/196] Adds the report search with filters. (#1630) --- docs/dev/mockoon.json | 148 ++++- modules/ui/.prettierignore | 6 + modules/ui/src/app/mocks/reports.mock.ts | 8 + modules/ui/src/app/model/filters.spec.ts | 136 +++++ modules/ui/src/app/model/filters.ts | 53 +- .../filter-chips/filter-chips.component.html | 47 -- .../filter-chips/filter-chips.component.scss | 108 ---- .../filter-chips.component.spec.ts | 224 -------- .../filter-chips/filter-chips.component.ts | 117 ---- .../filter-dialog.component.html | 40 ++ .../filter-dialog.component.spec.ts | 251 +++++++- .../filter-dialog/filter-dialog.component.ts | 74 ++- .../filter-header.component.html | 51 -- .../filter-header.component.scss | 43 -- .../filter-header.component.spec.ts | 94 --- .../filter-header/filter-header.component.ts | 54 -- .../components/search/search.component.html | 106 ++++ .../components/search/search.component.scss | 241 ++++++++ .../search/search.component.spec.ts | 544 ++++++++++++++++++ .../components/search/search.component.ts | 340 +++++++++++ .../app/pages/reports/reports.component.html | 96 ++-- .../app/pages/reports/reports.component.scss | 20 +- .../pages/reports/reports.component.spec.ts | 76 ++- .../app/pages/reports/reports.component.ts | 54 +- .../app/pages/reports/reports.store.spec.ts | 76 +++ .../ui/src/app/pages/reports/reports.store.ts | 74 ++- modules/ui/src/theming/variables.scss | 1 + 27 files changed, 2215 insertions(+), 867 deletions(-) create mode 100644 modules/ui/src/app/model/filters.spec.ts delete mode 100644 modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.html delete mode 100644 modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.scss delete mode 100644 modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts delete mode 100644 modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts delete mode 100644 modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html delete mode 100644 modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.scss delete mode 100644 modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.spec.ts delete mode 100644 modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.ts create mode 100644 modules/ui/src/app/pages/reports/components/search/search.component.html create mode 100644 modules/ui/src/app/pages/reports/components/search/search.component.scss create mode 100644 modules/ui/src/app/pages/reports/components/search/search.component.spec.ts create mode 100644 modules/ui/src/app/pages/reports/components/search/search.component.ts diff --git a/docs/dev/mockoon.json b/docs/dev/mockoon.json index 8f5f5e3bd..d62543948 100644 --- a/docs/dev/mockoon.json +++ b/docs/dev/mockoon.json @@ -1,6 +1,6 @@ { "uuid": "a8882b26-c990-47b9-9dfb-49532a5934c2", - "lastMigration": 32, + "lastMigration": 33, "name": "Testrun", "endpointPrefix": "", "latency": 0, @@ -35,7 +35,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "ea00c773-fb7c-4889-b140-c2b48cae7819", @@ -113,7 +115,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "6299b6ba-2746-4f44-b7ba-2c31bdd795dc", @@ -142,7 +146,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "cf9a795b-6b3d-41cf-8115-3777a3514dc8", @@ -236,7 +242,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "1f580148-ed7a-47f4-bc4b-6b3ce5c8d8a2", @@ -384,7 +392,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "69fe7ba0-1a81-482f-b8a7-f92cb75d957c", @@ -546,7 +556,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "9a013389-fa81-4b39-a60b-d0305eab5f58", @@ -594,7 +606,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "d808737a-e666-4ff4-89d6-7df7da041710", @@ -618,7 +632,7 @@ "rulesOperator": "OR", "disableTemplating": false, "fallbackTo404": false, - "default": false, + "default": true, "crudKey": "id", "callbacks": [] }, @@ -656,12 +670,52 @@ "rulesOperator": "OR", "disableTemplating": false, "fallbackTo404": false, - "default": true, + "default": false, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "1c96c809-73c7-4f8f-bc11-2b51e3168124", + "body": "[\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"host\": {\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n \"python_version\": \"3.11.2\"\n },\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\"\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"host\": {\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n \"python_version\": \"3.11.2\"\n },\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\"\n },\n {\n \"testrun\": {\n \"version\": \"2.2.2\"\n },\n \"device\": {{data 'cntg' '0'}},\n \"host\": {\n \"location\": \"Data Center Alpha - Rack 12, Bay B\",\n \"linux_env\": \"Ubuntu 24.04 LTS (x86_64)\",\n \"python_version\": \"3.11.2\"\n },\n \"status\": \"Non-Compliant\",\n \"started\": \"2026-02-02 17:24:52\",\n \"finished\": \"2026-02-02 17:34:58\",\n \"report\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"export\": \"/export/f0d4e2f2f541_2026-02-02T17:24:52\",\n \"folder_name\": \"f0d4e2f2f541_2026-02-02T17:24:52\",\n \"delete\": \"/report/f0d4e2f2f541_2026-02-02T17:24:52\"\n }\n]", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, + "crudKey": "id", + "callbacks": [] + }, + { + "uuid": "0f23461b-1a9b-43dd-b56a-5bd15cbffe84", + "body": "[]", + "latency": 0, + "statusCode": 200, + "label": "", + "headers": [], + "bodyType": "INLINE", + "filePath": "", + "databucketID": "", + "sendFileAsBody": false, + "rules": [], + "rulesOperator": "OR", + "disableTemplating": false, + "fallbackTo404": false, + "default": false, "crudKey": "id", "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "adeda7ee-f6d2-4ab1-ac2a-861d1f2abaed", @@ -763,7 +817,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "f3b4ed0b-11e2-4d7f-8d08-4b9840c70d5c", @@ -774,7 +830,7 @@ "responses": [ { "uuid": "e6bb13a8-2755-412d-bdee-65241dd4b28d", - "body": "{\n \"network\": {\n \"device_intf\": \"enx207bd2620617\",\n \"internet_intf\": \"enx207bd26205e9\"\n },\n \"log_level\": \"INFO\",\n \"startup_timeout\": 60,\n \"monitor_period\": 60\n}", + "body": "{\n \"network\": {\n \"device_intf\": \"enx00e04c020fa8\",\n \"internet_intf\": \"enx207bd26205e9\"\n },\n \"log_level\": \"INFO\",\n \"startup_timeout\": 60,\n \"monitor_period\": 60\n}", "latency": 0, "statusCode": 200, "label": "", @@ -807,7 +863,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "04dae1d8-3ff8-49d8-8068-33cfbaf00a4c", @@ -855,7 +913,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "eadeb46e-c9d5-4f97-9a8d-ed12ee53c789", @@ -941,7 +1001,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "40b2c138-af73-419a-af00-37efe9e08dfc", @@ -1027,7 +1089,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "ce48617f-b7d2-4284-925d-964ac4e453f2", @@ -1121,7 +1185,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "a760ed7c-5ad0-43ae-96aa-cf9357a157a3", @@ -1207,7 +1273,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "a9101349-5805-4914-ad13-06a5b466cfd1", @@ -1255,7 +1323,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "36128197-31dc-4b55-bcbe-f42c958d0e1b", @@ -1303,7 +1373,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "c1da7f9f-6f12-48fa-8c4c-df30664ca393", @@ -1351,7 +1423,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "03fc347f-20b4-461d-a865-a6e56917166c", @@ -1418,7 +1492,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "6325baee-2cd2-4d35-a69c-57cce8235450", @@ -1447,7 +1523,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "b6def8f1-0275-4b95-a327-68c75b3c871b", @@ -1514,7 +1592,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "94e2892b-2650-4508-ac19-63c0529b5f65", @@ -1562,7 +1642,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "727b4183-2d2c-4c0f-9102-77bd53a9c9f1", @@ -1629,7 +1711,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "6667bead-2851-46fa-8dee-de8adfc63b25", @@ -1658,7 +1742,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 }, { "uuid": "65398138-9bd5-4701-af27-48cd268c30cb", @@ -1706,7 +1792,9 @@ "callbacks": [] } ], - "responseMode": null + "responseMode": null, + "streamingMode": null, + "streamingInterval": 0 } ], "rootChildren": [ @@ -1852,7 +1940,7 @@ "id": "cntg", "name": "device_list", "documentation": "", - "value": "[\n {\n \"mac_addr\": \"00:1e:42:35:73:c4\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Teltonika\",\n \"model\": \"TRB 140\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Hardware - Air quality\",\n \"test_pack\": \"Pilot Assessment\",\n \"firmware\": \"3.14 omega\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"dns\": {\n \"enabled\": false\n },\n \"connection\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"nmap\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.8.0-40-generic\"\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:ff\",\n \"status\": \"Invalid\",\n \"manufacturer\": \"Manufacturer X\",\n \"model\": \"Device X\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\n \"enabled\": true\n },\n \"dns\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": true\n },\n \"protocol\": {\n \"enabled\": false\n },\n \"services\": {\n \"enabled\": true\n },\n \"tls\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.10.0-40-generic\"\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:fa\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Manufacturer Y\",\n \"model\": \"Device y\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"Yes\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\n \"enabled\": false\n },\n \"dns\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"protocol\": {\n \"enabled\": false\n },\n \"services\": {\n \"enabled\": false\n },\n \"tls\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.8.0-40\"\n }\n]" + "value": "[\n {\n \"mac_addr\": \"00:1e:42:35:73:c4\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Teltonika\",\n \"model\": \"TRB 140\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Hardware - Air quality\",\n \"test_pack\": \"Pilot Assessment\",\n \"firmware\": \"3.14 omega\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"dns\": {\n \"enabled\": false\n },\n \"connection\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"nmap\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.8.0-40-generic\"\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:ff\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Manufacturer X\",\n \"model\": \"Device X\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"No\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\n \"enabled\": true\n },\n \"dns\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": true\n },\n \"protocol\": {\n \"enabled\": false\n },\n \"services\": {\n \"enabled\": true\n },\n \"tls\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.10.0-40-generic\"\n },\n {\n \"mac_addr\": \"aa:bb:cc:dd:ee:fa\",\n \"status\": \"Valid\",\n \"manufacturer\": \"Manufacturer Y\",\n \"model\": \"Device y\",\n \"type\": \"IoT Gateway\",\n \"technology\": \"Building Automation\",\n \"test_pack\": \"Device Qualification\",\n \"additional_info\": [\n {\n \"question\": \"What type of device is this?\",\n \"answer\": \"IoT Gateway\"\n },\n {\n \"question\": \"Please select the technology this device falls into\",\n \"answer\": \"Building Automation\"\n },\n {\n \"question\": \"Does your device process any sensitive information? \",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can all non-essential services be disabled on your device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Is there a second IP port on the device?\",\n \"answer\": \"No\"\n },\n {\n \"question\": \"Can the second IP port on your device be disabled?\",\n \"answer\": \"Yes\"\n }\n ],\n \"test_modules\": {\n \"connection\": {\n \"enabled\": false\n },\n \"dns\": {\n \"enabled\": true\n },\n \"ntp\": {\n \"enabled\": false\n },\n \"protocol\": {\n \"enabled\": false\n },\n \"services\": {\n \"enabled\": false\n },\n \"tls\": {\n \"enabled\": false\n }\n },\n \"kernel\": \"Linux 6.8.0-40\"\n }\n]" } ], "callbacks": [] diff --git a/modules/ui/.prettierignore b/modules/ui/.prettierignore index d53004b88..10bb35a8c 100644 --- a/modules/ui/.prettierignore +++ b/modules/ui/.prettierignore @@ -38,6 +38,12 @@ yarn-error.log testem.log /typings +# Virtual environments +venv/ +.venv/ +*.bak/ + # System files .DS_Store Thumbs.db + diff --git a/modules/ui/src/app/mocks/reports.mock.ts b/modules/ui/src/app/mocks/reports.mock.ts index a6974efa3..6f9e56889 100644 --- a/modules/ui/src/app/mocks/reports.mock.ts +++ b/modules/ui/src/app/mocks/reports.mock.ts @@ -216,6 +216,10 @@ export const FILTERS = { results: ['test'], dateRange: 'test', quickSearch: 'test', + location: 'test', + linuxEnv: 'test', + pythonVersion: 'test', + kernel: 'test', }; export const EMPTY_FILTERS = { deviceInfo: '', @@ -223,6 +227,10 @@ export const EMPTY_FILTERS = { results: [''], dateRange: '', quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', }; export const DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY = diff --git a/modules/ui/src/app/model/filters.spec.ts b/modules/ui/src/app/model/filters.spec.ts new file mode 100644 index 000000000..dcc5ee08e --- /dev/null +++ b/modules/ui/src/app/model/filters.spec.ts @@ -0,0 +1,136 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + DateRange, + Filters, + FilterItem, + FilterName, + FilterTitle, +} from './filters'; + +describe('Filters Models', () => { + describe('DateRange', () => { + it('should return formatted string with start and end as Date objects', () => { + const range = new DateRange(); + range.start = new Date(2024, 0, 15); + range.end = new Date(2024, 0, 20); + + expect(range.toString()).toBe('1/15/2024-1/20/2024'); + }); + + it('should return formatted string with start and end as strings', () => { + const range = new DateRange(); + range.start = '2024-01-15'; + range.end = '2024-01-20'; + + expect(range.toString()).toBe('2024-01-15-2024-01-20'); + }); + + it('should return formatted string with only start date', () => { + const range = new DateRange(); + range.start = new Date(2024, 4, 10); + range.end = null; + + expect(range.toString()).toBe('5/10/2024'); + }); + + it('should return formatted string with only start string', () => { + const range = new DateRange(); + range.start = '2024-05-10'; + range.end = ''; + + expect(range.toString()).toBe('2024-05-10'); + }); + + it('should return formatted string with only end date', () => { + const range = new DateRange(); + range.start = null; + range.end = new Date(2024, 11, 25); + + expect(range.toString()).toBe('12/25/2024'); + }); + + it('should return formatted string with only end string', () => { + const range = new DateRange(); + range.start = ''; + range.end = '2024-12-25'; + + expect(range.toString()).toBe('2024-12-25'); + }); + + it('should return empty string when neither start nor end is set', () => { + const range = new DateRange(); + range.start = ''; + range.end = ''; + + expect(range.toString()).toBe(''); + }); + }); + + describe('Filters', () => { + it('should initialize with default empty values for all filter fields', () => { + const filters = new Filters(); + + expect(filters.deviceInfo).toBe(''); + expect(filters.deviceFirmware).toBe(''); + expect(filters.results).toEqual([]); + expect(filters.dateRange).toBe(''); + expect(filters.quickSearch).toBe(''); + expect(filters.location).toBe(''); + expect(filters.linuxEnv).toBe(''); + expect(filters.pythonVersion).toBe(''); + expect(filters.kernel).toBe(''); + }); + }); + + describe('Enums', () => { + it('should define FilterItem values correctly', () => { + expect(FilterItem.DeviceInfo).toBe('Device'); + expect(FilterItem.DeviceFirmware).toBe('Firmware'); + expect(FilterItem.Results).toBe('Result'); + expect(FilterItem.Started).toBe('Started'); + expect(FilterItem.Location).toBe('Location'); + expect(FilterItem.LinuxEnv).toBe('Linux Environment'); + expect(FilterItem.PythonVersion).toBe('Python Version'); + expect(FilterItem.Kernel).toBe('Kernel'); + }); + + it('should define FilterName values correctly', () => { + expect(FilterName.DeviceInfo).toBe('deviceInfo'); + expect(FilterName.DeviceFirmware).toBe('deviceFirmware'); + expect(FilterName.Results).toBe('results'); + expect(FilterName.Started).toBe('started'); + expect(FilterName.DateRange).toBe('dateRange'); + expect(FilterName.QuickSearch).toBe('quickSearch'); + expect(FilterName.Location).toBe('location'); + expect(FilterName.LinuxEnv).toBe('linuxEnv'); + expect(FilterName.PythonVersion).toBe('pythonVersion'); + expect(FilterName.Kernel).toBe('kernel'); + }); + + it('should define FilterTitle values correctly', () => { + expect(FilterTitle.DeviceInfo).toBe('Enter device name'); + expect(FilterTitle.DeviceFirmware).toBe('Enter firmware name'); + expect(FilterTitle.Results).toBe('Select status'); + expect(FilterTitle.Started).toBe('Select dates'); + expect(FilterTitle.Location).toBe('Enter location'); + expect(FilterTitle.LinuxEnv).toBe('Enter Linux environment'); + expect(FilterTitle.PythonVersion).toBe('Enter Python version'); + expect(FilterTitle.Kernel).toBe('Enter kernel'); + }); + }); +}); diff --git a/modules/ui/src/app/model/filters.ts b/modules/ui/src/app/model/filters.ts index 8d7359895..cc7bb7f47 100644 --- a/modules/ui/src/app/model/filters.ts +++ b/modules/ui/src/app/model/filters.ts @@ -13,6 +13,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +export type FilterValue = + | string + | string[] + | DateRange + | { start?: string | Date | null; end?: string | Date | null } + | null; + +export interface OpenFilterEvent { + event: Event; + filter: string; + title: string; + filterOpened: boolean; + menuRect?: DOMRect; + itemRect?: DOMRect; +} + +export interface FilterMenuItem { + displayName: FilterItem; + name: FilterName; + title: FilterTitle; +} + +export enum FilterItem { + DeviceInfo = 'Device', + DeviceFirmware = 'Firmware', + Results = 'Result', + Started = 'Started', + Location = 'Location', + LinuxEnv = 'Linux Environment', + PythonVersion = 'Python Version', + Kernel = 'Kernel', +} + export enum FilterName { DeviceInfo = 'deviceInfo', DeviceFirmware = 'deviceFirmware', @@ -20,6 +54,10 @@ export enum FilterName { Started = 'started', DateRange = 'dateRange', QuickSearch = 'quickSearch', + Location = 'location', + LinuxEnv = 'linuxEnv', + PythonVersion = 'pythonVersion', + Kernel = 'kernel', } export enum FilterTitle { @@ -27,13 +65,10 @@ export enum FilterTitle { DeviceFirmware = 'Enter firmware name', Results = 'Select status', Started = 'Select dates', -} - -export interface ReportFilters { - deviceInfo: string; - deviceFirmware: string; - results: string[]; - dateRange: DateRange | string; + Location = 'Enter location', + LinuxEnv = 'Enter Linux environment', + PythonVersion = 'Enter Python version', + Kernel = 'Enter kernel', } export class DateRange { @@ -59,6 +94,10 @@ export class Filters { results: string[] = []; dateRange: DateRange | string = ''; quickSearch = ''; + location = ''; + linuxEnv = ''; + pythonVersion = ''; + kernel = ''; } function getDateString(date: string | Date) { diff --git a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.html b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.html deleted file mode 100644 index b69ac48ea..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.html +++ /dev/null @@ -1,47 +0,0 @@ - - - @for (item of filters | keyvalue; track item) { - @if (!isValueEmpty(item.value)) { - - {{ getFilterChipLabel(item.key, item.value) }} - - - } - } -
-
Clear all filters
-
-
diff --git a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.scss b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.scss deleted file mode 100644 index 1ea43e240..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.scss +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@use 'colors'; - -:host { - display: flex; -} - -.filter-chip.mat-mdc-chip { - background: colors.$light-grey; - &::ng-deep .mat-mdc-chip-primary-focus-indicator { - display: none; - } -} - -.filter-chip.mat-mdc-chip ::ng-deep .mat-mdc-chip-action-label { - color: colors.$on-secondary-container; - font-weight: 500; -} - -.filter-chip.mat-mdc-chip ::ng-deep .mat-mdc-chip-remove { - color: colors.$on-secondary-container; -} - -.filter-chip.cdk-keyboard-focused, -.filter-chip-remove:focus-visible { - outline: colors.$black solid 2px; - &:before { - content: none; - } -} - -.filter-chip-remove:focus { - &:before { - content: none; - } -} - -.clear-button:has(.clear-button-label:focus), -.clear-button.cdk-keyboard-focused { - outline: colors.$black solid 2px; -} - -.clear-button-label:focus { - border: none; -} - -.clear-button { - height: var(--mat-button-text-container-height); - border-radius: var(--mat-button-text-container-shape); - margin: 0 0 0 8px !important; - border: none; - display: flex; - align-items: center; - justify-content: center; -} - -.clear-button .clear-button-label { - color: colors.$primary !important; - border: none; - outline: none; -} - -.clear-button ::ng-deep .mat-focus-indicator { - display: none; -} - -.clear-button - ::ng-deep - .mdc-evolution-chip__action--primary:not( - .mdc-evolution-chip__action--presentational - ):not(.mdc-ripple-upgraded):focus::before { - border: none; -} - -.filter-chip .filter-chip-remove { - margin: 0 8px; - padding-left: 0; - padding-right: 0; - border-radius: 8px; -} - -.mat-mdc-standard-chip:not( - .mdc-evolution-chip--disabled - ).filter-chip-clear-all { - background-color: colors.$white; - - & ::ng-deep .mat-mdc-chip-action { - padding: 0; - } - - & ::ng-deep .mat-mdc-chip-focus-overlay { - display: none; - } -} diff --git a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts deleted file mode 100644 index 0644f8ef4..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.spec.ts +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FilterChipsComponent } from './filter-chips.component'; - -describe('FilterChipsComponent', () => { - let component: FilterChipsComponent; - let fixture: ComponentFixture; - let compiled: HTMLElement; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [FilterChipsComponent], - }); - fixture = TestBed.createComponent(FilterChipsComponent); - component = fixture.componentInstance; - compiled = fixture.nativeElement as HTMLElement; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - describe('#clearFilter', () => { - const MOCK_FILTERS = { - deviceInfo: 'Delta', - deviceFirmware: '03', - results: ['Compliant'], - dateRange: { start: '10/2/2024', end: '11/2/2024' }, - quickSearch: 'Krakow', - }; - - beforeEach(() => { - component.filters = { ...MOCK_FILTERS }; - }); - - it(`should clear deviceFirmware filter`, () => { - const result = { ...MOCK_FILTERS, deviceFirmware: '' }; - component.clearFilter('deviceFirmware'); - - expect(component.filters).toEqual(result); - }); - - it(`should clear results filter`, () => { - const clearedFilters = { ...MOCK_FILTERS, results: [] }; - component.clearFilter('results'); - - expect(component.filters).toEqual(clearedFilters); - }); - - it(`should clear dateRange filter`, () => { - const clearedFilters = { ...MOCK_FILTERS, dateRange: '' }; - component.clearFilter('dateRange'); - - expect(component.filters).toEqual(clearedFilters); - }); - - it(`should clear quickSearch filter`, () => { - const clearedFilters = { ...MOCK_FILTERS, quickSearch: '' }; - component.clearFilter('quickSearch'); - - expect(component.filters).toEqual(clearedFilters); - }); - }); - - describe('DOM tests', () => { - describe('"Clear all filters" button', () => { - it('should exist', () => { - const button = compiled.querySelector('.clear-button'); - - expect(button).toBeTruthy(); - }); - - it('should clear all filters on click', () => { - const clearAllFiltersSpy = spyOn(component, 'clearAllFilters'); - const button = compiled.querySelector( - '.clear-button' - ) as HTMLButtonElement; - button.click(); - - expect(clearAllFiltersSpy).toHaveBeenCalled(); - }); - }); - - describe('filter chips', () => { - describe('with no filter data', () => { - beforeEach(() => { - component.filters = { - deviceInfo: '', - deviceFirmware: '', - results: [], - dateRange: '', - quickSearch: '', - }; - fixture.detectChanges(); - }); - it('should not be displayed', () => { - const chips = compiled.querySelectorAll('.filter-chip'); - - expect(chips.length).toEqual(0); - }); - }); - - describe('with filter data', () => { - beforeEach(() => { - component.filters = { - deviceInfo: 'Delta', - deviceFirmware: '03', - results: ['Compliant'], - dateRange: '', - quickSearch: 'Krakow', - }; - fixture.detectChanges(); - }); - it('should be displayed', () => { - const chips = compiled.querySelectorAll('.filter-chip'); - - expect(chips.length).toEqual(4); - }); - - it('should render search tag for quickSearch filter', () => { - const chips = compiled.querySelectorAll('.filter-chip'); - const quickSearchChip = Array.from(chips).find(c => - c.textContent?.includes('search:') - ); - expect(quickSearchChip).toBeTruthy(); - expect(quickSearchChip?.textContent).toContain('search: "Krakow"'); - }); - - it('should call clearFilter on close button click', () => { - const clearFilterSpy = spyOn(component, 'clearFilter'); - const chipRemoveButtons = compiled.querySelectorAll( - '.filter-chip button' - ); - (chipRemoveButtons[1] as HTMLButtonElement).click(); - - expect(clearFilterSpy).toHaveBeenCalledWith('deviceInfo'); - }); - }); - }); - }); - - describe('Class tests', () => { - beforeEach(() => { - component.filters = { - deviceInfo: 'Delta', - deviceFirmware: '03', - results: ['Compliant'], - dateRange: '', - quickSearch: 'Krakow', - }; - fixture.detectChanges(); - }); - - it('should clear filters on clearAllFilters', () => { - component.clearAllFilters(); - - expect(component.filters).toEqual({ - deviceInfo: '', - deviceFirmware: '', - results: [], - dateRange: '', - quickSearch: '', - }); - }); - - it('should filter by key on clearFilter', () => { - component.clearFilter('deviceInfo'); - - expect(component.filters).toEqual({ - deviceInfo: '', - deviceFirmware: '03', - results: ['Compliant'], - dateRange: '', - quickSearch: 'Krakow', - }); - }); - - it('should format filter chip labels correctly', () => { - expect(component.getFilterChipLabel('quickSearch', 'Krakow')).toBe( - 'search: "Krakow"' - ); - expect(component.getFilterChipLabel('deviceInfo', 'Pixel')).toBe( - 'Device contains "Pixel"' - ); - expect(component.getFilterChipLabel('deviceFirmware', '1.0')).toBe( - 'Firmware contains "1.0"' - ); - expect( - component.getFilterChipLabel('dateRange', { - start: '01/01/2024', - end: '01/05/2024', - }) - ).toBe('01/01/2024 - 01/05/2024'); - expect( - component.getFilterChipLabel('results', ['Compliant', 'Non-Compliant']) - ).toBe('Compliant, Non-Compliant'); - }); - - it('should generate accessible remove button aria-labels', () => { - expect(component.getRemoveFilterAriaLabel('quickSearch', 'Krakow')).toBe( - 'Clear filter: search: "Krakow"' - ); - expect(component.getRemoveFilterAriaLabel('deviceInfo', 'Pixel')).toBe( - 'Clear filter: Device contains "Pixel"' - ); - }); - }); -}); diff --git a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts b/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts deleted file mode 100644 index 27c9ff271..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-chips/filter-chips.component.ts +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Copyright 2023 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatChipsModule } from '@angular/material/chips'; -import { CommonModule, KeyValuePipe } from '@angular/common'; -import { DateRange, FilterName, Filters } from '../../../../model/filters'; -import { MatButtonModule } from '@angular/material/button'; - -export type FilterValue = - | string - | string[] - | DateRange - | { start?: string | Date | null; end?: string | Date | null } - | null; - -@Component({ - selector: 'app-filter-chips', - templateUrl: './filter-chips.component.html', - styleUrls: ['./filter-chips.component.scss'], - imports: [ - MatIconModule, - MatChipsModule, - MatButtonModule, - KeyValuePipe, - CommonModule, - ], -}) -export class FilterChipsComponent { - @Input() filters!: Filters; - - @Output() filterCleared = new EventEmitter(); - - isValueEmpty(value: FilterValue) { - if ( - value instanceof DateRange || - (typeof value === 'object' && value !== null && !Array.isArray(value)) - ) { - return !value.start && !value.end; - } - return value === null || value === undefined || value.length === 0; - } - - getFilterChipLabel(key: string, value: FilterValue): string { - if (key === FilterName.QuickSearch) { - return `search: "${value}"`; - } - if (key === FilterName.DeviceInfo) { - return `Device contains "${value}"`; - } - if (key === FilterName.DeviceFirmware) { - return `Firmware contains "${value}"`; - } - if (key === FilterName.DateRange) { - if ( - typeof value === 'object' && - value && - !Array.isArray(value) && - (value.start || value.end) - ) { - return `${value.start || ''} - ${value.end || ''}`; - } - return String(value ?? ''); - } - if (Array.isArray(value)) { - return value.join(', '); - } - return String(value ?? ''); - } - - getRemoveFilterAriaLabel(key: string, value: FilterValue): string { - return `Clear filter: ${this.getFilterChipLabel(key, value)}`; - } - - clearFilter(filter: string) { - switch (filter) { - case FilterName.DeviceInfo: - this.filters.deviceInfo = ''; - break; - case FilterName.DeviceFirmware: - this.filters.deviceFirmware = ''; - break; - case FilterName.Results: - this.filters.results = []; - break; - case FilterName.DateRange: - this.filters.dateRange = ''; - break; - case FilterName.QuickSearch: - this.filters.quickSearch = ''; - break; - } - this.filterCleared.emit(this.filters); - } - - clearAllFilters() { - this.filters.deviceInfo = ''; - this.filters.deviceFirmware = ''; - this.filters.results = []; - this.filters.dateRange = ''; - this.filters.quickSearch = ''; - this.filterCleared.emit(this.filters); - } -} diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html index b84761a39..fdc361544 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html @@ -59,6 +59,46 @@

{{ data.title }}

} } + @if (data.filter === FilterName.Location) { + + Location + + + } + @if (data.filter === FilterName.LinuxEnv) { + + Linux Environment + + + } + @if (data.filter === FilterName.PythonVersion) { + + Python Version + + + } + @if (data.filter === FilterName.Kernel) { + + Kernel + + + } @if (data.filter === FilterName.Results) {
@for (result of results.controls; track result; let i = $index) { diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts index d866a1f37..43083d21d 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts @@ -36,6 +36,7 @@ import { MatNativeDateModule } from '@angular/material/core'; import { DateRange, FilterName, FilterTitle } from '../../../../model/filters'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of } from 'rxjs'; +import { ResultOfTestrun } from '../../../../model/testrun-status'; describe('FilterDialogComponent', () => { let component: FilterDialogComponent; @@ -115,6 +116,10 @@ describe('FilterDialogComponent', () => { const mockFormData = { deviceInfo: 'deviceInfo', deviceFirmware: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', results: [], dateRange: new DateRange(), }; @@ -130,7 +135,54 @@ describe('FilterDialogComponent', () => { closeSpy.calls.reset(); }); - it('should not close dialog with invalid date on "confirm" click', () => { + it('should close dialog with new filter fields on "confirm" click', () => { + fixture.detectChanges(); + component.filterForm.get('location')?.setValue(' Data Center 1 '); + component.filterForm.get('linuxEnv')?.setValue(' Ubuntu 24.04 '); + component.filterForm.get('pythonVersion')?.setValue(' 3.11 '); + component.filterForm.get('kernel')?.setValue(' 6.8.0 '); + component.results.controls[0].setValue(true); + + const mockFormData = { + deviceInfo: '', + deviceFirmware: '', + location: 'Data Center 1', + linuxEnv: 'Ubuntu 24.04', + pythonVersion: '3.11', + kernel: '6.8.0', + results: [ResultOfTestrun.Compliant], + dateRange: new DateRange(), + }; + const closeSpy = spyOn(component.dialogRef, 'close'); + const confirmButton = compiled.querySelector( + '.confirm-button' + ) as HTMLButtonElement; + + confirmButton?.click(); + + expect(closeSpy).toHaveBeenCalledWith(mockFormData); + }); + + it('should auto-populate end date with today if start date is set and end date is empty on confirm', () => { + fixture.detectChanges(); + const startDate = new Date('2024-01-01'); + component.range.start = startDate; + component.range.end = null; + + const closeSpy = spyOn(component.dialogRef, 'close'); + component.confirm(); + + expect(closeSpy).toHaveBeenCalledWith( + jasmine.objectContaining({ + dateRange: jasmine.objectContaining({ + start: startDate, + end: jasmine.any(Date), + }), + }) + ); + }); + + it('should not close dialog with invalid format on "confirm" click', () => { fixture.detectChanges(); component.filterForm.get('deviceInfo')?.setValue('as&@3$'); const closeSpy = spyOn(component.dialogRef, 'close'); @@ -145,6 +197,25 @@ describe('FilterDialogComponent', () => { closeSpy.calls.reset(); }); + it('should provide form control getters', () => { + fixture.detectChanges(); + expect(component.deviceInfo).toBe(component.filterForm.get('deviceInfo')!); + expect(component.deviceFirmware).toBe( + component.filterForm.get('deviceFirmware')! + ); + expect(component.location).toBe(component.filterForm.get('location')!); + expect(component.linuxEnv).toBe(component.filterForm.get('linuxEnv')!); + expect(component.pythonVersion).toBe( + component.filterForm.get('pythonVersion')! + ); + expect(component.kernel).toBe(component.filterForm.get('kernel')!); + expect(component.results).toBe( + component.filterForm.controls[ + 'results' + ] as unknown as typeof component.results + ); + }); + it('should have "invalid_format" error if field does not satisfy validation rules', () => { [ 'very long value very long value very long value very long value very long value very long value very long', @@ -202,6 +273,17 @@ describe('FilterDialogComponent', () => { expect(component.range).toEqual(range); }); + it('#selectedChange should swap dates if selected end is earlier than start', () => { + const earlierDate = new Date('Wed Jun 20 2023 00:00:00 GMT+0000'); + const laterDate = new Date('Thu Jun 22 2023 00:00:00 GMT+0000'); + + component.selectedChange(laterDate); + component.selectedChange(earlierDate); + + expect(component.range.start).toEqual(earlierDate); + expect(component.range.end).toEqual(laterDate); + }); + it('#startDateChanged should set date range data', () => { const mockDate = new Date('Wed Jun 21 2023 00:00:00 GMT+0000'); component.startDateChanged({ @@ -254,4 +336,171 @@ describe('FilterDialogComponent', () => { ); }); }); + + describe('dialog positioning and sizing', () => { + it('should set 360px width for Started filter', () => { + const updateSizeSpy = spyOn(component.dialogRef, 'updateSize'); + component.data = { + trigger: mockClientRest, + filter: FilterName.Started, + title: FilterTitle.Started, + }; + + component.ngOnInit(); + expect(updateSizeSpy).toHaveBeenCalledWith('360px'); + }); + + it('should set 240px width and offset position for Results filter without menuRect', () => { + const updateSizeSpy = spyOn(component.dialogRef, 'updateSize'); + const updatePositionSpy = spyOn(component.dialogRef, 'updatePosition'); + component.data = { + trigger: { + nativeElement: { + getBoundingClientRect: () => ({ + left: 300, + bottom: 80, + }), + }, + }, + filter: FilterName.Results, + title: FilterTitle.Results, + }; + + component.ngOnInit(); + expect(updateSizeSpy).toHaveBeenCalledWith('240px'); + expect(updatePositionSpy).toHaveBeenCalledWith({ + left: '60px', + top: '94px', + }); + }); + + it('should position dialog to the right of menu with no padding when menuRect is provided', () => { + const updatePositionSpy = spyOn(component.dialogRef, 'updatePosition'); + const menuRect = { + left: 50, + right: 250, + top: 100, + bottom: 400, + width: 200, + height: 300, + x: 50, + y: 100, + toJSON: () => ({}), + } as DOMRect; + + component.data = { + trigger: mockClientRest, + filter: FilterName.DeviceInfo, + title: FilterTitle.DeviceInfo, + menuRect, + }; + + component.ngOnInit(); + + expect(updatePositionSpy).toHaveBeenCalledWith({ + left: '250px', + top: '100px', + }); + }); + + it('should adjust left position if menuRect overflows window width', () => { + const updatePositionSpy = spyOn(component.dialogRef, 'updatePosition'); + const menuRect = { + left: 800, + right: window.innerWidth + 100, + top: 100, + bottom: 400, + width: 200, + height: 300, + x: 800, + y: 100, + toJSON: () => ({}), + } as DOMRect; + + component.data = { + trigger: mockClientRest, + filter: FilterName.DeviceInfo, + title: FilterTitle.DeviceInfo, + menuRect, + }; + + component.ngOnInit(); + + expect(updatePositionSpy).toHaveBeenCalledWith({ + left: `${window.innerWidth - 328}px`, + top: '100px', + }); + }); + + it('should position dialog on the level with menu item when itemRect is provided', () => { + const updatePositionSpy = spyOn(component.dialogRef, 'updatePosition'); + const menuRect = { + left: 50, + right: 250, + top: 100, + bottom: 400, + width: 200, + height: 300, + x: 50, + y: 100, + toJSON: () => ({}), + } as DOMRect; + + const itemRect = { + left: 50, + right: 250, + top: 180, + bottom: 220, + width: 200, + height: 40, + x: 50, + y: 180, + toJSON: () => ({}), + } as DOMRect; + + component.data = { + trigger: mockClientRest, + filter: FilterName.DeviceInfo, + title: FilterTitle.DeviceInfo, + menuRect, + itemRect, + }; + + component.ngOnInit(); + + expect(updatePositionSpy).toHaveBeenCalledWith({ + left: '250px', + top: '180px', + }); + }); + + it('should fallback to trigger position when menuRect is not provided', () => { + const updatePositionSpy = spyOn(component.dialogRef, 'updatePosition'); + component.data = { + trigger: { + nativeElement: { + getBoundingClientRect: () => ({ + left: 100, + bottom: 80, + }), + }, + }, + filter: FilterName.DeviceInfo, + title: FilterTitle.DeviceInfo, + }; + + component.ngOnInit(); + + expect(updatePositionSpy).toHaveBeenCalledWith({ + left: '100px', + top: '94px', + }); + }); + + it('should update dialog view on window resize', () => { + const updatePositionSpy = spyOn(component.dialogRef, 'updatePosition'); + component.onResize(); + expect(updatePositionSpy).toHaveBeenCalled(); + }); + }); }); diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts index 6dccc0616..41b566fbd 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts @@ -86,6 +86,8 @@ interface DialogData { trigger: ElementRef; filter: string; title: string; + menuRect?: DOMRect; + itemRect?: DOMRect; } @Component({ @@ -167,6 +169,22 @@ export class FilterDialogComponent return this.filterForm.get('deviceFirmware') as AbstractControl; } + get location() { + return this.filterForm.get('location') as AbstractControl; + } + + get linuxEnv() { + return this.filterForm.get('linuxEnv') as AbstractControl; + } + + get pythonVersion() { + return this.filterForm.get('pythonVersion') as AbstractControl; + } + + get kernel() { + return this.filterForm.get('kernel') as AbstractControl; + } + ngOnInit() { this.setDialogView(); this.createFilterForm(); @@ -174,17 +192,7 @@ export class FilterDialogComponent private setDialogView(): void { const matDialogConfig: MatDialogConfig = new MatDialogConfig(); - const rect = this.data.trigger?.nativeElement.getBoundingClientRect(); - - matDialogConfig.position = { - left: - this.data.filter === FilterName.Results - ? `${rect.left - 240}px` - : `${rect.left}px`, - top: `${rect.bottom + 14}px`, - }; - this.topPosition = rect.bottom + this.dialog_actions_height; if (this.data.filter === FilterName.Started) { matDialogConfig.width = '360px'; } else if (this.data.filter === FilterName.Results) { @@ -193,13 +201,49 @@ export class FilterDialogComponent matDialogConfig.width = '328px'; } + const dialogWidthNum = parseInt(matDialogConfig.width, 10) || 328; + + if (this.data.menuRect) { + let left = this.data.menuRect.right; + if (left + dialogWidthNum > window.innerWidth) { + left = Math.max(0, window.innerWidth - dialogWidthNum); + } + const top = this.data.itemRect + ? this.data.itemRect.top + : this.data.menuRect.top; + + matDialogConfig.position = { + left: `${left}px`, + top: `${top}px`, + }; + this.topPosition = top + this.dialog_actions_height; + } else { + const rect = this.data.trigger?.nativeElement?.getBoundingClientRect?.(); + if (rect) { + matDialogConfig.position = { + left: + this.data.filter === FilterName.Results + ? `${rect.left - 240}px` + : `${rect.left}px`, + top: `${rect.bottom + 14}px`, + }; + this.topPosition = rect.bottom + this.dialog_actions_height; + } + } + this.dialogRef.updateSize(matDialogConfig.width); - this.dialogRef.updatePosition(matDialogConfig.position); + if (matDialogConfig.position) { + this.dialogRef.updatePosition(matDialogConfig.position); + } } private createFilterForm() { this.filterForm = this.fb.group({ deviceInfo: ['', [this.deviceValidators.deviceStringFormat()]], deviceFirmware: ['', [this.deviceValidators.firmwareStringFormat()]], + location: ['', []], + linuxEnv: ['', []], + pythonVersion: ['', []], + kernel: ['', []], results: new FormArray(this.resultList.map(() => new FormControl(false))), }); } @@ -249,8 +293,12 @@ export class FilterDialogComponent } const filtersData = { - deviceInfo: formData.deviceInfo.trim(), - deviceFirmware: formData.deviceFirmware.trim(), + deviceInfo: formData.deviceInfo?.trim() || '', + deviceFirmware: formData.deviceFirmware?.trim() || '', + location: formData.location?.trim() || '', + linuxEnv: formData.linuxEnv?.trim() || '', + pythonVersion: formData.pythonVersion?.trim() || '', + kernel: formData.kernel?.trim() || '', results, dateRange: this.range, }; diff --git a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html b/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html deleted file mode 100644 index f97391eb9..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.html +++ /dev/null @@ -1,51 +0,0 @@ - - {{ headerText }} - - - - - - - diff --git a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.scss b/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.scss deleted file mode 100644 index 1a77525fc..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.scss +++ /dev/null @@ -1,43 +0,0 @@ -@use '@angular/material' as mat; -@use 'm3-theme' as *; -@use 'colors'; -@use 'variables'; - -:host { - display: contents; -} - -th { - height: var(--mat-table-header-container-height); - vertical-align: middle; -} - -.filter-button { - display: flex; - width: variables.$reports-table-header-size; - height: variables.$reports-table-header-size; - justify-content: center; - align-items: center; - flex-shrink: 0; - margin-left: 8px; - padding: 0; - border: none; - background: colors.$white; - cursor: pointer; - border-radius: 50%; - &:hover { - background-color: rgba(0, 0, 0, 0.04); - } - &:active, - &.active { - background-color: colors.$secondary-container; - color: colors.$on-secondary-container; - &:hover { - filter: brightness(90%); - } - } -} - -.filter-button.active .mat-icon { - color: mat.get-theme-color($light-theme, primary, 35); -} diff --git a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.spec.ts b/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.spec.ts deleted file mode 100644 index d530772d3..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.spec.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Component } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FilterHeaderComponent } from './filter-header.component'; -import { MatIconModule } from '@angular/material/icon'; -import { MatSortModule } from '@angular/material/sort'; -import { MatButtonModule } from '@angular/material/button'; -import { MatTableModule } from '@angular/material/table'; -import { CommonModule } from '@angular/common'; -import { By } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -@Component({ - selector: 'app-dummy-table', - template: ` - - - - - - - - -
{{ element }}
- `, - standalone: false, -}) -export class DummyTableComponent { - data = ['Row 1', 'Row 2', 'Row 3']; - displayedColumns = ['testColumn']; -} - -describe('FilterHeaderComponent within mat-table', () => { - let fixture: ComponentFixture; - let compiled: HTMLElement; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [DummyTableComponent], - imports: [ - BrowserAnimationsModule, - FilterHeaderComponent, - MatIconModule, - MatSortModule, - MatButtonModule, - MatTableModule, - CommonModule, - ], - }).compileComponents(); - - fixture = TestBed.createComponent(DummyTableComponent); - fixture.detectChanges(); - compiled = fixture.nativeElement as HTMLElement; - }); - - it('should have the filter header component', () => { - const filterHeader = compiled.querySelector( - 'app-filter-header' - ) as HTMLElement; - expect(filterHeader).toBeTruthy(); - const headerText = filterHeader?.querySelector( - 'th span' - ) as HTMLSpanElement; - expect(headerText?.textContent?.trim()).toBe('Test Header'); - }); - - it('should emit an event when filter button is clicked in filter header', () => { - const filterHeader = fixture.debugElement.query( - By.css('app-filter-header') - ); - const filterHeaderComponent = - filterHeader.componentInstance as FilterHeaderComponent; - - spyOn(filterHeaderComponent.emitOpenFilter, 'emit'); - - const button = filterHeader.query(By.css('.filter-button')) - .nativeElement as HTMLButtonElement; - button.click(); - - expect(filterHeaderComponent.emitOpenFilter.emit).toHaveBeenCalledWith({ - event: new PointerEvent('event'), - filter: 'testFilter', - title: 'testTitle', - filterOpened: false, - }); - }); -}); diff --git a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.ts b/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.ts deleted file mode 100644 index 3dfb1e2d1..000000000 --- a/modules/ui/src/app/pages/reports/components/filter-header/filter-header.component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { CommonModule } from '@angular/common'; -import { MatTableModule } from '@angular/material/table'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTooltipModule } from '@angular/material/tooltip'; - -export interface OpenFilterEvent { - event: Event; - filter: string; - title: string; - filterOpened: boolean; -} - -@Component({ - selector: 'app-filter-header', - imports: [ - MatIconModule, - MatButtonModule, - CommonModule, - MatTableModule, - MatSortModule, - MatTooltipModule, - ], - templateUrl: './filter-header.component.html', - styleUrl: './filter-header.component.scss', -}) -export class FilterHeaderComponent { - @Output() emitOpenFilter = new EventEmitter(); - @Input({ required: true }) filterName!: string; - @Input({ required: true }) filterTitle!: string; - @Input({ required: true }) filterOpened!: boolean; - @Input() hasSorting: boolean = true; - @Input() filtered: boolean = false; - @Input({ required: true }) activeFilter!: string; - @Input() sortActionDescription: string = ''; - @Input({ required: true }) headerText!: string; - isFilterHovered = false; - - openFilter( - event: Event, - filter: string, - title: string, - filterOpened: boolean - ): void { - this.emitOpenFilter.emit({ - event, - filter, - title, - filterOpened, - }); - } -} diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.html b/modules/ui/src/app/pages/reports/components/search/search.component.html new file mode 100644 index 000000000..8c4cc74d9 --- /dev/null +++ b/modules/ui/src/app/pages/reports/components/search/search.component.html @@ -0,0 +1,106 @@ + +
+ + + + +
+ @for (item of getActiveFilters(); track item.key) { +
+ + {{ getFilterChipLabel(item.key, item.value) }} + + +
+ } + + +
+ + @if (inputValue || hasActiveFilters()) { + + } +
+ + + @for (menuItem of filterMenuItems; track menuItem) { + + } + diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.scss b/modules/ui/src/app/pages/reports/components/search/search.component.scss new file mode 100644 index 000000000..561752371 --- /dev/null +++ b/modules/ui/src/app/pages/reports/components/search/search.component.scss @@ -0,0 +1,241 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@use '@angular/material' as mat; +@use 'm3-theme' as *; +@use 'colors'; +@use 'variables'; + +.search-field { + position: relative; + display: flex; + align-items: center; + gap: 8px; + border-radius: variables.$corner-small; + border: 1px solid mat.get-theme-color($light-theme, neutral-variant, 80); + background-color: colors.$white; + min-height: 48px; + padding: 4px 8px 4px 6px; + box-sizing: border-box; + width: 100%; + cursor: text; +} + +.search-menu-trigger { + position: absolute; + bottom: -1px; + left: 0; + width: 0; + height: 0; + pointer-events: none; +} + +.search-content { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px; + flex: 1 1 auto; + min-width: 0; + padding: 0; +} + +.filter-chip { + display: inline-flex; + min-height: 32px; + align-items: center; + gap: 4px; + background-color: colors.$secondary-container; + border-radius: 8px; + padding: 4px 6px 4px 10px; + font-family: variables.$font-text; + font-size: 14px; + font-weight: 500; + color: colors.$on-secondary-container; + cursor: pointer; + max-width: 240px; + box-sizing: border-box; + transition: background-color 0.15s ease; + + &:hover { + background-color: colors.$secondary-fixed-dim; + } + + &:focus-visible { + outline: 2px solid colors.$primary; + outline-offset: 1px; + } +} + +.filter-chip-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.filter-chip-remove { + display: flex; + align-items: center; + justify-content: center; + border: none; + background: transparent; + cursor: pointer; + padding: 0; + border-radius: 50%; + width: 18px; + height: 18px; + color: colors.$on-secondary-container; + flex-shrink: 0; + + &:hover { + background-color: rgba(0, 0, 0, 0.1); + } + + &:focus-visible { + outline: 2px solid colors.$primary; + } + + .chip-close-icon { + font-size: 14px; + width: 14px; + height: 14px; + line-height: 14px; + } +} + +.search-input { + flex: 1 1 100px; + min-width: 60px; + border: none; + outline: none; + background: transparent; + font-family: variables.$font-text; + font-size: 14px; + color: colors.$on-surface; + height: 32px; + padding: 0 4px; + + &::placeholder { + color: colors.$on-surface-variant; + opacity: 0.8; + } +} + +.clear-button { + font-family: variables.$font-text; + font-size: 14px; + font-weight: 500; + color: colors.$primary; + background: transparent; + border: none; + cursor: pointer; + padding: 0 8px; + height: 32px; + min-width: unset; + white-space: nowrap; + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: variables.$corner-small; + + ::ng-deep .mdc-button__label { + color: colors.$primary; + font-family: variables.$font-text; + font-size: 14px; + font-weight: 500; + line-height: 20px; + } + + &:hover { + color: colors.$blue-700; + + ::ng-deep .mdc-button__label { + color: colors.$blue-700; + } + } + + &:focus-visible { + outline: 2px solid colors.$primary; + outline-offset: 2px; + } +} + +.filter-button { + display: inline-flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 36px; + height: 36px; + min-width: 36px; + min-height: 36px; + padding: 0; + border: none; + background: transparent; + color: colors.$on-surface-variant; + border-radius: 50%; + box-sizing: border-box; + + ::ng-deep .mdc-button__label { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } + + ::ng-deep .mat-mdc-button-touch-target { + width: 36px; + height: 36px; + } + + .filter-icon { + font-size: 20px; + width: 20px; + height: 20px; + line-height: 20px; + display: flex; + align-items: center; + justify-content: center; + margin: 0; + } + + &.active { + color: colors.$primary; + background-color: colors.$primary-container; + } + + &:focus-visible { + outline: 2px solid colors.$primary; + outline-offset: 2px; + } +} + +::ng-deep .search-filter-menu { + .filter-menu-item { + display: flex; + align-items: center; + font-family: variables.$font-text; + font-size: 14px; + color: colors.$on-surface; + + &.active-filter-item { + background-color: colors.$secondary-container; + color: colors.$on-secondary-container; + font-weight: 500; + } + } +} diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts new file mode 100644 index 000000000..a1e2442a5 --- /dev/null +++ b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts @@ -0,0 +1,544 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { SearchComponent } from './search.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { + DateRange, + FilterName, + FilterTitle, + Filters, +} from '../../../../model/filters'; + +describe('SearchComponent', () => { + let component: SearchComponent; + let fixture: ComponentFixture; + let compiled: HTMLElement; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SearchComponent, BrowserAnimationsModule], + }).compileComponents(); + + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + compiled = fixture.nativeElement as HTMLElement; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('Active filters & labels', () => { + it('should return empty list when no filters are active', () => { + component.filters = new Filters(); + expect(component.getActiveFilters()).toEqual([]); + expect(component.hasActiveFilters()).toBeFalse(); + }); + + it('should return empty list when filters is null or undefined', () => { + component.filters = null as unknown as Filters; + expect(component.getActiveFilters()).toEqual([]); + expect(component.hasActiveFilters()).toBeFalse(); + expect(component.isFilterActive('deviceInfo')).toBeFalse(); + }); + + it('should return active filter items when filters are set', () => { + component.filters = { + deviceInfo: 'Pixel', + deviceFirmware: '1.0', + results: ['Compliant'], + dateRange: { start: '10/01/2024', end: '10/05/2024' }, + quickSearch: 'test', + location: 'Data Center', + linuxEnv: 'Ubuntu 24.04', + pythonVersion: '3.11', + kernel: '6.8.0', + }; + + const active = component.getActiveFilters(); + expect(active.length).toBe(9); + expect(component.hasActiveFilters()).toBeTrue(); + expect(component.isFilterActive('deviceInfo')).toBeTrue(); + expect(component.isFilterActive('deviceFirmware')).toBeTrue(); + expect(component.isFilterActive('results')).toBeTrue(); + expect(component.isFilterActive('dateRange')).toBeTrue(); + expect(component.isFilterActive('quickSearch')).toBeTrue(); + expect(component.isFilterActive('location')).toBeTrue(); + expect(component.isFilterActive('linuxEnv')).toBeTrue(); + expect(component.isFilterActive('pythonVersion')).toBeTrue(); + expect(component.isFilterActive('kernel')).toBeTrue(); + }); + + it('should format chip labels correctly for all filter types', () => { + expect( + component.getFilterChipLabel(FilterName.QuickSearch, 'query') + ).toBe('search: "query"'); + expect( + component.getFilterChipLabel(FilterName.DeviceInfo, 'Device A') + ).toBe('Device contains "Device A"'); + expect( + component.getFilterChipLabel(FilterName.DeviceFirmware, 'v2.1') + ).toBe('Firmware contains "v2.1"'); + expect( + component.getFilterChipLabel(FilterName.Location, 'Building 1') + ).toBe('Location contains "Building 1"'); + expect(component.getFilterChipLabel(FilterName.LinuxEnv, 'Ubuntu')).toBe( + 'Linux Env contains "Ubuntu"' + ); + expect( + component.getFilterChipLabel(FilterName.PythonVersion, '3.11') + ).toBe('Python contains "3.11"'); + expect(component.getFilterChipLabel(FilterName.Kernel, 'Linux 6.8')).toBe( + 'Kernel contains "Linux 6.8"' + ); + expect( + component.getFilterChipLabel(FilterName.DateRange, { + start: '01/01/2024', + end: '01/10/2024', + }) + ).toBe('01/01/2024 - 01/10/2024'); + expect( + component.getFilterChipLabel(FilterName.Started, { + start: '01/01/2024', + end: '', + }) + ).toBe('01/01/2024 - '); + expect( + component.getFilterChipLabel( + FilterName.DateRange, + '01/01/2024 - 01/10/2024' + ) + ).toBe('01/01/2024 - 01/10/2024'); + expect( + component.getFilterChipLabel(FilterName.Results, [ + 'Compliant', + 'Non-compliant', + ]) + ).toBe('Compliant, Non-compliant'); + expect(component.getFilterChipLabel('unknownKey', 'sampleValue')).toBe( + 'sampleValue' + ); + }); + + it('should correctly evaluate isValueEmpty', () => { + expect(component.isValueEmpty('')).toBeTrue(); + expect(component.isValueEmpty([])).toBeTrue(); + expect(component.isValueEmpty(null)).toBeTrue(); + expect(component.isValueEmpty(undefined as unknown as string)).toBeTrue(); + expect(component.isValueEmpty(new DateRange())).toBeTrue(); + expect(component.isValueEmpty({ start: '', end: '' })).toBeTrue(); + + expect(component.isValueEmpty('value')).toBeFalse(); + expect(component.isValueEmpty(['value'])).toBeFalse(); + expect( + component.isValueEmpty({ start: '01/01/2024', end: '01/10/2024' }) + ).toBeFalse(); + const dateRange = new DateRange(); + dateRange.start = '01/01/2024'; + expect(component.isValueEmpty(dateRange)).toBeFalse(); + }); + + it('should generate accessible labels', () => { + expect(component.getChipAriaLabel(FilterName.QuickSearch, 'test')).toBe( + 'Filter: search: "test". Click to edit.' + ); + expect( + component.getRemoveFilterAriaLabel(FilterName.DeviceInfo, 'Pixel') + ).toBe('Clear filter: Device contains "Pixel"'); + }); + }); + + describe('Filter removal & clearing', () => { + let mockFilters: Filters; + + beforeEach(() => { + mockFilters = { + deviceInfo: 'Pixel', + deviceFirmware: '1.0', + results: ['Compliant'], + dateRange: { start: '10/01/2024', end: '10/05/2024' }, + quickSearch: 'test', + location: 'DC-1', + linuxEnv: 'Ubuntu', + pythonVersion: '3.11', + kernel: '6.8', + }; + component.filters = { ...mockFilters }; + }); + + it('should remove deviceInfo filter and handle event', () => { + spyOn(component.filterCleared, 'emit'); + const event = new MouseEvent('click'); + spyOn(event, 'preventDefault'); + spyOn(event, 'stopPropagation'); + + component.removeFilter(FilterName.DeviceInfo, event); + + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopPropagation).toHaveBeenCalled(); + expect(component.filters.deviceInfo).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove deviceFirmware filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.DeviceFirmware); + + expect(component.filters.deviceFirmware).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove results filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.Results); + + expect(component.filters.results).toEqual([]); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove dateRange filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.DateRange); + + expect(component.filters.dateRange).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove started filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.Started); + + expect(component.filters.dateRange).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove quickSearch filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.QuickSearch); + + expect(component.filters.quickSearch).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove location filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.Location); + + expect(component.filters.location).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove linuxEnv filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.LinuxEnv); + + expect(component.filters.linuxEnv).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove pythonVersion filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.PythonVersion); + + expect(component.filters.pythonVersion).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove kernel filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.Kernel); + + expect(component.filters.kernel).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should clear all filters on clearAll and handle event', () => { + spyOn(component.filterCleared, 'emit'); + spyOn(component.searchQueryChanged, 'emit'); + component.inputValue = 'some text'; + + const event = new MouseEvent('click'); + spyOn(event, 'preventDefault'); + spyOn(event, 'stopPropagation'); + + component.clearAll(event); + + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopPropagation).toHaveBeenCalled(); + expect(component.inputValue).toBe(''); + expect(component.filters.deviceInfo).toBe(''); + expect(component.filters.deviceFirmware).toBe(''); + expect(component.filters.results).toEqual([]); + expect(component.filters.dateRange).toBe(''); + expect(component.filters.quickSearch).toBe(''); + expect(component.filters.location).toBe(''); + expect(component.filters.linuxEnv).toBe(''); + expect(component.filters.pythonVersion).toBe(''); + expect(component.filters.kernel).toBe(''); + expect(component.searchQueryChanged.emit).toHaveBeenCalledWith(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + }); + + describe('Input handling', () => { + it('should update inputValue on input change', () => { + const event = { + target: { value: 'my search' }, + } as unknown as Event; + + component.onInputChange(event); + expect(component.inputValue).toBe('my search'); + }); + + it('should add search chip on Enter and clear input', () => { + spyOn(component.filterCleared, 'emit'); + spyOn(component.searchQueryChanged, 'emit'); + component.inputValue = ' Raspberry Pi '; + + const event = new KeyboardEvent('keydown', { key: 'Enter' }); + spyOn(event, 'preventDefault'); + + component.onEnter(event); + + expect(event.preventDefault).toHaveBeenCalled(); + expect(component.filters.quickSearch).toBe('Raspberry Pi'); + expect(component.searchQueryChanged.emit).toHaveBeenCalledWith( + 'Raspberry Pi' + ); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + expect(component.inputValue).toBe(''); + }); + + it('should not add search chip on Enter if input is empty or whitespace', () => { + spyOn(component.filterCleared, 'emit'); + spyOn(component.searchQueryChanged, 'emit'); + component.inputValue = ' '; + + const event = new KeyboardEvent('keydown', { key: 'Enter' }); + component.onEnter(event); + + expect(component.searchQueryChanged.emit).not.toHaveBeenCalled(); + expect(component.filterCleared.emit).not.toHaveBeenCalled(); + }); + + it('should remove last filter on Backspace when input is empty', () => { + component.filters = { + deviceInfo: 'Pixel', + deviceFirmware: '1.0', + results: [], + dateRange: '', + quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', + }; + component.inputValue = ''; + spyOn(component, 'removeFilter'); + + component.onBackspace(); + + expect(component.removeFilter).toHaveBeenCalledWith('deviceFirmware'); + }); + + it('should not remove last filter on Backspace when no active filters', () => { + component.filters = new Filters(); + component.inputValue = ''; + spyOn(component, 'removeFilter'); + + component.onBackspace(); + + expect(component.removeFilter).not.toHaveBeenCalled(); + }); + + it('should not remove last filter on Backspace if input is not empty', () => { + component.filters = { + deviceInfo: 'Pixel', + deviceFirmware: '', + results: [], + dateRange: '', + quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', + }; + component.inputValue = 'abc'; + spyOn(component, 'removeFilter'); + + component.onBackspace(); + + expect(component.removeFilter).not.toHaveBeenCalled(); + }); + + it('should focus search input on focusInput()', () => { + const inputEl = component.searchInput()?.nativeElement; + if (inputEl) { + spyOn(inputEl, 'focus'); + component.focusInput(); + expect(inputEl.focus).toHaveBeenCalled(); + } + }); + }); + + describe('Filter menu & dialog opening', () => { + it('should emit emitOpenFilter on openFilterMenu for all menu items', () => { + spyOn(component.emitOpenFilter, 'emit'); + component.filterMenuItems.forEach(item => { + const button = document.createElement('button'); + const event = { + currentTarget: button, + preventDefault: jasmine.createSpy('preventDefault'), + stopPropagation: jasmine.createSpy('stopPropagation'), + } as unknown as Event; + + component.openFilterMenu(item.name, item.title, event); + + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopPropagation).toHaveBeenCalled(); + expect(component.emitOpenFilter.emit).toHaveBeenCalledWith( + jasmine.objectContaining({ + filter: item.name, + title: item.title, + filterOpened: component.filterOpened, + }) + ); + }); + }); + + it('should find closest menu panel if present', () => { + spyOn(component.emitOpenFilter, 'emit'); + const menuPanel = document.createElement('div'); + menuPanel.classList.add('search-filter-menu'); + const button = document.createElement('button'); + menuPanel.appendChild(button); + document.body.appendChild(menuPanel); + + const event = { + currentTarget: button, + preventDefault: () => undefined, + stopPropagation: () => undefined, + } as unknown as Event; + + component.openFilterMenu(FilterName.Started, FilterTitle.Started, event); + + expect(component.emitOpenFilter.emit).toHaveBeenCalled(); + document.body.removeChild(menuPanel); + }); + }); + + describe('DOM rendering', () => { + it('should render search input and filter button', () => { + const input = compiled.querySelector('.search-input'); + const filterBtn = compiled.querySelector('.filter-button'); + + expect(input).toBeTruthy(); + expect(filterBtn).toBeTruthy(); + }); + + it('should render filter chips when filters are present', () => { + component.filters = { + deviceInfo: 'Pixel', + deviceFirmware: '', + results: ['Compliant'], + dateRange: '', + quickSearch: 'test', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', + }; + fixture.detectChanges(); + + const chips = compiled.querySelectorAll('.filter-chip'); + expect(chips.length).toBe(3); + }); + + it('should render clear button when filters or input value are present', () => { + component.filters = new Filters(); + component.inputValue = ''; + fixture.detectChanges(); + expect(compiled.querySelector('.clear-button')).toBeNull(); + + component.inputValue = 'abc'; + fixture.detectChanges(); + const clearBtn = compiled.querySelector('.clear-button'); + expect(clearBtn).toBeTruthy(); + expect(clearBtn?.textContent?.trim()).toBe('Clear all'); + }); + + it('should trigger removeFilter on chip remove button click, enter, space', () => { + component.filters = { + deviceInfo: 'Pixel', + deviceFirmware: '', + results: [], + dateRange: '', + quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', + }; + fixture.detectChanges(); + + spyOn(component, 'removeFilter'); + const removeBtn = compiled.querySelector( + '.filter-chip-remove' + ) as HTMLButtonElement; + expect(removeBtn).toBeTruthy(); + + removeBtn.click(); + expect(component.removeFilter).toHaveBeenCalledWith( + 'deviceInfo', + jasmine.any(MouseEvent) + ); + + const enterEvent = new KeyboardEvent('keydown', { key: 'Enter' }); + removeBtn.dispatchEvent(enterEvent); + expect(component.removeFilter).toHaveBeenCalled(); + + const spaceEvent = new KeyboardEvent('keydown', { key: ' ' }); + removeBtn.dispatchEvent(spaceEvent); + expect(component.removeFilter).toHaveBeenCalled(); + }); + }); +}); diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.ts b/modules/ui/src/app/pages/reports/components/search/search.component.ts new file mode 100644 index 000000000..7a25c962d --- /dev/null +++ b/modules/ui/src/app/pages/reports/components/search/search.component.ts @@ -0,0 +1,340 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + Component, + ElementRef, + EventEmitter, + Input, + Output, + viewChild, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { + DateRange, + FilterName, + FilterTitle, + Filters, + FilterItem, + FilterMenuItem, + OpenFilterEvent, + FilterValue, +} from '../../../../model/filters'; + +export interface ActiveFilterItem { + key: string; + value: FilterValue; +} + +@Component({ + selector: 'app-search', + imports: [ + CommonModule, + FormsModule, + MatIconModule, + MatButtonModule, + MatMenuModule, + MatTooltipModule, + ], + templateUrl: './search.component.html', + styleUrls: ['./search.component.scss'], +}) +export class SearchComponent { + @Input() filters: Filters = new Filters(); + @Input() filterOpened: boolean = false; + @Input() activeFilter: string = ''; + + @Output() emitOpenFilter = new EventEmitter(); + @Output() filterCleared = new EventEmitter(); + @Output() searchQueryChanged = new EventEmitter(); + + readonly searchInput = viewChild>('searchInput'); + readonly filterButton = + viewChild>('filterButton'); + + public readonly FilterName = FilterName; + public readonly FilterTitle = FilterTitle; + + inputValue: string = ''; + isFocused: boolean = false; + isMenuOpened: boolean = false; + filterMenuItems: FilterMenuItem[] = [ + { + displayName: FilterItem.Started, + name: FilterName.Started, + title: FilterTitle.Started, + }, + { + displayName: FilterItem.DeviceInfo, + name: FilterName.DeviceInfo, + title: FilterTitle.DeviceInfo, + }, + { + displayName: FilterItem.DeviceFirmware, + name: FilterName.DeviceFirmware, + title: FilterTitle.DeviceFirmware, + }, + { + displayName: FilterItem.Results, + name: FilterName.Results, + title: FilterTitle.Results, + }, + { + displayName: FilterItem.Location, + name: FilterName.Location, + title: FilterTitle.Location, + }, + { + displayName: FilterItem.LinuxEnv, + name: FilterName.LinuxEnv, + title: FilterTitle.LinuxEnv, + }, + { + displayName: FilterItem.PythonVersion, + name: FilterName.PythonVersion, + title: FilterTitle.PythonVersion, + }, + { + displayName: FilterItem.Kernel, + name: FilterName.Kernel, + title: FilterTitle.Kernel, + }, + ]; + + focusInput(): void { + this.searchInput()?.nativeElement.focus(); + } + + onInputChange(event: Event): void { + const target = event.target as HTMLInputElement; + this.inputValue = target.value; + } + + onEnter(event: Event): void { + event.preventDefault(); + const query = this.inputValue.trim(); + if (query) { + this.filters.quickSearch = query; + this.searchQueryChanged.emit(query); + this.filterCleared.emit(this.filters); + this.inputValue = ''; + if (this.searchInput()?.nativeElement) { + this.searchInput()!.nativeElement.value = ''; + } + } + } + + onBackspace(): void { + if (this.inputValue === '') { + const active = this.getActiveFilters(); + if (active.length > 0) { + const lastFilter = active[active.length - 1]; + this.removeFilter(lastFilter.key); + } + } + } + + getActiveFilters(): ActiveFilterItem[] { + if (!this.filters) { + return []; + } + const items: ActiveFilterItem[] = []; + const keys: (keyof Filters)[] = [ + FilterName.QuickSearch, + FilterName.DeviceInfo, + FilterName.DeviceFirmware, + FilterName.DateRange, + FilterName.Results, + FilterName.Location, + FilterName.LinuxEnv, + FilterName.PythonVersion, + FilterName.Kernel, + ]; + + for (const key of keys) { + const value = this.filters[key]; + if (!this.isValueEmpty(value)) { + items.push({ key, value }); + } + } + + return items; + } + + hasActiveFilters(): boolean { + return this.getActiveFilters().length > 0; + } + + isFilterActive(key: string): boolean { + if (!this.filters) { + return false; + } + const filterKey = key as keyof Filters; + const val = this.filters[filterKey] as FilterValue; + return !this.isValueEmpty(val); + } + + isValueEmpty(value: FilterValue): boolean { + if ( + value instanceof DateRange || + (typeof value === 'object' && value !== null && !Array.isArray(value)) + ) { + return !value.start && !value.end; + } + return value === null || value === undefined || value.length === 0; + } + + getFilterChipLabel(key: string, value: FilterValue): string { + if (key === FilterName.QuickSearch) { + return `search: "${value}"`; + } + if (key === FilterName.DeviceInfo) { + return `Device contains "${value}"`; + } + if (key === FilterName.DeviceFirmware) { + return `Firmware contains "${value}"`; + } + if (key === FilterName.Location) { + return `Location contains "${value}"`; + } + if (key === FilterName.LinuxEnv) { + return `Linux Env contains "${value}"`; + } + if (key === FilterName.PythonVersion) { + return `Python contains "${value}"`; + } + if (key === FilterName.Kernel) { + return `Kernel contains "${value}"`; + } + if (key === FilterName.DateRange || key === FilterName.Started) { + if ( + typeof value === 'object' && + value && + !Array.isArray(value) && + (value.start || value.end) + ) { + return `${value.start || ''} - ${value.end || ''}`; + } + return String(value ?? ''); + } + if (Array.isArray(value)) { + return value.join(', '); + } + return String(value ?? ''); + } + + getChipAriaLabel(key: string, value: FilterValue): string { + return `Filter: ${this.getFilterChipLabel(key, value)}. Click to edit.`; + } + + getRemoveFilterAriaLabel(key: string, value: FilterValue): string { + return `Clear filter: ${this.getFilterChipLabel(key, value)}`; + } + + removeFilter(key: string, event?: Event): void { + if (event) { + event.preventDefault(); + event.stopPropagation(); + } + switch (key) { + case FilterName.DeviceInfo: + this.filters.deviceInfo = ''; + break; + case FilterName.DeviceFirmware: + this.filters.deviceFirmware = ''; + break; + case FilterName.Results: + this.filters.results = []; + break; + case FilterName.DateRange: + case FilterName.Started: + this.filters.dateRange = ''; + break; + case FilterName.QuickSearch: + this.filters.quickSearch = ''; + //this.searchQueryChanged.emit(''); + break; + case FilterName.Location: + this.filters.location = ''; + break; + case FilterName.LinuxEnv: + this.filters.linuxEnv = ''; + break; + case FilterName.PythonVersion: + this.filters.pythonVersion = ''; + break; + case FilterName.Kernel: + this.filters.kernel = ''; + break; + } + this.filterCleared.emit(this.filters); + } + + clearAll(event?: Event): void { + if (event) { + event.preventDefault(); + event.stopPropagation(); + } + this.inputValue = ''; + if (this.searchInput()?.nativeElement) { + this.searchInput()!.nativeElement.value = ''; + } + this.filters.deviceInfo = ''; + this.filters.deviceFirmware = ''; + this.filters.results = []; + this.filters.dateRange = ''; + this.filters.quickSearch = ''; + this.filters.location = ''; + this.filters.linuxEnv = ''; + this.filters.pythonVersion = ''; + this.filters.kernel = ''; + this.searchQueryChanged.emit(''); + this.filterCleared.emit(this.filters); + } + + openFilterMenu(filter: FilterName, title: FilterTitle, event: Event): void { + event.preventDefault(); + event.stopPropagation(); + const menuItem = event.currentTarget as HTMLElement; + const itemRect = menuItem?.getBoundingClientRect?.(); + const menuPanel = + menuItem?.closest('.mat-mdc-menu-panel') || + menuItem?.closest('.search-filter-menu') || + (document.querySelector('.search-filter-menu') as HTMLElement); + const menuRect = menuPanel ? menuPanel.getBoundingClientRect() : itemRect; + + const trigger = this.filterButton()?.nativeElement + ? new ElementRef(this.filterButton()!.nativeElement) + : new ElementRef(event.currentTarget); + this.emitOpenFilter.emit({ + event: { + ...event, + currentTarget: trigger.nativeElement, + preventDefault: () => event?.preventDefault?.(), + stopPropagation: () => event?.stopPropagation?.(), + } as unknown as Event, + filter, + title, + filterOpened: this.filterOpened, + menuRect, + itemRect, + }); + } +} diff --git a/modules/ui/src/app/pages/reports/reports.component.html b/modules/ui/src/app/pages/reports/reports.component.html index 64424d718..55c943285 100644 --- a/modules/ui/src/app/pages/reports/reports.component.html +++ b/modules/ui/src/app/pages/reports/reports.component.html @@ -18,6 +18,18 @@

Reports

+ +
Reports - - + mat-header-cell + mat-sort-header + sortActionDescription="Sort by Started date" + matTooltip="Sort by Started"> + Started + {{ getFormattedDateString(data.started) }} @@ -98,32 +107,26 @@

Reports

- - + mat-header-cell + mat-sort-header + sortActionDescription="Sort by Device" + matTooltip="Sort by Device"> + Device + {{ data.deviceInfo }} - - + mat-header-cell + mat-sort-header + sortActionDescription="Sort by Firmware" + matTooltip="Sort by Firmware"> + Firmware + {{ data.deviceFirmware }} @@ -142,17 +145,14 @@

Reports

- - + mat-header-cell + mat-sort-header + sortActionDescription="Sort by Result" + matTooltip="Sort by Result"> + Result + Reports
- - -
- -
- -
Reports -
diff --git a/modules/ui/src/app/pages/reports/reports.component.scss b/modules/ui/src/app/pages/reports/reports.component.scss index bf6c6fca2..4e8bda637 100644 --- a/modules/ui/src/app/pages/reports/reports.component.scss +++ b/modules/ui/src/app/pages/reports/reports.component.scss @@ -28,10 +28,24 @@ $column-expand-width: 56px; } .history-toolbar { - gap: 10px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 24px; background: colors.$white; - height: 74px; - padding: 24px 0 8px 32px; + height: auto; + min-height: 74px; + padding: 24px 32px 8px 32px; + box-sizing: border-box; + + .title { + margin: 0; + white-space: nowrap; + } +} + +app-search { + margin: 24px 32px 16px 32px; } .history-content { diff --git a/modules/ui/src/app/pages/reports/reports.component.spec.ts b/modules/ui/src/app/pages/reports/reports.component.spec.ts index 2e19bf002..cf8af1572 100644 --- a/modules/ui/src/app/pages/reports/reports.component.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.component.spec.ts @@ -73,6 +73,10 @@ describe('ReportsComponent', () => { results: ['compliant'], dateRange: '', quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', }, dataLoaded: dataLoaded, selectedRow: null, @@ -91,11 +95,14 @@ describe('ReportsComponent', () => { 'setFilteredValuesDeviceInfo', 'setFilteredValuesQuickSearch', 'setFilteredValuesResults', + 'setFilteredValuesLocation', + 'setFilteredValuesLinuxEnv', + 'setFilteredValuesPythonVersion', + 'setFilteredValuesKernel', 'setActiveFiler', 'setFilterOpened', 'updateSort', 'getReports', - 'getReports', 'fetchReports', ]); mockLiveAnnouncer = jasmine.createSpyObj(['announce']); @@ -198,6 +205,8 @@ describe('ReportsComponent', () => { filter: '', title: '', trigger: new ElementRef(event.currentTarget), + menuRect: undefined, + itemRect: undefined, }, autoFocus: true, hasBackdrop: true, @@ -222,12 +231,20 @@ describe('ReportsComponent', () => { start: 'Wed Jun 21 2023 00:00:00', end: 'Thu Jun 22 2023 00:00:00', }; + const mockFilterLocation = 'mockLocation'; + const mockFilterLinuxEnv = 'mockLinuxEnv'; + const mockFilterPythonVersion = 'mockPythonVersion'; + const mockFilterKernel = 'mockKernel'; const mockFilteredData = { results: mockFilterResults, deviceInfo: mockFilterDeviceInfo, deviceFirmware: mockFilterDeviceFirmware, dateRange: mockFilterDateRange, + location: mockFilterLocation, + linuxEnv: mockFilterLinuxEnv, + pythonVersion: mockFilterPythonVersion, + kernel: mockFilterKernel, }; spyOn(component.dialog, 'open').and.returnValue({ @@ -259,6 +276,30 @@ describe('ReportsComponent', () => { title: FilterTitle.DeviceInfo, filterOpened: false, }); + component.openFilter({ + event, + filter: FilterName.Location, + title: FilterTitle.Location, + filterOpened: false, + }); + component.openFilter({ + event, + filter: FilterName.LinuxEnv, + title: FilterTitle.LinuxEnv, + filterOpened: false, + }); + component.openFilter({ + event, + filter: FilterName.PythonVersion, + title: FilterTitle.PythonVersion, + filterOpened: false, + }); + component.openFilter({ + event, + filter: FilterName.Kernel, + title: FilterTitle.Kernel, + filterOpened: false, + }); expect(mockReportsStore.setFilteredValuesResults).toHaveBeenCalledWith( mockFilterResults ); @@ -271,6 +312,18 @@ describe('ReportsComponent', () => { expect(mockReportsStore.setFilteredValuesDateRange).toHaveBeenCalledWith( mockFilterDateRange ); + expect(mockReportsStore.setFilteredValuesLocation).toHaveBeenCalledWith( + mockFilterLocation + ); + expect(mockReportsStore.setFilteredValuesLinuxEnv).toHaveBeenCalledWith( + mockFilterLinuxEnv + ); + expect( + mockReportsStore.setFilteredValuesPythonVersion + ).toHaveBeenCalledWith(mockFilterPythonVersion); + expect(mockReportsStore.setFilteredValuesKernel).toHaveBeenCalledWith( + mockFilterKernel + ); }); describe('#focusNextButton', () => { @@ -330,6 +383,15 @@ describe('ReportsComponent', () => { ).toHaveBeenCalledWith('testSearch'); }); + it('onSearchQueryChanged should update searchQuery and call applySearchQuery', () => { + component.onSearchQueryChanged('newQuery'); + + expect(component.searchQuery).toBe('newQuery'); + expect( + mockReportsStore.setFilteredValuesQuickSearch + ).toHaveBeenCalledWith('newQuery'); + }); + it('addSearchTag should set searchQuery and call applySearchQuery', () => { component.addSearchTag('tagSearch'); @@ -395,12 +457,16 @@ describe('ReportsComponent', () => { describe('filterCleared', () => { it('should update searchQuery and call store.setFilteredValues', () => { - const filters = { + const filters: Filters = { deviceInfo: '', deviceFirmware: '', results: [], dateRange: '', quickSearch: 'searchKeyword', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', }; component.filterCleared(filters); @@ -560,10 +626,10 @@ describe('ReportsComponent', () => { expect(link).toBeTruthy(); }); - it('should have filter chips', () => { - const chips = compiled.querySelector('app-filter-chips'); + it('should have search component', () => { + const search = compiled.querySelector('app-search'); - expect(chips).toBeTruthy(); + expect(search).toBeTruthy(); }); it('should have empty state when no data satisfy filters', () => { diff --git a/modules/ui/src/app/pages/reports/reports.component.ts b/modules/ui/src/app/pages/reports/reports.component.ts index 4a1d0857a..631e4f7a0 100644 --- a/modules/ui/src/app/pages/reports/reports.component.ts +++ b/modules/ui/src/app/pages/reports/reports.component.ts @@ -37,15 +37,16 @@ import { MatDialog } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatInputModule } from '@angular/material/input'; import { tap } from 'rxjs/internal/operators/tap'; -import { FilterName, FilterTitle, Filters } from '../../model/filters'; -import { ReportsStore } from './reports.store'; import { - FilterHeaderComponent, + FilterName, + FilterTitle, + Filters, OpenFilterEvent, -} from './components/filter-header/filter-header.component'; +} from '../../model/filters'; +import { ReportsStore } from './reports.store'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatIcon, MatIconModule } from '@angular/material/icon'; -import { FilterChipsComponent } from './components/filter-chips/filter-chips.component'; +import { MatIconModule } from '@angular/material/icon'; +import { SearchComponent } from './components/search/search.component'; import { DownloadReportZipComponent } from '../../components/download-report-zip/download-report-zip.component'; import { DownloadReportPdfComponent } from '../../components/download-report-pdf/download-report-pdf.component'; import { DeleteReportComponent } from './components/delete-report/delete-report.component'; @@ -67,14 +68,11 @@ import { state, style, trigger } from '@angular/animations'; MatSortModule, MatButtonModule, MatInputModule, - FilterChipsComponent, + SearchComponent, DeleteReportComponent, DownloadReportZipComponent, DownloadReportPdfComponent, - FilterHeaderComponent, EmptyMessageComponent, - MatSortModule, - MatIcon, MatTooltipModule, ], providers: [ReportsStore, DatePipe], @@ -164,6 +162,11 @@ export class ReportsComponent implements OnInit, OnDestroy { this.store.setFilteredValuesQuickSearch(this.searchQuery); } + onSearchQueryChanged(query: string) { + this.searchQuery = query; + this.applySearchQuery(); + } + addSearchTag(tag: string) { this.searchQuery = tag; this.applySearchQuery(); @@ -193,20 +196,29 @@ export class ReportsComponent implements OnInit, OnDestroy { return this.testRunService.getResultClass(status); } - openFilter({ event, filter, title, filterOpened }: OpenFilterEvent) { + openFilter({ + event, + filter, + title, + filterOpened, + menuRect, + itemRect, + }: OpenFilterEvent) { event.preventDefault(); event.stopPropagation(); const target = new ElementRef(event.currentTarget); if (!filterOpened) { - this.openFilterDialog(target, filter, title); + this.openFilterDialog(target, filter, title, menuRect, itemRect); } } openFilterDialog( target: ElementRef, filter: string, - title: string + title: string, + menuRect?: DOMRect, + itemRect?: DOMRect ) { this.store.setFilterOpened(true); this.store.setActiveFiler(filter); @@ -216,6 +228,8 @@ export class ReportsComponent implements OnInit, OnDestroy { filter, title, trigger: target, + menuRect, + itemRect, }, autoFocus: true, hasBackdrop: true, @@ -248,6 +262,20 @@ export class ReportsComponent implements OnInit, OnDestroy { if (filter === FilterName.Started) { this.store.setFilteredValuesDateRange(filteredData.dateRange); } + if (filter === FilterName.Location) { + this.store.setFilteredValuesLocation(filteredData.location); + } + if (filter === FilterName.LinuxEnv) { + this.store.setFilteredValuesLinuxEnv(filteredData.linuxEnv); + } + if (filter === FilterName.PythonVersion) { + this.store.setFilteredValuesPythonVersion( + filteredData.pythonVersion + ); + } + if (filter === FilterName.Kernel) { + this.store.setFilteredValuesKernel(filteredData.kernel); + } } }); } diff --git a/modules/ui/src/app/pages/reports/reports.store.spec.ts b/modules/ui/src/app/pages/reports/reports.store.spec.ts index c2878c341..048cd495a 100644 --- a/modules/ui/src/app/pages/reports/reports.store.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.store.spec.ts @@ -154,6 +154,10 @@ describe('ReportsStore', () => { results: [], dateRange: '', quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', }, dataLoaded: true, selectedRow: null, @@ -362,6 +366,78 @@ describe('ReportsStore', () => { }); }); + describe('setFilteredValuesLocation', () => { + it('should update store', done => { + const updatedFilters = { ...FILTERS, ...{ location: 'test2' } }; + store.overrideSelector(selectReports, [...HISTORY]); + reportsStore.setFilteredValues({ ...FILTERS }); + + reportsStore.setFilteredValuesLocation('test2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.filteredValues).toEqual(updatedFilters); + expect(store.dataSource.filter).toEqual( + JSON.stringify(updatedFilters) + ); + done(); + }); + }); + }); + + describe('setFilteredValuesLinuxEnv', () => { + it('should update store', done => { + const updatedFilters = { ...FILTERS, ...{ linuxEnv: 'test2' } }; + store.overrideSelector(selectReports, [...HISTORY]); + reportsStore.setFilteredValues({ ...FILTERS }); + + reportsStore.setFilteredValuesLinuxEnv('test2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.filteredValues).toEqual(updatedFilters); + expect(store.dataSource.filter).toEqual( + JSON.stringify(updatedFilters) + ); + done(); + }); + }); + }); + + describe('setFilteredValuesPythonVersion', () => { + it('should update store', done => { + const updatedFilters = { ...FILTERS, ...{ pythonVersion: 'test2' } }; + store.overrideSelector(selectReports, [...HISTORY]); + reportsStore.setFilteredValues({ ...FILTERS }); + + reportsStore.setFilteredValuesPythonVersion('test2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.filteredValues).toEqual(updatedFilters); + expect(store.dataSource.filter).toEqual( + JSON.stringify(updatedFilters) + ); + done(); + }); + }); + }); + + describe('setFilteredValuesKernel', () => { + it('should update store', done => { + const updatedFilters = { ...FILTERS, ...{ kernel: 'test2' } }; + store.overrideSelector(selectReports, [...HISTORY]); + reportsStore.setFilteredValues({ ...FILTERS }); + + reportsStore.setFilteredValuesKernel('test2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.filteredValues).toEqual(updatedFilters); + expect(store.dataSource.filter).toEqual( + JSON.stringify(updatedFilters) + ); + done(); + }); + }); + }); + describe('setFilteredValues', () => { it('should update store', done => { const updatedFilters = { ...EMPTY_FILTERS }; diff --git a/modules/ui/src/app/pages/reports/reports.store.ts b/modules/ui/src/app/pages/reports/reports.store.ts index 4be683c1b..69f75193e 100644 --- a/modules/ui/src/app/pages/reports/reports.store.ts +++ b/modules/ui/src/app/pages/reports/reports.store.ts @@ -207,6 +207,54 @@ export class ReportsStore extends ComponentStore { ); }); + setFilteredValuesLocation = this.effect(location$ => { + return location$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([location, filteredValues, dataSource]) => { + this.updateFilters(dataSource, { + ...filteredValues, + location, + }); + }) + ); + }); + + setFilteredValuesLinuxEnv = this.effect(linuxEnv$ => { + return linuxEnv$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([linuxEnv, filteredValues, dataSource]) => { + this.updateFilters(dataSource, { + ...filteredValues, + linuxEnv, + }); + }) + ); + }); + + setFilteredValuesPythonVersion = this.effect(pythonVersion$ => { + return pythonVersion$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([pythonVersion, filteredValues, dataSource]) => { + this.updateFilters(dataSource, { + ...filteredValues, + pythonVersion, + }); + }) + ); + }); + + setFilteredValuesKernel = this.effect(kernel$ => { + return kernel$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([kernel, filteredValues, dataSource]) => { + this.updateFilters(dataSource, { + ...filteredValues, + kernel, + }); + }) + ); + }); + setFilteredValues = this.effect(filteredValues$ => { return filteredValues$.pipe( withLatestFrom(this.dataSource$), @@ -326,13 +374,33 @@ export class ReportsStore extends ComponentStore { data.started, searchString ); + const isIncludeLocation = this.filterStringData( + data.host?.location ?? '', + searchString.location ?? '' + ); + const isIncludeLinuxEnv = this.filterStringData( + data.host?.linux_env ?? '', + searchString.linuxEnv ?? '' + ); + const isIncludePythonVersion = this.filterStringData( + data.host?.python_version ?? '', + searchString.pythonVersion ?? '' + ); + const isIncludeKernel = this.filterStringData( + data.device?.kernel ?? '', + searchString.kernel ?? '' + ); return ( isIncludeSearchQuery && isIncludeDeviceInfo && isIncludeDeviceFirmware && isIncludeStatus && - isIncludeStartedDate + isIncludeStartedDate && + isIncludeLocation && + isIncludeLinuxEnv && + isIncludePythonVersion && + isIncludeKernel ); }; return filterPredicate; @@ -448,6 +516,10 @@ export class ReportsStore extends ComponentStore { results: [], dateRange: '', quickSearch: '', + location: '', + linuxEnv: '', + pythonVersion: '', + kernel: '', }, dataLoaded: false, selectedRow: null, diff --git a/modules/ui/src/theming/variables.scss b/modules/ui/src/theming/variables.scss index 4c5a69004..e8bc0db7c 100644 --- a/modules/ui/src/theming/variables.scss +++ b/modules/ui/src/theming/variables.scss @@ -21,6 +21,7 @@ $corner-large: 16px; $corner-extra-large: 28px; $corner-extra-extra-large: 48px; $corner-medium: 12px; +$corner-small: 8px; $reports-table-header-size: 32px; // nav variables From 1718547ffcc0de4460a539d417ecad0844133485 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 17 Aug 2026 15:26:37 +0200 Subject: [PATCH 137/196] device kernel in a report summary qualification --- .../test_packs/qualification/report_templates/summary.jinja | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/test_packs/qualification/report_templates/summary.jinja b/resources/test_packs/qualification/report_templates/summary.jinja index 07aedf444..d6cf716b8 100644 --- a/resources/test_packs/qualification/report_templates/summary.jinja +++ b/resources/test_packs/qualification/report_templates/summary.jinja @@ -13,6 +13,11 @@

MAC Address

{{ device['mac_addr'] }}
+ {% if device['kernel'] %} +
+

Kernel

+
{{ device['kernel'] }}
+ {% endif %}
From 5569c61d346c46be1ac151fc91314c3c791aca69 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 17 Aug 2026 15:27:35 +0200 Subject: [PATCH 138/196] device kernel in a report summary pilot --- resources/test_packs/pilot/report_templates/summary.jinja | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/test_packs/pilot/report_templates/summary.jinja b/resources/test_packs/pilot/report_templates/summary.jinja index 47a83a4fe..d9df64911 100644 --- a/resources/test_packs/pilot/report_templates/summary.jinja +++ b/resources/test_packs/pilot/report_templates/summary.jinja @@ -13,6 +13,11 @@

MAC Address

{{ device['mac_addr'] }}
+ {% if device['kernel'] %} +
+

Kernel

+
{{ device['kernel'] }}
+ {% endif %}
From 44f953925286dcfb27bf2ba79d198b4e833bb36c Mon Sep 17 00:00:00 2001 From: Aleksander Date: Mon, 17 Aug 2026 18:58:36 +0200 Subject: [PATCH 139/196] environment styles Added CSS styles for environment details card and updated HTML structure. Signed-off-by: Aleksander --- .../report_templates/summary.jinja | 116 +++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/resources/test_packs/qualification/report_templates/summary.jinja b/resources/test_packs/qualification/report_templates/summary.jinja index d6cf716b8..ce0200867 100644 --- a/resources/test_packs/qualification/report_templates/summary.jinja +++ b/resources/test_packs/qualification/report_templates/summary.jinja @@ -54,4 +54,118 @@
-{% endmacro %} \ No newline at end of file +{% endmacro %} + + + + + +
+

Environment Details

+ +
+ +
+
+ Location ID + LOC-2847-US-WEST +
+
+ Timestamp + 2023-06-22T16:12:34.567Z +
+
+ Linux Environment Details + Ubuntu 22.04.2 LTS (Jammy Jellyfish) x86_64 +
+
+ Linux Kernel Version + 5.15.0-76-generic +
+
+ Device Hardware Version + Rev. 3.2.1 (PCB-A07) +
+
+
+
From 9c6945bf595ae3166a6d8a28ba67180eee56e46a Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 19 Aug 2026 14:24:26 +0200 Subject: [PATCH 140/196] report styles --- resources/report/test_report_styles.css | 81 ++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/resources/report/test_report_styles.css b/resources/report/test_report_styles.css index d41600c84..c02e6c82e 100644 --- a/resources/report/test_report_styles.css +++ b/resources/report/test_report_styles.css @@ -8,6 +8,7 @@ --summary-height: 2.8in; --vertical-line-height: calc(var(--summary-height)-.2in); --vertical-line-pos-x: 25%; + --host-metadata-height: 1.2in; } @font-face { @@ -330,7 +331,7 @@ padding-top: 0.2in; padding-left: 0.2in; background-color: #F8F9FA; - width: 250px; + width: 340px; height: 100.4%; } @@ -356,6 +357,14 @@ color: #202124; } + .summary-item-value.kernel-value{ + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: block; + } + .summary-item-space { position: relative; padding-bottom: 15px; @@ -364,7 +373,7 @@ .summary-device-modules { position: absolute; - left: 3.2in; + left: 3.9in; top: .2in; } @@ -391,7 +400,7 @@ position: absolute; right: 0; top: 0; - width: 2.6in; + width: 2.2in; height: 100%; } @@ -422,6 +431,72 @@ left: 20px; } + .summary-box-value kernel-value{ + font-size: 16px; + } + + /* Host metadata */ + + .host-metadata { + position: relative; + width: 100%; + height: var(--host-metadata-height); /* 2in */ + margin-top: 0.2in; + margin-bottom: 0.25in; + box-sizing: border-box; + } + + .host-metadata-card { + display: flex; + flex-direction: column; + padding: 16px 24px; + gap: 12px; + width: 100%; + height: 100%; + background: #F0F4F8; + border-radius: 0; + box-sizing: border-box; + } + + .host-metadata-title { + font-family: 'Google Sans', sans-serif; + font-weight: 500; + font-size: 18px; + line-height: 24px; + color: #202124; + margin: 0; + } + + .host-metadata-row { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: 40px; + width: 100%; + } + + .host-metadata-item { + display: flex; + flex-direction: column; + gap: 4px; + flex: 0 0 auto; + } + + .host-metadata-item .summary-item-label h4 { + margin: 0; + font-size: 12px; + font-weight: 500; + color: #5F6368; + white-space: nowrap; + } + + .host-metadata-item .summary-item-value { + font-size: 16px; + font-weight: 500; + color: #202124; + white-space: nowrap; + } + .result-list-title { font-size: 24px; color: black; From 48fd87b90da666431d1da2ab85dc2ff8ac33678c Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 19 Aug 2026 14:24:47 +0200 Subject: [PATCH 141/196] pilot host metadata --- .../pilot/report_templates/summary.jinja | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/resources/test_packs/pilot/report_templates/summary.jinja b/resources/test_packs/pilot/report_templates/summary.jinja index d9df64911..4584f5a4f 100644 --- a/resources/test_packs/pilot/report_templates/summary.jinja +++ b/resources/test_packs/pilot/report_templates/summary.jinja @@ -16,7 +16,7 @@ {% if device['kernel'] %}

Kernel

-
{{ device['kernel'] }}
+
{{ device['kernel'] }}
{% endif %} @@ -56,4 +56,31 @@ + {% endmacro %} \ No newline at end of file From 5f5861927b1dceb4a5e3f6eb8629f9f8e8cb9aed Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 19 Aug 2026 14:25:07 +0200 Subject: [PATCH 142/196] qualification host metadata --- .../report_templates/summary.jinja | 135 ++++-------------- 1 file changed, 24 insertions(+), 111 deletions(-) diff --git a/resources/test_packs/qualification/report_templates/summary.jinja b/resources/test_packs/qualification/report_templates/summary.jinja index ce0200867..733528572 100644 --- a/resources/test_packs/qualification/report_templates/summary.jinja +++ b/resources/test_packs/qualification/report_templates/summary.jinja @@ -16,7 +16,7 @@ {% if device['kernel'] %}

Kernel

-
{{ device['kernel'] }}
+
{{ device['kernel'] }}
{% endif %} @@ -54,118 +54,31 @@ -{% endmacro %} - - - - - -
-

Environment Details

- -
- -
-
- Location ID - LOC-2847-US-WEST +
- @for (item of getActiveFilters(); track item.key) { + @for (item of getActiveFilters(); track getChipTrackId(item)) {
+ (click)=" + item.key === FilterName.QuickSearch + ? removeFilter(item.key, $event, item.value) + : removeFilter(item.key, $event) + " + (keydown.enter)=" + item.key === FilterName.QuickSearch + ? removeFilter(item.key, $event, item.value) + : removeFilter(item.key, $event) + " + (keydown.space)=" + item.key === FilterName.QuickSearch + ? removeFilter(item.key, $event, item.value) + : removeFilter(item.key, $event) + ">
diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts index a1e2442a5..71a9e3fa6 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts +++ b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts @@ -63,7 +63,7 @@ describe('SearchComponent', () => { deviceFirmware: '1.0', results: ['Compliant'], dateRange: { start: '10/01/2024', end: '10/05/2024' }, - quickSearch: 'test', + quickSearch: ['test'], location: 'Data Center', linuxEnv: 'Ubuntu 24.04', pythonVersion: '3.11', @@ -172,7 +172,7 @@ describe('SearchComponent', () => { deviceFirmware: '1.0', results: ['Compliant'], dateRange: { start: '10/01/2024', end: '10/05/2024' }, - quickSearch: 'test', + quickSearch: ['test'], location: 'DC-1', linuxEnv: 'Ubuntu', pythonVersion: '3.11', @@ -241,7 +241,19 @@ describe('SearchComponent', () => { spyOn(component.filterCleared, 'emit'); component.removeFilter(FilterName.QuickSearch); - expect(component.filters.quickSearch).toBe(''); + expect(component.filters.quickSearch).toEqual([]); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + + it('should remove specific quickSearch chip when value is provided', () => { + component.filters.quickSearch = ['first', 'second', 'third']; + spyOn(component.filterCleared, 'emit'); + + component.removeFilter(FilterName.QuickSearch, undefined, 'second'); + + expect(component.filters.quickSearch).toEqual(['first', 'third']); expect(component.filterCleared.emit).toHaveBeenCalledWith( component.filters ); @@ -305,7 +317,7 @@ describe('SearchComponent', () => { expect(component.filters.deviceFirmware).toBe(''); expect(component.filters.results).toEqual([]); expect(component.filters.dateRange).toBe(''); - expect(component.filters.quickSearch).toBe(''); + expect(component.filters.quickSearch).toEqual([]); expect(component.filters.location).toBe(''); expect(component.filters.linuxEnv).toBe(''); expect(component.filters.pythonVersion).toBe(''); @@ -338,7 +350,7 @@ describe('SearchComponent', () => { component.onEnter(event); expect(event.preventDefault).toHaveBeenCalled(); - expect(component.filters.quickSearch).toBe('Raspberry Pi'); + expect(component.filters.quickSearch).toEqual(['Raspberry Pi']); expect(component.searchQueryChanged.emit).toHaveBeenCalledWith( 'Raspberry Pi' ); @@ -348,6 +360,39 @@ describe('SearchComponent', () => { expect(component.inputValue).toBe(''); }); + it('should add multiple search chips on subsequent Enters without replacing previous chip', () => { + spyOn(component.filterCleared, 'emit'); + const event = new KeyboardEvent('keydown', { key: 'Enter' }); + + component.inputValue = 'first'; + component.onEnter(event); + + expect(component.filters.quickSearch).toEqual(['first']); + + component.inputValue = 'second'; + component.onEnter(event); + + expect(component.filters.quickSearch).toEqual(['first', 'second']); + + const active = component.getActiveFilters(); + const searchChips = active.filter( + item => item.key === FilterName.QuickSearch + ); + expect(searchChips.length).toBe(2); + expect(searchChips[0].value).toBe('first'); + expect(searchChips[1].value).toBe('second'); + }); + + it('should not add duplicate search chip if identical query is entered', () => { + component.filters.quickSearch = ['first']; + component.inputValue = 'first'; + const event = new KeyboardEvent('keydown', { key: 'Enter' }); + component.onEnter(event); + + expect(component.filters.quickSearch).toEqual(['first']); + expect(component.inputValue).toBe(''); + }); + it('should not add search chip on Enter if input is empty or whitespace', () => { spyOn(component.filterCleared, 'emit'); spyOn(component.searchQueryChanged, 'emit'); @@ -366,7 +411,7 @@ describe('SearchComponent', () => { deviceFirmware: '1.0', results: [], dateRange: '', - quickSearch: '', + quickSearch: [], location: '', linuxEnv: '', pythonVersion: '', @@ -380,6 +425,19 @@ describe('SearchComponent', () => { expect(component.removeFilter).toHaveBeenCalledWith('deviceFirmware'); }); + it('should remove last quickSearch chip on Backspace when multiple exist', () => { + component.filters = { + ...new Filters(), + quickSearch: ['first', 'second'], + }; + component.inputValue = ''; + spyOn(component, 'removeFilter').and.callThrough(); + + component.onBackspace(); + + expect(component.filters.quickSearch).toEqual(['first']); + }); + it('should not remove last filter on Backspace when no active filters', () => { component.filters = new Filters(); component.inputValue = ''; @@ -396,7 +454,7 @@ describe('SearchComponent', () => { deviceFirmware: '', results: [], dateRange: '', - quickSearch: '', + quickSearch: [], location: '', linuxEnv: '', pythonVersion: '', @@ -481,7 +539,7 @@ describe('SearchComponent', () => { deviceFirmware: '', results: ['Compliant'], dateRange: '', - quickSearch: 'test', + quickSearch: ['test'], location: '', linuxEnv: '', pythonVersion: '', @@ -493,6 +551,37 @@ describe('SearchComponent', () => { expect(chips.length).toBe(3); }); + it('should render multiple search chips and remove only clicked chip from DOM', () => { + component.filters = { + ...new Filters(), + quickSearch: ['apple', 'banana'], + }; + fixture.detectChanges(); + + let chips = compiled.querySelectorAll('.filter-chip'); + expect(chips.length).toBe(2); + expect(chips[0].textContent).toContain('search: "apple"'); + expect(chips[1].textContent).toContain('search: "banana"'); + + spyOn(component, 'removeFilter').and.callThrough(); + const firstRemoveBtn = chips[0].querySelector( + '.filter-chip-remove' + ) as HTMLButtonElement; + firstRemoveBtn.click(); + + expect(component.removeFilter).toHaveBeenCalledWith( + FilterName.QuickSearch, + jasmine.any(MouseEvent), + 'apple' + ); + expect(component.filters.quickSearch).toEqual(['banana']); + + fixture.detectChanges(); + chips = compiled.querySelectorAll('.filter-chip'); + expect(chips.length).toBe(1); + expect(chips[0].textContent).toContain('search: "banana"'); + }); + it('should render clear button when filters or input value are present', () => { component.filters = new Filters(); component.inputValue = ''; @@ -512,7 +601,7 @@ describe('SearchComponent', () => { deviceFirmware: '', results: [], dateRange: '', - quickSearch: '', + quickSearch: [], location: '', linuxEnv: '', pythonVersion: '', diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.ts b/modules/ui/src/app/pages/reports/components/search/search.component.ts index 7a25c962d..b4c2f5dc0 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.ts +++ b/modules/ui/src/app/pages/reports/components/search/search.component.ts @@ -127,11 +127,34 @@ export class SearchComponent { this.inputValue = target.value; } + private normalizeQuickSearch(value: FilterValue): string[] { + if (Array.isArray(value)) { + return value.map(v => String(v).trim()).filter(Boolean); + } + if (typeof value === 'string' && value.trim()) { + return [value.trim()]; + } + return []; + } + + getChipTrackId(item: ActiveFilterItem): string { + return `${item.key}_${this.getFilterChipLabel(item.key, item.value)}`; + } + onEnter(event: Event): void { event.preventDefault(); const query = this.inputValue.trim(); if (query) { - this.filters.quickSearch = query; + if (!this.filters) { + this.filters = new Filters(); + } + const currentQueries = this.normalizeQuickSearch( + this.filters.quickSearch + ); + if (!currentQueries.includes(query)) { + currentQueries.push(query); + } + this.filters.quickSearch = currentQueries; this.searchQueryChanged.emit(query); this.filterCleared.emit(this.filters); this.inputValue = ''; @@ -146,7 +169,11 @@ export class SearchComponent { const active = this.getActiveFilters(); if (active.length > 0) { const lastFilter = active[active.length - 1]; - this.removeFilter(lastFilter.key); + if (lastFilter.key === FilterName.QuickSearch) { + this.removeFilter(lastFilter.key, undefined, lastFilter.value); + } else { + this.removeFilter(lastFilter.key); + } } } } @@ -171,7 +198,14 @@ export class SearchComponent { for (const key of keys) { const value = this.filters[key]; if (!this.isValueEmpty(value)) { - items.push({ key, value }); + if (key === FilterName.QuickSearch) { + const queries = this.normalizeQuickSearch(value); + for (const query of queries) { + items.push({ key, value: query }); + } + } else { + items.push({ key, value }); + } } } @@ -248,7 +282,24 @@ export class SearchComponent { return `Clear filter: ${this.getFilterChipLabel(key, value)}`; } - removeFilter(key: string, event?: Event): void { + removeFilter( + key: string, + eventOrValue?: Event | FilterValue, + valueOrEvent?: FilterValue | Event + ): void { + let event: Event | undefined; + let value: FilterValue | undefined; + + if (eventOrValue instanceof Event) { + event = eventOrValue; + value = valueOrEvent as FilterValue; + } else if (valueOrEvent instanceof Event) { + event = valueOrEvent; + value = eventOrValue as FilterValue; + } else { + value = (eventOrValue as FilterValue) ?? (valueOrEvent as FilterValue); + } + if (event) { event.preventDefault(); event.stopPropagation(); @@ -268,8 +319,16 @@ export class SearchComponent { this.filters.dateRange = ''; break; case FilterName.QuickSearch: - this.filters.quickSearch = ''; - //this.searchQueryChanged.emit(''); + if (value !== undefined) { + const currentQueries = this.normalizeQuickSearch( + this.filters.quickSearch + ); + this.filters.quickSearch = currentQueries.filter( + q => q !== String(value) + ); + } else { + this.filters.quickSearch = []; + } break; case FilterName.Location: this.filters.location = ''; @@ -300,7 +359,7 @@ export class SearchComponent { this.filters.deviceFirmware = ''; this.filters.results = []; this.filters.dateRange = ''; - this.filters.quickSearch = ''; + this.filters.quickSearch = []; this.filters.location = ''; this.filters.linuxEnv = ''; this.filters.pythonVersion = ''; diff --git a/modules/ui/src/app/pages/reports/reports.component.html b/modules/ui/src/app/pages/reports/reports.component.html index 55c943285..08a72c0aa 100644 --- a/modules/ui/src/app/pages/reports/reports.component.html +++ b/modules/ui/src/app/pages/reports/reports.component.html @@ -27,8 +27,7 @@

Reports

[filterOpened]="vm.filterOpened" [activeFilter]="vm.activeFilter" (emitOpenFilter)="openFilter($event)" - (filterCleared)="filterCleared($event)" - (searchQueryChanged)="onSearchQueryChanged($event)"> + (filterCleared)="filterCleared($event)">
{ deviceFirmware: '', results: ['compliant'], dateRange: '', - quickSearch: '', + quickSearch: [], location: '', linuxEnv: '', pythonVersion: '', @@ -462,7 +462,7 @@ describe('ReportsComponent', () => { deviceFirmware: '', results: [], dateRange: '', - quickSearch: 'searchKeyword', + quickSearch: ['searchKeyword'], location: '', linuxEnv: '', pythonVersion: '', diff --git a/modules/ui/src/app/pages/reports/reports.component.ts b/modules/ui/src/app/pages/reports/reports.component.ts index 631e4f7a0..2ffe7cd9c 100644 --- a/modules/ui/src/app/pages/reports/reports.component.ts +++ b/modules/ui/src/app/pages/reports/reports.component.ts @@ -281,7 +281,9 @@ export class ReportsComponent implements OnInit, OnDestroy { } filterCleared(filters: Filters) { - this.searchQuery = filters.quickSearch || ''; + this.searchQuery = Array.isArray(filters.quickSearch) + ? (filters.quickSearch[0] ?? '') + : filters.quickSearch || ''; this.store.setFilteredValues(filters); } diff --git a/modules/ui/src/app/pages/reports/reports.store.spec.ts b/modules/ui/src/app/pages/reports/reports.store.spec.ts index 1c2888f0e..fe430e0e8 100644 --- a/modules/ui/src/app/pages/reports/reports.store.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.store.spec.ts @@ -153,7 +153,7 @@ describe('ReportsStore', () => { deviceFirmware: '', results: [], dateRange: '', - quickSearch: '', + quickSearch: [], location: '', linuxEnv: '', pythonVersion: '', @@ -264,11 +264,11 @@ describe('ReportsStore', () => { describe('setFilteredValuesQuickSearch', () => { it('should update store', done => { - const updatedFilters = { ...FILTERS, ...{ quickSearch: 'test2' } }; + const updatedFilters = { ...FILTERS, ...{ quickSearch: ['test2'] } }; store.overrideSelector(selectReports, [...HISTORY]); reportsStore.setFilteredValues({ ...FILTERS }); - reportsStore.setFilteredValuesQuickSearch('test2'); + reportsStore.setFilteredValuesQuickSearch(['test2']); reportsStore.viewModel$.pipe(take(1)).subscribe(store => { expect(store.filteredValues).toEqual(updatedFilters); @@ -338,6 +338,33 @@ describe('ReportsStore', () => { done(); }); }); + + it('should apply AND operation across multiple quickSearch queries', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch([ + 'Data Center Alpha', + '1.2.3', + ]); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(1); + expect(store.dataSource.filteredData[0].deviceFirmware).toBe('1.2.3'); + done(); + }); + }); + + it('should return 0 items when one of the AND queries does not match', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesQuickSearch([ + 'Data Center Alpha', + 'NonexistentDevice', + ]); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.filteredData.length).toBe(0); + done(); + }); + }); }); describe('setFilteredValuesDeviceFirmware', () => { @@ -572,16 +599,6 @@ describe('ReportsStore', () => { }); }); - it('should filter by folder_name, report URL, and export URL in quickSearch', done => { - reportsStore.setDataSource([...HISTORY]); - reportsStore.setFilteredValuesQuickSearch('12345'); - - reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { - expect(vm.dataSource.filteredData.length).toBe(1); - done(); - }); - }); - it('should return all items when quickSearch is empty or contains only whitespace', done => { reportsStore.setDataSource([...HISTORY]); reportsStore.setFilteredValuesQuickSearch(' '); diff --git a/modules/ui/src/app/pages/reports/reports.store.ts b/modules/ui/src/app/pages/reports/reports.store.ts index 2104aa785..eb37120ed 100644 --- a/modules/ui/src/app/pages/reports/reports.store.ts +++ b/modules/ui/src/app/pages/reports/reports.store.ts @@ -159,17 +159,24 @@ export class ReportsStore extends ComponentStore { ); }); - setFilteredValuesQuickSearch = this.effect(quickSearch$ => { - return quickSearch$.pipe( - withLatestFrom(this.filteredValues$, this.dataSource$), - tap(([quickSearch, filteredValues, dataSource]) => { - this.updateFilters(dataSource, { - ...filteredValues, - quickSearch, - }); - }) - ); - }); + setFilteredValuesQuickSearch = this.effect( + quickSearch$ => { + return quickSearch$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([quickSearch, filteredValues, dataSource]) => { + const quickSearchArray = Array.isArray(quickSearch) + ? quickSearch + : quickSearch && quickSearch.trim() + ? [quickSearch.trim()] + : []; + this.updateFilters(dataSource, { + ...filteredValues, + quickSearch: quickSearchArray, + }); + }) + ); + } + ); setFilteredValuesDeviceInfo = this.effect(deviceInfo$ => { return deviceInfo$.pipe( @@ -417,19 +424,21 @@ export class ReportsStore extends ComponentStore { private filterSearchQuery( data: HistoryTestrun, - searchQuery: string = '' + searchQuery: string[] | string = [] ): boolean { - if (!searchQuery || !searchQuery.trim()) { + const queries = Array.isArray(searchQuery) + ? searchQuery.map(q => q.trim().toLowerCase()).filter(Boolean) + : typeof searchQuery === 'string' && searchQuery.trim() + ? [searchQuery.trim().toLowerCase()] + : []; + + if (queries.length === 0) { return true; } - const query = searchQuery.trim().toLowerCase(); const formattedStarted = data.started ? this.datePipe.transform(data.started, 'd MMM y H:mm') : ''; - const formattedFinished = data.finished - ? this.datePipe.transform(data.finished, 'd MMM y H:mm') - : ''; const searchableFields = [ data.deviceInfo, @@ -440,26 +449,21 @@ export class ReportsStore extends ComponentStore { data.device?.firmware, data.device?.kernel, data.device?.test_pack, - data.device?.created_at, data.program, data.status, data.testResult, data.result, - data.started, - data.finished, formattedStarted, - formattedFinished, data.duration, - data.folder_name, - data.report, - data.export, data.host?.location, data.host?.linux_env, data.host?.python_version, ]; - return searchableFields.some( - field => field && field.toString().toLowerCase().includes(query) + return queries.every(query => + searchableFields.some( + field => field && field.toString().toLowerCase().includes(query) + ) ); } @@ -535,7 +539,7 @@ export class ReportsStore extends ComponentStore { deviceFirmware: '', results: [], dateRange: '', - quickSearch: '', + quickSearch: [], location: '', linuxEnv: '', pythonVersion: '', From c7cc3caff1543105fd4d61d0691a1a872ac9833d Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Fri, 11 Sep 2026 09:17:59 +0000 Subject: [PATCH 156/196] Adds Assessment type filter (#1640) --- modules/ui/src/app/mocks/reports.mock.ts | 2 + modules/ui/src/app/model/filters.spec.ts | 4 + modules/ui/src/app/model/filters.ts | 4 + .../filter-dialog.component.html | 18 ++- .../filter-dialog.component.scss | 6 + .../filter-dialog.component.spec.ts | 36 +++++ .../filter-dialog/filter-dialog.component.ts | 12 ++ .../components/search/search.component.html | 3 +- .../components/search/search.component.scss | 31 ++-- .../search/search.component.spec.ts | 50 +++++-- .../components/search/search.component.ts | 136 +++++++++++++++--- .../pages/reports/reports.component.spec.ts | 14 ++ .../app/pages/reports/reports.component.ts | 5 + .../app/pages/reports/reports.store.spec.ts | 42 ++++++ .../ui/src/app/pages/reports/reports.store.ts | 37 ++++- 15 files changed, 343 insertions(+), 57 deletions(-) diff --git a/modules/ui/src/app/mocks/reports.mock.ts b/modules/ui/src/app/mocks/reports.mock.ts index 7562881e7..0e3006d15 100644 --- a/modules/ui/src/app/mocks/reports.mock.ts +++ b/modules/ui/src/app/mocks/reports.mock.ts @@ -220,6 +220,7 @@ export const FILTERS = { linuxEnv: 'test', pythonVersion: 'test', kernel: 'test', + assessmentType: 'test', }; export const EMPTY_FILTERS = { deviceInfo: '', @@ -231,6 +232,7 @@ export const EMPTY_FILTERS = { linuxEnv: '', pythonVersion: '', kernel: '', + assessmentType: '', }; export const DATA_SOURCE_INITIAL_VALUE_NOT_EMPTY = diff --git a/modules/ui/src/app/model/filters.spec.ts b/modules/ui/src/app/model/filters.spec.ts index 960fc06b9..9958ddee1 100644 --- a/modules/ui/src/app/model/filters.spec.ts +++ b/modules/ui/src/app/model/filters.spec.ts @@ -94,6 +94,7 @@ describe('Filters Models', () => { expect(filters.linuxEnv).toBe(''); expect(filters.pythonVersion).toBe(''); expect(filters.kernel).toBe(''); + expect(filters.assessmentType).toBe(''); }); }); @@ -107,6 +108,7 @@ describe('Filters Models', () => { expect(FilterItem.LinuxEnv).toBe('Linux Environment'); expect(FilterItem.PythonVersion).toBe('Python Version'); expect(FilterItem.Kernel).toBe('Kernel'); + expect(FilterItem.AssessmentType).toBe('Assessment type'); }); it('should define FilterName values correctly', () => { @@ -120,6 +122,7 @@ describe('Filters Models', () => { expect(FilterName.LinuxEnv).toBe('linuxEnv'); expect(FilterName.PythonVersion).toBe('pythonVersion'); expect(FilterName.Kernel).toBe('kernel'); + expect(FilterName.AssessmentType).toBe('assessmentType'); }); it('should define FilterTitle values correctly', () => { @@ -131,6 +134,7 @@ describe('Filters Models', () => { expect(FilterTitle.LinuxEnv).toBe('Enter Linux environment'); expect(FilterTitle.PythonVersion).toBe('Enter Python version'); expect(FilterTitle.Kernel).toBe('Enter kernel'); + expect(FilterTitle.AssessmentType).toBe('Select assessment type'); }); }); }); diff --git a/modules/ui/src/app/model/filters.ts b/modules/ui/src/app/model/filters.ts index dbdb96e43..6d233c7ea 100644 --- a/modules/ui/src/app/model/filters.ts +++ b/modules/ui/src/app/model/filters.ts @@ -45,6 +45,7 @@ export enum FilterItem { LinuxEnv = 'Linux Environment', PythonVersion = 'Python Version', Kernel = 'Kernel', + AssessmentType = 'Assessment type', } export enum FilterName { @@ -58,6 +59,7 @@ export enum FilterName { LinuxEnv = 'linuxEnv', PythonVersion = 'pythonVersion', Kernel = 'kernel', + AssessmentType = 'assessmentType', } export enum FilterTitle { @@ -69,6 +71,7 @@ export enum FilterTitle { LinuxEnv = 'Enter Linux environment', PythonVersion = 'Enter Python version', Kernel = 'Enter kernel', + AssessmentType = 'Select assessment type', } export class DateRange { @@ -98,6 +101,7 @@ export class Filters { linuxEnv = ''; pythonVersion = ''; kernel = ''; + assessmentType = ''; } function getDateString(date: string | Date) { diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html index fdc361544..070d34442 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.html @@ -99,8 +99,24 @@

{{ data.title }}

aria-label="kernel" /> } + @if (data.filter === FilterName.AssessmentType) { + + Assessment type + + @for (type of testingTypes; track type) { + {{ type }} + } + + + } @if (data.filter === FilterName.Results) { -
+
@for (result of results.controls; track result; let i = $index) {

diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.scss b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.scss index 814016b99..73795ef4f 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.scss +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.scss @@ -88,6 +88,7 @@ button { min-width: 38px; + min-height: 36px; margin: 0; padding: 0 16px; font-weight: 500; @@ -96,6 +97,11 @@ ::ng-deep .mat-focus-indicator { display: none; } + + &:focus-visible { + outline: 2px solid colors.$primary; + outline-offset: 2px; + } } } diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts index 43083d21d..65f236e62 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.spec.ts @@ -37,6 +37,7 @@ import { DateRange, FilterName, FilterTitle } from '../../../../model/filters'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of } from 'rxjs'; import { ResultOfTestrun } from '../../../../model/testrun-status'; +import { TestingType } from '../../../../model/device'; describe('FilterDialogComponent', () => { let component: FilterDialogComponent; @@ -120,6 +121,7 @@ describe('FilterDialogComponent', () => { linuxEnv: '', pythonVersion: '', kernel: '', + assessmentType: '', results: [], dateRange: new DateRange(), }; @@ -141,6 +143,9 @@ describe('FilterDialogComponent', () => { component.filterForm.get('linuxEnv')?.setValue(' Ubuntu 24.04 '); component.filterForm.get('pythonVersion')?.setValue(' 3.11 '); component.filterForm.get('kernel')?.setValue(' 6.8.0 '); + component.filterForm + .get('assessmentType') + ?.setValue(' Pilot Assessment '); component.results.controls[0].setValue(true); const mockFormData = { @@ -150,6 +155,7 @@ describe('FilterDialogComponent', () => { linuxEnv: 'Ubuntu 24.04', pythonVersion: '3.11', kernel: '6.8.0', + assessmentType: 'Pilot Assessment', results: [ResultOfTestrun.Compliant], dateRange: new DateRange(), }; @@ -209,6 +215,9 @@ describe('FilterDialogComponent', () => { component.filterForm.get('pythonVersion')! ); expect(component.kernel).toBe(component.filterForm.get('kernel')!); + expect(component.assessmentType).toBe( + component.filterForm.get('assessmentType')! + ); expect(component.results).toBe( component.filterForm.controls[ 'results' @@ -246,6 +255,33 @@ describe('FilterDialogComponent', () => { }); }); + describe('assessment type filter', () => { + beforeEach(() => { + component.data = { + trigger: mockClientRest, + filter: FilterName.AssessmentType, + title: FilterTitle.AssessmentType, + }; + fixture.detectChanges(); + }); + + it('should render mat-select for assessment type with TestingType options', () => { + const select = compiled.querySelector('mat-select'); + expect(select).toBeTruthy(); + expect(component.testingTypes).toEqual([ + TestingType.Pilot, + TestingType.Qualification, + ]); + }); + + it('should update assessmentType form control on value change', () => { + component.filterForm + .get('assessmentType') + ?.setValue(TestingType.Qualification); + expect(component.assessmentType.value).toBe(TestingType.Qualification); + }); + }); + describe('date filter', () => { beforeEach(() => { component.data = { diff --git a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts index 41b566fbd..d80cb49ee 100644 --- a/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts +++ b/modules/ui/src/app/pages/reports/components/filter-dialog/filter-dialog.component.ts @@ -64,6 +64,7 @@ import { ResultOfTestrun, StatusOfTestrun, } from '../../../../model/testrun-status'; +import { TestingType } from '../../../../model/device'; import { DeviceValidators } from '../../../devices/components/device-form/device.validators'; class DateErrorStateMatcher implements ErrorStateMatcher { @@ -136,6 +137,11 @@ export class FilterDialogComponent public readonly FilterName = FilterName; + public readonly testingTypes: TestingType[] = [ + TestingType.Pilot, + TestingType.Qualification, + ]; + range: LocalDateRange = new LocalDateRange(); topPosition = 0; @@ -185,6 +191,10 @@ export class FilterDialogComponent return this.filterForm.get('kernel') as AbstractControl; } + get assessmentType() { + return this.filterForm.get('assessmentType') as AbstractControl; + } + ngOnInit() { this.setDialogView(); this.createFilterForm(); @@ -244,6 +254,7 @@ export class FilterDialogComponent linuxEnv: ['', []], pythonVersion: ['', []], kernel: ['', []], + assessmentType: ['', []], results: new FormArray(this.resultList.map(() => new FormControl(false))), }); } @@ -299,6 +310,7 @@ export class FilterDialogComponent linuxEnv: formData.linuxEnv?.trim() || '', pythonVersion: formData.pythonVersion?.trim() || '', kernel: formData.kernel?.trim() || '', + assessmentType: formData.assessmentType?.trim() || '', results, dateRange: this.range, }; diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.html b/modules/ui/src/app/pages/reports/components/search/search.component.html index 889dcb518..e654e83d8 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.html +++ b/modules/ui/src/app/pages/reports/components/search/search.component.html @@ -45,8 +45,7 @@ @for (item of getActiveFilters(); track getChipTrackId(item)) {

{{ getFilterChipLabel(item.key, item.value) }} diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.scss b/modules/ui/src/app/pages/reports/components/search/search.component.scss index 561752371..c0a4eebfa 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.scss +++ b/modules/ui/src/app/pages/reports/components/search/search.component.scss @@ -59,24 +59,14 @@ gap: 4px; background-color: colors.$secondary-container; border-radius: 8px; - padding: 4px 6px 4px 10px; + padding: 4px 4px 4px 10px; font-family: variables.$font-text; font-size: 14px; font-weight: 500; color: colors.$on-secondary-container; - cursor: pointer; - max-width: 240px; + cursor: default; + max-width: 100%; box-sizing: border-box; - transition: background-color 0.15s ease; - - &:hover { - background-color: colors.$secondary-fixed-dim; - } - - &:focus-visible { - outline: 2px solid colors.$primary; - outline-offset: 1px; - } } .filter-chip-label { @@ -94,8 +84,10 @@ cursor: pointer; padding: 0; border-radius: 50%; - width: 18px; - height: 18px; + width: 24px; + height: 24px; + min-width: 24px; + min-height: 24px; color: colors.$on-secondary-container; flex-shrink: 0; @@ -105,13 +97,14 @@ &:focus-visible { outline: 2px solid colors.$primary; + outline-offset: 1px; } .chip-close-icon { - font-size: 14px; - width: 14px; - height: 14px; - line-height: 14px; + font-size: 16px; + width: 16px; + height: 16px; + line-height: 16px; } } diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts index 71a9e3fa6..3b906e76e 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts +++ b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts @@ -61,6 +61,7 @@ describe('SearchComponent', () => { component.filters = { deviceInfo: 'Pixel', deviceFirmware: '1.0', + assessmentType: 'Pilot', results: ['Compliant'], dateRange: { start: '10/01/2024', end: '10/05/2024' }, quickSearch: ['test'], @@ -71,10 +72,11 @@ describe('SearchComponent', () => { }; const active = component.getActiveFilters(); - expect(active.length).toBe(9); + expect(active.length).toBe(10); expect(component.hasActiveFilters()).toBeTrue(); expect(component.isFilterActive('deviceInfo')).toBeTrue(); expect(component.isFilterActive('deviceFirmware')).toBeTrue(); + expect(component.isFilterActive('assessmentType')).toBeTrue(); expect(component.isFilterActive('results')).toBeTrue(); expect(component.isFilterActive('dateRange')).toBeTrue(); expect(component.isFilterActive('quickSearch')).toBeTrue(); @@ -90,46 +92,52 @@ describe('SearchComponent', () => { ).toBe('search: "query"'); expect( component.getFilterChipLabel(FilterName.DeviceInfo, 'Device A') - ).toBe('Device contains "Device A"'); + ).toBe('Device: Device A'); expect( component.getFilterChipLabel(FilterName.DeviceFirmware, 'v2.1') - ).toBe('Firmware contains "v2.1"'); + ).toBe('Firmware: v2.1'); + expect( + component.getFilterChipLabel( + FilterName.AssessmentType, + 'Pilot Assessment' + ) + ).toBe('Assessment type: Pilot Assessment'); expect( component.getFilterChipLabel(FilterName.Location, 'Building 1') - ).toBe('Location contains "Building 1"'); + ).toBe('Location: Building 1'); expect(component.getFilterChipLabel(FilterName.LinuxEnv, 'Ubuntu')).toBe( - 'Linux Env contains "Ubuntu"' + 'Linux Environment: Ubuntu' ); expect( component.getFilterChipLabel(FilterName.PythonVersion, '3.11') - ).toBe('Python contains "3.11"'); + ).toBe('Python Version: 3.11'); expect(component.getFilterChipLabel(FilterName.Kernel, 'Linux 6.8')).toBe( - 'Kernel contains "Linux 6.8"' + 'Kernel: Linux 6.8' ); expect( component.getFilterChipLabel(FilterName.DateRange, { start: '01/01/2024', end: '01/10/2024', }) - ).toBe('01/01/2024 - 01/10/2024'); + ).toBe('Started: 01/01/2024 - 01/10/2024'); expect( component.getFilterChipLabel(FilterName.Started, { start: '01/01/2024', end: '', }) - ).toBe('01/01/2024 - '); + ).toBe('Started: 01/01/2024'); expect( component.getFilterChipLabel( FilterName.DateRange, '01/01/2024 - 01/10/2024' ) - ).toBe('01/01/2024 - 01/10/2024'); + ).toBe('Started: 01/01/2024 - 01/10/2024'); expect( component.getFilterChipLabel(FilterName.Results, [ 'Compliant', 'Non-compliant', ]) - ).toBe('Compliant, Non-compliant'); + ).toBe('Result: Compliant, Non-compliant'); expect(component.getFilterChipLabel('unknownKey', 'sampleValue')).toBe( 'sampleValue' ); @@ -155,11 +163,11 @@ describe('SearchComponent', () => { it('should generate accessible labels', () => { expect(component.getChipAriaLabel(FilterName.QuickSearch, 'test')).toBe( - 'Filter: search: "test". Click to edit.' + 'Filter: search: "test"' ); expect( component.getRemoveFilterAriaLabel(FilterName.DeviceInfo, 'Pixel') - ).toBe('Clear filter: Device contains "Pixel"'); + ).toBe('Clear filter: Device: Pixel'); }); }); @@ -170,6 +178,7 @@ describe('SearchComponent', () => { mockFilters = { deviceInfo: 'Pixel', deviceFirmware: '1.0', + assessmentType: 'Pilot', results: ['Compliant'], dateRange: { start: '10/01/2024', end: '10/05/2024' }, quickSearch: ['test'], @@ -207,6 +216,16 @@ describe('SearchComponent', () => { ); }); + it('should remove assessmentType filter', () => { + spyOn(component.filterCleared, 'emit'); + component.removeFilter(FilterName.AssessmentType); + + expect(component.filters.assessmentType).toBe(''); + expect(component.filterCleared.emit).toHaveBeenCalledWith( + component.filters + ); + }); + it('should remove results filter', () => { spyOn(component.filterCleared, 'emit'); component.removeFilter(FilterName.Results); @@ -315,6 +334,7 @@ describe('SearchComponent', () => { expect(component.inputValue).toBe(''); expect(component.filters.deviceInfo).toBe(''); expect(component.filters.deviceFirmware).toBe(''); + expect(component.filters.assessmentType).toBe(''); expect(component.filters.results).toEqual([]); expect(component.filters.dateRange).toBe(''); expect(component.filters.quickSearch).toEqual([]); @@ -409,6 +429,7 @@ describe('SearchComponent', () => { component.filters = { deviceInfo: 'Pixel', deviceFirmware: '1.0', + assessmentType: '', results: [], dateRange: '', quickSearch: [], @@ -452,6 +473,7 @@ describe('SearchComponent', () => { component.filters = { deviceInfo: 'Pixel', deviceFirmware: '', + assessmentType: '', results: [], dateRange: '', quickSearch: [], @@ -537,6 +559,7 @@ describe('SearchComponent', () => { component.filters = { deviceInfo: 'Pixel', deviceFirmware: '', + assessmentType: '', results: ['Compliant'], dateRange: '', quickSearch: ['test'], @@ -599,6 +622,7 @@ describe('SearchComponent', () => { component.filters = { deviceInfo: 'Pixel', deviceFirmware: '', + assessmentType: '', results: [], dateRange: '', quickSearch: [], diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.ts b/modules/ui/src/app/pages/reports/components/search/search.component.ts index b4c2f5dc0..5e7442d30 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.ts +++ b/modules/ui/src/app/pages/reports/components/search/search.component.ts @@ -20,6 +20,7 @@ import { Input, Output, viewChild, + inject, } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; @@ -27,6 +28,7 @@ import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatMenuModule } from '@angular/material/menu'; import { MatTooltipModule } from '@angular/material/tooltip'; +import { LiveAnnouncer } from '@angular/cdk/a11y'; import { DateRange, FilterName, @@ -68,6 +70,7 @@ export class SearchComponent { readonly searchInput = viewChild>('searchInput'); readonly filterButton = viewChild>('filterButton'); + private readonly liveAnnouncer = inject(LiveAnnouncer, { optional: true }); public readonly FilterName = FilterName; public readonly FilterTitle = FilterTitle; @@ -91,6 +94,11 @@ export class SearchComponent { name: FilterName.DeviceFirmware, title: FilterTitle.DeviceFirmware, }, + { + displayName: FilterItem.AssessmentType, + name: FilterName.AssessmentType, + title: FilterTitle.AssessmentType, + }, { displayName: FilterItem.Results, name: FilterName.Results, @@ -157,6 +165,10 @@ export class SearchComponent { this.filters.quickSearch = currentQueries; this.searchQueryChanged.emit(query); this.filterCleared.emit(this.filters); + this.liveAnnouncer?.announce( + `Filter added: search: "${query}"`, + 'polite' + ); this.inputValue = ''; if (this.searchInput()?.nativeElement) { this.searchInput()!.nativeElement.value = ''; @@ -187,6 +199,7 @@ export class SearchComponent { FilterName.QuickSearch, FilterName.DeviceInfo, FilterName.DeviceFirmware, + FilterName.AssessmentType, FilterName.DateRange, FilterName.Results, FilterName.Location, @@ -240,33 +253,35 @@ export class SearchComponent { return `search: "${value}"`; } if (key === FilterName.DeviceInfo) { - return `Device contains "${value}"`; + return `Device: ${value}`; } if (key === FilterName.DeviceFirmware) { - return `Firmware contains "${value}"`; + return `Firmware: ${value}`; + } + if (key === FilterName.AssessmentType) { + return `Assessment type: ${value}`; + } + if (key === FilterName.Results) { + const results = Array.isArray(value) + ? value.join(', ') + : String(value ?? ''); + return `Result: ${results}`; } if (key === FilterName.Location) { - return `Location contains "${value}"`; + return `Location: ${value}`; } if (key === FilterName.LinuxEnv) { - return `Linux Env contains "${value}"`; + return `Linux Environment: ${value}`; } if (key === FilterName.PythonVersion) { - return `Python contains "${value}"`; + return `Python Version: ${value}`; } if (key === FilterName.Kernel) { - return `Kernel contains "${value}"`; + return `Kernel: ${value}`; } if (key === FilterName.DateRange || key === FilterName.Started) { - if ( - typeof value === 'object' && - value && - !Array.isArray(value) && - (value.start || value.end) - ) { - return `${value.start || ''} - ${value.end || ''}`; - } - return String(value ?? ''); + const dateStr = this.formatDateFilter(value); + return dateStr ? `Started: ${dateStr}` : 'Started'; } if (Array.isArray(value)) { return value.join(', '); @@ -274,8 +289,87 @@ export class SearchComponent { return String(value ?? ''); } + private formatDateItem(date: string | Date | null | undefined): string { + if (!date) { + return ''; + } + if (date instanceof Date) { + if (isNaN(date.getTime())) { + return ''; + } + return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`; + } + if (typeof date === 'string') { + const trimmed = date.trim(); + if (!trimmed) { + return ''; + } + if ( + /^\d{1,2}\/\d{1,2}\/\d{4}$/.test(trimmed) || + /^\d{4}-\d{2}-\d{2}$/.test(trimmed) + ) { + return trimmed; + } + const parsed = new Date(trimmed); + if (!isNaN(parsed.getTime())) { + return `${parsed.getMonth() + 1}/${parsed.getDate()}/${parsed.getFullYear()}`; + } + return trimmed; + } + return String(date); + } + + private formatDateFilter(value: FilterValue): string { + if (!value) { + return ''; + } + if (value instanceof Date) { + return this.formatDateItem(value); + } + if ( + typeof value === 'object' && + !Array.isArray(value) && + ('start' in value || 'end' in value) + ) { + const range = value as { + start?: string | Date | null; + end?: string | Date | null; + }; + const startStr = this.formatDateItem(range.start); + const endStr = this.formatDateItem(range.end); + + if (startStr && endStr) { + if (startStr === endStr) { + return startStr; + } + return `${startStr} - ${endStr}`; + } + if (startStr) { + return startStr; + } + if (endStr) { + return endStr; + } + return ''; + } + if (typeof value === 'string') { + const trimmed = value.trim(); + if (trimmed.includes(' - ')) { + const [s, e] = trimmed.split(' - '); + const sFormatted = this.formatDateItem(s); + const eFormatted = this.formatDateItem(e); + if (sFormatted && eFormatted && sFormatted !== eFormatted) { + return `${sFormatted} - ${eFormatted}`; + } + return sFormatted || eFormatted || trimmed; + } + return this.formatDateItem(trimmed); + } + return String(value); + } + getChipAriaLabel(key: string, value: FilterValue): string { - return `Filter: ${this.getFilterChipLabel(key, value)}. Click to edit.`; + return `Filter: ${this.getFilterChipLabel(key, value)}`; } getRemoveFilterAriaLabel(key: string, value: FilterValue): string { @@ -304,6 +398,10 @@ export class SearchComponent { event.preventDefault(); event.stopPropagation(); } + const filterKey = key as keyof Filters; + const filterValue = value !== undefined ? value : this.filters[filterKey]; + const filterLabel = this.getFilterChipLabel(key, filterValue); + switch (key) { case FilterName.DeviceInfo: this.filters.deviceInfo = ''; @@ -311,6 +409,9 @@ export class SearchComponent { case FilterName.DeviceFirmware: this.filters.deviceFirmware = ''; break; + case FilterName.AssessmentType: + this.filters.assessmentType = ''; + break; case FilterName.Results: this.filters.results = []; break; @@ -344,6 +445,7 @@ export class SearchComponent { break; } this.filterCleared.emit(this.filters); + this.liveAnnouncer?.announce(`Filter removed: ${filterLabel}`, 'polite'); } clearAll(event?: Event): void { @@ -357,6 +459,7 @@ export class SearchComponent { } this.filters.deviceInfo = ''; this.filters.deviceFirmware = ''; + this.filters.assessmentType = ''; this.filters.results = []; this.filters.dateRange = ''; this.filters.quickSearch = []; @@ -366,6 +469,7 @@ export class SearchComponent { this.filters.kernel = ''; this.searchQueryChanged.emit(''); this.filterCleared.emit(this.filters); + this.liveAnnouncer?.announce('All filters cleared', 'polite'); } openFilterMenu(filter: FilterName, title: FilterTitle, event: Event): void { diff --git a/modules/ui/src/app/pages/reports/reports.component.spec.ts b/modules/ui/src/app/pages/reports/reports.component.spec.ts index 6e4d1d64c..2ee6c41c6 100644 --- a/modules/ui/src/app/pages/reports/reports.component.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.component.spec.ts @@ -70,6 +70,7 @@ describe('ReportsComponent', () => { filteredValues: { deviceInfo: '', deviceFirmware: '', + assessmentType: '', results: ['compliant'], dateRange: '', quickSearch: [], @@ -93,6 +94,7 @@ describe('ReportsComponent', () => { 'setFilteredValuesDateRange', 'setFilteredValuesDeviceFirmware', 'setFilteredValuesDeviceInfo', + 'setFilteredValuesAssessmentType', 'setFilteredValuesQuickSearch', 'setFilteredValuesResults', 'setFilteredValuesLocation', @@ -227,6 +229,7 @@ describe('ReportsComponent', () => { const mockFilterResults = ['compliant']; const mockFilterDeviceInfo = 'mockDevice'; const mockFilterDeviceFirmware = 'mockFirmware'; + const mockFilterAssessmentType = 'mockAssessmentType'; const mockFilterDateRange = { start: 'Wed Jun 21 2023 00:00:00', end: 'Thu Jun 22 2023 00:00:00', @@ -240,6 +243,7 @@ describe('ReportsComponent', () => { results: mockFilterResults, deviceInfo: mockFilterDeviceInfo, deviceFirmware: mockFilterDeviceFirmware, + assessmentType: mockFilterAssessmentType, dateRange: mockFilterDateRange, location: mockFilterLocation, linuxEnv: mockFilterLinuxEnv, @@ -276,6 +280,12 @@ describe('ReportsComponent', () => { title: FilterTitle.DeviceInfo, filterOpened: false, }); + component.openFilter({ + event, + filter: FilterName.AssessmentType, + title: FilterTitle.AssessmentType, + filterOpened: false, + }); component.openFilter({ event, filter: FilterName.Location, @@ -309,6 +319,9 @@ describe('ReportsComponent', () => { expect( mockReportsStore.setFilteredValuesDeviceFirmware ).toHaveBeenCalledWith(mockFilterDeviceFirmware); + expect( + mockReportsStore.setFilteredValuesAssessmentType + ).toHaveBeenCalledWith(mockFilterAssessmentType); expect(mockReportsStore.setFilteredValuesDateRange).toHaveBeenCalledWith( mockFilterDateRange ); @@ -460,6 +473,7 @@ describe('ReportsComponent', () => { const filters: Filters = { deviceInfo: '', deviceFirmware: '', + assessmentType: '', results: [], dateRange: '', quickSearch: ['searchKeyword'], diff --git a/modules/ui/src/app/pages/reports/reports.component.ts b/modules/ui/src/app/pages/reports/reports.component.ts index 2ffe7cd9c..f5a33f962 100644 --- a/modules/ui/src/app/pages/reports/reports.component.ts +++ b/modules/ui/src/app/pages/reports/reports.component.ts @@ -276,6 +276,11 @@ export class ReportsComponent implements OnInit, OnDestroy { if (filter === FilterName.Kernel) { this.store.setFilteredValuesKernel(filteredData.kernel); } + if (filter === FilterName.AssessmentType) { + this.store.setFilteredValuesAssessmentType( + filteredData.assessmentType + ); + } } }); } diff --git a/modules/ui/src/app/pages/reports/reports.store.spec.ts b/modules/ui/src/app/pages/reports/reports.store.spec.ts index fe430e0e8..29af0d008 100644 --- a/modules/ui/src/app/pages/reports/reports.store.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.store.spec.ts @@ -151,6 +151,7 @@ describe('ReportsStore', () => { filteredValues: { deviceInfo: '', deviceFirmware: '', + assessmentType: '', results: [], dateRange: '', quickSearch: [], @@ -385,6 +386,24 @@ describe('ReportsStore', () => { }); }); + describe('setFilteredValuesAssessmentType', () => { + it('should update store', done => { + const updatedFilters = { ...FILTERS, ...{ assessmentType: 'test2' } }; + store.overrideSelector(selectReports, [...HISTORY]); + reportsStore.setFilteredValues({ ...FILTERS }); + + reportsStore.setFilteredValuesAssessmentType('test2'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.filteredValues).toEqual(updatedFilters); + expect(store.dataSource.filter).toEqual( + JSON.stringify(updatedFilters) + ); + done(); + }); + }); + }); + describe('setFilteredValuesDateRange', () => { it('should update store', done => { const updatedFilters = { ...FILTERS, ...{ dateRange: 'test2' } }; @@ -608,6 +627,29 @@ describe('ReportsStore', () => { done(); }); }); + + it('should filter by assessmentType', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesAssessmentType('Qualification'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.filteredData.length).toBe(3); + expect(vm.dataSource.filteredData[0].program).toContain( + 'Qualification' + ); + done(); + }); + }); + + it('should filter out items when assessmentType does not match', done => { + reportsStore.setDataSource([...HISTORY]); + reportsStore.setFilteredValuesAssessmentType('Pilot'); + + reportsStore.viewModel$.pipe(take(1)).subscribe(vm => { + expect(vm.dataSource.filteredData.length).toBe(0); + done(); + }); + }); }); }); }); diff --git a/modules/ui/src/app/pages/reports/reports.store.ts b/modules/ui/src/app/pages/reports/reports.store.ts index eb37120ed..0df67a924 100644 --- a/modules/ui/src/app/pages/reports/reports.store.ts +++ b/modules/ui/src/app/pages/reports/reports.store.ts @@ -262,6 +262,18 @@ export class ReportsStore extends ComponentStore { ); }); + setFilteredValuesAssessmentType = this.effect(assessmentType$ => { + return assessmentType$.pipe( + withLatestFrom(this.filteredValues$, this.dataSource$), + tap(([assessmentType, filteredValues, dataSource]) => { + this.updateFilters(dataSource, { + ...filteredValues, + assessmentType, + }); + }) + ); + }); + setFilteredValues = this.effect(filteredValues$ => { return filteredValues$.pipe( withLatestFrom(this.dataSource$), @@ -406,6 +418,10 @@ export class ReportsStore extends ComponentStore { data.device?.kernel ?? '', searchString.kernel ?? '' ); + const isIncludeAssessmentType = this.filterStringData( + data.program ?? '', + searchString.assessmentType ?? '' + ); return ( isIncludeSearchQuery && @@ -416,7 +432,8 @@ export class ReportsStore extends ComponentStore { isIncludeLocation && isIncludeLinuxEnv && isIncludePythonVersion && - isIncludeKernel + isIncludeKernel && + isIncludeAssessmentType ); }; return filterPredicate; @@ -490,12 +507,16 @@ export class ReportsStore extends ComponentStore { const startDate = searchString.dateRange.start ? typeof searchString.dateRange.start === 'string' ? Date.parse(searchString.dateRange.start) - : searchString.dateRange.start.getDate() + : typeof (searchString.dateRange.start as Date).getTime === 'function' + ? (searchString.dateRange.start as Date).getTime() + : new Date(searchString.dateRange.start).getTime() : 0; const endDate = searchString.dateRange.end ? typeof searchString.dateRange.end === 'string' ? Date.parse(searchString.dateRange.end) - : searchString.dateRange.end.getDate() + : typeof (searchString.dateRange.end as Date).getTime === 'function' + ? (searchString.dateRange.end as Date).getTime() + : new Date(searchString.dateRange.end).getTime() : 0; const startedDateWithoutTime = new Date(startedDate).toDateString(); @@ -512,10 +533,13 @@ export class ReportsStore extends ComponentStore { private isFiltersEmpty(filteredValues: Filters) { return Object.values(filteredValues).every(value => { - if (value.start === '') { - return value.end.length === 0; + if ( + value instanceof DateRange || + (typeof value === 'object' && value !== null && !Array.isArray(value)) + ) { + return !value.start && !value.end; } - return value.length === 0; + return value === null || value === undefined || value.length === 0; }); } constructor() { @@ -544,6 +568,7 @@ export class ReportsStore extends ComponentStore { linuxEnv: '', pythonVersion: '', kernel: '', + assessmentType: '', }, dataLoaded: false, selectedRow: null, From 296255aebf6abf4515c3330b075be6c75e45072d Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Mon, 14 Sep 2026 10:13:44 +0000 Subject: [PATCH 157/196] Risk profiles docs (#1597) --- docs/README.md | 1 + docs/risk_profiles.md | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 docs/risk_profiles.md diff --git a/docs/README.md b/docs/README.md index 0c6171176..6b05ff96c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,6 +11,7 @@ - [Test modules](/docs/test/modules.md) - [Test results](/docs/test/statuses.md) - [Device compliance guide](/docs/test/compliant.md) + - [Risk profiles](/docs/risk_profiles.md) - [Developer guidelines](/docs/dev/README.md) - [Accessibility](/docs/ui/accessibility.md) - [Roadmap](/docs/roadmap.pdf) diff --git a/docs/risk_profiles.md b/docs/risk_profiles.md new file mode 100644 index 000000000..01f7b873d --- /dev/null +++ b/docs/risk_profiles.md @@ -0,0 +1,64 @@ +Testrun logo + +# Risk Profiles & Risk Assessment + +Testrun includes a Risk Assessment module that evaluates potential security risks of IoT devices based on functional characteristics and security configurations. This document explains risk profiles, when they become outdated, how outdated profiles appear in the UI, and what actions users can take to resolve them. + +--- + +## Overview + +A **Risk Profile** is a structured questionnaire that records information about a device's features, communication capabilities, and operational requirements. Based on the responses: + +- **Calculated Risk Level**: The system determines whether the device carries **Limited** or **High** risk. +- **Profile Statuses**: + - `Valid`: The profile is complete, up to date, and active. + - `Draft`: The profile is partially completed or saved for future editing. + - `Expired` / `Outdated`: The profile has exceeded its validity period or question format requirements. + - `Copy`: A temporary copy created from an existing profile. + +--- + +## Outdated (Expired) Risk Profiles + +### When do Risk Profiles become Outdated (Expired)? + +A risk profile automatically receives the **`Expired`** status **1 year (12 months)** after its creation date. + +*Note*: If new required questions are introduced while a profile is less than 12 months old, the profile status becomes **`Draft`** (not `Expired`), while the associated device status becomes **`Outdated`** (`Invalid`). + +--- + +### Profiles Under 12 Months Old with New System Questions + +Yes, if a profile is **less than 12 months old** but the system introduces **new required questions** to the risk assessment format: + +1. **Profile Status Changes to `Draft` (Not `Expired`)**: + - Because the profile is under 12 months old, it is not marked as `Expired`. + - However, because it lacks answers for newly added required questions, internal validation fails. + - The system automatically transitions the profile status from `Valid` to **`Draft`**. + +2. **UI & Direct Editing Behavior**: + - **Risk Assessment List**: Shows a **Draft icon** next to the profile name. + - **Form View is Unlocked**: Unlike `Expired` profiles, a `Draft` profile is **NOT locked in read-only mode**. Users can click on it directly, answer the newly introduced questions in the form, and click **Save** to restore its status to `Valid`. + +--- + +### What Users Can Do with Outdated Profiles + +When dealing with an outdated risk profile, users can perform the following actions: + +1. **View Existing Responses**: + - Click on the outdated profile to view its read-only questionnaire responses. + +2. **Copy the Outdated Profile (Recommended)**: + - Click the profile's action menu (`...`) and select **Copy**. + - Testrun generates a duplicate profile named `Copy of `. + - The copied profile receives a **new creation timestamp**, unlocking all form fields for editing. + +3. **Update and Save as Valid**: + - Review and update answers in the copied profile to match current device functionality. + - Click **Save** to set the new profile status to `Valid`. + +4. **Delete Obsolete Profiles**: + - If an outdated profile is no longer needed, click the action menu (`...`) on the profile card and select **Delete** to permanently remove it. From b19170f028398a0de44054ac0bf915515ff02250 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Mon, 14 Sep 2026 12:06:55 +0000 Subject: [PATCH 158/196] [TR] The pagination wasn't implemented on the Reports page (#1641) * Adds pagination on the reports page --- .../reports/reports-paginator-intl.spec.ts | 60 +++++ .../pages/reports/reports-paginator-intl.ts | 52 ++++ .../app/pages/reports/reports.component.html | 11 + .../app/pages/reports/reports.component.scss | 49 +++- .../pages/reports/reports.component.spec.ts | 213 ++++++++++++++++ .../app/pages/reports/reports.component.ts | 231 +++++++++++++++++- .../app/pages/reports/reports.store.spec.ts | 20 ++ .../ui/src/app/pages/reports/reports.store.ts | 11 + 8 files changed, 640 insertions(+), 7 deletions(-) create mode 100644 modules/ui/src/app/pages/reports/reports-paginator-intl.spec.ts create mode 100644 modules/ui/src/app/pages/reports/reports-paginator-intl.ts diff --git a/modules/ui/src/app/pages/reports/reports-paginator-intl.spec.ts b/modules/ui/src/app/pages/reports/reports-paginator-intl.spec.ts new file mode 100644 index 000000000..8b9bbf5a2 --- /dev/null +++ b/modules/ui/src/app/pages/reports/reports-paginator-intl.spec.ts @@ -0,0 +1,60 @@ +/** + * Copyright 2026 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ReportsPaginatorIntl } from './reports-paginator-intl'; + +describe('ReportsPaginatorIntl', () => { + let intl: ReportsPaginatorIntl; + + beforeEach(() => { + intl = new ReportsPaginatorIntl(); + }); + + it('should be created with expected labels', () => { + expect(intl).toBeTruthy(); + expect(intl.itemsPerPageLabel).toBe('Items per page:'); + expect(intl.nextPageLabel).toBe('Next page'); + expect(intl.previousPageLabel).toBe('Previous page'); + expect(intl.firstPageLabel).toBe('First page'); + expect(intl.lastPageLabel).toBe('Last page'); + }); + + describe('getRangeLabel', () => { + it('should return "Results 0 of 0" when length is 0', () => { + expect(intl.getRangeLabel(0, 10, 0)).toBe('Results 0 of 0'); + }); + + it('should return "Results 0 of 0" when pageSize is 0', () => { + expect(intl.getRangeLabel(0, 0, 100)).toBe('Results 0 of 0'); + }); + + it('should return "Results 1-50 of 485" for page 0 with pageSize 50 and length 485', () => { + expect(intl.getRangeLabel(0, 50, 485)).toBe('Results 1-50 of 485'); + }); + + it('should return "Results 11-20 of 25" for page 1 with pageSize 10 and length 25', () => { + expect(intl.getRangeLabel(1, 10, 25)).toBe('Results 11-20 of 25'); + }); + + it('should return "Results 21-25 of 25" for last page with pageSize 10 and length 25', () => { + expect(intl.getRangeLabel(2, 10, 25)).toBe('Results 21-25 of 25'); + }); + + it('should return "Results 1-1 of 1" when length is 1', () => { + expect(intl.getRangeLabel(0, 10, 1)).toBe('Results 1-1 of 1'); + }); + }); +}); diff --git a/modules/ui/src/app/pages/reports/reports-paginator-intl.ts b/modules/ui/src/app/pages/reports/reports-paginator-intl.ts new file mode 100644 index 000000000..86f8a936c --- /dev/null +++ b/modules/ui/src/app/pages/reports/reports-paginator-intl.ts @@ -0,0 +1,52 @@ +/** + * Copyright 2026 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Injectable } from '@angular/core'; +import { MatPaginatorIntl } from '@angular/material/paginator'; + +/** + * Custom internationalization provider for Reports pagination controls + * adhering to Google UI guidelines and accessible naming requirements. + */ +@Injectable() +export class ReportsPaginatorIntl extends MatPaginatorIntl { + override itemsPerPageLabel = 'Items per page:'; + override nextPageLabel = 'Next page'; + override previousPageLabel = 'Previous page'; + override firstPageLabel = 'First page'; + override lastPageLabel = 'Last page'; + + /** + * Generates a human-readable range label indicating current results and total results found. + * Example: "Results 1-50 of 485" + */ + override getRangeLabel = ( + page: number, + pageSize: number, + length: number + ): string => { + if (length === 0 || pageSize === 0) { + return 'Results 0 of 0'; + } + const safeLength = Math.max(length, 0); + const startIndex = page * pageSize; + const endIndex = + startIndex < safeLength + ? Math.min(startIndex + pageSize, safeLength) + : startIndex + pageSize; + return `Results ${startIndex + 1}-${endIndex} of ${safeLength}`; + }; +} diff --git a/modules/ui/src/app/pages/reports/reports.component.html b/modules/ui/src/app/pages/reports/reports.component.html index 08a72c0aa..550a59dc2 100644 --- a/modules/ui/src/app/pages/reports/reports.component.html +++ b/modules/ui/src/app/pages/reports/reports.component.html @@ -30,6 +30,7 @@

Reports

(filterCleared)="filterCleared($event)">
Reports class="detail-row" [class.expanded-row]="isExpanded(row)"> + +
} } diff --git a/modules/ui/src/app/pages/reports/reports.component.scss b/modules/ui/src/app/pages/reports/reports.component.scss index 4e8bda637..f46bad8be 100644 --- a/modules/ui/src/app/pages/reports/reports.component.scss +++ b/modules/ui/src/app/pages/reports/reports.component.scss @@ -25,6 +25,9 @@ $column-expand-width: 56px; overflow: hidden; display: flex; flex-direction: column; + height: 100%; + align-self: stretch; + box-sizing: border-box; } .history-toolbar { @@ -37,6 +40,7 @@ $column-expand-width: 56px; min-height: 74px; padding: 24px 32px 8px 32px; box-sizing: border-box; + flex-shrink: 0; .title { margin: 0; @@ -46,15 +50,16 @@ $column-expand-width: 56px; app-search { margin: 24px 32px 16px 32px; + flex-shrink: 0; } .history-content { - margin: 10px 32px 39px 32px; + margin: 10px 32px 24px 32px; overflow-y: auto; - height: -webkit-max-content; - height: -moz-max-content; - height: max-content; - max-height: calc(100vh - 160px); + flex: 1 1 auto; + min-height: 0; + display: flex; + flex-direction: column; } .history-content-empty, @@ -96,6 +101,28 @@ app-search { } } +mat-paginator { + background-color: #{colors.$surface}; + color: #{colors.$on-surface-variant}; + font-family: #{variables.$font-text}; + position: sticky; + bottom: 0; + z-index: 2; + flex-shrink: 0; + margin-top: auto; + + ::ng-deep .mat-mdc-paginator-container { + padding: 0 16px; + min-height: 52px; + } + + ::ng-deep .mat-mdc-paginator-range-label { + margin: 0 24px 0 24px; + font-size: 13px; + font-weight: 500; + } +} + @container history-content (width < 770px) { th, td { @@ -117,6 +144,18 @@ app-search { padding: 0 4px; } + mat-paginator { + ::ng-deep .mat-mdc-paginator-container { + padding: 0 4px; + flex-wrap: wrap; + justify-content: center; + } + + ::ng-deep .mat-mdc-paginator-range-label { + margin: 0 8px; + } + } + .metadata-accordion-detail .metadata-card { padding-left: 4px; diff --git a/modules/ui/src/app/pages/reports/reports.component.spec.ts b/modules/ui/src/app/pages/reports/reports.component.spec.ts index 2ee6c41c6..0819aa389 100644 --- a/modules/ui/src/app/pages/reports/reports.component.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.component.spec.ts @@ -39,7 +39,10 @@ import { } from '../../mocks/reports.mock'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort } from '@angular/material/sort'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { Breakpoints } from '@angular/cdk/layout'; import { HistoryTestrun } from '../../model/testrun-status'; +import { SCREEN_SIZE_PAGE_SIZES } from './reports.component'; describe('ReportsComponent', () => { let component: ReportsComponent; @@ -104,6 +107,7 @@ describe('ReportsComponent', () => { 'setActiveFiler', 'setFilterOpened', 'updateSort', + 'updatePaginator', 'getReports', 'fetchReports', ]); @@ -144,6 +148,20 @@ describe('ReportsComponent', () => { expect(mockReportsStore.updateSort).toHaveBeenCalledWith(mockSort); }); + + it('should update paginator if paginator viewChild is available', () => { + const mockPaginator = { + pageIndex: 0, + pageSize: 10, + } as unknown as MatPaginator; + spyOn(component, 'paginator').and.returnValue(mockPaginator); + + component.ngOnInit(); + + expect(mockReportsStore.updatePaginator).toHaveBeenCalledWith( + mockPaginator + ); + }); }); it('#sortData should call liveAnnouncer with sorted direction message and update sort', () => { @@ -567,6 +585,147 @@ describe('ReportsComponent', () => { expect(component.getPythonVersion(itemWithoutHost)).toBeUndefined(); }); }); + + describe('Pagination and Responsive Page Size', () => { + it('should calculate page size based on width breakpoints', () => { + const mockMatched = (query: string): boolean => + query === Breakpoints.XSmall; + expect(component.calculatePageSizeFromQueries(mockMatched)).toBe( + SCREEN_SIZE_PAGE_SIZES.XSmall + ); + + const mockSmall = (query: string): boolean => + query === Breakpoints.Small; + expect(component.calculatePageSizeFromQueries(mockSmall)).toBe( + SCREEN_SIZE_PAGE_SIZES.Small + ); + + const mockMedium = (query: string): boolean => + query === Breakpoints.Medium; + expect(component.calculatePageSizeFromQueries(mockMedium)).toBe( + SCREEN_SIZE_PAGE_SIZES.Medium + ); + + const mockLarge = (query: string): boolean => + query === Breakpoints.Large; + expect(component.calculatePageSizeFromQueries(mockLarge)).toBe( + SCREEN_SIZE_PAGE_SIZES.Large + ); + + const mockXLarge = (query: string): boolean => + query === Breakpoints.XLarge; + expect(component.calculatePageSizeFromQueries(mockXLarge)).toBe( + SCREEN_SIZE_PAGE_SIZES.XLarge + ); + }); + + it('should adjust page size based on screen height', () => { + const matchLarge = (query: string): boolean => + query === Breakpoints.Large; + + expect(component.calculatePageSizeFromQueries(matchLarge, 500)).toBe(3); + expect(component.calculatePageSizeFromQueries(matchLarge, 700)).toBe(5); + expect(component.calculatePageSizeFromQueries(matchLarge, 850)).toBe(8); + expect(component.calculatePageSizeFromQueries(matchLarge, 1000)).toBe( + 11 + ); + expect(component.calculatePageSizeFromQueries(matchLarge, 1200)).toBe( + 14 + ); + }); + + it('should calculate page size based on container height when available', () => { + const matchLarge = (query: string): boolean => + query === Breakpoints.Large; + + expect( + component.calculatePageSizeFromQueries(matchLarge, 950, 622) + ).toBe(9); + expect( + component.calculatePageSizeFromQueries(matchLarge, 1200, 746) + ).toBe(12); + expect( + component.calculatePageSizeFromQueries(matchLarge, 600, 300) + ).toBe(3); + }); + + it('should return larger size on extra large screen with large height', () => { + const matchXLarge = (query: string): boolean => + query === Breakpoints.XLarge; + expect(component.calculatePageSizeFromQueries(matchXLarge, 1200)).toBe( + 15 + ); + }); + + it('#updatePageSize should update pageSize and call _changePageSize on paginator', () => { + const mockPaginator = { + pageSize: 10, + _changePageSize: jasmine.createSpy('_changePageSize'), + } as unknown as MatPaginator; + spyOn(component, 'paginator').and.returnValue(mockPaginator); + + component.updatePageSize(20); + + expect(component.pageSize).toBe(20); + expect(mockPaginator.pageSize).toBe(20); + expect( + (mockPaginator as unknown as { _changePageSize: jasmine.Spy }) + ._changePageSize + ).toHaveBeenCalledWith(20); + }); + + it('#onPageChange should announce results range and page', () => { + const pageEvent: PageEvent = { + pageIndex: 0, + pageSize: 10, + length: 485, + }; + + component.onPageChange(pageEvent); + + expect(mockLiveAnnouncer.announce).toHaveBeenCalledWith( + 'Showing results 1 to 10 of 485, page 1 of 49', + 'polite' + ); + }); + + it('#onPageChange should announce "No results found" when length is 0', () => { + const pageEvent: PageEvent = { + pageIndex: 0, + pageSize: 10, + length: 0, + }; + + component.onPageChange(pageEvent); + + expect(mockLiveAnnouncer.announce).toHaveBeenCalledWith( + 'No results found', + 'polite' + ); + }); + + it('#onPageChange should update pageSize and prevent automatic resize override when user selects page size', () => { + const pageEvent: PageEvent = { + pageIndex: 0, + pageSize: 25, + length: 100, + }; + + component.onPageChange(pageEvent); + + expect(component.pageSize).toBe(25); + + // evaluateScreenSize should not override user-selected page size + component.evaluateScreenSize(); + expect(component.pageSize).toBe(25); + }); + + it('#onWindowResize should invoke evaluateScreenSize', () => { + spyOn(component, 'evaluateScreenSize'); + component.onWindowResize(); + expect(component.evaluateScreenSize).toHaveBeenCalled(); + }); + }); }); describe('DOM tests', () => { @@ -733,6 +892,60 @@ describe('ReportsComponent', () => { expect(component.getKernel(itemWithoutMeta)).toBeFalsy(); expect(component.getPythonVersion(itemWithoutMeta)).toBeFalsy(); }); + + it('should render mat-paginator with accessible attributes', () => { + const paginator = compiled.querySelector('mat-paginator'); + expect(paginator).toBeTruthy(); + expect(paginator?.getAttribute('aria-label')).toBe( + 'Select page of reports' + ); + }); + + it('should hide page size dropdown on mat-paginator', () => { + const paginator = component.paginator(); + expect(paginator?.hidePageSize).toBeTrue(); + const pageSizeContainer = compiled.querySelector( + '.mat-mdc-paginator-page-size' + ); + expect(pageSizeContainer).toBeNull(); + }); + + it('should hide paginator when there is no data', () => { + const emptyDataSource = new MatTableDataSource([]); + component.viewModel$ = getViewModel(emptyDataSource, true); + fixture.detectChanges(); + + const paginator = compiled.querySelector('mat-paginator'); + expect(paginator?.classList).toContain('hidden'); + }); + + it('should paginate items when results exceed page size', () => { + const manyItems: HistoryTestrun[] = Array.from( + { length: 25 }, + (_, i) => ({ + ...FORMATTED_HISTORY[0], + started: `2023-06-${(i + 1).toString().padStart(2, '0')}T10:11:00.123Z`, + deviceInfo: `Device ${i + 1}`, + }) + ); + const manyDataSource = new MatTableDataSource( + manyItems + ); + component.viewModel$ = getViewModel(manyDataSource, true); + component.pageSize = 10; + fixture.detectChanges(); + + const paginator = component.paginator(); + if (paginator) { + manyDataSource.paginator = paginator; + fixture.detectChanges(); + } + + const renderedRows = compiled.querySelectorAll( + 'tbody tr:not(.detail-row)' + ); + expect(renderedRows.length).toBe(10); + }); }); }); }); diff --git a/modules/ui/src/app/pages/reports/reports.component.ts b/modules/ui/src/app/pages/reports/reports.component.ts index f5a33f962..2e9bc0b1d 100644 --- a/modules/ui/src/app/pages/reports/reports.component.ts +++ b/modules/ui/src/app/pages/reports/reports.component.ts @@ -15,13 +15,26 @@ */ import { Component, + DestroyRef, ElementRef, + HostListener, + Injector, OnDestroy, OnInit, - viewChild, + afterNextRender, + effect, inject, + viewChild, } from '@angular/core'; import { LiveAnnouncer } from '@angular/cdk/a11y'; +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; +import { + MatPaginator, + MatPaginatorIntl, + MatPaginatorModule, + PageEvent, +} from '@angular/material/paginator'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { TestRunService } from '../../services/test-run.service'; import { HistoryTestrun, @@ -54,6 +67,53 @@ import { FilterDialogComponent } from './components/filter-dialog/filter-dialog. import { EmptyMessageComponent } from '../../components/empty-message/empty-message.component'; import { MatTooltipModule } from '@angular/material/tooltip'; import { state, style, trigger } from '@angular/animations'; +import { ReportsPaginatorIntl } from './reports-paginator-intl'; + +export const TABLE_ROW_HEIGHT = 52; +export const TABLE_OVERHEAD_HEIGHT = 112; // Header row (56px) + Paginator (56px) +export const PAGE_VERTICAL_OVERHEAD = 410; // Estimated vertical UI overhead outside table data rows +export const DEFAULT_PAGE_SIZE = 10; +export const MIN_PAGE_SIZE = 3; +export const MAX_PAGE_SIZE = 50; + +export const SCREEN_SIZE_PAGE_SIZES = { + XSmall: 3, + Small: 6, + Medium: 9, + Large: 14, + XLarge: 20, +} as const; + +export interface CalculatePageSizeOptions { + containerHeight?: number; + windowHeight?: number; + maxForBreakpoint?: number; +} + +export function calculatePageSize( + options: CalculatePageSizeOptions = {} +): number { + const { containerHeight, windowHeight, maxForBreakpoint } = options; + + let availableHeight: number | undefined; + if (containerHeight !== undefined && containerHeight > 0) { + availableHeight = containerHeight - TABLE_OVERHEAD_HEIGHT; + } else if (windowHeight !== undefined && windowHeight > 0) { + availableHeight = windowHeight - PAGE_VERTICAL_OVERHEAD; + } + + if (availableHeight === undefined) { + return maxForBreakpoint ?? DEFAULT_PAGE_SIZE; + } + + let count = Math.floor(availableHeight / TABLE_ROW_HEIGHT); + + if (maxForBreakpoint !== undefined && maxForBreakpoint > 0) { + count = Math.min(count, maxForBreakpoint); + } + + return Math.max(MIN_PAGE_SIZE, Math.min(MAX_PAGE_SIZE, count)); +} @Component({ selector: 'app-history', @@ -68,6 +128,7 @@ import { state, style, trigger } from '@angular/animations'; MatSortModule, MatButtonModule, MatInputModule, + MatPaginatorModule, SearchComponent, DeleteReportComponent, DownloadReportZipComponent, @@ -75,7 +136,11 @@ import { state, style, trigger } from '@angular/animations'; EmptyMessageComponent, MatTooltipModule, ], - providers: [ReportsStore, DatePipe], + providers: [ + ReportsStore, + DatePipe, + { provide: MatPaginatorIntl, useClass: ReportsPaginatorIntl }, + ], animations: [ trigger('detailExpand', [ state( @@ -91,6 +156,9 @@ export class ReportsComponent implements OnInit, OnDestroy { private testRunService = inject(TestRunService); private datePipe = inject(DatePipe); private liveAnnouncer = inject(LiveAnnouncer); + private breakpointObserver = inject(BreakpointObserver); + private destroyRef = inject(DestroyRef); + private injector = inject(Injector); dialog = inject(MatDialog); private store = inject(ReportsStore); @@ -98,7 +166,56 @@ export class ReportsComponent implements OnInit, OnDestroy { public readonly FilterTitle = FilterTitle; private destroy$: Subject = new Subject(); sort = viewChild(MatSort); + paginator = viewChild(MatPaginator); + historyContent = viewChild>('historyContent'); viewModel$ = this.store.viewModel$; + private resizeObserver?: ResizeObserver; + + pageSize: number = DEFAULT_PAGE_SIZE; + private isUserSelectedPageSize = false; + + private readonly paginatorEffect = effect(() => { + const paginator = this.paginator(); + if (paginator) { + this.store.updatePaginator(paginator); + } + }); + + private readonly sortEffect = effect(() => { + const sort = this.sort(); + if (sort) { + this.store.updateSort(sort); + } + }); + + private readonly historyContentEffect = effect(() => { + const historyContent = this.historyContent(); + if (historyContent?.nativeElement) { + this.evaluateScreenSize(); + this.setupResizeObserver(historyContent.nativeElement); + } + }); + + private setupResizeObserver(element: HTMLElement): void { + if (typeof ResizeObserver === 'undefined') { + return; + } + this.resizeObserver?.disconnect(); + this.resizeObserver = new ResizeObserver(() => { + this.evaluateScreenSize(); + }); + this.resizeObserver.observe(element); + } + + constructor() { + this.initResponsivePageSize(); + afterNextRender( + () => { + this.evaluateScreenSize(); + }, + { injector: this.injector } + ); + } ngOnInit() { this.store.fetchReports(); @@ -106,6 +223,115 @@ export class ReportsComponent implements OnInit, OnDestroy { if (sort) { this.store.updateSort(sort); } + const paginator = this.paginator(); + if (paginator) { + this.store.updatePaginator(paginator); + } + } + + @HostListener('window:resize') + onWindowResize(): void { + this.evaluateScreenSize(); + } + + private initResponsivePageSize(): void { + this.breakpointObserver + .observe([ + Breakpoints.XSmall, + Breakpoints.Small, + Breakpoints.Medium, + Breakpoints.Large, + Breakpoints.XLarge, + ]) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.evaluateScreenSize(); + }); + + this.evaluateScreenSize(); + } + + evaluateScreenSize(): void { + if (this.isUserSelectedPageSize) { + return; + } + const isMatched = (query: string): boolean => { + return this.breakpointObserver.isMatched(query); + }; + const windowHeight = + typeof window !== 'undefined' ? window.innerHeight : undefined; + const containerHeight = this.historyContent()?.nativeElement?.clientHeight; + const newSize = this.calculatePageSizeFromQueries( + isMatched, + windowHeight, + containerHeight && containerHeight > 0 ? containerHeight : undefined + ); + this.updatePageSize(newSize); + } + + calculatePageSizeFromQueries( + isMatched: (query: string) => boolean, + windowHeight?: number, + containerHeight?: number + ): number { + let widthSize: number = SCREEN_SIZE_PAGE_SIZES.Medium; + if (isMatched(Breakpoints.XSmall)) { + widthSize = SCREEN_SIZE_PAGE_SIZES.XSmall; + } else if (isMatched(Breakpoints.Small)) { + widthSize = SCREEN_SIZE_PAGE_SIZES.Small; + } else if (isMatched(Breakpoints.Medium)) { + widthSize = SCREEN_SIZE_PAGE_SIZES.Medium; + } else if (isMatched(Breakpoints.Large)) { + widthSize = SCREEN_SIZE_PAGE_SIZES.Large; + } else if (isMatched(Breakpoints.XLarge)) { + widthSize = SCREEN_SIZE_PAGE_SIZES.XLarge; + } + + return calculatePageSize({ + containerHeight, + windowHeight, + maxForBreakpoint: widthSize, + }); + } + + updatePageSize(newSize: number): void { + if (this.pageSize !== newSize) { + this.pageSize = newSize; + const paginator = this.paginator(); + if (paginator) { + paginator.pageSize = newSize; + if ( + typeof (paginator as { _changePageSize?: (size: number) => void }) + ._changePageSize === 'function' + ) { + ( + paginator as { _changePageSize: (size: number) => void } + )._changePageSize(newSize); + } + } + } + } + + onPageChange(event: PageEvent): void { + if (this.pageSize !== event.pageSize) { + this.pageSize = event.pageSize; + this.isUserSelectedPageSize = true; + } + if (event.length === 0) { + this.liveAnnouncer.announce('No results found', 'polite'); + return; + } + const totalPages = Math.ceil(event.length / event.pageSize) || 1; + const currentPage = event.pageIndex + 1; + const startIndex = event.pageIndex * event.pageSize + 1; + const endIndex = Math.min( + (event.pageIndex + 1) * event.pageSize, + event.length + ); + this.liveAnnouncer.announce( + `Showing results ${startIndex} to ${endIndex} of ${event.length}, page ${currentPage} of ${totalPages}`, + 'polite' + ); } public expandedRows: Set = new Set(); @@ -293,6 +519,7 @@ export class ReportsComponent implements OnInit, OnDestroy { } ngOnDestroy() { + this.resizeObserver?.disconnect(); this.destroy$.next(true); this.destroy$.unsubscribe(); } diff --git a/modules/ui/src/app/pages/reports/reports.store.spec.ts b/modules/ui/src/app/pages/reports/reports.store.spec.ts index 29af0d008..d43068c11 100644 --- a/modules/ui/src/app/pages/reports/reports.store.spec.ts +++ b/modules/ui/src/app/pages/reports/reports.store.spec.ts @@ -32,6 +32,7 @@ import { import { DatePipe } from '@angular/common'; import { MatRow } from '@angular/material/table'; import { MatSort } from '@angular/material/sort'; +import { MatPaginator } from '@angular/material/paginator'; import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { selectReports, selectRiskProfiles } from '../../store/selectors'; import { AppState } from '../../store/state'; @@ -227,6 +228,25 @@ describe('ReportsStore', () => { }); }); + describe('updatePaginator', () => { + it('should update store with paginator', done => { + const paginator = { + pageIndex: 0, + pageSize: 10, + page: of(), + initialized: of(), + } as unknown as MatPaginator; + store.overrideSelector(selectReports, [...HISTORY]); + + reportsStore.updatePaginator(paginator); + + reportsStore.viewModel$.pipe(take(1)).subscribe(store => { + expect(store.dataSource.paginator).toEqual(paginator); + done(); + }); + }); + }); + describe('setFilteredValuesResults', () => { it('should update store', done => { const updatedFilters = { ...FILTERS, ...{ results: ['test2'] } }; diff --git a/modules/ui/src/app/pages/reports/reports.store.ts b/modules/ui/src/app/pages/reports/reports.store.ts index 0df67a924..cab56aa4b 100644 --- a/modules/ui/src/app/pages/reports/reports.store.ts +++ b/modules/ui/src/app/pages/reports/reports.store.ts @@ -14,6 +14,7 @@ import { exhaustMap } from 'rxjs'; import { tap, withLatestFrom } from 'rxjs/operators'; import { DatePipe } from '@angular/common'; import { MatSort } from '@angular/material/sort'; +import { MatPaginator } from '@angular/material/paginator'; import { selectReports, selectRiskProfiles } from '../../store/selectors'; import { Store } from '@ngrx/store'; import { AppState } from '../../store/state'; @@ -81,6 +82,7 @@ export class ReportsStore extends ComponentStore { dataSource.filterPredicate = this.customFilterPredicate(); dataSource.filter = JSON.stringify(state.filteredValues); dataSource.sort = state.dataSource.sort; + dataSource.paginator = state.dataSource.paginator; return { ...state, @@ -147,6 +149,15 @@ export class ReportsStore extends ComponentStore { ); }); + updatePaginator = this.effect(paginator$ => { + return paginator$.pipe( + withLatestFrom(this.dataSource$), + tap(([paginator, dataSource]) => { + dataSource.paginator = paginator; + }) + ); + }); + setFilteredValuesResults = this.effect(results$ => { return results$.pipe( withLatestFrom(this.filteredValues$, this.dataSource$), From 55460d4a91275f9d052607ddce3fa3939925b3f8 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Tue, 15 Sep 2026 14:39:33 +0000 Subject: [PATCH 159/196] Highlight hovered menu item (#1642) --- .../components/search/search.component.html | 9 ++- .../components/search/search.component.scss | 52 +++++++++++++- .../search/search.component.spec.ts | 63 ++++++++++++++--- .../components/search/search.component.ts | 13 ++-- modules/ui/src/styles.scss | 67 +++++++++++++++++++ 5 files changed, 187 insertions(+), 17 deletions(-) diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.html b/modules/ui/src/app/pages/reports/components/search/search.component.html index e654e83d8..0a5d272a8 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.html +++ b/modules/ui/src/app/pages/reports/components/search/search.component.html @@ -105,13 +105,20 @@ class="search-filter-menu" yPosition="below" [overlapTrigger]="false"> - @for (menuItem of filterMenuItems; track menuItem) { + @for (menuItem of filterMenuItems; track menuItem.name) { } diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.scss b/modules/ui/src/app/pages/reports/components/search/search.component.scss index c0a4eebfa..a7e864261 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.scss +++ b/modules/ui/src/app/pages/reports/components/search/search.component.scss @@ -218,17 +218,67 @@ } ::ng-deep .search-filter-menu { + width: 208px; + min-width: 208px; + max-width: 208px; + border-radius: variables.$corner-large; + background-color: colors.$surface-container-low; + + @include mat.menu-overrides( + ( + container-color: colors.$surface-container-low, + container-shape: variables.$corner-large, + item-label-text-color: #1f1f1f, + item-label-text-size: 14px, + item-label-text-font: variables.$font-text, + item-hover-state-layer-color: colors.$secondary-container, + item-focus-state-layer-color: colors.$secondary-container, + item-leading-spacing: 12px, + item-trailing-spacing: 12px, + item-with-icon-leading-spacing: 12px, + item-with-icon-trailing-spacing: 12px, + ) + ); + .filter-menu-item { display: flex; align-items: center; + justify-content: space-between; + padding-left: 12px; + padding-right: 12px; font-family: variables.$font-text; font-size: 14px; - color: colors.$on-surface; + color: #1f1f1f; + + .mat-mdc-menu-item-text { + order: 1; + flex: 1 1 auto; + } + + .filter-menu-item-icon { + order: 2; + margin-right: 0; + margin-left: auto; + color: inherit; + display: flex; + align-items: center; + justify-content: center; + font-size: 24px; + width: 24px; + height: 24px; + line-height: 24px; + } &.active-filter-item { background-color: colors.$secondary-container; color: colors.$on-secondary-container; font-weight: 500; } + + &:not(.cdk-keyboard-focused):not(:focus-visible):not(:hover):not( + .active-filter-item + ) { + background-color: transparent !important; + } } } diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts index 3b906e76e..f9a57c74e 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts +++ b/modules/ui/src/app/pages/reports/components/search/search.component.spec.ts @@ -54,7 +54,6 @@ describe('SearchComponent', () => { component.filters = null as unknown as Filters; expect(component.getActiveFilters()).toEqual([]); expect(component.hasActiveFilters()).toBeFalse(); - expect(component.isFilterActive('deviceInfo')).toBeFalse(); }); it('should return active filter items when filters are set', () => { @@ -74,16 +73,58 @@ describe('SearchComponent', () => { const active = component.getActiveFilters(); expect(active.length).toBe(10); expect(component.hasActiveFilters()).toBeTrue(); - expect(component.isFilterActive('deviceInfo')).toBeTrue(); - expect(component.isFilterActive('deviceFirmware')).toBeTrue(); - expect(component.isFilterActive('assessmentType')).toBeTrue(); - expect(component.isFilterActive('results')).toBeTrue(); - expect(component.isFilterActive('dateRange')).toBeTrue(); - expect(component.isFilterActive('quickSearch')).toBeTrue(); - expect(component.isFilterActive('location')).toBeTrue(); - expect(component.isFilterActive('linuxEnv')).toBeTrue(); - expect(component.isFilterActive('pythonVersion')).toBeTrue(); - expect(component.isFilterActive('kernel')).toBeTrue(); + }); + + describe('isFilterActive', () => { + it('should return false when filterOpened is false', () => { + component.filterOpened = false; + component.activeFilter = 'deviceInfo'; + expect(component.isFilterActive('deviceInfo')).toBeFalse(); + }); + + it('should return false when activeFilter is empty', () => { + component.filterOpened = true; + component.activeFilter = ''; + expect(component.isFilterActive('deviceInfo')).toBeFalse(); + }); + + it('should return false when activeFilter does not match key', () => { + component.filterOpened = true; + component.activeFilter = 'deviceFirmware'; + expect(component.isFilterActive('deviceInfo')).toBeFalse(); + }); + + it('should return true when filterOpened is true and activeFilter matches key', () => { + component.filterOpened = true; + component.activeFilter = 'deviceInfo'; + expect(component.isFilterActive('deviceInfo')).toBeTrue(); + }); + + it('should return false when search query is applied already but category is not in active state', () => { + component.filters = { + ...new Filters(), + deviceInfo: 'Pixel', + }; + component.filterOpened = false; + component.activeFilter = ''; + expect(component.isFilterActive('deviceInfo')).toBeFalse(); + + component.filterOpened = true; + component.activeFilter = 'deviceFirmware'; + expect(component.isFilterActive('deviceInfo')).toBeFalse(); + expect(component.isFilterActive('deviceFirmware')).toBeTrue(); + }); + + it('should handle Started and dateRange aliases correctly', () => { + component.filterOpened = true; + component.activeFilter = FilterName.Started; + expect(component.isFilterActive(FilterName.DateRange)).toBeTrue(); + expect(component.isFilterActive(FilterName.Started)).toBeTrue(); + + component.activeFilter = FilterName.DateRange; + expect(component.isFilterActive(FilterName.Started)).toBeTrue(); + expect(component.isFilterActive(FilterName.DateRange)).toBeTrue(); + }); }); it('should format chip labels correctly for all filter types', () => { diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.ts b/modules/ui/src/app/pages/reports/components/search/search.component.ts index 5e7442d30..991e3bf1f 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.ts +++ b/modules/ui/src/app/pages/reports/components/search/search.component.ts @@ -230,12 +230,17 @@ export class SearchComponent { } isFilterActive(key: string): boolean { - if (!this.filters) { + if (!this.filterOpened || !this.activeFilter) { return false; } - const filterKey = key as keyof Filters; - const val = this.filters[filterKey] as FilterValue; - return !this.isValueEmpty(val); + if ( + (this.activeFilter === FilterName.Started || + this.activeFilter === FilterName.DateRange) && + (key === FilterName.Started || key === FilterName.DateRange) + ) { + return true; + } + return this.activeFilter === key; } isValueEmpty(value: FilterValue): boolean { diff --git a/modules/ui/src/styles.scss b/modules/ui/src/styles.scss index 3473b76fd..7fb867d2b 100644 --- a/modules/ui/src/styles.scss +++ b/modules/ui/src/styles.scss @@ -74,6 +74,7 @@ item-label-text-size: 16px, item-label-text-font: variables.$font-text, item-hover-state-layer-color: colors.$secondary-container, + item-focus-state-layer-color: colors.$secondary-container, item-with-icon-leading-spacing: 24px, item-with-icon-trailing-spacing: 24px, ) @@ -566,6 +567,72 @@ button:not(.mat-mdc-button-disabled) { ) ); } + +.search-filter-menu { + width: 208px; + min-width: 208px; + max-width: 208px; + border-radius: variables.$corner-large; + background-color: colors.$surface-container-low; + + @include mat.menu-overrides( + ( + container-color: colors.$surface-container-low, + container-shape: variables.$corner-large, + item-label-text-color: #1f1f1f, + item-label-text-size: 14px, + item-label-text-font: variables.$font-text, + item-hover-state-layer-color: colors.$secondary-container, + item-focus-state-layer-color: colors.$secondary-container, + item-leading-spacing: 12px, + item-trailing-spacing: 12px, + item-with-icon-leading-spacing: 12px, + item-with-icon-trailing-spacing: 12px, + ) + ); + + .filter-menu-item { + display: flex; + align-items: center; + justify-content: space-between; + padding-left: 12px; + padding-right: 12px; + font-family: variables.$font-text; + font-size: 14px; + color: #1f1f1f; + + .mat-mdc-menu-item-text { + order: 1; + flex: 1 1 auto; + } + + .filter-menu-item-icon { + order: 2; + margin-right: 0; + margin-left: auto; + color: inherit; + display: flex; + align-items: center; + justify-content: center; + font-size: 24px; + width: 24px; + height: 24px; + line-height: 24px; + } + + &.active-filter-item { + background-color: colors.$secondary-container; + color: colors.$on-secondary-container; + font-weight: 500; + } + + &:not(.cdk-keyboard-focused):not(:focus-visible):not(:hover):not( + .active-filter-item + ) { + background-color: transparent !important; + } + } +} button.mat-mdc-icon-button, button.mat-mdc-button, button.mdc-button--unelevated, From 04f6d00f34095f87bf4516ada66bf8c39b955e81 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 16 Sep 2026 11:48:01 +0200 Subject: [PATCH 160/196] attempt to restart ws container --- framework/python/src/core/testrun.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/framework/python/src/core/testrun.py b/framework/python/src/core/testrun.py index c7af5208c..d63b57b95 100644 --- a/framework/python/src/core/testrun.py +++ b/framework/python/src/core/testrun.py @@ -652,6 +652,24 @@ def start_ws(self): 'Please investigate and try again.') LOGGER.error(ie) sys.exit(1) + except docker.errors.APIError as ae: + if ae.status_code == 409: + try: + client.containers.get('tr-ws').remove(force=True) + except (docker.errors.NotFound, docker.errors.APIError): + pass + client.containers.run( + 'testrun/ws', + auto_remove=True, + name='tr-ws', + detach=True, + ports={ + '9001': 9001, + '1883': 1883 + } + ) + else: + raise def _stop_ws(self): LOGGER.info('Stopping websockets server') @@ -659,11 +677,9 @@ def _stop_ws(self): try: container = client.containers.get('tr-ws') if container is not None: - container.kill() - # If the container has been started without auto-remove flag remove it try: - container.remove() - except docker.errors.APIError: + container.remove(force=True) + except (docker.errors.APIError, docker.errors.NotFound): pass except docker.errors.NotFound: From a9d6cba37ea3478929c09d1d058f3d1e0e957dc8 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 16 Sep 2026 17:40:30 +0200 Subject: [PATCH 161/196] add test method blueprint to tls test module --- modules/test/tls/python/src/tls_module.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/test/tls/python/src/tls_module.py b/modules/test/tls/python/src/tls_module.py index 3b0dc004c..48c743a67 100644 --- a/modules/test/tls/python/src/tls_module.py +++ b/modules/test/tls/python/src/tls_module.py @@ -556,6 +556,10 @@ def _security_tls_v1_3_client(self): '1.3', unsupported_versions=['1.0', '1.1']) + def _security_http_server(self): + LOGGER.info('Running http test') + return True, 'compliant', 'description' + def _validate_tls_client(self, client_mac, tls_version, From 55dc50b80452de4d605515599069e9c27d81c620 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 16 Sep 2026 17:42:42 +0200 Subject: [PATCH 162/196] add http test to README --- modules/test/tls/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/test/tls/README.md b/modules/test/tls/README.md index cfca8100c..80ee76514 100644 --- a/modules/test/tls/README.md +++ b/modules/test/tls/README.md @@ -19,4 +19,5 @@ Within the ```python/src``` directory, the below tests are executed. | security.tls.v1_2_client | Device uses TLS with connection to an external service on port 443 (or any other port which could be running the webserver-HTTPS) | The packet indicates a TLS connection with at least TLS v1.2 and support for ECDH and ECDSA ciphers | Required if Applicable | | security.tls.v1_3_server | Check the device web server TLS 1.3 and the certificate is valid | TLS 1.3 certificate is issued to the web browser client when accessed | Informational | | security.tls.v1_3_client | Device uses TLS with connection to an external service on port 443 (or any other port which could be running the webserver-HTTPS) | The packet indicates a TLS connection with at least TLS 1.3 using AEAD-based ciphers | Informational | +| security.http.server | HTTP server test | Compliant | Informational | From 7e0ee8fabd910be85dba4f32dd15a8456e579f7d Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Wed, 16 Sep 2026 17:42:57 +0200 Subject: [PATCH 163/196] add http test to module config --- modules/test/tls/conf/module_config.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/test/tls/conf/module_config.json b/modules/test/tls/conf/module_config.json index 228fbb64d..364d57efa 100644 --- a/modules/test/tls/conf/module_config.json +++ b/modules/test/tls/conf/module_config.json @@ -58,6 +58,14 @@ "Disable connections to unsecure services", "Ensure any URLs connected to are secure (https)" ] + }, + { + "name": "security.http.server", + "test_description": "HTTP server", + "expected_behavior": "HTTP server compliant", + "recommendations": [ + "Implement HEAD method" + ] } ] } From e341e6cf14ac7353353938e4bdf046e40f1bd48b Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Thu, 17 Sep 2026 08:56:06 +0000 Subject: [PATCH 164/196] Changes draft risk profile icon (#1647) --- .../dynamic-form.component.spec.ts | 15 +++++-- .../list-layout/list-layout.component.html | 2 +- .../list-layout/list-layout.component.spec.ts | 19 +++++++++ .../profile-item/profile-item.component.html | 9 ++++- .../profile-item.component.spec.ts | 39 +++++++++++++++++++ modules/ui/src/styles.scss | 2 + 6 files changed, 80 insertions(+), 6 deletions(-) diff --git a/modules/ui/src/app/components/dynamic-form/dynamic-form.component.spec.ts b/modules/ui/src/app/components/dynamic-form/dynamic-form.component.spec.ts index 1754893f7..890a6ea54 100644 --- a/modules/ui/src/app/components/dynamic-form/dynamic-form.component.spec.ts +++ b/modules/ui/src/app/components/dynamic-form/dynamic-form.component.spec.ts @@ -239,12 +239,19 @@ describe('DynamicFormComponent', () => { describe('adjustSubscriptWrapperHeights', () => { it('should set height for hint wrapper', () => { + const hint = compiled.querySelector( + '.mat-mdc-form-field-hint' + ) as HTMLElement; + const formFieldWithHint = hint.closest('mat-form-field'); + const wrapper = formFieldWithHint?.querySelector( + '.mat-mdc-form-field-subscript-wrapper' + ) as HTMLElement; + + expect(hint.offsetHeight).toBeGreaterThan(0); component.adjustSubscriptWrapperHeights(); - const wrapper = compiled.querySelector( - '.mat-mdc-form-field-subscript-wrapper' - ); - expect(wrapper?.clientHeight).toEqual(20); + expect(wrapper?.style.height).toEqual(`${hint.offsetHeight}px`); + expect(wrapper?.clientHeight).toEqual(hint.offsetHeight); }); }); }); diff --git a/modules/ui/src/app/components/list-layout/list-layout.component.html b/modules/ui/src/app/components/list-layout/list-layout.component.html index b484c4f7e..8b6636347 100644 --- a/modules/ui/src/app/components/list-layout/list-layout.component.html +++ b/modules/ui/src/app/components/list-layout/list-layout.component.html @@ -63,7 +63,7 @@
@if (isOpenEntityForm() && !initialEntity()) {
- + edit_note {{ title() === LayoutType.Device ? 'New device' diff --git a/modules/ui/src/app/components/list-layout/list-layout.component.spec.ts b/modules/ui/src/app/components/list-layout/list-layout.component.spec.ts index a0e8647eb..59ab52938 100644 --- a/modules/ui/src/app/components/list-layout/list-layout.component.spec.ts +++ b/modules/ui/src/app/components/list-layout/list-layout.component.spec.ts @@ -44,6 +44,8 @@ interface Entity { [actions]="actions" [itemTemplate]="defaultItemTemplate" [emptyContent]="empty" + [isOpenEntityForm]="isOpenEntityForm" + [initialEntity]="initialEntity" (addEntity)="onAddEntity()" (menuItemClicked)="onMenuItemClicked($event)"> @@ -61,6 +63,8 @@ class HostComponent { addEntityText = 'Add Entity'; entities: Entity[] = []; actions = [{ label: 'Edit', value: 'edit' }]; + isOpenEntityForm = false; + initialEntity: Entity | null = null; onAddEntity = jasmine.createSpy('onAddEntity'); onMenuItemClicked = jasmine.createSpy('onMenuItemClicked'); } @@ -202,4 +206,19 @@ describe('ListLayoutComponent', () => { expect(searchIcon?.textContent?.trim()).toBe('search'); })); }); + + describe('when entity form is open without initial entity', () => { + beforeEach(() => { + component.isOpenEntityForm = true; + component.initialEntity = null; + fixture.detectChanges(); + }); + + it('should display fake list item with edit_note icon', () => { + const fakeItem = compiled.querySelector('.fake-list-item'); + expect(fakeItem).toBeTruthy(); + const icon = fakeItem?.querySelector('mat-icon'); + expect(icon?.textContent?.trim()).toBe('edit_note'); + }); + }); }); diff --git a/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.html b/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.html index f1df53e63..19337c1f6 100644 --- a/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.html +++ b/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.html @@ -40,7 +40,9 @@ profile.status === ProfileStatus.DRAFT || profile.status === ProfileStatus.COPY ) { - + + edit_note + } @if (profile.status === ProfileStatus.EXPIRED) { @@ -51,6 +53,11 @@

{{ profile.name }}

+ @if (profile.status === ProfileStatus.DRAFT) { +
+ {{ ProfileStatus.DRAFT }} +
+ } @if (profile.risk) {
{{ profile.risk }} risk diff --git a/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.spec.ts b/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.spec.ts index 28eb0bf98..713357267 100644 --- a/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.spec.ts +++ b/modules/ui/src/app/pages/risk-assessment/profile-item/profile-item.component.spec.ts @@ -19,6 +19,7 @@ import { ProfileItemComponent } from './profile-item.component'; import { PROFILE_MOCK } from '../../../mocks/profile.mock'; import { TestRunService } from '../../../services/test-run.service'; import { LiveAnnouncer } from '@angular/cdk/a11y'; +import { ProfileStatus } from '../../../model/profile'; describe('ProfileItemComponent', () => { let component: ProfileItemComponent; @@ -85,4 +86,42 @@ describe('ProfileItemComponent', () => { expect(profileClickedSpy).toHaveBeenCalled(); }); + + it('should display check_circle icon for valid profile', () => { + const icon = compiled.querySelector('.profile-item-icon'); + expect(icon?.textContent?.trim()).toBe('check_circle'); + }); + + it('should display edit_note icon for draft profile', () => { + fixture.componentRef.setInput('profile', { + ...PROFILE_MOCK, + status: ProfileStatus.DRAFT, + }); + fixture.detectChanges(); + + const icon = compiled.querySelector('.profile-item-icon'); + expect(icon?.textContent?.trim()).toBe('edit_note'); + }); + + it('should display edit_note icon for copy profile', () => { + fixture.componentRef.setInput('profile', { + ...PROFILE_MOCK, + status: ProfileStatus.COPY, + }); + fixture.detectChanges(); + + const icon = compiled.querySelector('.profile-item-icon'); + expect(icon?.textContent?.trim()).toBe('edit_note'); + }); + + it('should display error icon for expired profile', () => { + fixture.componentRef.setInput('profile', { + ...PROFILE_MOCK, + status: ProfileStatus.EXPIRED, + }); + fixture.detectChanges(); + + const icon = compiled.querySelector('.profile-item-icon'); + expect(icon?.textContent?.trim()).toBe('error'); + }); }); diff --git a/modules/ui/src/styles.scss b/modules/ui/src/styles.scss index 7fb867d2b..42edd3515 100644 --- a/modules/ui/src/styles.scss +++ b/modules/ui/src/styles.scss @@ -306,6 +306,8 @@ body:has(app-help-tip) .app-toolbar-button.app-toolbar-button-help-tips { border-radius: 200px; padding: 0 7px; white-space: nowrap; + background: colors.$surface-variant; + color: colors.$on-surface-variant; &.red { background: colors.$error-container; color: colors.$on-error-container; From 10ebe7f1190e06b1eeba63fe374a8ddc8a0547d3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Thu, 17 Sep 2026 12:29:57 +0200 Subject: [PATCH 165/196] include http test to testpack --- resources/test_packs/pilot/config.json | 4 ++++ resources/test_packs/qualification/config.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/resources/test_packs/pilot/config.json b/resources/test_packs/pilot/config.json index c7c1c47c6..4a417689c 100644 --- a/resources/test_packs/pilot/config.json +++ b/resources/test_packs/pilot/config.json @@ -176,6 +176,10 @@ { "name": "security.tls.v1_3_client", "required_result": "Informational" + }, + { + "name": "security.http.server", + "required_result": "Informational" } ] } \ No newline at end of file diff --git a/resources/test_packs/qualification/config.json b/resources/test_packs/qualification/config.json index 8d3e26758..21c9c0dec 100644 --- a/resources/test_packs/qualification/config.json +++ b/resources/test_packs/qualification/config.json @@ -176,6 +176,10 @@ { "name": "security.tls.v1_3_client", "required_result": "Informational" + }, + { + "name": "security.http.server", + "required_result": "Informational" } ] } \ No newline at end of file From 0e4110fbad607303dff8b4b3be27dd7a53f7725f Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Thu, 17 Sep 2026 11:51:33 +0000 Subject: [PATCH 166/196] Changes draft risk profile icon (#1649) * Changes draft risk profile icon * Adds fonts --- resources/report/test_report_styles.css | 41 ++++++++++++++++++- .../pilot/report_templates/summary.jinja | 20 +++------ .../report_templates/summary.jinja | 20 +++------ 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/resources/report/test_report_styles.css b/resources/report/test_report_styles.css index c02e6c82e..78cdb633a 100644 --- a/resources/report/test_report_styles.css +++ b/resources/report/test_report_styles.css @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&family=Google+Sans+Text:wght@400;500;700&family=Google+Sans+Flex:wght@400;500;700&display=swap'); + /* Set some global variables */ :root { --header-height: .75in; @@ -18,6 +20,38 @@ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } + @font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 400; + src: url(https://fonts.gstatic.com/s/googlesanstext/v29/5aUu9-KzpRiLCAt4Unrc-xIKmCU5qEp2iw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + + @font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 500; + src: url(https://fonts.gstatic.com/s/googlesanstext/v29/5aUp9-KzpRiLCAt4Unrc-xIKmCU5oLlVnmhjtg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + + @font-face { + font-family: 'Google Sans Text'; + font-style: normal; + font-weight: 700; + src: url(https://fonts.gstatic.com/s/googlesanstext/v29/5aUp9-KzpRiLCAt4Unrc-xIKmCU5oPFTnmhjtg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + + @font-face { + font-family: 'Google Sans Flex'; + font-style: normal; + font-weight: 400 700; + src: url(https://fonts.gstatic.com/s/googlesansflex/v22/t5sEIQcYNIWbFgDgAAzZ34auoVyXkJCOvp3SFWJbN5hF8Ju1x6sKCyp0l9sI40swNJwInycYAJzz0m7kJ4qFQOJBOjLvDSndo0SKMpKSTzwliVdHAy4bxTDHg_ugnAakp8ubq8BIo1pdkkXZj4igdvKMDV8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + @font-face { font-family: 'Roboto Mono'; font-style: normal; @@ -461,8 +495,8 @@ .host-metadata-title { font-family: 'Google Sans', sans-serif; font-weight: 500; - font-size: 18px; - line-height: 24px; + font-size: 22px; + line-height: 28px; color: #202124; margin: 0; } @@ -484,13 +518,16 @@ .host-metadata-item .summary-item-label h4 { margin: 0; + font-family: 'Google Sans Text', sans-serif; font-size: 12px; font-weight: 500; color: #5F6368; white-space: nowrap; + text-transform: capitalize; } .host-metadata-item .summary-item-value { + font-family: 'Google Sans Flex', sans-serif; font-size: 16px; font-weight: 500; color: #202124; diff --git a/resources/test_packs/pilot/report_templates/summary.jinja b/resources/test_packs/pilot/report_templates/summary.jinja index 4584f5a4f..654dbdcb5 100644 --- a/resources/test_packs/pilot/report_templates/summary.jinja +++ b/resources/test_packs/pilot/report_templates/summary.jinja @@ -60,27 +60,19 @@
{% endmacro %} \ No newline at end of file diff --git a/resources/test_packs/qualification/report_templates/summary.jinja b/resources/test_packs/qualification/report_templates/summary.jinja index 733528572..5c14e27f8 100644 --- a/resources/test_packs/qualification/report_templates/summary.jinja +++ b/resources/test_packs/qualification/report_templates/summary.jinja @@ -58,27 +58,19 @@
{% endmacro %} From d262e2fec16d69c48d5a0df3d0f2ccf2965de069 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Fri, 18 Sep 2026 10:30:12 +0000 Subject: [PATCH 167/196] [TR] The Metadata is displayed in PDF not by design (#1651) * Changes draft risk profile icon * Adds fonts From 1b0a613546104a871537213ae77a7c872212e974 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Fri, 18 Sep 2026 13:05:34 +0000 Subject: [PATCH 168/196] Change filter button color (#1652) --- .../components/search/search.component.html | 7 +- .../components/search/search.component.scss | 15 ++- .../search/search.component.spec.ts | 93 ++++++++++++++++++- .../components/search/search.component.ts | 25 ++++- modules/ui/src/styles.scss | 13 ++- 5 files changed, 140 insertions(+), 13 deletions(-) diff --git a/modules/ui/src/app/pages/reports/components/search/search.component.html b/modules/ui/src/app/pages/reports/components/search/search.component.html index 0a5d272a8..afa3b2c1f 100644 --- a/modules/ui/src/app/pages/reports/components/search/search.component.html +++ b/modules/ui/src/app/pages/reports/components/search/search.component.html @@ -19,7 +19,7 @@ mat-icon-button #filterButton class="filter-button" - [class.active]="hasActiveFilters() || filterOpened" + [class.active]="isMenuOpened" (click)="menuTrigger.toggleMenu()" matTooltip="Filter reports" aria-label="Filter reports" @@ -39,7 +39,7 @@ #menuTrigger="matMenuTrigger" [matMenuTriggerFor]="filterMenu" (menuOpened)="isMenuOpened = true" - (menuClosed)="isMenuOpened = false">
+ (menuClosed)="onMenuClosed()">
@for (item of getActiveFilters(); track getChipTrackId(item)) { @@ -104,7 +104,8 @@ #filterMenu="matMenu" class="search-filter-menu" yPosition="below" - [overlapTrigger]="false"> + [overlapTrigger]="false" + (closed)="onMenuClosed($event)"> @for (menuItem of filterMenuItems; track menuItem.name) {