From 36ebe7bf8659acde40f0b0f83f5f3da515e91e58 Mon Sep 17 00:00:00 2001 From: MartinBelthle Date: Thu, 16 Jan 2025 15:48:54 +0100 Subject: [PATCH 01/38] feat(launcher): allow local launcher to work with xpress (#2251) - allow user to launch a simulation with xpress and presolve in local - use simulator 8.8.11 instead of 8.8.5 - Don't import failed outputs inside the study - separate logs in stdout and stderr as it was done with the slurm launcher - Persist the logs if the simulation fails (by introducing a local_workspace) --- antarest/core/config.py | 6 + .../launcher/adapters/abstractlauncher.py | 8 +- .../adapters/local_launcher/local_launcher.py | 161 +++++++++--------- .../adapters/slurm_launcher/slurm_launcher.py | 8 +- antarest/launcher/service.py | 8 +- .../model/filesystem/root/filestudytree.py | 6 +- .../rawstudy/model/filesystem/root/logs.py | 17 -- .../model/filesystem/root/output/output.py | 3 +- docs/developer-guide/install/1-CONFIG.md | 13 ++ resources/antares-desktop-fs/config.yaml | 1 + .../local_workspace/.placeholder | 0 resources/deploy/config.yaml | 1 + scripts/package_antares_web.sh | 2 +- tests/launcher/test_local_launcher.py | 58 ++++++- tests/storage/test_service.py | 40 ++--- 15 files changed, 177 insertions(+), 155 deletions(-) delete mode 100644 antarest/study/storage/rawstudy/model/filesystem/root/logs.py create mode 100644 resources/antares-desktop-fs/local_workspace/.placeholder diff --git a/antarest/core/config.py b/antarest/core/config.py index 7a69835119..02394efc55 100644 --- a/antarest/core/config.py +++ b/antarest/core/config.py @@ -263,6 +263,8 @@ class LocalConfig: enable_nb_cores_detection: bool = True nb_cores: NbCoresConfig = NbCoresConfig() time_limit: TimeLimitConfig = TimeLimitConfig() + xpress_dir: Optional[str] = None + local_workspace: Path = Path("./local_workspace") @classmethod def from_dict(cls, data: JSON) -> "LocalConfig": @@ -278,10 +280,14 @@ def from_dict(cls, data: JSON) -> "LocalConfig": nb_cores = data.get("nb_cores", asdict(defaults.nb_cores)) if enable_nb_cores_detection: nb_cores.update(cls._autodetect_nb_cores()) + xpress_dir = data.get("xpress_dir", defaults.xpress_dir) + local_workspace = Path(data["local_workspace"]) if "local_workspace" in data else defaults.local_workspace return cls( binaries={str(v): Path(p) for v, p in binaries.items()}, enable_nb_cores_detection=enable_nb_cores_detection, nb_cores=NbCoresConfig(**nb_cores), + xpress_dir=xpress_dir, + local_workspace=local_workspace, ) @classmethod diff --git a/antarest/launcher/adapters/abstractlauncher.py b/antarest/launcher/adapters/abstractlauncher.py index ac36176300..c25797eb66 100644 --- a/antarest/launcher/adapters/abstractlauncher.py +++ b/antarest/launcher/adapters/abstractlauncher.py @@ -21,7 +21,6 @@ from antarest.core.interfaces.cache import ICache from antarest.core.interfaces.eventbus import Event, EventChannelDirectory, EventType, IEventBus from antarest.core.model import PermissionInfo, PublicMode -from antarest.core.requests import RequestParameters from antarest.launcher.adapters.log_parser import LaunchProgressDTO from antarest.launcher.model import JobStatus, LauncherParametersDTO, LogType @@ -70,12 +69,7 @@ def __init__( @abstractmethod def run_study( - self, - study_uuid: str, - job_id: str, - version: SolverVersion, - launcher_parameters: LauncherParametersDTO, - params: RequestParameters, + self, study_uuid: str, job_id: str, version: SolverVersion, launcher_parameters: LauncherParametersDTO ) -> None: raise NotImplementedError() diff --git a/antarest/launcher/adapters/local_launcher/local_launcher.py b/antarest/launcher/adapters/local_launcher/local_launcher.py index 30560977a7..3c96f44931 100644 --- a/antarest/launcher/adapters/local_launcher/local_launcher.py +++ b/antarest/launcher/adapters/local_launcher/local_launcher.py @@ -10,17 +10,15 @@ # # This file is part of the Antares project. -import io import logging +import os import shutil import signal import subprocess -import tempfile import threading import time from pathlib import Path -from typing import Callable, Dict, Optional, Tuple, cast -from uuid import UUID +from typing import Any, Callable, Dict, List, Optional, Tuple from antares.study.version import SolverVersion from typing_extensions import override @@ -28,9 +26,8 @@ from antarest.core.config import Config from antarest.core.interfaces.cache import ICache from antarest.core.interfaces.eventbus import IEventBus -from antarest.core.requests import RequestParameters from antarest.launcher.adapters.abstractlauncher import AbstractLauncher, LauncherCallbacks, LauncherInitException -from antarest.launcher.adapters.log_manager import follow +from antarest.launcher.adapters.log_manager import LogTailManager from antarest.launcher.model import JobStatus, LauncherParametersDTO, LogType logger = logging.getLogger(__name__) @@ -51,7 +48,11 @@ def __init__( super().__init__(config, callbacks, event_bus, cache) if self.config.launcher.local is None: raise LauncherInitException("Missing parameter 'launcher.local'") - self.tmpdir = config.storage.tmp_dir + self.local_workspace = self.config.launcher.local.local_workspace + logs_path = self.local_workspace / "LOGS" + logs_path.mkdir(parents=True, exist_ok=True) + self.log_directory = logs_path + self.log_tail_manager = LogTailManager(self.local_workspace) self.job_id_to_study_id: Dict[str, Tuple[str, Path, subprocess.Popen]] = {} # type: ignore self.logs: Dict[str, str] = {} @@ -76,12 +77,7 @@ def _select_best_binary(self, version: str) -> Path: @override def run_study( - self, - study_uuid: str, - job_id: str, - version: SolverVersion, - launcher_parameters: LauncherParametersDTO, - params: RequestParameters, + self, study_uuid: str, job_id: str, version: SolverVersion, launcher_parameters: LauncherParametersDTO ) -> None: antares_solver_path = self._select_best_binary(f"{version:ddd}") @@ -98,68 +94,37 @@ def run_study( ) job.start() - def _get_job_final_output_path(self, job_id: str) -> Path: - return self.config.storage.tmp_dir / f"antares_solver-{job_id}.log" - def _compute( self, antares_solver_path: Path, study_uuid: str, - uuid: UUID, + job_id: str, launcher_parameters: LauncherParametersDTO, ) -> None: - end = False - - def stop_reading_output() -> bool: - if end and str(uuid) in self.logs: - with open( - self._get_job_final_output_path(str(uuid)), - "w", - ) as log_file: - log_file.write(self.logs[str(uuid)]) - del self.logs[str(uuid)] - return end - - tmp_path = tempfile.mkdtemp(prefix="local_launch_", dir=str(self.tmpdir)) - export_path = Path(tmp_path) / "export" + export_path = self.local_workspace / job_id + logs_path = self.log_directory / job_id + logs_path.mkdir() try: - self.callbacks.export_study(str(uuid), study_uuid, export_path, launcher_parameters) - - args = [ - str(antares_solver_path), - f"--force-parallel={launcher_parameters.nb_cpu}", - str(export_path), - ] - process = subprocess.Popen( - args, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - universal_newlines=True, - encoding="utf-8", - ) - self.job_id_to_study_id[str(uuid)] = ( - study_uuid, - export_path, - process, - ) - self.callbacks.update_status( - str(uuid), - JobStatus.RUNNING, - None, - None, - ) + self.callbacks.export_study(job_id, study_uuid, export_path, launcher_parameters) + + simulator_args, environment_variables = self._parse_launcher_options(launcher_parameters) + new_args = [str(antares_solver_path)] + simulator_args + [str(export_path)] + + std_err_file = logs_path / f"{job_id}-err.log" + std_out_file = logs_path / f"{job_id}-out.log" + with open(std_err_file, "w") as err_file, open(std_out_file, "w") as out_file: + process = subprocess.Popen( + new_args, + env=environment_variables, + stdout=out_file, + stderr=err_file, + universal_newlines=True, + encoding="utf-8", + ) + self.job_id_to_study_id[job_id] = (study_uuid, export_path, process) + self.callbacks.update_status(job_id, JobStatus.RUNNING, None, None) - thread = threading.Thread( - target=lambda: follow( - cast(io.StringIO, process.stdout), - self.create_update_log(str(uuid)), - stop_reading_output, - None, - ), - name=f"{self.__class__.__name__}-LogsWatcher", - daemon=True, - ) - thread.start() + self.log_tail_manager.track(std_out_file, self.create_update_log(job_id)) while process.poll() is None: time.sleep(1) @@ -170,32 +135,59 @@ def stop_reading_output() -> bool: subprocess.run(["Rscript", "post-processing.R"], cwd=export_path) output_id: Optional[str] = None - try: - output_id = self.callbacks.import_output(str(uuid), export_path / "output", {}) - except Exception as e: - logger.error( - f"Failed to import output for study {study_uuid} located at {export_path}", - exc_info=e, - ) - del self.job_id_to_study_id[str(uuid)] + if process.returncode == 0: + # The job succeed we need to import the output + try: + launcher_logs = self._import_launcher_logs(job_id) + output_id = self.callbacks.import_output(job_id, export_path / "output", launcher_logs) + except Exception as e: + logger.error( + f"Failed to import output for study {study_uuid} located at {export_path}", + exc_info=e, + ) + del self.job_id_to_study_id[job_id] self.callbacks.update_status( - str(uuid), + job_id, JobStatus.FAILED if process.returncode != 0 or not output_id else JobStatus.SUCCESS, None, output_id, ) except Exception as e: - logger.error(f"Unexpected error happened during launch {uuid}", exc_info=e) + logger.error(f"Unexpected error happened during launch {job_id}", exc_info=e) self.callbacks.update_status( - str(uuid), + job_id, JobStatus.FAILED, str(e), None, ) finally: - logger.info(f"Removing launch {uuid} export path at {tmp_path}") - end = True - shutil.rmtree(tmp_path) + logger.info(f"Removing launch {job_id} export path at {export_path}") + shutil.rmtree(export_path, ignore_errors=True) + + def _import_launcher_logs(self, job_id: str) -> Dict[str, List[Path]]: + logs_path = self.log_directory / job_id + return { + "antares-out.log": [logs_path / f"{job_id}-out.log"], + "antares-err.log": [logs_path / f"{job_id}-err.log"], + } + + def _parse_launcher_options(self, launcher_parameters: LauncherParametersDTO) -> Tuple[List[str], Dict[str, Any]]: + simulator_args = [f"--force-parallel={launcher_parameters.nb_cpu}"] + environment_variables = os.environ.copy() + if launcher_parameters.other_options: + solver = [] + if "xpress" in launcher_parameters.other_options: + solver = ["--use-ortools", "--ortools-solver=xpress"] + if xpress_dir_path := self.config.launcher.local.xpress_dir: # type: ignore + environment_variables["XPRESSDIR"] = xpress_dir_path + environment_variables["XPRESS"] = environment_variables["XPRESSDIR"] + os.sep + "bin" + elif "coin" in launcher_parameters.other_options: + solver = ["--use-ortools", "--ortools-solver=coin"] + if solver: + simulator_args += solver + if "presolve" in launcher_parameters.other_options: + simulator_args += ["--solver-parameters", "PRESOLVE 1"] + return simulator_args, environment_variables @override def create_update_log(self, job_id: str) -> Callable[[str], None]: @@ -210,10 +202,11 @@ def append_to_log(log_line: str) -> None: @override def get_log(self, job_id: str, log_type: LogType) -> Optional[str]: - if job_id in self.job_id_to_study_id and job_id in self.logs: + if job_id in self.job_id_to_study_id and job_id in self.logs and log_type == LogType.STDOUT: return self.logs[job_id] - elif self._get_job_final_output_path(job_id).exists(): - return self._get_job_final_output_path(job_id).read_text() + job_path = self.log_directory / job_id / f"{job_id}-{log_type.to_suffix()}" + if job_path.exists(): + return job_path.read_text() return None @override diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index 0506ad5694..810581e561 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -34,7 +34,6 @@ from antarest.core.interfaces.cache import ICache from antarest.core.interfaces.eventbus import Event, EventType, IEventBus from antarest.core.model import PermissionInfo, PublicMode -from antarest.core.requests import RequestParameters from antarest.core.utils.archives import unzip from antarest.core.utils.utils import assert_this from antarest.launcher.adapters.abstractlauncher import AbstractLauncher, LauncherCallbacks, LauncherInitException @@ -592,12 +591,7 @@ def _apply_params(self, launcher_params: LauncherParametersDTO) -> argparse.Name @override def run_study( - self, - study_uuid: str, - job_id: str, - version: SolverVersion, - launcher_parameters: LauncherParametersDTO, - params: RequestParameters, + self, study_uuid: str, job_id: str, version: SolverVersion, launcher_parameters: LauncherParametersDTO ) -> None: thread = threading.Thread( target=self._run_study, diff --git a/antarest/launcher/service.py b/antarest/launcher/service.py index 7032e388c0..c919321a39 100644 --- a/antarest/launcher/service.py +++ b/antarest/launcher/service.py @@ -251,13 +251,7 @@ def run_study( ) self.job_result_repository.save(job_status) - self.launchers[launcher].run_study( - study_uuid, - job_uuid, - solver_version, - launcher_parameters, - params, - ) + self.launchers[launcher].run_study(study_uuid, job_uuid, solver_version, launcher_parameters) self.event_bus.push( Event( diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py index 409c8aac7f..592b0309fc 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py @@ -14,12 +14,12 @@ from typing_extensions import override +from antarest.study.storage.rawstudy.model.filesystem.bucket_node import BucketNode from antarest.study.storage.rawstudy.model.filesystem.folder_node import FolderNode from antarest.study.storage.rawstudy.model.filesystem.inode import TREE from antarest.study.storage.rawstudy.model.filesystem.root.desktop import Desktop from antarest.study.storage.rawstudy.model.filesystem.root.input.input import Input from antarest.study.storage.rawstudy.model.filesystem.root.layers.layers import Layers -from antarest.study.storage.rawstudy.model.filesystem.root.logs import Logs from antarest.study.storage.rawstudy.model.filesystem.root.output.output import Output from antarest.study.storage.rawstudy.model.filesystem.root.settings.settings import Settings from antarest.study.storage.rawstudy.model.filesystem.root.study_antares import StudyAntares @@ -40,11 +40,13 @@ def build(self) -> TREE: "study": StudyAntares(self.context, self.config.next_file("study.antares")), "settings": Settings(self.context, self.config.next_file("settings")), "layers": Layers(self.context, self.config.next_file("layers")), - "logs": Logs(self.context, self.config.next_file("logs")), "input": Input(self.context, self.config.next_file("input")), "user": User(self.context, self.config.next_file("user")), } + if (self.config.path / "logs").exists(): + children["logs"] = BucketNode(self.context, self.config.next_file("logs")) + if self.config.outputs: output_config = self.config.next_file("output") output_config.path = self.config.output_path or output_config.path diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/logs.py b/antarest/study/storage/rawstudy/model/filesystem/root/logs.py deleted file mode 100644 index f78c68d303..0000000000 --- a/antarest/study/storage/rawstudy/model/filesystem/root/logs.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) -# -# See AUTHORS.txt -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# SPDX-License-Identifier: MPL-2.0 -# -# This file is part of the Antares project. - -from antarest.study.storage.rawstudy.model.filesystem.bucket_node import BucketNode - - -class Logs(BucketNode): - pass diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py index f33ed11bb8..5a451d5cf3 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py @@ -29,5 +29,6 @@ def build(self) -> TREE: for i, s in self.config.outputs.items() } - children["logs"] = BucketNode(self.context, self.config.next_file("logs")) + if (self.config.path / "logs").exists(): + children["logs"] = BucketNode(self.context, self.config.next_file("logs")) return children diff --git a/docs/developer-guide/install/1-CONFIG.md b/docs/developer-guide/install/1-CONFIG.md index bad109d17a..49c2b791ed 100644 --- a/docs/developer-guide/install/1-CONFIG.md +++ b/docs/developer-guide/install/1-CONFIG.md @@ -388,6 +388,19 @@ it is instantiated on shared servers using `slurm`. > NOTE: As you can see, you can use newer solver for older study version thanks to the solver retro-compatibility +### **xpress_dir** + +- **Type:** str +- **Default value:** None +- **Description:** Path towards your xpress_dir. Needed if you want to launch a study with xpress. If the environment +variables "XPRESS_DIR" and "XPRESS" are set on your local environment it should work without setting them. + +### **local_workspace** + +- **Type:** Path +- **Default value:** `./local_workspace` +- **Description:** Antares Web uses this directory to run the simulations. + ## **slurm** SLURM (Simple Linux Utility for Resource Management) is used to interact with a remote environment (for Antares it's diff --git a/resources/antares-desktop-fs/config.yaml b/resources/antares-desktop-fs/config.yaml index c151490a47..31c8794f15 100644 --- a/resources/antares-desktop-fs/config.yaml +++ b/resources/antares-desktop-fs/config.yaml @@ -22,6 +22,7 @@ launcher: local: binaries: VER: ANTARES_SOLVER_PATH + local_workspace: ./local_workspace # slurm: # local_workspace: /path/to/slurm_workspace # Path to the local SLURM workspace diff --git a/resources/antares-desktop-fs/local_workspace/.placeholder b/resources/antares-desktop-fs/local_workspace/.placeholder new file mode 100644 index 0000000000..e69de29bb2 diff --git a/resources/deploy/config.yaml b/resources/deploy/config.yaml index 08831198ce..be61caeb29 100644 --- a/resources/deploy/config.yaml +++ b/resources/deploy/config.yaml @@ -22,6 +22,7 @@ launcher: local: binaries: VER: ANTARES_SOLVER_PATH + local_workspace: ./local_workspace # slurm: # local_workspace: /path/to/slurm_workspace # Path to the local SLURM workspace diff --git a/scripts/package_antares_web.sh b/scripts/package_antares_web.sh index 9743fbc049..c51f217f95 100755 --- a/scripts/package_antares_web.sh +++ b/scripts/package_antares_web.sh @@ -9,7 +9,7 @@ set -e ANTARES_SOLVER_VERSION="8.8" -ANTARES_SOLVER_FULL_VERSION="8.8.5" +ANTARES_SOLVER_FULL_VERSION="8.8.11" ANTARES_SOLVER_VERSION_INT="880" SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) diff --git a/tests/launcher/test_local_launcher.py b/tests/launcher/test_local_launcher.py index 0bad3cdd74..84d04b2297 100644 --- a/tests/launcher/test_local_launcher.py +++ b/tests/launcher/test_local_launcher.py @@ -32,7 +32,7 @@ def launcher_config(tmp_path: Path) -> Config: Fixture to create a launcher config with a local launcher. """ solver_path = tmp_path.joinpath(SOLVER_NAME) - data = {"binaries": {"700": solver_path}, "enable_nb_cores_detection": True} + data = {"binaries": {"700": solver_path}, "enable_nb_cores_detection": True, "local_workspace": tmp_path} return Config(launcher=LauncherConfig(local=LocalConfig.from_dict(data))) @@ -79,8 +79,8 @@ def test_compute(tmp_path: Path, launcher_config: Config): ) solver_path.chmod(0o775) - study_id = uuid.uuid4() - local_launcher.job_id_to_study_id = {str(study_id): ("study-id", tmp_path / "run", Mock())} + study_id = str(uuid.uuid4()) + local_launcher.job_id_to_study_id = {study_id: ("study-id", tmp_path / "run", Mock())} local_launcher.callbacks.import_output.return_value = "some output" launcher_parameters = LauncherParametersDTO( adequacy_patch=None, @@ -97,21 +97,65 @@ def test_compute(tmp_path: Path, launcher_config: Config): local_launcher._compute( antares_solver_path=solver_path, study_uuid="study-id", - uuid=study_id, + job_id=study_id, launcher_parameters=launcher_parameters, ) # noinspection PyUnresolvedReferences local_launcher.callbacks.update_status.assert_has_calls( [ - call(str(study_id), JobStatus.RUNNING, None, None), - call(str(study_id), JobStatus.SUCCESS, None, "some output"), + call(study_id, JobStatus.RUNNING, None, None), + call(study_id, JobStatus.SUCCESS, None, "some output"), ] ) @pytest.mark.unit_test -def test_select_best_binary(tmp_path: Path): +def test_parse_launcher_arguments(launcher_config: Config): + local_launcher = LocalLauncher(launcher_config, callbacks=Mock(), event_bus=Mock(), cache=Mock()) + launcher_parameters = LauncherParametersDTO(nb_cpu=4) + sim_args, _ = local_launcher._parse_launcher_options(launcher_parameters) + assert sim_args == ["--force-parallel=4"] + + launcher_parameters = LauncherParametersDTO(nb_cpu=8) + sim_args, _ = local_launcher._parse_launcher_options(launcher_parameters) + assert sim_args == ["--force-parallel=8"] + + launcher_parameters.other_options = "coin" + sim_args, _ = local_launcher._parse_launcher_options(launcher_parameters) + assert sim_args == ["--force-parallel=8", "--use-ortools", "--ortools-solver=coin"] + + launcher_parameters.other_options = "xpress" + sim_args, blabla = local_launcher._parse_launcher_options(launcher_parameters) + assert sim_args == ["--force-parallel=8", "--use-ortools", "--ortools-solver=xpress"] + + launcher_parameters.other_options = "xpress presolve" + sim_args, _ = local_launcher._parse_launcher_options(launcher_parameters) + assert sim_args == [ + "--force-parallel=8", + "--use-ortools", + "--ortools-solver=xpress", + "--solver-parameters", + "PRESOLVE 1", + ] + + os.environ["XPRESS_DIR"] = "fake_path_for_test" + launcher_parameters.other_options = "xpress presolve" + _, env_variables = local_launcher._parse_launcher_options(launcher_parameters) + assert env_variables["XPRESS_DIR"] == "fake_path_for_test" + + +@pytest.mark.unit_test +def test_parse_xpress_dir(tmp_path: Path): + data = {"xpress_dir": "fake_path_for_test"} + launcher_config = Config(launcher=LauncherConfig(local=LocalConfig.from_dict(data))) + local_launcher = LocalLauncher(launcher_config, callbacks=Mock(), event_bus=Mock(), cache=Mock()) + _, env_variables = local_launcher._parse_launcher_options(LauncherParametersDTO()) + assert env_variables["XPRESS_DIR"] == "fake_path_for_test" + + +@pytest.mark.unit_test +def test_select_best_binary(): binaries = { "700": Path("700"), "800": Path("800"), diff --git a/tests/storage/test_service.py b/tests/storage/test_service.py index 8359bd063f..1c3986a3c7 100644 --- a/tests/storage/test_service.py +++ b/tests/storage/test_service.py @@ -1588,31 +1588,28 @@ def test_get_save_logs(tmp_path: Path) -> None: (output_path / "output_id").mkdir() (output_path / "logs").mkdir() - assert ( - service.get_logs( - study_id, - "output_id", - "job_id", - True, - RequestParameters(user=DEFAULT_ADMIN_USER), - ) - == "" - ) + possible_log_paths = [ + output_path / "output_id" / "antares-out.log", + output_path / "output_id" / "simulation.log", + output_path / "logs" / "job_id-out.log", + output_path / "logs" / "output_id-out.log", + ] - (output_path / "output_id" / "antares-out.log").write_text("some log 2") - assert ( - service.get_logs( - study_id, - "output_id", - "job_id", - False, - RequestParameters(user=DEFAULT_ADMIN_USER), + for log_path in possible_log_paths: + log_path.write_text("some log 2") + assert ( + service.get_logs( + study_id, + "output_id", + "job_id", + False, + RequestParameters(user=DEFAULT_ADMIN_USER), + ) + == "some log 2" ) - == "some log 2" - ) + log_path.unlink() service.save_logs(study_id, "job_id", "out.log", "some log") - assert ( service.get_logs( study_id, @@ -1625,7 +1622,6 @@ def test_get_save_logs(tmp_path: Path) -> None: ) service.save_logs(study_id, "job_id", "err.log", "some log 3") - assert ( service.get_logs( study_id, From 7f74b6adb4889d0ed966aace7986d911b7e3931f Mon Sep 17 00:00:00 2001 From: Sylvain Leclerc Date: Thu, 16 Jan 2025 16:14:14 +0100 Subject: [PATCH 02/38] feat(installer): update installer for v2.19 (#2297) --- installer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer b/installer index 118c9c5d85..b0f6a7f9d2 160000 --- a/installer +++ b/installer @@ -1 +1 @@ -Subproject commit 118c9c5d85a0b7b0d47e6b899c7c4ed15caaa7bd +Subproject commit b0f6a7f9d29a7f882385c4bd098f843ba0255931 From dada67d7e2f12eee49c765d2eb6b24ed39bb2e50 Mon Sep 17 00:00:00 2001 From: MartinBelthle Date: Thu, 16 Jan 2025 18:02:39 +0100 Subject: [PATCH 03/38] feat(bc): add constraint duplication endpoint (#2295) --- .../business/areas/st_storage_management.py | 2 +- .../business/areas/thermal_management.py | 2 +- .../business/binding_constraint_management.py | 69 ++++++++++++++ antarest/study/web/study_data_blueprint.py | 21 +++++ .../test_binding_constraints.py | 90 +++++++++++++++++++ 5 files changed, 182 insertions(+), 2 deletions(-) diff --git a/antarest/study/business/areas/st_storage_management.py b/antarest/study/business/areas/st_storage_management.py index b0ef5322ab..962ce5d7f1 100644 --- a/antarest/study/business/areas/st_storage_management.py +++ b/antarest/study/business/areas/st_storage_management.py @@ -548,7 +548,7 @@ def duplicate_cluster(self, study: Study, area_id: str, source_id: str, new_clus The duplicated cluster configuration. Raises: - ClusterAlreadyExists: If a cluster with the new name already exists in the area. + DuplicateSTStorage: If a cluster with the new name already exists in the area. """ new_id = transform_name_to_id(new_cluster_name) lower_new_id = new_id.lower() diff --git a/antarest/study/business/areas/thermal_management.py b/antarest/study/business/areas/thermal_management.py index cbd0f7e997..13380b54b3 100644 --- a/antarest/study/business/areas/thermal_management.py +++ b/antarest/study/business/areas/thermal_management.py @@ -429,7 +429,7 @@ def duplicate_cluster( The duplicated cluster configuration. Raises: - ClusterAlreadyExists: If a cluster with the new name already exists in the area. + DuplicateThermalCluster: If a cluster with the new name already exists in the area. """ new_id = transform_name_to_id(new_cluster_name, lower=False) lower_new_id = new_id.lower() diff --git a/antarest/study/business/binding_constraint_management.py b/antarest/study/business/binding_constraint_management.py index 19e9c0f782..7c4175ff53 100644 --- a/antarest/study/business/binding_constraint_management.py +++ b/antarest/study/business/binding_constraint_management.py @@ -795,6 +795,75 @@ def create_binding_constraint( new_constraint["id"] = bc_id return self.constraint_model_adapter(new_constraint, version) + def duplicate_binding_constraint(self, study: Study, source_id: str, new_constraint_name: str) -> ConstraintOutput: + """ + Creates a duplicate constraint with a new name. + + Args: + study: The study in which the cluster will be duplicated. + source_id: The identifier of the constraint to be duplicated. + new_constraint_name: The new name for the duplicated constraint. + + Returns: + The duplicated constraint configuration. + + Raises: + DuplicateConstraintName: If a constraint with the new name already exists in the study. + """ + + # Checks if the new constraint already exists + new_constraint_id = transform_name_to_id(new_constraint_name) + existing_constraints = self.get_binding_constraints(study) + if new_constraint_id in {bc.id for bc in existing_constraints}: + raise DuplicateConstraintName( + f"A binding constraint with the same name already exists: {new_constraint_name}." + ) + + # Retrieval of the source constraint properties + source_constraint = next(iter(bc for bc in existing_constraints if bc.id == source_id), None) + if not source_constraint: + raise BindingConstraintNotFound(f"Binding constraint '{source_id}' not found") + + new_constraint = { + "name": new_constraint_name, + **source_constraint.model_dump(mode="json", exclude={"terms", "name", "id"}), + } + args = { + **new_constraint, + "command_context": self.storage_service.variant_study_service.command_factory.command_context, + "study_version": StudyVersion.parse(study.version), + } + if source_constraint.terms: + args["coeffs"] = self.terms_to_coeffs(source_constraint.terms) + + # Retrieval of the source constraint matrices + file_study = self.storage_service.get_storage(study).get_raw(study) + if file_study.config.version < STUDY_VERSION_8_7: + matrix = file_study.tree.get(["input", "bindingconstraints", source_id]) + args["values"] = matrix["data"] + else: + correspondence_map = { + "lt": TermMatrices.LESS.value, + "gt": TermMatrices.GREATER.value, + "eq": TermMatrices.EQUAL.value, + } + source_matrices = OPERATOR_MATRIX_FILE_MAP[source_constraint.operator] + for matrix_name in source_matrices: + matrix = file_study.tree.get(["input", "bindingconstraints", matrix_name.format(bc_id=source_id)])[ + "data" + ] + command_attribute = correspondence_map[matrix_name.removeprefix("{bc_id}_")] + args[command_attribute] = matrix + + # Creates and applies constraint + command = CreateBindingConstraint(**args) + execute_or_add_commands(study, file_study, [command], self.storage_service) + + # Returns the new constraint + source_constraint.name = new_constraint_name + source_constraint.id = new_constraint_id + return source_constraint + def update_binding_constraint( self, study: Study, diff --git a/antarest/study/web/study_data_blueprint.py b/antarest/study/web/study_data_blueprint.py index 9f267df774..6fa84387ee 100644 --- a/antarest/study/web/study_data_blueprint.py +++ b/antarest/study/web/study_data_blueprint.py @@ -1340,6 +1340,27 @@ def create_binding_constraint( study = study_service.check_study_access(uuid, StudyPermissionType.READ, params) return study_service.binding_constraint_manager.create_binding_constraint(study, data) + @bp.post( + "/studies/{uuid}/bindingconstraints/{binding_constraint_id}", + tags=[APITag.study_data], + summary="Duplicates a given binding constraint", + ) + def duplicate_binding_constraint( + uuid: str, + binding_constraint_id: str, + new_constraint_name: str, + current_user: JWTUser = Depends(auth.get_current_user), + ) -> ConstraintOutput: + logger.info( + f"Duplicates constraint {binding_constraint_id} for study {uuid}", + extra={"user": current_user.id}, + ) + params = RequestParameters(user=current_user) + study = study_service.check_study_access(uuid, StudyPermissionType.WRITE, params) + return study_service.binding_constraint_manager.duplicate_binding_constraint( + study, binding_constraint_id, new_constraint_name + ) + @bp.delete( "/studies/{uuid}/bindingconstraints/{binding_constraint_id}", tags=[APITag.study_data], diff --git a/tests/integration/study_data_blueprint/test_binding_constraints.py b/tests/integration/study_data_blueprint/test_binding_constraints.py index c5e8d17b5b..e0f19a21cc 100644 --- a/tests/integration/study_data_blueprint/test_binding_constraints.py +++ b/tests/integration/study_data_blueprint/test_binding_constraints.py @@ -462,10 +462,61 @@ def test_lifecycle__nominal(self, client: TestClient, user_access_token: str, st assert len(dataframe["index"]) == 366 assert len(dataframe["columns"]) == 3 # less, equal, greater + # ============================= + # CONSTRAINT DUPLICATION + # ============================= + + # Change source constraint matrix to ensure it will be copied correctly + new_matrix = np.ones((366, 3)).tolist() + res = client.post( + f"/v1/studies/{study_id}/raw", params={"path": f"input/bindingconstraints/{bc_id}"}, json=new_matrix + ) + res.raise_for_status() + + # Get the source constraint properties to ensure there are copied correctly + res = client.get(f"/v1/studies/{study_id}/bindingconstraints/{bc_id}") + res.raise_for_status() + current_constraint = res.json() + current_constraint.pop("name") + current_constraint.pop("id") + + # Duplicates the constraint + duplicated_name = "BC_4" + res = client.post( + f"/v1/studies/{study_id}/bindingconstraints/{bc_id}", params={"new_constraint_name": duplicated_name} + ) + res.raise_for_status() + duplicated_constraint = res.json() + + # Asserts the duplicated constraint has the right name and the right properties + assert duplicated_constraint.pop("name") == duplicated_name + new_id = duplicated_constraint.pop("id") + assert current_constraint == duplicated_constraint + + # Asserts the matrix is duplicated correctly + res = client.get(f"/v1/studies/{study_id}/raw", params={"path": f"input/bindingconstraints/{new_id}"}) + res.raise_for_status() + assert res.json()["data"] == new_matrix + # ============================= # ERRORS # ============================= + # Asserts duplication fails if given an non-exisiting constraint + fake_name = "fake_name" + res = client.post( + f"/v1/studies/{study_id}/bindingconstraints/{fake_name}", params={"new_constraint_name": "aa"} + ) + assert res.status_code == 404 + assert res.json()["exception"] == "BindingConstraintNotFound" + assert res.json()["description"] == f"Binding constraint '{fake_name}' not found" + + # Asserts duplication fails if given an already existing name + res = client.post(f"/v1/studies/{study_id}/bindingconstraints/{bc_id}", params={"new_constraint_name": bc_id}) + assert res.status_code == 409 + assert res.json()["exception"] == "DuplicateConstraintName" + assert res.json()["description"] == f"A binding constraint with the same name already exists: {bc_id}." + # Assert empty name res = client.post( f"/v1/studies/{study_id}/bindingconstraints", @@ -921,6 +972,45 @@ def test_for_version_870(self, client: TestClient, user_access_token: str, study binding_constraints_list = preparer.get_binding_constraints(study_id) assert len(binding_constraints_list) == 2 + # ============================= + # CONSTRAINT DUPLICATION + # ============================= + + # Change source constraint matrix to ensure it will be copied correctly + new_matrix = np.ones((366, 1)).tolist() + res = client.post( + f"/v1/studies/{study_id}/raw", + params={"path": f"input/bindingconstraints/{bc_id_w_matrix}_lt"}, + json=new_matrix, + ) + res.raise_for_status() + + # Get the source constraint properties to ensure there are copied correctly + res = client.get(f"/v1/studies/{study_id}/bindingconstraints/{bc_id_w_matrix}") + res.raise_for_status() + current_constraint = res.json() + current_constraint.pop("name") + current_constraint.pop("id") + + # Duplicates the constraint + duplicated_name = "BC_4" + res = client.post( + f"/v1/studies/{study_id}/bindingconstraints/{bc_id_w_matrix}", + params={"new_constraint_name": duplicated_name}, + ) + res.raise_for_status() + duplicated_constraint = res.json() + + # Asserts the duplicated constraint has the right name and the right properties + assert duplicated_constraint.pop("name") == duplicated_name + new_id = duplicated_constraint.pop("id") + assert current_constraint == duplicated_constraint + + # Asserts the matrix is duplicated correctly + res = client.get(f"/v1/studies/{study_id}/raw", params={"path": f"input/bindingconstraints/{new_id}_lt"}) + res.raise_for_status() + assert res.json()["data"] == new_matrix + # ============================= # ERRORS # ============================= From abc882cc1f367d10034763b88d1d87b767a8fbe7 Mon Sep 17 00:00:00 2001 From: Theo Pascoli <48944759+TheoPascoli@users.noreply.github.com> Date: Fri, 17 Jan 2025 10:13:28 +0100 Subject: [PATCH 04/38] feat: happy new year (#2299) Change all headers to 2025 --- antarest/__init__.py | 2 +- antarest/core/__init__.py | 2 +- antarest/core/application.py | 2 +- antarest/core/cache/__init__.py | 2 +- antarest/core/cache/business/__init__.py | 2 +- antarest/core/cache/business/local_chache.py | 2 +- antarest/core/cache/business/redis_cache.py | 2 +- antarest/core/cache/main.py | 2 +- antarest/core/cli.py | 2 +- antarest/core/config.py | 2 +- antarest/core/configdata/__init__.py | 2 +- antarest/core/configdata/model.py | 2 +- antarest/core/configdata/repository.py | 2 +- antarest/core/core_blueprint.py | 2 +- antarest/core/exceptions.py | 2 +- antarest/core/filesystem_blueprint.py | 2 +- antarest/core/filetransfer/__init__.py | 2 +- antarest/core/filetransfer/main.py | 2 +- antarest/core/filetransfer/model.py | 2 +- antarest/core/filetransfer/repository.py | 2 +- antarest/core/filetransfer/service.py | 2 +- antarest/core/filetransfer/web.py | 2 +- antarest/core/interfaces/__init__.py | 2 +- antarest/core/interfaces/cache.py | 2 +- antarest/core/interfaces/eventbus.py | 2 +- antarest/core/interfaces/service.py | 2 +- antarest/core/jwt.py | 2 +- antarest/core/logging/__init__.py | 2 +- antarest/core/logging/utils.py | 2 +- antarest/core/maintenance/__init__.py | 2 +- antarest/core/maintenance/main.py | 2 +- antarest/core/maintenance/model.py | 2 +- antarest/core/maintenance/repository.py | 2 +- antarest/core/maintenance/service.py | 2 +- antarest/core/maintenance/web.py | 2 +- antarest/core/model.py | 2 +- antarest/core/permissions.py | 2 +- antarest/core/persistence.py | 2 +- antarest/core/requests.py | 2 +- antarest/core/roles.py | 2 +- antarest/core/serialization/__init__.py | 2 +- antarest/core/swagger.py | 2 +- antarest/core/tasks/__init__.py | 2 +- antarest/core/tasks/main.py | 2 +- antarest/core/tasks/model.py | 2 +- antarest/core/tasks/repository.py | 2 +- antarest/core/tasks/service.py | 2 +- antarest/core/tasks/web.py | 2 +- antarest/core/utils/__init__.py | 2 +- antarest/core/utils/archives.py | 2 +- antarest/core/utils/string.py | 2 +- antarest/core/utils/utils.py | 2 +- antarest/core/utils/web.py | 2 +- antarest/core/version_info.py | 2 +- antarest/dbmodel.py | 2 +- antarest/desktop/__init__.py | 2 +- antarest/desktop/systray_app.py | 2 +- antarest/eventbus/__init__.py | 2 +- antarest/eventbus/business/__init__.py | 2 +- antarest/eventbus/business/interfaces.py | 2 +- antarest/eventbus/business/local_eventbus.py | 2 +- antarest/eventbus/business/redis_eventbus.py | 2 +- antarest/eventbus/main.py | 2 +- antarest/eventbus/service.py | 2 +- antarest/eventbus/web.py | 2 +- antarest/front.py | 2 +- antarest/gui.py | 2 +- antarest/launcher/__init__.py | 2 +- antarest/launcher/adapters/__init__.py | 2 +- antarest/launcher/adapters/abstractlauncher.py | 2 +- antarest/launcher/adapters/factory_launcher.py | 2 +- antarest/launcher/adapters/local_launcher/__init__.py | 2 +- antarest/launcher/adapters/local_launcher/local_launcher.py | 2 +- antarest/launcher/adapters/log_manager.py | 2 +- antarest/launcher/adapters/log_parser.py | 2 +- antarest/launcher/adapters/slurm_launcher/__init__.py | 2 +- antarest/launcher/adapters/slurm_launcher/slurm_launcher.py | 2 +- antarest/launcher/extensions/__init__.py | 2 +- antarest/launcher/extensions/adequacy_patch/__init__.py | 2 +- antarest/launcher/extensions/adequacy_patch/extension.py | 2 +- antarest/launcher/extensions/interface.py | 2 +- antarest/launcher/main.py | 2 +- antarest/launcher/model.py | 2 +- antarest/launcher/repository.py | 2 +- antarest/launcher/service.py | 2 +- antarest/launcher/ssh_client.py | 2 +- antarest/launcher/ssh_config.py | 2 +- antarest/launcher/web.py | 2 +- antarest/login/__init__.py | 2 +- antarest/login/auth.py | 2 +- antarest/login/ldap.py | 2 +- antarest/login/main.py | 2 +- antarest/login/model.py | 2 +- antarest/login/repository.py | 2 +- antarest/login/service.py | 2 +- antarest/login/utils.py | 2 +- antarest/login/web.py | 2 +- antarest/main.py | 2 +- antarest/matrixstore/__init__.py | 2 +- antarest/matrixstore/exceptions.py | 2 +- antarest/matrixstore/main.py | 2 +- antarest/matrixstore/matrix_editor.py | 2 +- antarest/matrixstore/matrix_garbage_collector.py | 2 +- antarest/matrixstore/model.py | 2 +- antarest/matrixstore/repository.py | 2 +- antarest/matrixstore/service.py | 2 +- antarest/matrixstore/uri_resolver_service.py | 2 +- antarest/matrixstore/web.py | 2 +- antarest/service_creator.py | 2 +- antarest/singleton_services.py | 2 +- antarest/study/__init__.py | 2 +- antarest/study/business/__init__.py | 2 +- antarest/study/business/adequacy_patch_management.py | 2 +- antarest/study/business/advanced_parameters_management.py | 2 +- antarest/study/business/aggregator_management.py | 2 +- antarest/study/business/all_optional_meta.py | 2 +- antarest/study/business/allocation_management.py | 2 +- antarest/study/business/area_management.py | 2 +- antarest/study/business/areas/__init__.py | 2 +- antarest/study/business/areas/hydro_management.py | 2 +- antarest/study/business/areas/properties_management.py | 2 +- antarest/study/business/areas/renewable_management.py | 2 +- antarest/study/business/areas/st_storage_management.py | 2 +- antarest/study/business/areas/thermal_management.py | 2 +- antarest/study/business/binding_constraint_management.py | 2 +- antarest/study/business/config_management.py | 2 +- antarest/study/business/correlation_management.py | 2 +- antarest/study/business/district_manager.py | 2 +- antarest/study/business/enum_ignore_case.py | 2 +- antarest/study/business/general_management.py | 2 +- antarest/study/business/link_management.py | 2 +- antarest/study/business/matrix_management.py | 2 +- antarest/study/business/model/__init__.py | 2 +- antarest/study/business/model/link_model.py | 2 +- antarest/study/business/optimization_management.py | 2 +- antarest/study/business/playlist_management.py | 2 +- antarest/study/business/scenario_builder_management.py | 2 +- antarest/study/business/table_mode_management.py | 2 +- antarest/study/business/thematic_trimming_field_infos.py | 2 +- antarest/study/business/thematic_trimming_management.py | 2 +- antarest/study/business/timeseries_config_management.py | 2 +- antarest/study/business/utils.py | 2 +- antarest/study/business/xpansion_management.py | 2 +- antarest/study/common/__init__.py | 2 +- antarest/study/common/studystorage.py | 2 +- antarest/study/css4_colors.py | 2 +- antarest/study/main.py | 2 +- antarest/study/model.py | 2 +- antarest/study/repository.py | 2 +- antarest/study/service.py | 2 +- antarest/study/storage/__init__.py | 2 +- antarest/study/storage/abstract_storage_service.py | 2 +- antarest/study/storage/auto_archive_service.py | 2 +- antarest/study/storage/df_download.py | 2 +- antarest/study/storage/explorer_service.py | 2 +- antarest/study/storage/matrix_profile.py | 2 +- antarest/study/storage/patch_service.py | 2 +- antarest/study/storage/rawstudy/__init__.py | 2 +- antarest/study/storage/rawstudy/ini_reader.py | 2 +- antarest/study/storage/rawstudy/ini_writer.py | 2 +- antarest/study/storage/rawstudy/model/__init__.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/__init__.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/bucket_node.py | 2 +- .../study/storage/rawstudy/model/filesystem/common/__init__.py | 2 +- .../rawstudy/model/filesystem/common/area_matrix_list.py | 2 +- .../study/storage/rawstudy/model/filesystem/common/prepro.py | 2 +- .../study/storage/rawstudy/model/filesystem/config/__init__.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/config/area.py | 2 +- .../rawstudy/model/filesystem/config/binding_constraint.py | 2 +- .../study/storage/rawstudy/model/filesystem/config/cluster.py | 2 +- .../storage/rawstudy/model/filesystem/config/exceptions.py | 2 +- .../rawstudy/model/filesystem/config/field_validators.py | 2 +- .../study/storage/rawstudy/model/filesystem/config/files.py | 2 +- .../storage/rawstudy/model/filesystem/config/identifier.py | 2 +- .../storage/rawstudy/model/filesystem/config/ini_properties.py | 2 +- .../study/storage/rawstudy/model/filesystem/config/model.py | 2 +- .../study/storage/rawstudy/model/filesystem/config/renewable.py | 2 +- .../rawstudy/model/filesystem/config/ruleset_matrices.py | 2 +- .../storage/rawstudy/model/filesystem/config/st_storage.py | 2 +- .../study/storage/rawstudy/model/filesystem/config/thermal.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/context.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/exceptions.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/factory.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/folder_node.py | 2 +- .../study/storage/rawstudy/model/filesystem/ini_file_node.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/inode.py | 2 +- .../study/storage/rawstudy/model/filesystem/json_file_node.py | 2 +- antarest/study/storage/rawstudy/model/filesystem/lazy_node.py | 2 +- .../study/storage/rawstudy/model/filesystem/matrix/__init__.py | 2 +- .../study/storage/rawstudy/model/filesystem/matrix/constants.py | 2 +- .../storage/rawstudy/model/filesystem/matrix/date_serializer.py | 2 +- .../storage/rawstudy/model/filesystem/matrix/head_writer.py | 2 +- .../rawstudy/model/filesystem/matrix/input_series_matrix.py | 2 +- .../study/storage/rawstudy/model/filesystem/matrix/matrix.py | 2 +- .../rawstudy/model/filesystem/matrix/output_series_matrix.py | 2 +- .../study/storage/rawstudy/model/filesystem/raw_file_node.py | 2 +- .../study/storage/rawstudy/model/filesystem/root/__init__.py | 2 +- .../study/storage/rawstudy/model/filesystem/root/desktop.py | 2 +- .../storage/rawstudy/model/filesystem/root/filestudytree.py | 2 +- .../storage/rawstudy/model/filesystem/root/input/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/areas/__init__.py | 2 +- .../storage/rawstudy/model/filesystem/root/input/areas/areas.py | 2 +- .../rawstudy/model/filesystem/root/input/areas/item/__init__.py | 2 +- .../model/filesystem/root/input/areas/item/adequacy_patch.py | 2 +- .../rawstudy/model/filesystem/root/input/areas/item/item.py | 2 +- .../model/filesystem/root/input/areas/item/optimization.py | 2 +- .../rawstudy/model/filesystem/root/input/areas/item/ui.py | 2 +- .../storage/rawstudy/model/filesystem/root/input/areas/list.py | 2 +- .../storage/rawstudy/model/filesystem/root/input/areas/sets.py | 2 +- .../model/filesystem/root/input/bindingconstraints/__init__.py | 2 +- .../root/input/bindingconstraints/bindingconstraints_ini.py | 2 +- .../root/input/bindingconstraints/bindingcontraints.py | 2 +- .../rawstudy/model/filesystem/root/input/commons/__init__.py | 2 +- .../model/filesystem/root/input/commons/prepro_series.py | 2 +- .../rawstudy/model/filesystem/root/input/hydro/__init__.py | 2 +- .../model/filesystem/root/input/hydro/allocation/__init__.py | 2 +- .../model/filesystem/root/input/hydro/allocation/allocation.py | 2 +- .../model/filesystem/root/input/hydro/allocation/area.py | 2 +- .../model/filesystem/root/input/hydro/common/__init__.py | 2 +- .../filesystem/root/input/hydro/common/capacity/__init__.py | 2 +- .../filesystem/root/input/hydro/common/capacity/capacity.py | 2 +- .../rawstudy/model/filesystem/root/input/hydro/common/common.py | 2 +- .../storage/rawstudy/model/filesystem/root/input/hydro/hydro.py | 2 +- .../rawstudy/model/filesystem/root/input/hydro/hydro_ini.py | 2 +- .../model/filesystem/root/input/hydro/prepro/__init__.py | 2 +- .../model/filesystem/root/input/hydro/prepro/area/__init__.py | 2 +- .../model/filesystem/root/input/hydro/prepro/area/area.py | 2 +- .../model/filesystem/root/input/hydro/prepro/area/prepro.py | 2 +- .../rawstudy/model/filesystem/root/input/hydro/prepro/prepro.py | 2 +- .../model/filesystem/root/input/hydro/series/__init__.py | 2 +- .../model/filesystem/root/input/hydro/series/area/__init__.py | 2 +- .../model/filesystem/root/input/hydro/series/area/area.py | 2 +- .../rawstudy/model/filesystem/root/input/hydro/series/series.py | 2 +- .../study/storage/rawstudy/model/filesystem/root/input/input.py | 2 +- .../rawstudy/model/filesystem/root/input/link/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/link/area/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/link/area/area.py | 2 +- .../filesystem/root/input/link/area/capacities/__init__.py | 2 +- .../filesystem/root/input/link/area/capacities/capacities.py | 2 +- .../model/filesystem/root/input/link/area/properties.py | 2 +- .../storage/rawstudy/model/filesystem/root/input/link/link.py | 2 +- .../rawstudy/model/filesystem/root/input/miscgen/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/miscgen/miscgen.py | 2 +- .../rawstudy/model/filesystem/root/input/renewables/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/renewables/clusters.py | 2 +- .../model/filesystem/root/input/renewables/renewable.py | 2 +- .../rawstudy/model/filesystem/root/input/renewables/series.py | 2 +- .../rawstudy/model/filesystem/root/input/reserves/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/reserves/reserves.py | 2 +- .../rawstudy/model/filesystem/root/input/st_storage/__init__.py | 2 +- .../model/filesystem/root/input/st_storage/clusters/__init__.py | 2 +- .../filesystem/root/input/st_storage/clusters/area/__init__.py | 2 +- .../filesystem/root/input/st_storage/clusters/area/area.py | 2 +- .../filesystem/root/input/st_storage/clusters/area/list.py | 2 +- .../model/filesystem/root/input/st_storage/clusters/clusters.py | 2 +- .../model/filesystem/root/input/st_storage/series/__init__.py | 2 +- .../filesystem/root/input/st_storage/series/area/__init__.py | 2 +- .../model/filesystem/root/input/st_storage/series/area/area.py | 2 +- .../root/input/st_storage/series/area/st_storage/__init__.py | 2 +- .../root/input/st_storage/series/area/st_storage/st_storage.py | 2 +- .../model/filesystem/root/input/st_storage/series/series.py | 2 +- .../model/filesystem/root/input/st_storage/st_storage.py | 2 +- .../rawstudy/model/filesystem/root/input/thermal/__init__.py | 2 +- .../rawstudy/model/filesystem/root/input/thermal/areas_ini.py | 2 +- .../model/filesystem/root/input/thermal/cluster/__init__.py | 2 +- .../filesystem/root/input/thermal/cluster/area/__init__.py | 2 +- .../model/filesystem/root/input/thermal/cluster/area/area.py | 2 +- .../model/filesystem/root/input/thermal/cluster/area/list.py | 2 +- .../model/filesystem/root/input/thermal/cluster/cluster.py | 2 +- .../model/filesystem/root/input/thermal/prepro/__init__.py | 2 +- .../model/filesystem/root/input/thermal/prepro/area/__init__.py | 2 +- .../model/filesystem/root/input/thermal/prepro/area/area.py | 2 +- .../root/input/thermal/prepro/area/thermal/__init__.py | 2 +- .../root/input/thermal/prepro/area/thermal/thermal.py | 2 +- .../model/filesystem/root/input/thermal/prepro/prepro.py | 2 +- .../model/filesystem/root/input/thermal/series/__init__.py | 2 +- .../model/filesystem/root/input/thermal/series/area/__init__.py | 2 +- .../model/filesystem/root/input/thermal/series/area/area.py | 2 +- .../root/input/thermal/series/area/thermal/__init__.py | 2 +- .../root/input/thermal/series/area/thermal/thermal.py | 2 +- .../model/filesystem/root/input/thermal/series/series.py | 2 +- .../rawstudy/model/filesystem/root/input/thermal/thermal.py | 2 +- .../storage/rawstudy/model/filesystem/root/layers/__init__.py | 2 +- .../storage/rawstudy/model/filesystem/root/layers/layer_ini.py | 2 +- .../storage/rawstudy/model/filesystem/root/layers/layers.py | 2 +- .../storage/rawstudy/model/filesystem/root/output/__init__.py | 2 +- .../storage/rawstudy/model/filesystem/root/output/output.py | 2 +- .../model/filesystem/root/output/simulation/__init__.py | 2 +- .../model/filesystem/root/output/simulation/about/__init__.py | 2 +- .../model/filesystem/root/output/simulation/about/about.py | 2 +- .../model/filesystem/root/output/simulation/about/study.py | 2 +- .../filesystem/root/output/simulation/info_antares_output.py | 2 +- .../model/filesystem/root/output/simulation/mode/__init__.py | 2 +- .../filesystem/root/output/simulation/mode/common/__init__.py | 2 +- .../model/filesystem/root/output/simulation/mode/common/area.py | 2 +- .../filesystem/root/output/simulation/mode/common/areas.py | 2 +- .../root/output/simulation/mode/common/binding_const.py | 2 +- .../model/filesystem/root/output/simulation/mode/common/link.py | 2 +- .../filesystem/root/output/simulation/mode/common/links.py | 2 +- .../model/filesystem/root/output/simulation/mode/common/set.py | 2 +- .../filesystem/root/output/simulation/mode/common/utils.py | 2 +- .../model/filesystem/root/output/simulation/mode/economy.py | 2 +- .../filesystem/root/output/simulation/mode/mcall/__init__.py | 2 +- .../model/filesystem/root/output/simulation/mode/mcall/grid.py | 2 +- .../filesystem/root/output/simulation/mode/mcind/__init__.py | 2 +- .../model/filesystem/root/output/simulation/mode/mcind/mcind.py | 2 +- .../model/filesystem/root/output/simulation/simulation.py | 2 +- .../filesystem/root/output/simulation/ts_generator/__init__.py | 2 +- .../root/output/simulation/ts_generator/ts_generator.py | 2 +- .../filesystem/root/output/simulation/ts_numbers/__init__.py | 2 +- .../filesystem/root/output/simulation/ts_numbers/ts_numbers.py | 2 +- .../root/output/simulation/ts_numbers/ts_numbers_data.py | 2 +- .../filesystem/root/output/simulation/xpansion/__init__.py | 2 +- .../model/filesystem/root/output/simulation/xpansion/lp.py | 2 +- .../filesystem/root/output/simulation/xpansion/sensitivity.py | 2 +- .../filesystem/root/output/simulation/xpansion/xpansion.py | 2 +- .../storage/rawstudy/model/filesystem/root/settings/__init__.py | 2 +- .../rawstudy/model/filesystem/root/settings/generaldata.py | 2 +- .../model/filesystem/root/settings/resources/__init__.py | 2 +- .../model/filesystem/root/settings/resources/resources.py | 2 +- .../rawstudy/model/filesystem/root/settings/scenariobuilder.py | 2 +- .../storage/rawstudy/model/filesystem/root/settings/settings.py | 2 +- .../model/filesystem/root/settings/simulations/__init__.py | 2 +- .../model/filesystem/root/settings/simulations/simulations.py | 2 +- .../storage/rawstudy/model/filesystem/root/study_antares.py | 2 +- .../storage/rawstudy/model/filesystem/root/user/__init__.py | 2 +- .../rawstudy/model/filesystem/root/user/expansion/__init__.py | 2 +- .../rawstudy/model/filesystem/root/user/expansion/candidates.py | 2 +- .../filesystem/root/user/expansion/constraint_resources.py | 2 +- .../rawstudy/model/filesystem/root/user/expansion/expansion.py | 2 +- .../model/filesystem/root/user/expansion/matrix_resources.py | 2 +- .../model/filesystem/root/user/expansion/sensitivity.py | 2 +- .../rawstudy/model/filesystem/root/user/expansion/settings.py | 2 +- .../study/storage/rawstudy/model/filesystem/root/user/user.py | 2 +- antarest/study/storage/rawstudy/model/helpers.py | 2 +- antarest/study/storage/rawstudy/raw_study_service.py | 2 +- antarest/study/storage/rawstudy/watcher.py | 2 +- antarest/study/storage/storage_service.py | 2 +- antarest/study/storage/study_download_utils.py | 2 +- antarest/study/storage/study_upgrader/__init__.py | 2 +- antarest/study/storage/utils.py | 2 +- antarest/study/storage/variantstudy/__init__.py | 2 +- antarest/study/storage/variantstudy/business/__init__.py | 2 +- .../study/storage/variantstudy/business/command_extractor.py | 2 +- .../study/storage/variantstudy/business/command_reverter.py | 2 +- .../storage/variantstudy/business/matrix_constants/__init__.py | 2 +- .../business/matrix_constants/binding_constraint/__init__.py | 2 +- .../matrix_constants/binding_constraint/series_after_v87.py | 2 +- .../matrix_constants/binding_constraint/series_before_v87.py | 2 +- .../storage/variantstudy/business/matrix_constants/common.py | 2 +- .../variantstudy/business/matrix_constants/hydro/__init__.py | 2 +- .../storage/variantstudy/business/matrix_constants/hydro/v6.py | 2 +- .../storage/variantstudy/business/matrix_constants/hydro/v7.py | 2 +- .../variantstudy/business/matrix_constants/link/__init__.py | 2 +- .../storage/variantstudy/business/matrix_constants/link/v7.py | 2 +- .../storage/variantstudy/business/matrix_constants/link/v8.py | 2 +- .../storage/variantstudy/business/matrix_constants/prepro.py | 2 +- .../business/matrix_constants/st_storage/__init__.py | 2 +- .../variantstudy/business/matrix_constants/st_storage/series.py | 2 +- .../variantstudy/business/matrix_constants/thermals/__init__.py | 2 +- .../variantstudy/business/matrix_constants/thermals/prepro.py | 2 +- .../storage/variantstudy/business/matrix_constants_generator.py | 2 +- antarest/study/storage/variantstudy/business/utils.py | 2 +- .../storage/variantstudy/business/utils_binding_constraint.py | 2 +- antarest/study/storage/variantstudy/command_factory.py | 2 +- antarest/study/storage/variantstudy/model/__init__.py | 2 +- antarest/study/storage/variantstudy/model/command/__init__.py | 2 +- antarest/study/storage/variantstudy/model/command/common.py | 2 +- .../study/storage/variantstudy/model/command/create_area.py | 2 +- .../variantstudy/model/command/create_binding_constraint.py | 2 +- .../study/storage/variantstudy/model/command/create_cluster.py | 2 +- .../study/storage/variantstudy/model/command/create_district.py | 2 +- .../study/storage/variantstudy/model/command/create_link.py | 2 +- .../variantstudy/model/command/create_renewables_cluster.py | 2 +- .../storage/variantstudy/model/command/create_st_storage.py | 2 +- .../storage/variantstudy/model/command/create_user_resource.py | 2 +- .../model/command/generate_thermal_cluster_timeseries.py | 2 +- antarest/study/storage/variantstudy/model/command/icommand.py | 2 +- .../study/storage/variantstudy/model/command/remove_area.py | 2 +- .../variantstudy/model/command/remove_binding_constraint.py | 2 +- .../study/storage/variantstudy/model/command/remove_cluster.py | 2 +- .../study/storage/variantstudy/model/command/remove_district.py | 2 +- .../study/storage/variantstudy/model/command/remove_link.py | 2 +- .../variantstudy/model/command/remove_renewables_cluster.py | 2 +- .../storage/variantstudy/model/command/remove_st_storage.py | 2 +- .../storage/variantstudy/model/command/remove_user_resource.py | 2 +- .../study/storage/variantstudy/model/command/replace_matrix.py | 2 +- .../variantstudy/model/command/update_binding_constraint.py | 2 +- .../study/storage/variantstudy/model/command/update_comments.py | 2 +- .../study/storage/variantstudy/model/command/update_config.py | 2 +- .../study/storage/variantstudy/model/command/update_district.py | 2 +- .../study/storage/variantstudy/model/command/update_link.py | 2 +- .../study/storage/variantstudy/model/command/update_playlist.py | 2 +- .../study/storage/variantstudy/model/command/update_raw_file.py | 2 +- .../variantstudy/model/command/update_scenario_builder.py | 2 +- antarest/study/storage/variantstudy/model/command_context.py | 2 +- .../storage/variantstudy/model/command_listener/__init__.py | 2 +- .../variantstudy/model/command_listener/command_listener.py | 2 +- antarest/study/storage/variantstudy/model/dbmodel.py | 2 +- antarest/study/storage/variantstudy/model/interfaces.py | 2 +- antarest/study/storage/variantstudy/model/model.py | 2 +- antarest/study/storage/variantstudy/repository.py | 2 +- antarest/study/storage/variantstudy/snapshot_generator.py | 2 +- .../study/storage/variantstudy/variant_command_extractor.py | 2 +- .../study/storage/variantstudy/variant_command_generator.py | 2 +- antarest/study/storage/variantstudy/variant_study_service.py | 2 +- antarest/study/web/__init__.py | 2 +- antarest/study/web/explorer_blueprint.py | 2 +- antarest/study/web/raw_studies_blueprint.py | 2 +- antarest/study/web/studies_blueprint.py | 2 +- antarest/study/web/study_data_blueprint.py | 2 +- antarest/study/web/variant_blueprint.py | 2 +- antarest/study/web/watcher_blueprint.py | 2 +- antarest/study/web/xpansion_studies_blueprint.py | 2 +- antarest/tools/__init__.py | 2 +- antarest/tools/admin.py | 2 +- antarest/tools/admin_lib.py | 2 +- antarest/tools/cli.py | 2 +- antarest/tools/lib.py | 2 +- antarest/worker/__init__.py | 2 +- antarest/worker/archive_worker.py | 2 +- antarest/worker/archive_worker_service.py | 2 +- antarest/worker/worker.py | 2 +- antarest/wsgi.py | 2 +- scripts/license_checker_and_adder.py | 2 +- tests/__init__.py | 2 +- tests/cache/__init__.py | 2 +- tests/cache/test_local_cache.py | 2 +- tests/cache/test_redis_cache.py | 2 +- tests/cache/test_service.py | 2 +- tests/conftest.py | 2 +- tests/conftest_db.py | 2 +- tests/conftest_instances.py | 2 +- tests/conftest_services.py | 2 +- tests/core/__init__.py | 2 +- tests/core/assets/__init__.py | 2 +- tests/core/tasks/__init__.py | 2 +- tests/core/tasks/test_model.py | 2 +- tests/core/tasks/test_task_job_service.py | 2 +- tests/core/test_auth.py | 2 +- tests/core/test_exceptions.py | 2 +- tests/core/test_file_transfer.py | 2 +- tests/core/test_jwt.py | 2 +- tests/core/test_maintenance.py | 2 +- tests/core/test_tasks.py | 2 +- tests/core/test_utils.py | 2 +- tests/core/test_utils_bp.py | 2 +- tests/core/test_version_info.py | 2 +- tests/core/utils/__init__.py | 2 +- tests/core/utils/test_extract_zip.py | 2 +- tests/db_statement_recorder.py | 2 +- tests/eventbus/__init__.py | 2 +- tests/eventbus/test_local_eventbus.py | 2 +- tests/eventbus/test_redis_event_bus.py | 2 +- tests/eventbus/test_service.py | 2 +- tests/eventbus/test_websocket_manager.py | 2 +- tests/helpers.py | 2 +- tests/integration/__init__.py | 2 +- tests/integration/assets/__init__.py | 2 +- tests/integration/conftest.py | 2 +- tests/integration/explorer_blueprint/test_explorer.py | 2 +- tests/integration/filesystem_blueprint/__init__.py | 2 +- .../filesystem_blueprint/test_filesystem_endpoints.py | 2 +- tests/integration/filesystem_blueprint/test_model.py | 2 +- tests/integration/launcher_blueprint/__init__.py | 2 +- tests/integration/launcher_blueprint/test_launcher_local.py | 2 +- tests/integration/launcher_blueprint/test_solver_versions.py | 2 +- tests/integration/prepare_proxy.py | 2 +- tests/integration/raw_studies_blueprint/__init__.py | 2 +- tests/integration/raw_studies_blueprint/assets/__init__.py | 2 +- .../raw_studies_blueprint/test_aggregate_raw_data.py | 2 +- .../integration/raw_studies_blueprint/test_download_matrices.py | 2 +- tests/integration/raw_studies_blueprint/test_fetch_raw_data.py | 2 +- tests/integration/studies_blueprint/__init__.py | 2 +- tests/integration/studies_blueprint/assets/__init__.py | 2 +- tests/integration/studies_blueprint/test_comments.py | 2 +- tests/integration/studies_blueprint/test_disk_usage.py | 2 +- tests/integration/studies_blueprint/test_get_studies.py | 2 +- tests/integration/studies_blueprint/test_move.py | 2 +- tests/integration/studies_blueprint/test_study_matrix_index.py | 2 +- tests/integration/studies_blueprint/test_study_version.py | 2 +- tests/integration/studies_blueprint/test_synthesis.py | 2 +- tests/integration/studies_blueprint/test_update_tags.py | 2 +- tests/integration/study_data_blueprint/__init__.py | 2 +- .../study_data_blueprint/test_advanced_parameters.py | 2 +- .../study_data_blueprint/test_binding_constraints.py | 2 +- tests/integration/study_data_blueprint/test_config_general.py | 2 +- tests/integration/study_data_blueprint/test_edit_matrix.py | 2 +- .../test_generate_thermal_cluster_timeseries.py | 2 +- tests/integration/study_data_blueprint/test_hydro_allocation.py | 2 +- .../integration/study_data_blueprint/test_hydro_correlation.py | 2 +- .../study_data_blueprint/test_hydro_inflow_structure.py | 2 +- tests/integration/study_data_blueprint/test_link.py | 2 +- tests/integration/study_data_blueprint/test_playlist.py | 2 +- tests/integration/study_data_blueprint/test_renewable.py | 2 +- tests/integration/study_data_blueprint/test_st_storage.py | 2 +- tests/integration/study_data_blueprint/test_table_mode.py | 2 +- tests/integration/study_data_blueprint/test_thermal.py | 2 +- tests/integration/test_apidoc.py | 2 +- tests/integration/test_core_blueprint.py | 2 +- tests/integration/test_integration.py | 2 +- tests/integration/test_integration_token_end_to_end.py | 2 +- tests/integration/test_integration_variantmanager_tool.py | 2 +- tests/integration/test_integration_watcher.py | 2 +- tests/integration/test_studies_upgrade.py | 2 +- tests/integration/utils.py | 2 +- tests/integration/variant_blueprint/__init__.py | 2 +- tests/integration/variant_blueprint/test_renewable_cluster.py | 2 +- tests/integration/variant_blueprint/test_st_storage.py | 2 +- tests/integration/variant_blueprint/test_thermal_cluster.py | 2 +- tests/integration/variant_blueprint/test_variant_manager.py | 2 +- tests/integration/xpansion_studies_blueprint/__init__.py | 2 +- .../xpansion_studies_blueprint/test_integration_xpansion.py | 2 +- tests/launcher/__init__.py | 2 +- tests/launcher/assets/__init__.py | 2 +- tests/launcher/test_extension_adequacy_patch.py | 2 +- tests/launcher/test_local_launcher.py | 2 +- tests/launcher/test_log_manager.py | 2 +- tests/launcher/test_log_parser.py | 2 +- tests/launcher/test_model.py | 2 +- tests/launcher/test_repository.py | 2 +- tests/launcher/test_service.py | 2 +- tests/launcher/test_slurm_launcher.py | 2 +- tests/launcher/test_ssh_client.py | 2 +- tests/launcher/test_web.py | 2 +- tests/login/__init__.py | 2 +- tests/login/conftest.py | 2 +- tests/login/test_ldap.py | 2 +- tests/login/test_login_service.py | 2 +- tests/login/test_model.py | 2 +- tests/login/test_repository.py | 2 +- tests/login/test_web.py | 2 +- tests/matrixstore/__init__.py | 2 +- tests/matrixstore/conftest.py | 2 +- tests/matrixstore/test_matrix_editor.py | 2 +- tests/matrixstore/test_matrix_garbage_collector.py | 2 +- tests/matrixstore/test_repository.py | 2 +- tests/matrixstore/test_service.py | 2 +- tests/matrixstore/test_web.py | 2 +- tests/storage/__init__.py | 2 +- tests/storage/business/__init__.py | 2 +- tests/storage/business/assets/__init__.py | 2 +- tests/storage/business/test_arealink_manager.py | 2 +- tests/storage/business/test_autoarchive_service.py | 2 +- tests/storage/business/test_config_manager.py | 2 +- tests/storage/business/test_explorer_service.py | 2 +- tests/storage/business/test_export.py | 2 +- tests/storage/business/test_import.py | 2 +- tests/storage/business/test_patch_service.py | 2 +- tests/storage/business/test_raw_study_service.py | 2 +- tests/storage/business/test_repository.py | 2 +- tests/storage/business/test_study_service_utils.py | 2 +- tests/storage/business/test_study_version_upgrader.py | 2 +- tests/storage/business/test_timeseries_config_manager.py | 2 +- tests/storage/business/test_url_resolver_service.py | 2 +- tests/storage/business/test_variant_study_service.py | 2 +- tests/storage/business/test_watcher.py | 2 +- tests/storage/business/test_xpansion_manager.py | 2 +- tests/storage/conftest.py | 2 +- tests/storage/integration/conftest.py | 2 +- tests/storage/integration/data/__init__.py | 2 +- tests/storage/integration/data/de_details_hourly.py | 2 +- tests/storage/integration/data/de_fr_values_hourly.py | 2 +- tests/storage/integration/data/digest_file.py | 2 +- tests/storage/integration/data/set_id_annual.py | 2 +- tests/storage/integration/data/set_values_monthly.py | 2 +- tests/storage/integration/test_STA_mini.py | 2 +- tests/storage/integration/test_exporter.py | 2 +- tests/storage/integration/test_write_STA_mini.py | 2 +- tests/storage/rawstudies/__init__.py | 2 +- tests/storage/rawstudies/samples/__init__.py | 2 +- tests/storage/rawstudies/test_factory.py | 2 +- tests/storage/rawstudies/test_helpers.py | 2 +- tests/storage/repository/__init__.py | 2 +- tests/storage/repository/antares_io/__init__.py | 2 +- tests/storage/repository/antares_io/reader/test_ini_reader.py | 2 +- tests/storage/repository/antares_io/writer/test_ini_writer.py | 2 +- tests/storage/repository/filesystem/__init__.py | 2 +- tests/storage/repository/filesystem/config/__init__.py | 2 +- tests/storage/repository/filesystem/config/test_config_files.py | 2 +- tests/storage/repository/filesystem/config/test_files.py | 2 +- .../repository/filesystem/config/test_ruleset_matrices.py | 2 +- tests/storage/repository/filesystem/config/test_utils.py | 2 +- tests/storage/repository/filesystem/matrix/__init__.py | 2 +- .../repository/filesystem/matrix/test_date_serializer.py | 2 +- tests/storage/repository/filesystem/matrix/test_head_writer.py | 2 +- .../repository/filesystem/matrix/test_input_series_matrix.py | 2 +- tests/storage/repository/filesystem/matrix/test_matrix_node.py | 2 +- .../repository/filesystem/matrix/test_output_series_matrix.py | 2 +- tests/storage/repository/filesystem/root/__init__.py | 2 +- tests/storage/repository/filesystem/root/input/__init__.py | 2 +- .../storage/repository/filesystem/root/input/hydro/__init__.py | 2 +- .../repository/filesystem/root/input/hydro/common/__init__.py | 2 +- .../filesystem/root/input/hydro/common/capacity/__init__.py | 2 +- .../root/input/hydro/common/capacity/test_capacity.py | 2 +- .../repository/filesystem/root/input/hydro/series/__init__.py | 2 +- .../filesystem/root/input/hydro/series/area/__init__.py | 2 +- .../filesystem/root/input/hydro/series/area/test_area.py | 2 +- tests/storage/repository/filesystem/root/output/__init__.py | 2 +- .../repository/filesystem/root/output/simulation/__init__.py | 2 +- .../filesystem/root/output/simulation/mode/__init__.py | 2 +- .../filesystem/root/output/simulation/mode/common/__init__.py | 2 +- .../filesystem/root/output/simulation/mode/common/test_area.py | 2 +- .../root/output/simulation/mode/common/test_binding_const.py | 2 +- .../filesystem/root/output/simulation/mode/common/test_link.py | 2 +- .../filesystem/root/output/simulation/mode/common/test_set.py | 2 +- tests/storage/repository/filesystem/special_node/__init__.py | 2 +- .../repository/filesystem/special_node/input_areas_list_test.py | 2 +- tests/storage/repository/filesystem/test_bucket_node.py | 2 +- tests/storage/repository/filesystem/test_folder_node.py | 2 +- tests/storage/repository/filesystem/test_ini_file_node.py | 2 +- tests/storage/repository/filesystem/test_lazy_node.py | 2 +- tests/storage/repository/filesystem/test_raw_file_node.py | 2 +- tests/storage/repository/filesystem/test_scenariobuilder.py | 2 +- tests/storage/repository/filesystem/test_ts_numbers_vector.py | 2 +- tests/storage/repository/filesystem/utils.py | 2 +- tests/storage/repository/test_study.py | 2 +- tests/storage/test_model.py | 2 +- tests/storage/test_service.py | 2 +- tests/storage/web/__init__.py | 2 +- tests/storage/web/test_studies_bp.py | 2 +- tests/study/__init__.py | 2 +- tests/study/business/__init__.py | 2 +- tests/study/business/areas/__init__.py | 2 +- tests/study/business/areas/assets/__init__.py | 2 +- tests/study/business/areas/test_st_storage_management.py | 2 +- tests/study/business/areas/test_thermal_management.py | 2 +- tests/study/business/test_all_optional_metaclass.py | 2 +- tests/study/business/test_allocation_manager.py | 2 +- tests/study/business/test_binding_constraint_management.py | 2 +- tests/study/business/test_correlation_manager.py | 2 +- tests/study/business/test_district_manager.py | 2 +- tests/study/business/test_matrix_management.py | 2 +- tests/study/storage/__init__.py | 2 +- tests/study/storage/rawstudy/__init__.py | 2 +- tests/study/storage/rawstudy/test_raw_study_service.py | 2 +- tests/study/storage/test_abstract_storage_service.py | 2 +- tests/study/storage/test_utils.py | 2 +- tests/study/storage/variantstudy/__init__.py | 2 +- tests/study/storage/variantstudy/business/__init__.py | 2 +- .../variantstudy/business/test_matrix_constants_generator.py | 2 +- tests/study/storage/variantstudy/model/__init__.py | 2 +- tests/study/storage/variantstudy/model/test_dbmodel.py | 2 +- tests/study/storage/variantstudy/test_snapshot_generator.py | 2 +- tests/study/storage/variantstudy/test_variant_study_service.py | 2 +- tests/study/test_model.py | 2 +- tests/study/test_repository.py | 2 +- tests/study/test_service.py | 2 +- tests/test_front.py | 2 +- tests/test_resources.py | 2 +- tests/variantstudy/__init__.py | 2 +- tests/variantstudy/assets/__init__.py | 2 +- tests/variantstudy/conftest.py | 2 +- tests/variantstudy/model/__init__.py | 2 +- tests/variantstudy/model/command/__init__.py | 2 +- tests/variantstudy/model/command/helpers.py | 2 +- tests/variantstudy/model/command/test_alias_decoder.py | 2 +- tests/variantstudy/model/command/test_create_area.py | 2 +- tests/variantstudy/model/command/test_create_cluster.py | 2 +- tests/variantstudy/model/command/test_create_link.py | 2 +- .../model/command/test_create_renewables_cluster.py | 2 +- tests/variantstudy/model/command/test_create_st_storage.py | 2 +- .../model/command/test_manage_binding_constraints.py | 2 +- tests/variantstudy/model/command/test_manage_district.py | 2 +- tests/variantstudy/model/command/test_remove_area.py | 2 +- tests/variantstudy/model/command/test_remove_cluster.py | 2 +- tests/variantstudy/model/command/test_remove_link.py | 2 +- .../model/command/test_remove_renewables_cluster.py | 2 +- tests/variantstudy/model/command/test_remove_st_storage.py | 2 +- tests/variantstudy/model/command/test_replace_matrix.py | 2 +- tests/variantstudy/model/command/test_update_comments.py | 2 +- tests/variantstudy/model/command/test_update_config.py | 2 +- tests/variantstudy/model/command/test_update_rawfile.py | 2 +- tests/variantstudy/model/test_variant_model.py | 2 +- tests/variantstudy/test_command_factory.py | 2 +- tests/variantstudy/test_utils.py | 2 +- tests/variantstudy/test_variant_command_extractor.py | 2 +- tests/worker/__init__.py | 2 +- tests/worker/test_archive_worker.py | 2 +- tests/worker/test_archive_worker_service.py | 2 +- tests/worker/test_worker.py | 2 +- tests/xml_compare.py | 2 +- 682 files changed, 682 insertions(+), 682 deletions(-) diff --git a/antarest/__init__.py b/antarest/__init__.py index adaa163763..76b50ff27b 100644 --- a/antarest/__init__.py +++ b/antarest/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/__init__.py b/antarest/core/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/__init__.py +++ b/antarest/core/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/application.py b/antarest/core/application.py index 3f09bd4102..ec1ee40798 100644 --- a/antarest/core/application.py +++ b/antarest/core/application.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/cache/__init__.py b/antarest/core/cache/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/cache/__init__.py +++ b/antarest/core/cache/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/cache/business/__init__.py b/antarest/core/cache/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/cache/business/__init__.py +++ b/antarest/core/cache/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/cache/business/local_chache.py b/antarest/core/cache/business/local_chache.py index 493322b9c6..0defd81a4b 100644 --- a/antarest/core/cache/business/local_chache.py +++ b/antarest/core/cache/business/local_chache.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/cache/business/redis_cache.py b/antarest/core/cache/business/redis_cache.py index ee7e30a6d1..60bd3885ba 100644 --- a/antarest/core/cache/business/redis_cache.py +++ b/antarest/core/cache/business/redis_cache.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/cache/main.py b/antarest/core/cache/main.py index c707732fec..cbc11cc6a2 100644 --- a/antarest/core/cache/main.py +++ b/antarest/core/cache/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/cli.py b/antarest/core/cli.py index e7de0a8140..162f1dedb7 100644 --- a/antarest/core/cli.py +++ b/antarest/core/cli.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/config.py b/antarest/core/config.py index 02394efc55..1a93131a0a 100644 --- a/antarest/core/config.py +++ b/antarest/core/config.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/configdata/__init__.py b/antarest/core/configdata/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/configdata/__init__.py +++ b/antarest/core/configdata/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/configdata/model.py b/antarest/core/configdata/model.py index faa6589709..531a77935b 100644 --- a/antarest/core/configdata/model.py +++ b/antarest/core/configdata/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/configdata/repository.py b/antarest/core/configdata/repository.py index 3b7aea6ada..b8c458bd6b 100644 --- a/antarest/core/configdata/repository.py +++ b/antarest/core/configdata/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/core_blueprint.py b/antarest/core/core_blueprint.py index d344531699..5c50415d47 100644 --- a/antarest/core/core_blueprint.py +++ b/antarest/core/core_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/exceptions.py b/antarest/core/exceptions.py index 722a385b26..7001d832ca 100644 --- a/antarest/core/exceptions.py +++ b/antarest/core/exceptions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filesystem_blueprint.py b/antarest/core/filesystem_blueprint.py index 804746993d..10145d744e 100644 --- a/antarest/core/filesystem_blueprint.py +++ b/antarest/core/filesystem_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filetransfer/__init__.py b/antarest/core/filetransfer/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/filetransfer/__init__.py +++ b/antarest/core/filetransfer/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filetransfer/main.py b/antarest/core/filetransfer/main.py index 3583dc5701..797e3652cc 100644 --- a/antarest/core/filetransfer/main.py +++ b/antarest/core/filetransfer/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filetransfer/model.py b/antarest/core/filetransfer/model.py index 0a5958d57a..772dabf80b 100644 --- a/antarest/core/filetransfer/model.py +++ b/antarest/core/filetransfer/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filetransfer/repository.py b/antarest/core/filetransfer/repository.py index 3df0594b80..da88f4d4be 100644 --- a/antarest/core/filetransfer/repository.py +++ b/antarest/core/filetransfer/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filetransfer/service.py b/antarest/core/filetransfer/service.py index dffb5a4908..a82f7af814 100644 --- a/antarest/core/filetransfer/service.py +++ b/antarest/core/filetransfer/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/filetransfer/web.py b/antarest/core/filetransfer/web.py index 6fce2e834a..0c702bc340 100644 --- a/antarest/core/filetransfer/web.py +++ b/antarest/core/filetransfer/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/interfaces/__init__.py b/antarest/core/interfaces/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/interfaces/__init__.py +++ b/antarest/core/interfaces/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/interfaces/cache.py b/antarest/core/interfaces/cache.py index 95d6497864..f851d79102 100644 --- a/antarest/core/interfaces/cache.py +++ b/antarest/core/interfaces/cache.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/interfaces/eventbus.py b/antarest/core/interfaces/eventbus.py index d9075dc49e..e42b7baaf0 100644 --- a/antarest/core/interfaces/eventbus.py +++ b/antarest/core/interfaces/eventbus.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/interfaces/service.py b/antarest/core/interfaces/service.py index 2e735cbbe5..d9c7e7639c 100644 --- a/antarest/core/interfaces/service.py +++ b/antarest/core/interfaces/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/jwt.py b/antarest/core/jwt.py index aa8323abb8..5b7806615e 100644 --- a/antarest/core/jwt.py +++ b/antarest/core/jwt.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/logging/__init__.py b/antarest/core/logging/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/logging/__init__.py +++ b/antarest/core/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/logging/utils.py b/antarest/core/logging/utils.py index 2fa8c4a040..fa24dab0b1 100644 --- a/antarest/core/logging/utils.py +++ b/antarest/core/logging/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/maintenance/__init__.py b/antarest/core/maintenance/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/maintenance/__init__.py +++ b/antarest/core/maintenance/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/maintenance/main.py b/antarest/core/maintenance/main.py index 8717150d07..a962d1b013 100644 --- a/antarest/core/maintenance/main.py +++ b/antarest/core/maintenance/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/maintenance/model.py b/antarest/core/maintenance/model.py index c17beadbc3..5d14623628 100644 --- a/antarest/core/maintenance/model.py +++ b/antarest/core/maintenance/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/maintenance/repository.py b/antarest/core/maintenance/repository.py index 1a69da65c6..6395785c2b 100644 --- a/antarest/core/maintenance/repository.py +++ b/antarest/core/maintenance/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/maintenance/service.py b/antarest/core/maintenance/service.py index 4e4cecc24b..22a7a273a3 100644 --- a/antarest/core/maintenance/service.py +++ b/antarest/core/maintenance/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/maintenance/web.py b/antarest/core/maintenance/web.py index ed6e28cf9f..f984b70050 100644 --- a/antarest/core/maintenance/web.py +++ b/antarest/core/maintenance/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/model.py b/antarest/core/model.py index 78aa7a1e82..a0c61e9830 100644 --- a/antarest/core/model.py +++ b/antarest/core/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/permissions.py b/antarest/core/permissions.py index 55defacf7d..9bf073e809 100644 --- a/antarest/core/permissions.py +++ b/antarest/core/permissions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/persistence.py b/antarest/core/persistence.py index 5bc80c4e98..4af73a064a 100644 --- a/antarest/core/persistence.py +++ b/antarest/core/persistence.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/requests.py b/antarest/core/requests.py index 055bbd8cdd..78a8c4ae6c 100644 --- a/antarest/core/requests.py +++ b/antarest/core/requests.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/roles.py b/antarest/core/roles.py index 232b5fa524..3d018c18f5 100644 --- a/antarest/core/roles.py +++ b/antarest/core/roles.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/serialization/__init__.py b/antarest/core/serialization/__init__.py index a8616e3eae..5591290ce8 100644 --- a/antarest/core/serialization/__init__.py +++ b/antarest/core/serialization/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/swagger.py b/antarest/core/swagger.py index 047f6c4809..6856b5d2fa 100644 --- a/antarest/core/swagger.py +++ b/antarest/core/swagger.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/tasks/__init__.py b/antarest/core/tasks/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/core/tasks/__init__.py +++ b/antarest/core/tasks/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/tasks/main.py b/antarest/core/tasks/main.py index 74685ba836..92b0929413 100644 --- a/antarest/core/tasks/main.py +++ b/antarest/core/tasks/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/tasks/model.py b/antarest/core/tasks/model.py index a533b73baf..ce4ab5631a 100644 --- a/antarest/core/tasks/model.py +++ b/antarest/core/tasks/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/tasks/repository.py b/antarest/core/tasks/repository.py index 74c9e84b78..87572bb570 100644 --- a/antarest/core/tasks/repository.py +++ b/antarest/core/tasks/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/tasks/service.py b/antarest/core/tasks/service.py index b5a40ff84d..4ada902c58 100644 --- a/antarest/core/tasks/service.py +++ b/antarest/core/tasks/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/tasks/web.py b/antarest/core/tasks/web.py index 19c7e8440e..2638347417 100644 --- a/antarest/core/tasks/web.py +++ b/antarest/core/tasks/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/utils/__init__.py b/antarest/core/utils/__init__.py index d1e93fb6a8..9da1a4758a 100644 --- a/antarest/core/utils/__init__.py +++ b/antarest/core/utils/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/utils/archives.py b/antarest/core/utils/archives.py index d12082a835..f1c734c83c 100644 --- a/antarest/core/utils/archives.py +++ b/antarest/core/utils/archives.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/utils/string.py b/antarest/core/utils/string.py index ab45405753..25139ad315 100644 --- a/antarest/core/utils/string.py +++ b/antarest/core/utils/string.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/utils/utils.py b/antarest/core/utils/utils.py index 0abe2a6fb4..90e920e815 100644 --- a/antarest/core/utils/utils.py +++ b/antarest/core/utils/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/utils/web.py b/antarest/core/utils/web.py index aeae230ce9..4d9f53056e 100644 --- a/antarest/core/utils/web.py +++ b/antarest/core/utils/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/core/version_info.py b/antarest/core/version_info.py index ec20a767c9..0b7f312b5b 100644 --- a/antarest/core/version_info.py +++ b/antarest/core/version_info.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/dbmodel.py b/antarest/dbmodel.py index 738134dadd..f2bcb418be 100644 --- a/antarest/dbmodel.py +++ b/antarest/dbmodel.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/desktop/__init__.py b/antarest/desktop/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/desktop/__init__.py +++ b/antarest/desktop/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/desktop/systray_app.py b/antarest/desktop/systray_app.py index 9d53ebb185..65f35777b0 100644 --- a/antarest/desktop/systray_app.py +++ b/antarest/desktop/systray_app.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/__init__.py b/antarest/eventbus/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/eventbus/__init__.py +++ b/antarest/eventbus/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/business/__init__.py b/antarest/eventbus/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/eventbus/business/__init__.py +++ b/antarest/eventbus/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/business/interfaces.py b/antarest/eventbus/business/interfaces.py index 63a90b7ee5..add916410f 100644 --- a/antarest/eventbus/business/interfaces.py +++ b/antarest/eventbus/business/interfaces.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/business/local_eventbus.py b/antarest/eventbus/business/local_eventbus.py index 774278d5e4..34b6a00a13 100644 --- a/antarest/eventbus/business/local_eventbus.py +++ b/antarest/eventbus/business/local_eventbus.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/business/redis_eventbus.py b/antarest/eventbus/business/redis_eventbus.py index db89c7bc68..161a15cc82 100644 --- a/antarest/eventbus/business/redis_eventbus.py +++ b/antarest/eventbus/business/redis_eventbus.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/main.py b/antarest/eventbus/main.py index 6ccf56e644..e1268dc374 100644 --- a/antarest/eventbus/main.py +++ b/antarest/eventbus/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/service.py b/antarest/eventbus/service.py index 63b519e954..f414712743 100644 --- a/antarest/eventbus/service.py +++ b/antarest/eventbus/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/eventbus/web.py b/antarest/eventbus/web.py index d2d9405235..53ea96964a 100644 --- a/antarest/eventbus/web.py +++ b/antarest/eventbus/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/front.py b/antarest/front.py index 33314eb3f4..98f5ab83d8 100644 --- a/antarest/front.py +++ b/antarest/front.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/gui.py b/antarest/gui.py index 86ddd5efd1..1f79e06443 100644 --- a/antarest/gui.py +++ b/antarest/gui.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/__init__.py b/antarest/launcher/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/launcher/__init__.py +++ b/antarest/launcher/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/__init__.py b/antarest/launcher/adapters/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/launcher/adapters/__init__.py +++ b/antarest/launcher/adapters/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/abstractlauncher.py b/antarest/launcher/adapters/abstractlauncher.py index c25797eb66..599667695b 100644 --- a/antarest/launcher/adapters/abstractlauncher.py +++ b/antarest/launcher/adapters/abstractlauncher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/factory_launcher.py b/antarest/launcher/adapters/factory_launcher.py index a7b3fcfdd2..cc24af3d2b 100644 --- a/antarest/launcher/adapters/factory_launcher.py +++ b/antarest/launcher/adapters/factory_launcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/local_launcher/__init__.py b/antarest/launcher/adapters/local_launcher/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/launcher/adapters/local_launcher/__init__.py +++ b/antarest/launcher/adapters/local_launcher/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/local_launcher/local_launcher.py b/antarest/launcher/adapters/local_launcher/local_launcher.py index 3c96f44931..e8400ffaa9 100644 --- a/antarest/launcher/adapters/local_launcher/local_launcher.py +++ b/antarest/launcher/adapters/local_launcher/local_launcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/log_manager.py b/antarest/launcher/adapters/log_manager.py index f85810f1ae..c4aeec907b 100644 --- a/antarest/launcher/adapters/log_manager.py +++ b/antarest/launcher/adapters/log_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/log_parser.py b/antarest/launcher/adapters/log_parser.py index 16cadd74ea..0583340917 100644 --- a/antarest/launcher/adapters/log_parser.py +++ b/antarest/launcher/adapters/log_parser.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/slurm_launcher/__init__.py b/antarest/launcher/adapters/slurm_launcher/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/launcher/adapters/slurm_launcher/__init__.py +++ b/antarest/launcher/adapters/slurm_launcher/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py index 810581e561..79e8b94fb9 100644 --- a/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py +++ b/antarest/launcher/adapters/slurm_launcher/slurm_launcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/extensions/__init__.py b/antarest/launcher/extensions/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/launcher/extensions/__init__.py +++ b/antarest/launcher/extensions/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/extensions/adequacy_patch/__init__.py b/antarest/launcher/extensions/adequacy_patch/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/launcher/extensions/adequacy_patch/__init__.py +++ b/antarest/launcher/extensions/adequacy_patch/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/extensions/adequacy_patch/extension.py b/antarest/launcher/extensions/adequacy_patch/extension.py index 093a91d17b..335677c5de 100644 --- a/antarest/launcher/extensions/adequacy_patch/extension.py +++ b/antarest/launcher/extensions/adequacy_patch/extension.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/extensions/interface.py b/antarest/launcher/extensions/interface.py index c7a3b3c39a..b2616451de 100644 --- a/antarest/launcher/extensions/interface.py +++ b/antarest/launcher/extensions/interface.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/main.py b/antarest/launcher/main.py index 1916b9607b..7f794b9a9c 100644 --- a/antarest/launcher/main.py +++ b/antarest/launcher/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/model.py b/antarest/launcher/model.py index 934b2b5753..df5c9cb903 100644 --- a/antarest/launcher/model.py +++ b/antarest/launcher/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/repository.py b/antarest/launcher/repository.py index 21126aac1d..d87d11e858 100644 --- a/antarest/launcher/repository.py +++ b/antarest/launcher/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/service.py b/antarest/launcher/service.py index c919321a39..f30e41faa7 100644 --- a/antarest/launcher/service.py +++ b/antarest/launcher/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/ssh_client.py b/antarest/launcher/ssh_client.py index 175c8a739b..e82a90ceef 100644 --- a/antarest/launcher/ssh_client.py +++ b/antarest/launcher/ssh_client.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/ssh_config.py b/antarest/launcher/ssh_config.py index 7d4524d04d..fd0bf42e9b 100644 --- a/antarest/launcher/ssh_config.py +++ b/antarest/launcher/ssh_config.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/launcher/web.py b/antarest/launcher/web.py index c07261384a..55deb68365 100644 --- a/antarest/launcher/web.py +++ b/antarest/launcher/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/__init__.py b/antarest/login/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/login/__init__.py +++ b/antarest/login/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/auth.py b/antarest/login/auth.py index e0227a51f5..01a38cfc09 100644 --- a/antarest/login/auth.py +++ b/antarest/login/auth.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/ldap.py b/antarest/login/ldap.py index 1635efe09d..91f0b12ad9 100644 --- a/antarest/login/ldap.py +++ b/antarest/login/ldap.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/main.py b/antarest/login/main.py index ac6b2956c9..34de1ffbc5 100644 --- a/antarest/login/main.py +++ b/antarest/login/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/model.py b/antarest/login/model.py index 18cc137d76..cfa7a7a015 100644 --- a/antarest/login/model.py +++ b/antarest/login/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/repository.py b/antarest/login/repository.py index d37c75a30d..dbf8cccb57 100644 --- a/antarest/login/repository.py +++ b/antarest/login/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/service.py b/antarest/login/service.py index fef02af68f..d535171a5e 100644 --- a/antarest/login/service.py +++ b/antarest/login/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/utils.py b/antarest/login/utils.py index 85ded68f50..459a1ff2ae 100644 --- a/antarest/login/utils.py +++ b/antarest/login/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/login/web.py b/antarest/login/web.py index 6f3968d6a9..3c0dd9be2d 100644 --- a/antarest/login/web.py +++ b/antarest/login/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/main.py b/antarest/main.py index eabb7bd5c4..3d2bf6ed83 100644 --- a/antarest/main.py +++ b/antarest/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/__init__.py b/antarest/matrixstore/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/matrixstore/__init__.py +++ b/antarest/matrixstore/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/exceptions.py b/antarest/matrixstore/exceptions.py index 9f9051ca4d..31abb679ed 100644 --- a/antarest/matrixstore/exceptions.py +++ b/antarest/matrixstore/exceptions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/main.py b/antarest/matrixstore/main.py index d8eaf0390a..4987e8f8a0 100644 --- a/antarest/matrixstore/main.py +++ b/antarest/matrixstore/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/matrix_editor.py b/antarest/matrixstore/matrix_editor.py index 33bf780cab..a8850e1c41 100644 --- a/antarest/matrixstore/matrix_editor.py +++ b/antarest/matrixstore/matrix_editor.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/matrix_garbage_collector.py b/antarest/matrixstore/matrix_garbage_collector.py index 3d7e513b94..f363c4649b 100644 --- a/antarest/matrixstore/matrix_garbage_collector.py +++ b/antarest/matrixstore/matrix_garbage_collector.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/model.py b/antarest/matrixstore/model.py index a46dad9455..b117e12e1f 100644 --- a/antarest/matrixstore/model.py +++ b/antarest/matrixstore/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/repository.py b/antarest/matrixstore/repository.py index a6d5733d66..4b8aa7840e 100644 --- a/antarest/matrixstore/repository.py +++ b/antarest/matrixstore/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/service.py b/antarest/matrixstore/service.py index 055fbca413..ca69f40fa2 100644 --- a/antarest/matrixstore/service.py +++ b/antarest/matrixstore/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/uri_resolver_service.py b/antarest/matrixstore/uri_resolver_service.py index 87dfdc89c4..542df1a49b 100644 --- a/antarest/matrixstore/uri_resolver_service.py +++ b/antarest/matrixstore/uri_resolver_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/matrixstore/web.py b/antarest/matrixstore/web.py index e50fddfbab..86bf23a17b 100644 --- a/antarest/matrixstore/web.py +++ b/antarest/matrixstore/web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/service_creator.py b/antarest/service_creator.py index b133d29b9c..a9b0351671 100644 --- a/antarest/service_creator.py +++ b/antarest/service_creator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/singleton_services.py b/antarest/singleton_services.py index 99fd44b23c..5437a570f8 100644 --- a/antarest/singleton_services.py +++ b/antarest/singleton_services.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/__init__.py b/antarest/study/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/__init__.py +++ b/antarest/study/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/__init__.py b/antarest/study/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/business/__init__.py +++ b/antarest/study/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/adequacy_patch_management.py b/antarest/study/business/adequacy_patch_management.py index 09ad034aed..3b309e0b01 100644 --- a/antarest/study/business/adequacy_patch_management.py +++ b/antarest/study/business/adequacy_patch_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/advanced_parameters_management.py b/antarest/study/business/advanced_parameters_management.py index 02e0da1134..31a8d880e5 100644 --- a/antarest/study/business/advanced_parameters_management.py +++ b/antarest/study/business/advanced_parameters_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/aggregator_management.py b/antarest/study/business/aggregator_management.py index da2bdf846f..6ee055bf2f 100644 --- a/antarest/study/business/aggregator_management.py +++ b/antarest/study/business/aggregator_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/all_optional_meta.py b/antarest/study/business/all_optional_meta.py index 7a8440226b..5d271f0772 100644 --- a/antarest/study/business/all_optional_meta.py +++ b/antarest/study/business/all_optional_meta.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/allocation_management.py b/antarest/study/business/allocation_management.py index eb18ae9bd2..eafec7f479 100644 --- a/antarest/study/business/allocation_management.py +++ b/antarest/study/business/allocation_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/area_management.py b/antarest/study/business/area_management.py index 5220b0e8e1..c607be980d 100644 --- a/antarest/study/business/area_management.py +++ b/antarest/study/business/area_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/areas/__init__.py b/antarest/study/business/areas/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/business/areas/__init__.py +++ b/antarest/study/business/areas/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/areas/hydro_management.py b/antarest/study/business/areas/hydro_management.py index cba5ec626c..396d2f785c 100644 --- a/antarest/study/business/areas/hydro_management.py +++ b/antarest/study/business/areas/hydro_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/areas/properties_management.py b/antarest/study/business/areas/properties_management.py index df5ab24663..151ff178c3 100644 --- a/antarest/study/business/areas/properties_management.py +++ b/antarest/study/business/areas/properties_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/areas/renewable_management.py b/antarest/study/business/areas/renewable_management.py index 2063750ca3..e82a13f3db 100644 --- a/antarest/study/business/areas/renewable_management.py +++ b/antarest/study/business/areas/renewable_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/areas/st_storage_management.py b/antarest/study/business/areas/st_storage_management.py index 962ce5d7f1..ef89e345d8 100644 --- a/antarest/study/business/areas/st_storage_management.py +++ b/antarest/study/business/areas/st_storage_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/areas/thermal_management.py b/antarest/study/business/areas/thermal_management.py index 13380b54b3..90c2420881 100644 --- a/antarest/study/business/areas/thermal_management.py +++ b/antarest/study/business/areas/thermal_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/binding_constraint_management.py b/antarest/study/business/binding_constraint_management.py index 7c4175ff53..1fb5d48a0d 100644 --- a/antarest/study/business/binding_constraint_management.py +++ b/antarest/study/business/binding_constraint_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/config_management.py b/antarest/study/business/config_management.py index 19fdb4acc0..872336cabd 100644 --- a/antarest/study/business/config_management.py +++ b/antarest/study/business/config_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/correlation_management.py b/antarest/study/business/correlation_management.py index 2b1a5b9430..6aab755ab8 100644 --- a/antarest/study/business/correlation_management.py +++ b/antarest/study/business/correlation_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/district_manager.py b/antarest/study/business/district_manager.py index 2cfec172d8..2479760866 100644 --- a/antarest/study/business/district_manager.py +++ b/antarest/study/business/district_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/enum_ignore_case.py b/antarest/study/business/enum_ignore_case.py index 56a06fabc1..a4f3dd572a 100644 --- a/antarest/study/business/enum_ignore_case.py +++ b/antarest/study/business/enum_ignore_case.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/general_management.py b/antarest/study/business/general_management.py index e4b3730d53..7270c63dc2 100644 --- a/antarest/study/business/general_management.py +++ b/antarest/study/business/general_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/link_management.py b/antarest/study/business/link_management.py index 7c6a971fde..a1a9cb3916 100644 --- a/antarest/study/business/link_management.py +++ b/antarest/study/business/link_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/matrix_management.py b/antarest/study/business/matrix_management.py index a80034b603..bc61aaa098 100644 --- a/antarest/study/business/matrix_management.py +++ b/antarest/study/business/matrix_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/model/__init__.py b/antarest/study/business/model/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/business/model/__init__.py +++ b/antarest/study/business/model/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/model/link_model.py b/antarest/study/business/model/link_model.py index f8c8e32ffd..9d6f50e1f5 100644 --- a/antarest/study/business/model/link_model.py +++ b/antarest/study/business/model/link_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/optimization_management.py b/antarest/study/business/optimization_management.py index 8156202f85..bbfa50c767 100644 --- a/antarest/study/business/optimization_management.py +++ b/antarest/study/business/optimization_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/playlist_management.py b/antarest/study/business/playlist_management.py index da70e87fa7..4b3de8c010 100644 --- a/antarest/study/business/playlist_management.py +++ b/antarest/study/business/playlist_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/scenario_builder_management.py b/antarest/study/business/scenario_builder_management.py index 71a7833cee..0ea15dd6d8 100644 --- a/antarest/study/business/scenario_builder_management.py +++ b/antarest/study/business/scenario_builder_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/table_mode_management.py b/antarest/study/business/table_mode_management.py index c7d570163a..efaeeae5c7 100644 --- a/antarest/study/business/table_mode_management.py +++ b/antarest/study/business/table_mode_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/thematic_trimming_field_infos.py b/antarest/study/business/thematic_trimming_field_infos.py index 9b2e0b06be..2f5c902244 100644 --- a/antarest/study/business/thematic_trimming_field_infos.py +++ b/antarest/study/business/thematic_trimming_field_infos.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/thematic_trimming_management.py b/antarest/study/business/thematic_trimming_management.py index d1db21c0e5..7aef93aedf 100644 --- a/antarest/study/business/thematic_trimming_management.py +++ b/antarest/study/business/thematic_trimming_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/timeseries_config_management.py b/antarest/study/business/timeseries_config_management.py index 226fc75bfb..83cae88554 100644 --- a/antarest/study/business/timeseries_config_management.py +++ b/antarest/study/business/timeseries_config_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/utils.py b/antarest/study/business/utils.py index 03b320c0c6..628dd4a0c4 100644 --- a/antarest/study/business/utils.py +++ b/antarest/study/business/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/business/xpansion_management.py b/antarest/study/business/xpansion_management.py index 3f19e7c8f3..7464de5ec5 100644 --- a/antarest/study/business/xpansion_management.py +++ b/antarest/study/business/xpansion_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/common/__init__.py b/antarest/study/common/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/common/__init__.py +++ b/antarest/study/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/common/studystorage.py b/antarest/study/common/studystorage.py index cedb352051..221857c339 100644 --- a/antarest/study/common/studystorage.py +++ b/antarest/study/common/studystorage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/css4_colors.py b/antarest/study/css4_colors.py index acac63cdde..11c77f72bf 100644 --- a/antarest/study/css4_colors.py +++ b/antarest/study/css4_colors.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/main.py b/antarest/study/main.py index 1efa9cb00b..b7ddb9715e 100644 --- a/antarest/study/main.py +++ b/antarest/study/main.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/model.py b/antarest/study/model.py index 9aed7c852a..cc8792ee99 100644 --- a/antarest/study/model.py +++ b/antarest/study/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/repository.py b/antarest/study/repository.py index 6ecad45df7..a904124d4d 100644 --- a/antarest/study/repository.py +++ b/antarest/study/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/service.py b/antarest/study/service.py index c7ab71b63b..e0e1e1a9c2 100644 --- a/antarest/study/service.py +++ b/antarest/study/service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/__init__.py b/antarest/study/storage/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/__init__.py +++ b/antarest/study/storage/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/abstract_storage_service.py b/antarest/study/storage/abstract_storage_service.py index f845eab757..69d9ba6a27 100644 --- a/antarest/study/storage/abstract_storage_service.py +++ b/antarest/study/storage/abstract_storage_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/auto_archive_service.py b/antarest/study/storage/auto_archive_service.py index 5efd2dda1c..aed3ff1027 100644 --- a/antarest/study/storage/auto_archive_service.py +++ b/antarest/study/storage/auto_archive_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/df_download.py b/antarest/study/storage/df_download.py index f1c4b80a3f..acb9471802 100644 --- a/antarest/study/storage/df_download.py +++ b/antarest/study/storage/df_download.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/explorer_service.py b/antarest/study/storage/explorer_service.py index c34d679d30..30ff6ffcb6 100644 --- a/antarest/study/storage/explorer_service.py +++ b/antarest/study/storage/explorer_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/matrix_profile.py b/antarest/study/storage/matrix_profile.py index a6ddf98679..c18808c8b3 100644 --- a/antarest/study/storage/matrix_profile.py +++ b/antarest/study/storage/matrix_profile.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/patch_service.py b/antarest/study/storage/patch_service.py index 1c44e1ddc9..f98870e240 100644 --- a/antarest/study/storage/patch_service.py +++ b/antarest/study/storage/patch_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/__init__.py b/antarest/study/storage/rawstudy/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/__init__.py +++ b/antarest/study/storage/rawstudy/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/ini_reader.py b/antarest/study/storage/rawstudy/ini_reader.py index e51d9c9672..e003878e7c 100644 --- a/antarest/study/storage/rawstudy/ini_reader.py +++ b/antarest/study/storage/rawstudy/ini_reader.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/ini_writer.py b/antarest/study/storage/rawstudy/ini_writer.py index d4ba73cf5d..9ff81c213e 100644 --- a/antarest/study/storage/rawstudy/ini_writer.py +++ b/antarest/study/storage/rawstudy/ini_writer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/__init__.py b/antarest/study/storage/rawstudy/model/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/__init__.py +++ b/antarest/study/storage/rawstudy/model/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/bucket_node.py b/antarest/study/storage/rawstudy/model/filesystem/bucket_node.py index 3def015763..a058721d4d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/bucket_node.py +++ b/antarest/study/storage/rawstudy/model/filesystem/bucket_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/common/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/common/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/common/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/common/area_matrix_list.py b/antarest/study/storage/rawstudy/model/filesystem/common/area_matrix_list.py index e4022a3600..0edb3de396 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/common/area_matrix_list.py +++ b/antarest/study/storage/rawstudy/model/filesystem/common/area_matrix_list.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/common/prepro.py b/antarest/study/storage/rawstudy/model/filesystem/common/prepro.py index b18d53b81d..4cb5d533b4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/common/prepro.py +++ b/antarest/study/storage/rawstudy/model/filesystem/common/prepro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/config/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/area.py b/antarest/study/storage/rawstudy/model/filesystem/config/area.py index db83868816..c91b42a00d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/binding_constraint.py b/antarest/study/storage/rawstudy/model/filesystem/config/binding_constraint.py index f902e66305..ebf18da753 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/binding_constraint.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/binding_constraint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/cluster.py b/antarest/study/storage/rawstudy/model/filesystem/config/cluster.py index f2a6349d90..f26f2b45e4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/cluster.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py b/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py index 3a903d9cf4..91c4dfef12 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/exceptions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/field_validators.py b/antarest/study/storage/rawstudy/model/filesystem/config/field_validators.py index f6a371769b..5089150c71 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/field_validators.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/field_validators.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/files.py b/antarest/study/storage/rawstudy/model/filesystem/config/files.py index 8f23fecd25..52458c9970 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/files.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/files.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/identifier.py b/antarest/study/storage/rawstudy/model/filesystem/config/identifier.py index 72800c6a1a..e25c5ab9fb 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/identifier.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/identifier.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/ini_properties.py b/antarest/study/storage/rawstudy/model/filesystem/config/ini_properties.py index abbf6fb77b..05451c6870 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/ini_properties.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/ini_properties.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/model.py b/antarest/study/storage/rawstudy/model/filesystem/config/model.py index 160609bc80..388bfaeb5d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/model.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/renewable.py b/antarest/study/storage/rawstudy/model/filesystem/config/renewable.py index 3c5cdcc57e..6b8087b3fd 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/renewable.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/renewable.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/ruleset_matrices.py b/antarest/study/storage/rawstudy/model/filesystem/config/ruleset_matrices.py index ca9ff2e724..47a7568142 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/ruleset_matrices.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/ruleset_matrices.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/st_storage.py b/antarest/study/storage/rawstudy/model/filesystem/config/st_storage.py index 426e263baa..0d21455783 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/st_storage.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/config/thermal.py b/antarest/study/storage/rawstudy/model/filesystem/config/thermal.py index 10750d604b..87f20514f4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/config/thermal.py +++ b/antarest/study/storage/rawstudy/model/filesystem/config/thermal.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/context.py b/antarest/study/storage/rawstudy/model/filesystem/context.py index 0bbb81b503..2d51ad1468 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/context.py +++ b/antarest/study/storage/rawstudy/model/filesystem/context.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/exceptions.py b/antarest/study/storage/rawstudy/model/filesystem/exceptions.py index 399847efc0..e87135e8ce 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/exceptions.py +++ b/antarest/study/storage/rawstudy/model/filesystem/exceptions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/factory.py b/antarest/study/storage/rawstudy/model/filesystem/factory.py index 40b28e33d8..63bfdc5a31 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/factory.py +++ b/antarest/study/storage/rawstudy/model/filesystem/factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/folder_node.py b/antarest/study/storage/rawstudy/model/filesystem/folder_node.py index c8b3604e88..cfcebe9019 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/folder_node.py +++ b/antarest/study/storage/rawstudy/model/filesystem/folder_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/ini_file_node.py b/antarest/study/storage/rawstudy/model/filesystem/ini_file_node.py index dda7a2a6c0..960ccc83e4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/ini_file_node.py +++ b/antarest/study/storage/rawstudy/model/filesystem/ini_file_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/inode.py b/antarest/study/storage/rawstudy/model/filesystem/inode.py index d910234f03..089699d825 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/inode.py +++ b/antarest/study/storage/rawstudy/model/filesystem/inode.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/json_file_node.py b/antarest/study/storage/rawstudy/model/filesystem/json_file_node.py index ca877e9fd6..0ff675c650 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/json_file_node.py +++ b/antarest/study/storage/rawstudy/model/filesystem/json_file_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/lazy_node.py b/antarest/study/storage/rawstudy/model/filesystem/lazy_node.py index d442d9d732..2a9204d71e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/lazy_node.py +++ b/antarest/study/storage/rawstudy/model/filesystem/lazy_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/constants.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/constants.py index ad1300bac7..7c760b490c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/constants.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/constants.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/date_serializer.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/date_serializer.py index ef856c5f91..7a0e1fe289 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/date_serializer.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/date_serializer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/head_writer.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/head_writer.py index 7c8d2fd588..0653197aa9 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/head_writer.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/head_writer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/input_series_matrix.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/input_series_matrix.py index e23cb9842a..6ead440945 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/input_series_matrix.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/input_series_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/matrix.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/matrix.py index 12f90519b7..5d720340b2 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/matrix.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/matrix/output_series_matrix.py b/antarest/study/storage/rawstudy/model/filesystem/matrix/output_series_matrix.py index c3b66d1245..c4fb19b6a4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/matrix/output_series_matrix.py +++ b/antarest/study/storage/rawstudy/model/filesystem/matrix/output_series_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/raw_file_node.py b/antarest/study/storage/rawstudy/model/filesystem/raw_file_node.py index 7752e93e0c..e5d9e9bed5 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/raw_file_node.py +++ b/antarest/study/storage/rawstudy/model/filesystem/raw_file_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/desktop.py b/antarest/study/storage/rawstudy/model/filesystem/root/desktop.py index 20cc1b19c1..04209fcaa8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/desktop.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/desktop.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py index 592b0309fc..ed4ac115d7 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/filestudytree.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/areas.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/areas.py index c9dd2b4e41..7ce396e9da 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/areas.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/areas.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/adequacy_patch.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/adequacy_patch.py index b371e886a7..1cc6fcc5f1 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/adequacy_patch.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/adequacy_patch.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/item.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/item.py index 822e3f80a3..80d170e5e8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/item.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/item.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/optimization.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/optimization.py index 53e83b6ed2..6cc4bef64a 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/optimization.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/optimization.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/ui.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/ui.py index 82da8ebf64..260a1fd7f2 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/ui.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/item/ui.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/list.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/list.py index cdc26f097e..2b873991c1 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/list.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/list.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/sets.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/sets.py index ad327b4eeb..0f9adda270 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/sets.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/areas/sets.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingconstraints_ini.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingconstraints_ini.py index 05ce00cedf..49cfd81847 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingconstraints_ini.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingconstraints_ini.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingcontraints.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingcontraints.py index fedaa47d54..d557ebd5b8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingcontraints.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/bindingconstraints/bindingcontraints.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/prepro_series.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/prepro_series.py index 74c99bf04b..fde5dacf08 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/prepro_series.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/commons/prepro_series.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/allocation.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/allocation.py index afa09c4c0e..af890b7de4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/allocation.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/allocation.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/area.py index b3b89b8498..fac71885a2 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/allocation/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/capacity.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/capacity.py index 33a6e999e7..ca45887ac8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/capacity.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/capacity/capacity.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/common.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/common.py index d89d80014a..7b1a342eb4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/common.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/common/common.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro.py index f5e021ce61..e22f83681b 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro_ini.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro_ini.py index d211875726..02b5c7d62c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro_ini.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/hydro_ini.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/area.py index bdd8ac80db..c3c47fc134 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/prepro.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/prepro.py index 560fb4cfee..76ea568140 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/prepro.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/area/prepro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/prepro.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/prepro.py index ba884200d5..bf31c45b74 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/prepro.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/prepro/prepro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/area.py index 4c6ada156a..7adbc438f9 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/series.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/series.py index bb22eab408..510cef5c9c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/series.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/hydro/series/series.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/input.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/input.py index 429831b818..3a0895e03f 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/input.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/input.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/area.py index 1eefe1d53c..f89d51cf9e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/capacities.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/capacities.py index aabc88f5f4..2b908dd3ff 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/capacities.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/capacities/capacities.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/properties.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/properties.py index 74992f5dd0..7631b0bca7 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/properties.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/area/properties.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/link.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/link.py index d94faabe71..4de3fbb6c4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/link/link.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/link/link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/miscgen.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/miscgen.py index 213c9b9632..6d03968e6d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/miscgen.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/miscgen/miscgen.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/clusters.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/clusters.py index 5f82229251..8db26ea89e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/clusters.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/clusters.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/renewable.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/renewable.py index aa6e9bd94b..6d38ad62a7 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/renewable.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/renewable.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/series.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/series.py index 91aa09642d..7c42659b02 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/series.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/renewables/series.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/reserves.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/reserves.py index 7b9b89c982..9a31a0efb4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/reserves.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/reserves/reserves.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/area.py index 375a8d64fa..2bcfe147e2 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/list.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/list.py index 05bb39ff0f..effd35ff88 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/list.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/area/list.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/clusters.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/clusters.py index 3723410414..15bd2fab7e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/clusters.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/clusters/clusters.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/area.py index 3acba900a1..d79b42a05a 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/st_storage.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/st_storage.py index c2a2a4a19a..1ecb643ed4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/st_storage.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/area/st_storage/st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/series.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/series.py index 3c071bfcd8..e6cb6126e2 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/series.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/series/series.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/st_storage.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/st_storage.py index 4ce2fcbe9c..69481773e1 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/st_storage.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/st_storage/st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/areas_ini.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/areas_ini.py index 89747be06c..e42e3bb427 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/areas_ini.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/areas_ini.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/area.py index e97c5d07ae..8f29e0d5b4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/list.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/list.py index 4b4389fdfd..adacbb8ffc 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/list.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/area/list.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/cluster.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/cluster.py index 77ec2e705f..7ca40fd5f8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/cluster.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/cluster/cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/area.py index b56dea4693..b3c3443dee 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/thermal.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/thermal.py index dc57ee3c4a..89830b67af 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/thermal.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/area/thermal/thermal.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/prepro.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/prepro.py index bf75f6ad07..448f09718d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/prepro.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/prepro/prepro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/area.py index c87e73a108..c4bae19d0d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/thermal.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/thermal.py index b18dde23a7..c39b7519b5 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/thermal.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/area/thermal/thermal.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/series.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/series.py index fc639c99d9..1617fd33d8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/series.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/series/series.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/thermal.py b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/thermal.py index dcdcd5dc70..62df6ec130 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/thermal.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/input/thermal/thermal.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/layers/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/layers/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/layers/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/layers/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/layers/layer_ini.py b/antarest/study/storage/rawstudy/model/filesystem/root/layers/layer_ini.py index 4755015f11..c44135188e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/layers/layer_ini.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/layers/layer_ini.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/layers/layers.py b/antarest/study/storage/rawstudy/model/filesystem/root/layers/layers.py index 9f40e3fc6d..585d8a1d0d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/layers/layers.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/layers/layers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py index 5a451d5cf3..cdeb6d5b28 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/output.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/about.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/about.py index 35cffab3db..cafcb15ddb 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/about.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/about.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/study.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/study.py index f0324b00fd..773a5f1c3d 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/study.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/about/study.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/info_antares_output.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/info_antares_output.py index 14e834ae0b..8342f16b1b 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/info_antares_output.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/info_antares_output.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/area.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/area.py index 398ec9bf4e..9087ed52f3 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/area.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/areas.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/areas.py index 4c1a14cdff..f84a718e9c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/areas.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/areas.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/binding_const.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/binding_const.py index e956da727b..b2f14a637b 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/binding_const.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/binding_const.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/link.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/link.py index 81922bc9c9..6e6adf2212 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/link.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/links.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/links.py index b7d4ad1d70..30f06e449c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/links.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/links.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/set.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/set.py index 11076e977c..99260aa7bb 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/set.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/set.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/utils.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/utils.py index d5d6b6495c..a1dd68594e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/utils.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/common/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/economy.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/economy.py index c39642589e..1f45a5d1f4 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/economy.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/economy.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/grid.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/grid.py index 374b4fc6a1..ae6365f3f1 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/grid.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcall/grid.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/mcind.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/mcind.py index ea1c5d2c58..9378ae0c5f 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/mcind.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/mode/mcind/mcind.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/simulation.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/simulation.py index 12ecb930d9..7e20a2caff 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/simulation.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/simulation.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/ts_generator.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/ts_generator.py index b99307d01d..79e22dbb4c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/ts_generator.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_generator/ts_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers.py index 4c84635f4a..f9a2eba1cc 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers_data.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers_data.py index 45512a2af2..0a85147844 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers_data.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/ts_numbers/ts_numbers_data.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/lp.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/lp.py index da7c468535..db0429cc16 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/lp.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/lp.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/sensitivity.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/sensitivity.py index 8383dbbcad..cb8446da23 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/sensitivity.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/sensitivity.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/xpansion.py b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/xpansion.py index 2815bac089..cd36bffa16 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/xpansion.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/output/simulation/xpansion/xpansion.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py index 27ece887bf..b3abcfba0e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/generaldata.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/resources.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/resources.py index 4ff236f7be..3b90d28304 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/resources.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/resources/resources.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/scenariobuilder.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/scenariobuilder.py index f1960d9984..d384433216 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/scenariobuilder.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/scenariobuilder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/settings.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/settings.py index f63b7cb69d..33ef9ee65c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/settings.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/settings.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/simulations.py b/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/simulations.py index 64e074623e..88d86481fd 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/simulations.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/settings/simulations/simulations.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/study_antares.py b/antarest/study/storage/rawstudy/model/filesystem/root/study_antares.py index 34d83ee943..fd7da87b0e 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/study_antares.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/study_antares.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/__init__.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/__init__.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/candidates.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/candidates.py index 80e90ca258..3e7ef0176f 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/candidates.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/candidates.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/constraint_resources.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/constraint_resources.py index fdcde63d7d..214d179901 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/constraint_resources.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/constraint_resources.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/expansion.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/expansion.py index 14a7a0d653..a6738beea8 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/expansion.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/expansion.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/matrix_resources.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/matrix_resources.py index a61ca899b6..0c6af18d17 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/matrix_resources.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/matrix_resources.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/sensitivity.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/sensitivity.py index 2a2ea7c9c3..f13dd4e3aa 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/sensitivity.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/sensitivity.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/settings.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/settings.py index 45e568d8f6..c162da1029 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/settings.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/expansion/settings.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/filesystem/root/user/user.py b/antarest/study/storage/rawstudy/model/filesystem/root/user/user.py index 5cf92d089b..8b6b47825b 100644 --- a/antarest/study/storage/rawstudy/model/filesystem/root/user/user.py +++ b/antarest/study/storage/rawstudy/model/filesystem/root/user/user.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/model/helpers.py b/antarest/study/storage/rawstudy/model/helpers.py index a8eae4e7b6..ccd6b20c82 100644 --- a/antarest/study/storage/rawstudy/model/helpers.py +++ b/antarest/study/storage/rawstudy/model/helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/raw_study_service.py b/antarest/study/storage/rawstudy/raw_study_service.py index 11572d6710..4d2a027965 100644 --- a/antarest/study/storage/rawstudy/raw_study_service.py +++ b/antarest/study/storage/rawstudy/raw_study_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/rawstudy/watcher.py b/antarest/study/storage/rawstudy/watcher.py index d0007ea757..40a08f47a4 100644 --- a/antarest/study/storage/rawstudy/watcher.py +++ b/antarest/study/storage/rawstudy/watcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/storage_service.py b/antarest/study/storage/storage_service.py index 51f7555d7f..31a5386e63 100644 --- a/antarest/study/storage/storage_service.py +++ b/antarest/study/storage/storage_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/study_download_utils.py b/antarest/study/storage/study_download_utils.py index f46b23e254..3048466a7d 100644 --- a/antarest/study/storage/study_download_utils.py +++ b/antarest/study/storage/study_download_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/study_upgrader/__init__.py b/antarest/study/storage/study_upgrader/__init__.py index e854e7d013..c3180bb5be 100644 --- a/antarest/study/storage/study_upgrader/__init__.py +++ b/antarest/study/storage/study_upgrader/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/utils.py b/antarest/study/storage/utils.py index 5ed97a19d5..639f9a6495 100644 --- a/antarest/study/storage/utils.py +++ b/antarest/study/storage/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/__init__.py b/antarest/study/storage/variantstudy/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/variantstudy/__init__.py +++ b/antarest/study/storage/variantstudy/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/__init__.py b/antarest/study/storage/variantstudy/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/variantstudy/business/__init__.py +++ b/antarest/study/storage/variantstudy/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/command_extractor.py b/antarest/study/storage/variantstudy/business/command_extractor.py index 851f3eb431..95b51fe9ea 100644 --- a/antarest/study/storage/variantstudy/business/command_extractor.py +++ b/antarest/study/storage/variantstudy/business/command_extractor.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/command_reverter.py b/antarest/study/storage/variantstudy/business/command_reverter.py index 7b585f46b5..d5971dd69e 100644 --- a/antarest/study/storage/variantstudy/business/command_reverter.py +++ b/antarest/study/storage/variantstudy/business/command_reverter.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/__init__.py b/antarest/study/storage/variantstudy/business/matrix_constants/__init__.py index ae0af113f7..3b4bc42056 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/__init__.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/__init__.py b/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/__init__.py index 580794d32a..470a9cc063 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/__init__.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_after_v87.py b/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_after_v87.py index 81c830f7d1..97ba0549a6 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_after_v87.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_after_v87.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_before_v87.py b/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_before_v87.py index 063eb069c8..4dd4078d0b 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_before_v87.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/binding_constraint/series_before_v87.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/common.py b/antarest/study/storage/variantstudy/business/matrix_constants/common.py index 4507a48ce7..42ca14a9b8 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/common.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/common.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/hydro/__init__.py b/antarest/study/storage/variantstudy/business/matrix_constants/hydro/__init__.py index 36ac538608..608a308295 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/hydro/__init__.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/hydro/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v6.py b/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v6.py index a2415c6f7e..47da8f2f68 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v6.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v6.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v7.py b/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v7.py index 0de0936333..9045b6d4cc 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v7.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/hydro/v7.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/link/__init__.py b/antarest/study/storage/variantstudy/business/matrix_constants/link/__init__.py index c517f46722..cb756f7274 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/link/__init__.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/link/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/link/v7.py b/antarest/study/storage/variantstudy/business/matrix_constants/link/v7.py index 4340537f99..29fad22514 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/link/v7.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/link/v7.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/link/v8.py b/antarest/study/storage/variantstudy/business/matrix_constants/link/v8.py index 839a703ef2..c87cf4116a 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/link/v8.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/link/v8.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/prepro.py b/antarest/study/storage/variantstudy/business/matrix_constants/prepro.py index 2a04905c67..cb22f0872f 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/prepro.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/prepro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/__init__.py b/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/__init__.py index f6c48f1942..8998175b7d 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/__init__.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/series.py b/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/series.py index 5efba8eece..cbbce5e727 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/series.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/st_storage/series.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/thermals/__init__.py b/antarest/study/storage/variantstudy/business/matrix_constants/thermals/__init__.py index 1b665aa933..c4a504b5e7 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/thermals/__init__.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/thermals/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants/thermals/prepro.py b/antarest/study/storage/variantstudy/business/matrix_constants/thermals/prepro.py index d244f5e7b4..5c1e43dcbc 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants/thermals/prepro.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants/thermals/prepro.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/matrix_constants_generator.py b/antarest/study/storage/variantstudy/business/matrix_constants_generator.py index 98f098a07d..148e6e5df0 100644 --- a/antarest/study/storage/variantstudy/business/matrix_constants_generator.py +++ b/antarest/study/storage/variantstudy/business/matrix_constants_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/utils.py b/antarest/study/storage/variantstudy/business/utils.py index c470d9ac03..84fb848056 100644 --- a/antarest/study/storage/variantstudy/business/utils.py +++ b/antarest/study/storage/variantstudy/business/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/business/utils_binding_constraint.py b/antarest/study/storage/variantstudy/business/utils_binding_constraint.py index 328e43f0f6..399df46636 100644 --- a/antarest/study/storage/variantstudy/business/utils_binding_constraint.py +++ b/antarest/study/storage/variantstudy/business/utils_binding_constraint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/command_factory.py b/antarest/study/storage/variantstudy/command_factory.py index 567567a263..9638141643 100644 --- a/antarest/study/storage/variantstudy/command_factory.py +++ b/antarest/study/storage/variantstudy/command_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/__init__.py b/antarest/study/storage/variantstudy/model/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/variantstudy/model/__init__.py +++ b/antarest/study/storage/variantstudy/model/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/__init__.py b/antarest/study/storage/variantstudy/model/command/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/variantstudy/model/command/__init__.py +++ b/antarest/study/storage/variantstudy/model/command/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/common.py b/antarest/study/storage/variantstudy/model/command/common.py index c2d604e55b..744c87d22c 100644 --- a/antarest/study/storage/variantstudy/model/command/common.py +++ b/antarest/study/storage/variantstudy/model/command/common.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_area.py b/antarest/study/storage/variantstudy/model/command/create_area.py index 30cd0608a4..65c78399b9 100644 --- a/antarest/study/storage/variantstudy/model/command/create_area.py +++ b/antarest/study/storage/variantstudy/model/command/create_area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py index 2e3d26e9bd..b76f092086 100644 --- a/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_cluster.py b/antarest/study/storage/variantstudy/model/command/create_cluster.py index 8364ab0857..c8f42fb60a 100644 --- a/antarest/study/storage/variantstudy/model/command/create_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/create_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_district.py b/antarest/study/storage/variantstudy/model/command/create_district.py index adde84a6ee..8edb484700 100644 --- a/antarest/study/storage/variantstudy/model/command/create_district.py +++ b/antarest/study/storage/variantstudy/model/command/create_district.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_link.py b/antarest/study/storage/variantstudy/model/command/create_link.py index 134491ce8c..1158c32a63 100644 --- a/antarest/study/storage/variantstudy/model/command/create_link.py +++ b/antarest/study/storage/variantstudy/model/command/create_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py b/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py index a278a1e5d6..2b4d93a085 100644 --- a/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_st_storage.py b/antarest/study/storage/variantstudy/model/command/create_st_storage.py index e247b7215c..a3c16195ad 100644 --- a/antarest/study/storage/variantstudy/model/command/create_st_storage.py +++ b/antarest/study/storage/variantstudy/model/command/create_st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/create_user_resource.py b/antarest/study/storage/variantstudy/model/command/create_user_resource.py index 0afb321e54..869b896f2b 100644 --- a/antarest/study/storage/variantstudy/model/command/create_user_resource.py +++ b/antarest/study/storage/variantstudy/model/command/create_user_resource.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py b/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py index 9f8631b608..b799940916 100644 --- a/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py +++ b/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/icommand.py b/antarest/study/storage/variantstudy/model/command/icommand.py index f3c998c67f..a12fd6cf2b 100644 --- a/antarest/study/storage/variantstudy/model/command/icommand.py +++ b/antarest/study/storage/variantstudy/model/command/icommand.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_area.py b/antarest/study/storage/variantstudy/model/command/remove_area.py index 4d7c33e922..ec4e491ead 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_area.py +++ b/antarest/study/storage/variantstudy/model/command/remove_area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py index 55dd971133..b05b51efc4 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_cluster.py b/antarest/study/storage/variantstudy/model/command/remove_cluster.py index 5ff1bebcae..3fe682ead9 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/remove_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_district.py b/antarest/study/storage/variantstudy/model/command/remove_district.py index 2b675aed3f..421d1deca3 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_district.py +++ b/antarest/study/storage/variantstudy/model/command/remove_district.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_link.py b/antarest/study/storage/variantstudy/model/command/remove_link.py index af5d3a5321..2f9b2fa7ef 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_link.py +++ b/antarest/study/storage/variantstudy/model/command/remove_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py b/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py index 5d82f1630d..5947889bbe 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_st_storage.py b/antarest/study/storage/variantstudy/model/command/remove_st_storage.py index 1e230cfdfa..a5a420a362 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_st_storage.py +++ b/antarest/study/storage/variantstudy/model/command/remove_st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/remove_user_resource.py b/antarest/study/storage/variantstudy/model/command/remove_user_resource.py index f873ec2d10..7081163625 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_user_resource.py +++ b/antarest/study/storage/variantstudy/model/command/remove_user_resource.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/replace_matrix.py b/antarest/study/storage/variantstudy/model/command/replace_matrix.py index c796c47ce2..aaceb7c3f7 100644 --- a/antarest/study/storage/variantstudy/model/command/replace_matrix.py +++ b/antarest/study/storage/variantstudy/model/command/replace_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py index 6c247b4c05..35715ed293 100644 --- a/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_comments.py b/antarest/study/storage/variantstudy/model/command/update_comments.py index b5300d171c..2288414463 100644 --- a/antarest/study/storage/variantstudy/model/command/update_comments.py +++ b/antarest/study/storage/variantstudy/model/command/update_comments.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_config.py b/antarest/study/storage/variantstudy/model/command/update_config.py index ef054383f0..e53ed7edfe 100644 --- a/antarest/study/storage/variantstudy/model/command/update_config.py +++ b/antarest/study/storage/variantstudy/model/command/update_config.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_district.py b/antarest/study/storage/variantstudy/model/command/update_district.py index 5d0b706484..d6a65bd16b 100644 --- a/antarest/study/storage/variantstudy/model/command/update_district.py +++ b/antarest/study/storage/variantstudy/model/command/update_district.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_link.py b/antarest/study/storage/variantstudy/model/command/update_link.py index 16a13fa7e3..1aaa2d5327 100644 --- a/antarest/study/storage/variantstudy/model/command/update_link.py +++ b/antarest/study/storage/variantstudy/model/command/update_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_playlist.py b/antarest/study/storage/variantstudy/model/command/update_playlist.py index 3c19b9a2f4..39fcf3d1dd 100644 --- a/antarest/study/storage/variantstudy/model/command/update_playlist.py +++ b/antarest/study/storage/variantstudy/model/command/update_playlist.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_raw_file.py b/antarest/study/storage/variantstudy/model/command/update_raw_file.py index 97446dadcc..0e8efb2392 100644 --- a/antarest/study/storage/variantstudy/model/command/update_raw_file.py +++ b/antarest/study/storage/variantstudy/model/command/update_raw_file.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py b/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py index 4328bcf1fe..6ae373e238 100644 --- a/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py +++ b/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command_context.py b/antarest/study/storage/variantstudy/model/command_context.py index f4b9d6f6c7..9291e8bb6a 100644 --- a/antarest/study/storage/variantstudy/model/command_context.py +++ b/antarest/study/storage/variantstudy/model/command_context.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command_listener/__init__.py b/antarest/study/storage/variantstudy/model/command_listener/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/storage/variantstudy/model/command_listener/__init__.py +++ b/antarest/study/storage/variantstudy/model/command_listener/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/command_listener/command_listener.py b/antarest/study/storage/variantstudy/model/command_listener/command_listener.py index c2c4da8f4e..5942df722f 100644 --- a/antarest/study/storage/variantstudy/model/command_listener/command_listener.py +++ b/antarest/study/storage/variantstudy/model/command_listener/command_listener.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/dbmodel.py b/antarest/study/storage/variantstudy/model/dbmodel.py index b855a75cf9..d0d6435732 100644 --- a/antarest/study/storage/variantstudy/model/dbmodel.py +++ b/antarest/study/storage/variantstudy/model/dbmodel.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/interfaces.py b/antarest/study/storage/variantstudy/model/interfaces.py index cfe392a024..2eb84be257 100644 --- a/antarest/study/storage/variantstudy/model/interfaces.py +++ b/antarest/study/storage/variantstudy/model/interfaces.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/model/model.py b/antarest/study/storage/variantstudy/model/model.py index 0d0c308581..cb1866037f 100644 --- a/antarest/study/storage/variantstudy/model/model.py +++ b/antarest/study/storage/variantstudy/model/model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/repository.py b/antarest/study/storage/variantstudy/repository.py index a090b84c5a..9c9425630d 100644 --- a/antarest/study/storage/variantstudy/repository.py +++ b/antarest/study/storage/variantstudy/repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/snapshot_generator.py b/antarest/study/storage/variantstudy/snapshot_generator.py index afde1004eb..58d4d62b7b 100644 --- a/antarest/study/storage/variantstudy/snapshot_generator.py +++ b/antarest/study/storage/variantstudy/snapshot_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/variant_command_extractor.py b/antarest/study/storage/variantstudy/variant_command_extractor.py index 76df6653c4..7515e0147e 100644 --- a/antarest/study/storage/variantstudy/variant_command_extractor.py +++ b/antarest/study/storage/variantstudy/variant_command_extractor.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/variant_command_generator.py b/antarest/study/storage/variantstudy/variant_command_generator.py index 13e93a561f..42113ead14 100644 --- a/antarest/study/storage/variantstudy/variant_command_generator.py +++ b/antarest/study/storage/variantstudy/variant_command_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/storage/variantstudy/variant_study_service.py b/antarest/study/storage/variantstudy/variant_study_service.py index 170eeadedb..fc9d447ea0 100644 --- a/antarest/study/storage/variantstudy/variant_study_service.py +++ b/antarest/study/storage/variantstudy/variant_study_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/__init__.py b/antarest/study/web/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/study/web/__init__.py +++ b/antarest/study/web/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/explorer_blueprint.py b/antarest/study/web/explorer_blueprint.py index 0981ba5214..2c8065fbd2 100644 --- a/antarest/study/web/explorer_blueprint.py +++ b/antarest/study/web/explorer_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/raw_studies_blueprint.py b/antarest/study/web/raw_studies_blueprint.py index 730402a9ee..a06eba7515 100644 --- a/antarest/study/web/raw_studies_blueprint.py +++ b/antarest/study/web/raw_studies_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/studies_blueprint.py b/antarest/study/web/studies_blueprint.py index 6fe9758186..25d72b94fc 100644 --- a/antarest/study/web/studies_blueprint.py +++ b/antarest/study/web/studies_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/study_data_blueprint.py b/antarest/study/web/study_data_blueprint.py index 6fa84387ee..9be21c1743 100644 --- a/antarest/study/web/study_data_blueprint.py +++ b/antarest/study/web/study_data_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/variant_blueprint.py b/antarest/study/web/variant_blueprint.py index db2c2b984a..c4056d7e1a 100644 --- a/antarest/study/web/variant_blueprint.py +++ b/antarest/study/web/variant_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/watcher_blueprint.py b/antarest/study/web/watcher_blueprint.py index cbfd3a8cb6..9a564ecb52 100644 --- a/antarest/study/web/watcher_blueprint.py +++ b/antarest/study/web/watcher_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/study/web/xpansion_studies_blueprint.py b/antarest/study/web/xpansion_studies_blueprint.py index 5372fb0cea..0871efd0f0 100644 --- a/antarest/study/web/xpansion_studies_blueprint.py +++ b/antarest/study/web/xpansion_studies_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/tools/__init__.py b/antarest/tools/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/tools/__init__.py +++ b/antarest/tools/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/tools/admin.py b/antarest/tools/admin.py index 39f15991cd..7ad6f3e9a4 100644 --- a/antarest/tools/admin.py +++ b/antarest/tools/admin.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/tools/admin_lib.py b/antarest/tools/admin_lib.py index 4a27593b96..526c415784 100644 --- a/antarest/tools/admin_lib.py +++ b/antarest/tools/admin_lib.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/tools/cli.py b/antarest/tools/cli.py index f7735b891e..aa6b733bde 100644 --- a/antarest/tools/cli.py +++ b/antarest/tools/cli.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/tools/lib.py b/antarest/tools/lib.py index 03d59a1949..85b1c6c19c 100644 --- a/antarest/tools/lib.py +++ b/antarest/tools/lib.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/worker/__init__.py b/antarest/worker/__init__.py index 058c6b221a..f477ac830c 100644 --- a/antarest/worker/__init__.py +++ b/antarest/worker/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/worker/archive_worker.py b/antarest/worker/archive_worker.py index 23bcd3aa69..cf62083b24 100644 --- a/antarest/worker/archive_worker.py +++ b/antarest/worker/archive_worker.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/worker/archive_worker_service.py b/antarest/worker/archive_worker_service.py index b8e505fa8c..d7c79efad7 100644 --- a/antarest/worker/archive_worker_service.py +++ b/antarest/worker/archive_worker_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/worker/worker.py b/antarest/worker/worker.py index 6de459efbb..a3525b5969 100644 --- a/antarest/worker/worker.py +++ b/antarest/worker/worker.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/antarest/wsgi.py b/antarest/wsgi.py index b39d3a1153..dc730be5e5 100644 --- a/antarest/wsgi.py +++ b/antarest/wsgi.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/scripts/license_checker_and_adder.py b/scripts/license_checker_and_adder.py index 31139ae87a..7b2413b302 100755 --- a/scripts/license_checker_and_adder.py +++ b/scripts/license_checker_and_adder.py @@ -8,7 +8,7 @@ # Use to skip subtrees that have their own licenses (forks) LICENSE_FILE_PATTERN = re.compile("LICENSE.*") -BACKEND_LICENSE_HEADER = """# Copyright (c) 2024, RTE (https://www.rte-france.com) +BACKEND_LICENSE_HEADER = """# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/__init__.py b/tests/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/cache/__init__.py b/tests/cache/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/cache/__init__.py +++ b/tests/cache/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/cache/test_local_cache.py b/tests/cache/test_local_cache.py index dc6382cac5..165db1f4a2 100644 --- a/tests/cache/test_local_cache.py +++ b/tests/cache/test_local_cache.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/cache/test_redis_cache.py b/tests/cache/test_redis_cache.py index 808131fabb..5e9aa5d7ae 100644 --- a/tests/cache/test_redis_cache.py +++ b/tests/cache/test_redis_cache.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/cache/test_service.py b/tests/cache/test_service.py index cc833227d0..41aee5bbbe 100644 --- a/tests/cache/test_service.py +++ b/tests/cache/test_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/conftest.py b/tests/conftest.py index cd2016daea..e384338bc8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/conftest_db.py b/tests/conftest_db.py index 51b63d24af..520decb814 100644 --- a/tests/conftest_db.py +++ b/tests/conftest_db.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/conftest_instances.py b/tests/conftest_instances.py index 58237e6fc1..bd5057c34f 100644 --- a/tests/conftest_instances.py +++ b/tests/conftest_instances.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/conftest_services.py b/tests/conftest_services.py index aef3457e3b..c1d4865662 100644 --- a/tests/conftest_services.py +++ b/tests/conftest_services.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/__init__.py b/tests/core/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/core/__init__.py +++ b/tests/core/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/assets/__init__.py b/tests/core/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/core/assets/__init__.py +++ b/tests/core/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/tasks/__init__.py b/tests/core/tasks/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/core/tasks/__init__.py +++ b/tests/core/tasks/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/tasks/test_model.py b/tests/core/tasks/test_model.py index 8c93ba9c3b..128a139244 100644 --- a/tests/core/tasks/test_model.py +++ b/tests/core/tasks/test_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/tasks/test_task_job_service.py b/tests/core/tasks/test_task_job_service.py index 759146cac5..b95b03fdba 100644 --- a/tests/core/tasks/test_task_job_service.py +++ b/tests/core/tasks/test_task_job_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_auth.py b/tests/core/test_auth.py index 469ce8a2ee..367750b770 100644 --- a/tests/core/test_auth.py +++ b/tests/core/test_auth.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_exceptions.py b/tests/core/test_exceptions.py index 9ebdc6aa84..af787d2a58 100644 --- a/tests/core/test_exceptions.py +++ b/tests/core/test_exceptions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_file_transfer.py b/tests/core/test_file_transfer.py index 44cf01e410..fa3a30601a 100644 --- a/tests/core/test_file_transfer.py +++ b/tests/core/test_file_transfer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_jwt.py b/tests/core/test_jwt.py index 603d2b76dc..8d7ee229b7 100644 --- a/tests/core/test_jwt.py +++ b/tests/core/test_jwt.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_maintenance.py b/tests/core/test_maintenance.py index c6c604d9ca..f1b6c741df 100644 --- a/tests/core/test_maintenance.py +++ b/tests/core/test_maintenance.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_tasks.py b/tests/core/test_tasks.py index f1a8473c00..47b8ea08cd 100644 --- a/tests/core/test_tasks.py +++ b/tests/core/test_tasks.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_utils.py b/tests/core/test_utils.py index e6022f139e..bca468c94b 100644 --- a/tests/core/test_utils.py +++ b/tests/core/test_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_utils_bp.py b/tests/core/test_utils_bp.py index b4ae0847ed..73878badaf 100644 --- a/tests/core/test_utils_bp.py +++ b/tests/core/test_utils_bp.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/test_version_info.py b/tests/core/test_version_info.py index 2ad075d9f1..a41b59af79 100644 --- a/tests/core/test_version_info.py +++ b/tests/core/test_version_info.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/utils/__init__.py b/tests/core/utils/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/core/utils/__init__.py +++ b/tests/core/utils/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/core/utils/test_extract_zip.py b/tests/core/utils/test_extract_zip.py index 5d24e6c772..4f2751c527 100644 --- a/tests/core/utils/test_extract_zip.py +++ b/tests/core/utils/test_extract_zip.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/db_statement_recorder.py b/tests/db_statement_recorder.py index 890205b94f..fc40e7c9da 100644 --- a/tests/db_statement_recorder.py +++ b/tests/db_statement_recorder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/eventbus/__init__.py b/tests/eventbus/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/eventbus/__init__.py +++ b/tests/eventbus/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/eventbus/test_local_eventbus.py b/tests/eventbus/test_local_eventbus.py index 571673cbeb..c8c552e2e1 100644 --- a/tests/eventbus/test_local_eventbus.py +++ b/tests/eventbus/test_local_eventbus.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/eventbus/test_redis_event_bus.py b/tests/eventbus/test_redis_event_bus.py index fa8722f742..05587f6408 100644 --- a/tests/eventbus/test_redis_event_bus.py +++ b/tests/eventbus/test_redis_event_bus.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/eventbus/test_service.py b/tests/eventbus/test_service.py index 4089849db7..4be8865f24 100644 --- a/tests/eventbus/test_service.py +++ b/tests/eventbus/test_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/eventbus/test_websocket_manager.py b/tests/eventbus/test_websocket_manager.py index 94500de322..0e23ca4ade 100644 --- a/tests/eventbus/test_websocket_manager.py +++ b/tests/eventbus/test_websocket_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/helpers.py b/tests/helpers.py index 80dd0683a6..2b04ecd65c 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/assets/__init__.py b/tests/integration/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/integration/assets/__init__.py +++ b/tests/integration/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 833791850d..7c588f37dd 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/explorer_blueprint/test_explorer.py b/tests/integration/explorer_blueprint/test_explorer.py index dbb6f83ebc..7463602cff 100644 --- a/tests/integration/explorer_blueprint/test_explorer.py +++ b/tests/integration/explorer_blueprint/test_explorer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/filesystem_blueprint/__init__.py b/tests/integration/filesystem_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/filesystem_blueprint/__init__.py +++ b/tests/integration/filesystem_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/filesystem_blueprint/test_filesystem_endpoints.py b/tests/integration/filesystem_blueprint/test_filesystem_endpoints.py index ac1e9a36ff..9dbc3308ed 100644 --- a/tests/integration/filesystem_blueprint/test_filesystem_endpoints.py +++ b/tests/integration/filesystem_blueprint/test_filesystem_endpoints.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/filesystem_blueprint/test_model.py b/tests/integration/filesystem_blueprint/test_model.py index d26bdb02cb..4e04761bee 100644 --- a/tests/integration/filesystem_blueprint/test_model.py +++ b/tests/integration/filesystem_blueprint/test_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/launcher_blueprint/__init__.py b/tests/integration/launcher_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/launcher_blueprint/__init__.py +++ b/tests/integration/launcher_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/launcher_blueprint/test_launcher_local.py b/tests/integration/launcher_blueprint/test_launcher_local.py index 67fc421324..6771b71e13 100644 --- a/tests/integration/launcher_blueprint/test_launcher_local.py +++ b/tests/integration/launcher_blueprint/test_launcher_local.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/launcher_blueprint/test_solver_versions.py b/tests/integration/launcher_blueprint/test_solver_versions.py index f4634a497e..4934d07a0b 100644 --- a/tests/integration/launcher_blueprint/test_solver_versions.py +++ b/tests/integration/launcher_blueprint/test_solver_versions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/prepare_proxy.py b/tests/integration/prepare_proxy.py index b1fa804a1f..e1d37502a1 100644 --- a/tests/integration/prepare_proxy.py +++ b/tests/integration/prepare_proxy.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/raw_studies_blueprint/__init__.py b/tests/integration/raw_studies_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/raw_studies_blueprint/__init__.py +++ b/tests/integration/raw_studies_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/raw_studies_blueprint/assets/__init__.py b/tests/integration/raw_studies_blueprint/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/integration/raw_studies_blueprint/assets/__init__.py +++ b/tests/integration/raw_studies_blueprint/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/raw_studies_blueprint/test_aggregate_raw_data.py b/tests/integration/raw_studies_blueprint/test_aggregate_raw_data.py index f4532ea46f..84637fbac2 100644 --- a/tests/integration/raw_studies_blueprint/test_aggregate_raw_data.py +++ b/tests/integration/raw_studies_blueprint/test_aggregate_raw_data.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/raw_studies_blueprint/test_download_matrices.py b/tests/integration/raw_studies_blueprint/test_download_matrices.py index f4b1519d4a..ec097d4fcc 100644 --- a/tests/integration/raw_studies_blueprint/test_download_matrices.py +++ b/tests/integration/raw_studies_blueprint/test_download_matrices.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/raw_studies_blueprint/test_fetch_raw_data.py b/tests/integration/raw_studies_blueprint/test_fetch_raw_data.py index 15673c8ae7..8cbd7429eb 100644 --- a/tests/integration/raw_studies_blueprint/test_fetch_raw_data.py +++ b/tests/integration/raw_studies_blueprint/test_fetch_raw_data.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/__init__.py b/tests/integration/studies_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/studies_blueprint/__init__.py +++ b/tests/integration/studies_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/assets/__init__.py b/tests/integration/studies_blueprint/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/integration/studies_blueprint/assets/__init__.py +++ b/tests/integration/studies_blueprint/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_comments.py b/tests/integration/studies_blueprint/test_comments.py index b83cc134b7..d57c3f068d 100644 --- a/tests/integration/studies_blueprint/test_comments.py +++ b/tests/integration/studies_blueprint/test_comments.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_disk_usage.py b/tests/integration/studies_blueprint/test_disk_usage.py index 6958667863..d421d813f5 100644 --- a/tests/integration/studies_blueprint/test_disk_usage.py +++ b/tests/integration/studies_blueprint/test_disk_usage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_get_studies.py b/tests/integration/studies_blueprint/test_get_studies.py index 8e94e15d92..7049f82369 100644 --- a/tests/integration/studies_blueprint/test_get_studies.py +++ b/tests/integration/studies_blueprint/test_get_studies.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_move.py b/tests/integration/studies_blueprint/test_move.py index 83defc9aad..357543b7a7 100644 --- a/tests/integration/studies_blueprint/test_move.py +++ b/tests/integration/studies_blueprint/test_move.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_study_matrix_index.py b/tests/integration/studies_blueprint/test_study_matrix_index.py index 4f540f4c30..0c02b2dc8e 100644 --- a/tests/integration/studies_blueprint/test_study_matrix_index.py +++ b/tests/integration/studies_blueprint/test_study_matrix_index.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_study_version.py b/tests/integration/studies_blueprint/test_study_version.py index 8a4e603450..087122f6a8 100644 --- a/tests/integration/studies_blueprint/test_study_version.py +++ b/tests/integration/studies_blueprint/test_study_version.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_synthesis.py b/tests/integration/studies_blueprint/test_synthesis.py index d67e0f60a7..e881fefa2b 100644 --- a/tests/integration/studies_blueprint/test_synthesis.py +++ b/tests/integration/studies_blueprint/test_synthesis.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/studies_blueprint/test_update_tags.py b/tests/integration/studies_blueprint/test_update_tags.py index fd9005a98a..12bded185a 100644 --- a/tests/integration/studies_blueprint/test_update_tags.py +++ b/tests/integration/studies_blueprint/test_update_tags.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/__init__.py b/tests/integration/study_data_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/study_data_blueprint/__init__.py +++ b/tests/integration/study_data_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_advanced_parameters.py b/tests/integration/study_data_blueprint/test_advanced_parameters.py index 7b76ee0c87..a647f79c34 100644 --- a/tests/integration/study_data_blueprint/test_advanced_parameters.py +++ b/tests/integration/study_data_blueprint/test_advanced_parameters.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_binding_constraints.py b/tests/integration/study_data_blueprint/test_binding_constraints.py index e0f19a21cc..408cef124d 100644 --- a/tests/integration/study_data_blueprint/test_binding_constraints.py +++ b/tests/integration/study_data_blueprint/test_binding_constraints.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_config_general.py b/tests/integration/study_data_blueprint/test_config_general.py index 7353814e1b..f287fd629b 100644 --- a/tests/integration/study_data_blueprint/test_config_general.py +++ b/tests/integration/study_data_blueprint/test_config_general.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_edit_matrix.py b/tests/integration/study_data_blueprint/test_edit_matrix.py index 474b53d4e3..f81ebcdae6 100644 --- a/tests/integration/study_data_blueprint/test_edit_matrix.py +++ b/tests/integration/study_data_blueprint/test_edit_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_generate_thermal_cluster_timeseries.py b/tests/integration/study_data_blueprint/test_generate_thermal_cluster_timeseries.py index ff8eda61e4..466b915e69 100644 --- a/tests/integration/study_data_blueprint/test_generate_thermal_cluster_timeseries.py +++ b/tests/integration/study_data_blueprint/test_generate_thermal_cluster_timeseries.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_hydro_allocation.py b/tests/integration/study_data_blueprint/test_hydro_allocation.py index cfe1b51ba6..d7e856f2c6 100644 --- a/tests/integration/study_data_blueprint/test_hydro_allocation.py +++ b/tests/integration/study_data_blueprint/test_hydro_allocation.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_hydro_correlation.py b/tests/integration/study_data_blueprint/test_hydro_correlation.py index 61a76f76e2..42a5338e0f 100644 --- a/tests/integration/study_data_blueprint/test_hydro_correlation.py +++ b/tests/integration/study_data_blueprint/test_hydro_correlation.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_hydro_inflow_structure.py b/tests/integration/study_data_blueprint/test_hydro_inflow_structure.py index 79965cc81e..fefcba24a9 100644 --- a/tests/integration/study_data_blueprint/test_hydro_inflow_structure.py +++ b/tests/integration/study_data_blueprint/test_hydro_inflow_structure.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_link.py b/tests/integration/study_data_blueprint/test_link.py index 9fba2a1d5a..7ba267c7cd 100644 --- a/tests/integration/study_data_blueprint/test_link.py +++ b/tests/integration/study_data_blueprint/test_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_playlist.py b/tests/integration/study_data_blueprint/test_playlist.py index 93bc1c9624..04d5f3c71b 100644 --- a/tests/integration/study_data_blueprint/test_playlist.py +++ b/tests/integration/study_data_blueprint/test_playlist.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_renewable.py b/tests/integration/study_data_blueprint/test_renewable.py index 8e3fb8051b..37a06728ae 100644 --- a/tests/integration/study_data_blueprint/test_renewable.py +++ b/tests/integration/study_data_blueprint/test_renewable.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_st_storage.py b/tests/integration/study_data_blueprint/test_st_storage.py index c2f1563df8..1a654ed9f9 100644 --- a/tests/integration/study_data_blueprint/test_st_storage.py +++ b/tests/integration/study_data_blueprint/test_st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_table_mode.py b/tests/integration/study_data_blueprint/test_table_mode.py index 80159f7a37..f2e53ba347 100644 --- a/tests/integration/study_data_blueprint/test_table_mode.py +++ b/tests/integration/study_data_blueprint/test_table_mode.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/study_data_blueprint/test_thermal.py b/tests/integration/study_data_blueprint/test_thermal.py index 6328606247..0ee1737d66 100644 --- a/tests/integration/study_data_blueprint/test_thermal.py +++ b/tests/integration/study_data_blueprint/test_thermal.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_apidoc.py b/tests/integration/test_apidoc.py index d0eb7445d8..2d4ed19c59 100644 --- a/tests/integration/test_apidoc.py +++ b/tests/integration/test_apidoc.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_core_blueprint.py b/tests/integration/test_core_blueprint.py index a60ba6dcfb..a4693ccc70 100644 --- a/tests/integration/test_core_blueprint.py +++ b/tests/integration/test_core_blueprint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py index 88f3b7ef1a..206227f9e9 100644 --- a/tests/integration/test_integration.py +++ b/tests/integration/test_integration.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_integration_token_end_to_end.py b/tests/integration/test_integration_token_end_to_end.py index e57b0d4039..c8c987ce34 100644 --- a/tests/integration/test_integration_token_end_to_end.py +++ b/tests/integration/test_integration_token_end_to_end.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_integration_variantmanager_tool.py b/tests/integration/test_integration_variantmanager_tool.py index 3303fa574a..4768332f30 100644 --- a/tests/integration/test_integration_variantmanager_tool.py +++ b/tests/integration/test_integration_variantmanager_tool.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_integration_watcher.py b/tests/integration/test_integration_watcher.py index da28eb76c4..a80da7c0c1 100644 --- a/tests/integration/test_integration_watcher.py +++ b/tests/integration/test_integration_watcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/test_studies_upgrade.py b/tests/integration/test_studies_upgrade.py index 37b5058ff2..33cbda1b6b 100644 --- a/tests/integration/test_studies_upgrade.py +++ b/tests/integration/test_studies_upgrade.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/utils.py b/tests/integration/utils.py index fa5a34f286..38a2c06bf0 100644 --- a/tests/integration/utils.py +++ b/tests/integration/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/variant_blueprint/__init__.py b/tests/integration/variant_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/variant_blueprint/__init__.py +++ b/tests/integration/variant_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/variant_blueprint/test_renewable_cluster.py b/tests/integration/variant_blueprint/test_renewable_cluster.py index 18e6af0c56..098cb12d52 100644 --- a/tests/integration/variant_blueprint/test_renewable_cluster.py +++ b/tests/integration/variant_blueprint/test_renewable_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/variant_blueprint/test_st_storage.py b/tests/integration/variant_blueprint/test_st_storage.py index b4092f0acb..52ff483836 100644 --- a/tests/integration/variant_blueprint/test_st_storage.py +++ b/tests/integration/variant_blueprint/test_st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/variant_blueprint/test_thermal_cluster.py b/tests/integration/variant_blueprint/test_thermal_cluster.py index 7e5ce92677..5029c2bca3 100644 --- a/tests/integration/variant_blueprint/test_thermal_cluster.py +++ b/tests/integration/variant_blueprint/test_thermal_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/variant_blueprint/test_variant_manager.py b/tests/integration/variant_blueprint/test_variant_manager.py index 00c75e515c..5cc7178754 100644 --- a/tests/integration/variant_blueprint/test_variant_manager.py +++ b/tests/integration/variant_blueprint/test_variant_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/xpansion_studies_blueprint/__init__.py b/tests/integration/xpansion_studies_blueprint/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/integration/xpansion_studies_blueprint/__init__.py +++ b/tests/integration/xpansion_studies_blueprint/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/integration/xpansion_studies_blueprint/test_integration_xpansion.py b/tests/integration/xpansion_studies_blueprint/test_integration_xpansion.py index 332b532680..32e15dc8db 100644 --- a/tests/integration/xpansion_studies_blueprint/test_integration_xpansion.py +++ b/tests/integration/xpansion_studies_blueprint/test_integration_xpansion.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/__init__.py b/tests/launcher/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/launcher/__init__.py +++ b/tests/launcher/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/assets/__init__.py b/tests/launcher/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/launcher/assets/__init__.py +++ b/tests/launcher/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_extension_adequacy_patch.py b/tests/launcher/test_extension_adequacy_patch.py index 6d8f0f7c9a..4f3467edfb 100644 --- a/tests/launcher/test_extension_adequacy_patch.py +++ b/tests/launcher/test_extension_adequacy_patch.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_local_launcher.py b/tests/launcher/test_local_launcher.py index 84d04b2297..aadfa79dba 100644 --- a/tests/launcher/test_local_launcher.py +++ b/tests/launcher/test_local_launcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_log_manager.py b/tests/launcher/test_log_manager.py index cfc6b87b52..9f53bc9961 100644 --- a/tests/launcher/test_log_manager.py +++ b/tests/launcher/test_log_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_log_parser.py b/tests/launcher/test_log_parser.py index d8356319bb..0fd422c93b 100644 --- a/tests/launcher/test_log_parser.py +++ b/tests/launcher/test_log_parser.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_model.py b/tests/launcher/test_model.py index 36f6bd8948..a7cbcd0dc4 100644 --- a/tests/launcher/test_model.py +++ b/tests/launcher/test_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_repository.py b/tests/launcher/test_repository.py index f5bcf2672f..30d3a4478c 100644 --- a/tests/launcher/test_repository.py +++ b/tests/launcher/test_repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_service.py b/tests/launcher/test_service.py index 0c4904a870..81ff178051 100644 --- a/tests/launcher/test_service.py +++ b/tests/launcher/test_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_slurm_launcher.py b/tests/launcher/test_slurm_launcher.py index 64ae611217..36f71bc51a 100644 --- a/tests/launcher/test_slurm_launcher.py +++ b/tests/launcher/test_slurm_launcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_ssh_client.py b/tests/launcher/test_ssh_client.py index df0af69fb2..e1a6c8366f 100644 --- a/tests/launcher/test_ssh_client.py +++ b/tests/launcher/test_ssh_client.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/launcher/test_web.py b/tests/launcher/test_web.py index e1104f87af..f678b4304e 100644 --- a/tests/launcher/test_web.py +++ b/tests/launcher/test_web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/__init__.py b/tests/login/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/login/__init__.py +++ b/tests/login/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/conftest.py b/tests/login/conftest.py index 38c90a9c8d..635a57d6a1 100644 --- a/tests/login/conftest.py +++ b/tests/login/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/test_ldap.py b/tests/login/test_ldap.py index aa674f68b4..e4ecb7645a 100644 --- a/tests/login/test_ldap.py +++ b/tests/login/test_ldap.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/test_login_service.py b/tests/login/test_login_service.py index 0c4c9b756c..50ca7a6b3f 100644 --- a/tests/login/test_login_service.py +++ b/tests/login/test_login_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/test_model.py b/tests/login/test_model.py index a37cdb7bd5..e01d4a2d10 100644 --- a/tests/login/test_model.py +++ b/tests/login/test_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/test_repository.py b/tests/login/test_repository.py index 1eed93d437..20aa38d8eb 100644 --- a/tests/login/test_repository.py +++ b/tests/login/test_repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/login/test_web.py b/tests/login/test_web.py index 389dc94cf7..ec896f5628 100644 --- a/tests/login/test_web.py +++ b/tests/login/test_web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/__init__.py b/tests/matrixstore/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/matrixstore/__init__.py +++ b/tests/matrixstore/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/conftest.py b/tests/matrixstore/conftest.py index 52285fb6f8..c4f86212b0 100644 --- a/tests/matrixstore/conftest.py +++ b/tests/matrixstore/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/test_matrix_editor.py b/tests/matrixstore/test_matrix_editor.py index 229e9e53f3..ed70e67c9a 100644 --- a/tests/matrixstore/test_matrix_editor.py +++ b/tests/matrixstore/test_matrix_editor.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/test_matrix_garbage_collector.py b/tests/matrixstore/test_matrix_garbage_collector.py index 7cb909f59c..25c347fd9e 100644 --- a/tests/matrixstore/test_matrix_garbage_collector.py +++ b/tests/matrixstore/test_matrix_garbage_collector.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/test_repository.py b/tests/matrixstore/test_repository.py index c343d8adc7..932f10b571 100644 --- a/tests/matrixstore/test_repository.py +++ b/tests/matrixstore/test_repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/test_service.py b/tests/matrixstore/test_service.py index 65ce952e1d..fa8119a643 100644 --- a/tests/matrixstore/test_service.py +++ b/tests/matrixstore/test_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/matrixstore/test_web.py b/tests/matrixstore/test_web.py index d47fb030bc..3d9d9365b4 100644 --- a/tests/matrixstore/test_web.py +++ b/tests/matrixstore/test_web.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/__init__.py b/tests/storage/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/__init__.py +++ b/tests/storage/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/__init__.py b/tests/storage/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/business/__init__.py +++ b/tests/storage/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/assets/__init__.py b/tests/storage/business/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/storage/business/assets/__init__.py +++ b/tests/storage/business/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_arealink_manager.py b/tests/storage/business/test_arealink_manager.py index 1cc0639c1f..6f20f5873f 100644 --- a/tests/storage/business/test_arealink_manager.py +++ b/tests/storage/business/test_arealink_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_autoarchive_service.py b/tests/storage/business/test_autoarchive_service.py index 57847b6ce8..72678691cd 100644 --- a/tests/storage/business/test_autoarchive_service.py +++ b/tests/storage/business/test_autoarchive_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_config_manager.py b/tests/storage/business/test_config_manager.py index d8a579bc40..e9cbbf53e2 100644 --- a/tests/storage/business/test_config_manager.py +++ b/tests/storage/business/test_config_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_explorer_service.py b/tests/storage/business/test_explorer_service.py index 1b555b7c8a..fb150aad1c 100644 --- a/tests/storage/business/test_explorer_service.py +++ b/tests/storage/business/test_explorer_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_export.py b/tests/storage/business/test_export.py index 2fb4b91411..fab40b0204 100644 --- a/tests/storage/business/test_export.py +++ b/tests/storage/business/test_export.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_import.py b/tests/storage/business/test_import.py index 6cf9a7ef74..7b8af36f65 100644 --- a/tests/storage/business/test_import.py +++ b/tests/storage/business/test_import.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_patch_service.py b/tests/storage/business/test_patch_service.py index 3abb8790f0..0c7422d436 100644 --- a/tests/storage/business/test_patch_service.py +++ b/tests/storage/business/test_patch_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_raw_study_service.py b/tests/storage/business/test_raw_study_service.py index 2e9bb25c5a..eb87bfc09f 100644 --- a/tests/storage/business/test_raw_study_service.py +++ b/tests/storage/business/test_raw_study_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_repository.py b/tests/storage/business/test_repository.py index ed025de372..6c48d17a2f 100644 --- a/tests/storage/business/test_repository.py +++ b/tests/storage/business/test_repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_study_service_utils.py b/tests/storage/business/test_study_service_utils.py index 270f3d4dba..8e5ff17714 100644 --- a/tests/storage/business/test_study_service_utils.py +++ b/tests/storage/business/test_study_service_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_study_version_upgrader.py b/tests/storage/business/test_study_version_upgrader.py index 39ce1da653..c5fc6443dc 100644 --- a/tests/storage/business/test_study_version_upgrader.py +++ b/tests/storage/business/test_study_version_upgrader.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_timeseries_config_manager.py b/tests/storage/business/test_timeseries_config_manager.py index 3bc7cd0ad9..233bdeb079 100644 --- a/tests/storage/business/test_timeseries_config_manager.py +++ b/tests/storage/business/test_timeseries_config_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_url_resolver_service.py b/tests/storage/business/test_url_resolver_service.py index a7f6a601c5..3d678e466e 100644 --- a/tests/storage/business/test_url_resolver_service.py +++ b/tests/storage/business/test_url_resolver_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_variant_study_service.py b/tests/storage/business/test_variant_study_service.py index a6a3feab85..f6e6077c40 100644 --- a/tests/storage/business/test_variant_study_service.py +++ b/tests/storage/business/test_variant_study_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_watcher.py b/tests/storage/business/test_watcher.py index daebd1e0cf..92e73f4d73 100644 --- a/tests/storage/business/test_watcher.py +++ b/tests/storage/business/test_watcher.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/business/test_xpansion_manager.py b/tests/storage/business/test_xpansion_manager.py index 325ddf7e0c..6c4d6b7db5 100644 --- a/tests/storage/business/test_xpansion_manager.py +++ b/tests/storage/business/test_xpansion_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/conftest.py b/tests/storage/conftest.py index 589d023919..297a367d08 100644 --- a/tests/storage/conftest.py +++ b/tests/storage/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/conftest.py b/tests/storage/integration/conftest.py index 3c7da36de9..f289ed7393 100644 --- a/tests/storage/integration/conftest.py +++ b/tests/storage/integration/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/data/__init__.py b/tests/storage/integration/data/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/integration/data/__init__.py +++ b/tests/storage/integration/data/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/data/de_details_hourly.py b/tests/storage/integration/data/de_details_hourly.py index 779c794bb6..5cb9af12e5 100644 --- a/tests/storage/integration/data/de_details_hourly.py +++ b/tests/storage/integration/data/de_details_hourly.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/data/de_fr_values_hourly.py b/tests/storage/integration/data/de_fr_values_hourly.py index 43a40c2e12..a36e89221e 100644 --- a/tests/storage/integration/data/de_fr_values_hourly.py +++ b/tests/storage/integration/data/de_fr_values_hourly.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/data/digest_file.py b/tests/storage/integration/data/digest_file.py index 932be1eedd..c678c7620f 100644 --- a/tests/storage/integration/data/digest_file.py +++ b/tests/storage/integration/data/digest_file.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/data/set_id_annual.py b/tests/storage/integration/data/set_id_annual.py index 353f2a03f5..000de609ce 100644 --- a/tests/storage/integration/data/set_id_annual.py +++ b/tests/storage/integration/data/set_id_annual.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/data/set_values_monthly.py b/tests/storage/integration/data/set_values_monthly.py index efe6fe7052..810c5a6353 100644 --- a/tests/storage/integration/data/set_values_monthly.py +++ b/tests/storage/integration/data/set_values_monthly.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/test_STA_mini.py b/tests/storage/integration/test_STA_mini.py index 580ad7c48b..bbe66a8545 100644 --- a/tests/storage/integration/test_STA_mini.py +++ b/tests/storage/integration/test_STA_mini.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/test_exporter.py b/tests/storage/integration/test_exporter.py index 39ad4b1b7a..ac727a918f 100644 --- a/tests/storage/integration/test_exporter.py +++ b/tests/storage/integration/test_exporter.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/integration/test_write_STA_mini.py b/tests/storage/integration/test_write_STA_mini.py index 302bbd6e52..832b2eeded 100644 --- a/tests/storage/integration/test_write_STA_mini.py +++ b/tests/storage/integration/test_write_STA_mini.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/rawstudies/__init__.py b/tests/storage/rawstudies/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/rawstudies/__init__.py +++ b/tests/storage/rawstudies/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/rawstudies/samples/__init__.py b/tests/storage/rawstudies/samples/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/storage/rawstudies/samples/__init__.py +++ b/tests/storage/rawstudies/samples/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/rawstudies/test_factory.py b/tests/storage/rawstudies/test_factory.py index 80b2a2e19c..ba94db04a2 100644 --- a/tests/storage/rawstudies/test_factory.py +++ b/tests/storage/rawstudies/test_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/rawstudies/test_helpers.py b/tests/storage/rawstudies/test_helpers.py index 4f540d56be..605a19756e 100644 --- a/tests/storage/rawstudies/test_helpers.py +++ b/tests/storage/rawstudies/test_helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/__init__.py b/tests/storage/repository/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/__init__.py +++ b/tests/storage/repository/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/antares_io/__init__.py b/tests/storage/repository/antares_io/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/antares_io/__init__.py +++ b/tests/storage/repository/antares_io/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/antares_io/reader/test_ini_reader.py b/tests/storage/repository/antares_io/reader/test_ini_reader.py index 6c1a18533a..b36ee066d7 100644 --- a/tests/storage/repository/antares_io/reader/test_ini_reader.py +++ b/tests/storage/repository/antares_io/reader/test_ini_reader.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/antares_io/writer/test_ini_writer.py b/tests/storage/repository/antares_io/writer/test_ini_writer.py index 1affe2dc9c..edb73035f3 100644 --- a/tests/storage/repository/antares_io/writer/test_ini_writer.py +++ b/tests/storage/repository/antares_io/writer/test_ini_writer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/__init__.py b/tests/storage/repository/filesystem/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/__init__.py +++ b/tests/storage/repository/filesystem/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/config/__init__.py b/tests/storage/repository/filesystem/config/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/config/__init__.py +++ b/tests/storage/repository/filesystem/config/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/config/test_config_files.py b/tests/storage/repository/filesystem/config/test_config_files.py index 77ae462678..aa8dbd1286 100644 --- a/tests/storage/repository/filesystem/config/test_config_files.py +++ b/tests/storage/repository/filesystem/config/test_config_files.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/config/test_files.py b/tests/storage/repository/filesystem/config/test_files.py index fbdf160bce..a8e711275f 100644 --- a/tests/storage/repository/filesystem/config/test_files.py +++ b/tests/storage/repository/filesystem/config/test_files.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/config/test_ruleset_matrices.py b/tests/storage/repository/filesystem/config/test_ruleset_matrices.py index 183a9481c8..481316885b 100644 --- a/tests/storage/repository/filesystem/config/test_ruleset_matrices.py +++ b/tests/storage/repository/filesystem/config/test_ruleset_matrices.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/config/test_utils.py b/tests/storage/repository/filesystem/config/test_utils.py index cf470df38f..fcce124a3c 100644 --- a/tests/storage/repository/filesystem/config/test_utils.py +++ b/tests/storage/repository/filesystem/config/test_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/matrix/__init__.py b/tests/storage/repository/filesystem/matrix/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/matrix/__init__.py +++ b/tests/storage/repository/filesystem/matrix/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/matrix/test_date_serializer.py b/tests/storage/repository/filesystem/matrix/test_date_serializer.py index 31ed6e8eab..4e148a50d8 100644 --- a/tests/storage/repository/filesystem/matrix/test_date_serializer.py +++ b/tests/storage/repository/filesystem/matrix/test_date_serializer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/matrix/test_head_writer.py b/tests/storage/repository/filesystem/matrix/test_head_writer.py index bdc579a811..21908fe750 100644 --- a/tests/storage/repository/filesystem/matrix/test_head_writer.py +++ b/tests/storage/repository/filesystem/matrix/test_head_writer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/matrix/test_input_series_matrix.py b/tests/storage/repository/filesystem/matrix/test_input_series_matrix.py index 153ce522e1..1312197c24 100644 --- a/tests/storage/repository/filesystem/matrix/test_input_series_matrix.py +++ b/tests/storage/repository/filesystem/matrix/test_input_series_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/matrix/test_matrix_node.py b/tests/storage/repository/filesystem/matrix/test_matrix_node.py index 936a54b6ea..7edaa94c6e 100644 --- a/tests/storage/repository/filesystem/matrix/test_matrix_node.py +++ b/tests/storage/repository/filesystem/matrix/test_matrix_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/matrix/test_output_series_matrix.py b/tests/storage/repository/filesystem/matrix/test_output_series_matrix.py index 8ed2a07fe0..1f5fbbac57 100644 --- a/tests/storage/repository/filesystem/matrix/test_output_series_matrix.py +++ b/tests/storage/repository/filesystem/matrix/test_output_series_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/__init__.py b/tests/storage/repository/filesystem/root/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/__init__.py +++ b/tests/storage/repository/filesystem/root/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/__init__.py b/tests/storage/repository/filesystem/root/input/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/input/__init__.py +++ b/tests/storage/repository/filesystem/root/input/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/__init__.py b/tests/storage/repository/filesystem/root/input/hydro/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/__init__.py +++ b/tests/storage/repository/filesystem/root/input/hydro/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/common/__init__.py b/tests/storage/repository/filesystem/root/input/hydro/common/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/common/__init__.py +++ b/tests/storage/repository/filesystem/root/input/hydro/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/common/capacity/__init__.py b/tests/storage/repository/filesystem/root/input/hydro/common/capacity/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/common/capacity/__init__.py +++ b/tests/storage/repository/filesystem/root/input/hydro/common/capacity/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/common/capacity/test_capacity.py b/tests/storage/repository/filesystem/root/input/hydro/common/capacity/test_capacity.py index a57f618e1c..2f98bf7b4b 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/common/capacity/test_capacity.py +++ b/tests/storage/repository/filesystem/root/input/hydro/common/capacity/test_capacity.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/series/__init__.py b/tests/storage/repository/filesystem/root/input/hydro/series/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/series/__init__.py +++ b/tests/storage/repository/filesystem/root/input/hydro/series/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/series/area/__init__.py b/tests/storage/repository/filesystem/root/input/hydro/series/area/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/series/area/__init__.py +++ b/tests/storage/repository/filesystem/root/input/hydro/series/area/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/input/hydro/series/area/test_area.py b/tests/storage/repository/filesystem/root/input/hydro/series/area/test_area.py index 4a1c7da570..0f71922ede 100644 --- a/tests/storage/repository/filesystem/root/input/hydro/series/area/test_area.py +++ b/tests/storage/repository/filesystem/root/input/hydro/series/area/test_area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/__init__.py b/tests/storage/repository/filesystem/root/output/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/output/__init__.py +++ b/tests/storage/repository/filesystem/root/output/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/__init__.py b/tests/storage/repository/filesystem/root/output/simulation/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/__init__.py +++ b/tests/storage/repository/filesystem/root/output/simulation/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/mode/__init__.py b/tests/storage/repository/filesystem/root/output/simulation/mode/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/mode/__init__.py +++ b/tests/storage/repository/filesystem/root/output/simulation/mode/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/mode/common/__init__.py b/tests/storage/repository/filesystem/root/output/simulation/mode/common/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/mode/common/__init__.py +++ b/tests/storage/repository/filesystem/root/output/simulation/mode/common/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_area.py b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_area.py index ca6a127e37..5727835f9a 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_area.py +++ b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_binding_const.py b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_binding_const.py index 8ee6a31266..2654c3fc6a 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_binding_const.py +++ b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_binding_const.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_link.py b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_link.py index 28123774c5..685dbedb8c 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_link.py +++ b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_set.py b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_set.py index f6016deb7c..6721368de5 100644 --- a/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_set.py +++ b/tests/storage/repository/filesystem/root/output/simulation/mode/common/test_set.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/special_node/__init__.py b/tests/storage/repository/filesystem/special_node/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/repository/filesystem/special_node/__init__.py +++ b/tests/storage/repository/filesystem/special_node/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/special_node/input_areas_list_test.py b/tests/storage/repository/filesystem/special_node/input_areas_list_test.py index a26635466b..b2c9155359 100644 --- a/tests/storage/repository/filesystem/special_node/input_areas_list_test.py +++ b/tests/storage/repository/filesystem/special_node/input_areas_list_test.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_bucket_node.py b/tests/storage/repository/filesystem/test_bucket_node.py index 1ea2ecf75f..596f2fb257 100644 --- a/tests/storage/repository/filesystem/test_bucket_node.py +++ b/tests/storage/repository/filesystem/test_bucket_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_folder_node.py b/tests/storage/repository/filesystem/test_folder_node.py index bd0ee4c3f4..c9e7080603 100644 --- a/tests/storage/repository/filesystem/test_folder_node.py +++ b/tests/storage/repository/filesystem/test_folder_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_ini_file_node.py b/tests/storage/repository/filesystem/test_ini_file_node.py index 3864fa875f..0baeb7b26e 100644 --- a/tests/storage/repository/filesystem/test_ini_file_node.py +++ b/tests/storage/repository/filesystem/test_ini_file_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_lazy_node.py b/tests/storage/repository/filesystem/test_lazy_node.py index 82e5cdeb0a..8564a80e1b 100644 --- a/tests/storage/repository/filesystem/test_lazy_node.py +++ b/tests/storage/repository/filesystem/test_lazy_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_raw_file_node.py b/tests/storage/repository/filesystem/test_raw_file_node.py index 04f2d6cb21..21504fff26 100644 --- a/tests/storage/repository/filesystem/test_raw_file_node.py +++ b/tests/storage/repository/filesystem/test_raw_file_node.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_scenariobuilder.py b/tests/storage/repository/filesystem/test_scenariobuilder.py index bb65b140c5..b2d882821d 100644 --- a/tests/storage/repository/filesystem/test_scenariobuilder.py +++ b/tests/storage/repository/filesystem/test_scenariobuilder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/test_ts_numbers_vector.py b/tests/storage/repository/filesystem/test_ts_numbers_vector.py index f92383371e..6a3f988f4e 100644 --- a/tests/storage/repository/filesystem/test_ts_numbers_vector.py +++ b/tests/storage/repository/filesystem/test_ts_numbers_vector.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/filesystem/utils.py b/tests/storage/repository/filesystem/utils.py index 385802430f..d6cc7ca9ef 100644 --- a/tests/storage/repository/filesystem/utils.py +++ b/tests/storage/repository/filesystem/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/repository/test_study.py b/tests/storage/repository/test_study.py index 43f51554a9..d3f30d3dda 100644 --- a/tests/storage/repository/test_study.py +++ b/tests/storage/repository/test_study.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/test_model.py b/tests/storage/test_model.py index f59ce30137..abf63273d7 100644 --- a/tests/storage/test_model.py +++ b/tests/storage/test_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/test_service.py b/tests/storage/test_service.py index 1c3986a3c7..b31ee0ea7f 100644 --- a/tests/storage/test_service.py +++ b/tests/storage/test_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/web/__init__.py b/tests/storage/web/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/storage/web/__init__.py +++ b/tests/storage/web/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/storage/web/test_studies_bp.py b/tests/storage/web/test_studies_bp.py index 9729cf57bc..cd3d8364b3 100644 --- a/tests/storage/web/test_studies_bp.py +++ b/tests/storage/web/test_studies_bp.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/__init__.py b/tests/study/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/__init__.py +++ b/tests/study/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/__init__.py b/tests/study/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/business/__init__.py +++ b/tests/study/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/areas/__init__.py b/tests/study/business/areas/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/business/areas/__init__.py +++ b/tests/study/business/areas/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/areas/assets/__init__.py b/tests/study/business/areas/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/study/business/areas/assets/__init__.py +++ b/tests/study/business/areas/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/areas/test_st_storage_management.py b/tests/study/business/areas/test_st_storage_management.py index 56a42d88a0..8ce3b3c910 100644 --- a/tests/study/business/areas/test_st_storage_management.py +++ b/tests/study/business/areas/test_st_storage_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/areas/test_thermal_management.py b/tests/study/business/areas/test_thermal_management.py index 6bb2e34d7e..07bdb58787 100644 --- a/tests/study/business/areas/test_thermal_management.py +++ b/tests/study/business/areas/test_thermal_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/test_all_optional_metaclass.py b/tests/study/business/test_all_optional_metaclass.py index 5001019595..8e67794a67 100644 --- a/tests/study/business/test_all_optional_metaclass.py +++ b/tests/study/business/test_all_optional_metaclass.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/test_allocation_manager.py b/tests/study/business/test_allocation_manager.py index 18fc8d9aa5..9b9e7538fd 100644 --- a/tests/study/business/test_allocation_manager.py +++ b/tests/study/business/test_allocation_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/test_binding_constraint_management.py b/tests/study/business/test_binding_constraint_management.py index dcec736496..f14efa3a7f 100644 --- a/tests/study/business/test_binding_constraint_management.py +++ b/tests/study/business/test_binding_constraint_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/test_correlation_manager.py b/tests/study/business/test_correlation_manager.py index 677b0fc62e..8d949fe95b 100644 --- a/tests/study/business/test_correlation_manager.py +++ b/tests/study/business/test_correlation_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/test_district_manager.py b/tests/study/business/test_district_manager.py index 2fb7a47068..43dc7fa1a1 100644 --- a/tests/study/business/test_district_manager.py +++ b/tests/study/business/test_district_manager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/business/test_matrix_management.py b/tests/study/business/test_matrix_management.py index 11bf3dfd2b..a89d3ab6a4 100644 --- a/tests/study/business/test_matrix_management.py +++ b/tests/study/business/test_matrix_management.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/__init__.py b/tests/study/storage/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/storage/__init__.py +++ b/tests/study/storage/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/rawstudy/__init__.py b/tests/study/storage/rawstudy/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/storage/rawstudy/__init__.py +++ b/tests/study/storage/rawstudy/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/rawstudy/test_raw_study_service.py b/tests/study/storage/rawstudy/test_raw_study_service.py index a138da1735..c2f2b8a9c0 100644 --- a/tests/study/storage/rawstudy/test_raw_study_service.py +++ b/tests/study/storage/rawstudy/test_raw_study_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/test_abstract_storage_service.py b/tests/study/storage/test_abstract_storage_service.py index 7b2dc79c28..1928813080 100644 --- a/tests/study/storage/test_abstract_storage_service.py +++ b/tests/study/storage/test_abstract_storage_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/test_utils.py b/tests/study/storage/test_utils.py index 6f5b907a4a..8ad765ae87 100644 --- a/tests/study/storage/test_utils.py +++ b/tests/study/storage/test_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/__init__.py b/tests/study/storage/variantstudy/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/storage/variantstudy/__init__.py +++ b/tests/study/storage/variantstudy/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/business/__init__.py b/tests/study/storage/variantstudy/business/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/storage/variantstudy/business/__init__.py +++ b/tests/study/storage/variantstudy/business/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/business/test_matrix_constants_generator.py b/tests/study/storage/variantstudy/business/test_matrix_constants_generator.py index f47bc75a8b..0b368ffe7a 100644 --- a/tests/study/storage/variantstudy/business/test_matrix_constants_generator.py +++ b/tests/study/storage/variantstudy/business/test_matrix_constants_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/model/__init__.py b/tests/study/storage/variantstudy/model/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/study/storage/variantstudy/model/__init__.py +++ b/tests/study/storage/variantstudy/model/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/model/test_dbmodel.py b/tests/study/storage/variantstudy/model/test_dbmodel.py index 529c9f04b3..b9a960500b 100644 --- a/tests/study/storage/variantstudy/model/test_dbmodel.py +++ b/tests/study/storage/variantstudy/model/test_dbmodel.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/test_snapshot_generator.py b/tests/study/storage/variantstudy/test_snapshot_generator.py index 70a05c391a..6956502504 100644 --- a/tests/study/storage/variantstudy/test_snapshot_generator.py +++ b/tests/study/storage/variantstudy/test_snapshot_generator.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/storage/variantstudy/test_variant_study_service.py b/tests/study/storage/variantstudy/test_variant_study_service.py index 8b5a69af76..54e1db01ab 100644 --- a/tests/study/storage/variantstudy/test_variant_study_service.py +++ b/tests/study/storage/variantstudy/test_variant_study_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/test_model.py b/tests/study/test_model.py index c93bdacc49..fc6fc148ad 100644 --- a/tests/study/test_model.py +++ b/tests/study/test_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/test_repository.py b/tests/study/test_repository.py index bcdcea759b..24a7e2c205 100644 --- a/tests/study/test_repository.py +++ b/tests/study/test_repository.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/study/test_service.py b/tests/study/test_service.py index e339c20daa..77fb4d9c91 100644 --- a/tests/study/test_service.py +++ b/tests/study/test_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/test_front.py b/tests/test_front.py index afe58f5fd3..4ef6041576 100644 --- a/tests/test_front.py +++ b/tests/test_front.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/test_resources.py b/tests/test_resources.py index 8c9abf46a6..ce944f5b6b 100644 --- a/tests/test_resources.py +++ b/tests/test_resources.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/__init__.py b/tests/variantstudy/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/variantstudy/__init__.py +++ b/tests/variantstudy/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/assets/__init__.py b/tests/variantstudy/assets/__init__.py index 3fff24b6fe..60247d605b 100644 --- a/tests/variantstudy/assets/__init__.py +++ b/tests/variantstudy/assets/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/conftest.py b/tests/variantstudy/conftest.py index 6d3039d4f9..bbd7ee895f 100644 --- a/tests/variantstudy/conftest.py +++ b/tests/variantstudy/conftest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/__init__.py b/tests/variantstudy/model/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/variantstudy/model/__init__.py +++ b/tests/variantstudy/model/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/__init__.py b/tests/variantstudy/model/command/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/variantstudy/model/command/__init__.py +++ b/tests/variantstudy/model/command/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/helpers.py b/tests/variantstudy/model/command/helpers.py index 4e6a792c61..3693b6b4a3 100644 --- a/tests/variantstudy/model/command/helpers.py +++ b/tests/variantstudy/model/command/helpers.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_alias_decoder.py b/tests/variantstudy/model/command/test_alias_decoder.py index 193c13a151..074114c748 100644 --- a/tests/variantstudy/model/command/test_alias_decoder.py +++ b/tests/variantstudy/model/command/test_alias_decoder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_create_area.py b/tests/variantstudy/model/command/test_create_area.py index 87f8d1044c..8e6de24779 100644 --- a/tests/variantstudy/model/command/test_create_area.py +++ b/tests/variantstudy/model/command/test_create_area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_create_cluster.py b/tests/variantstudy/model/command/test_create_cluster.py index 077681bac6..bdd4e9feea 100644 --- a/tests/variantstudy/model/command/test_create_cluster.py +++ b/tests/variantstudy/model/command/test_create_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_create_link.py b/tests/variantstudy/model/command/test_create_link.py index bd4bac60ef..aa147e2df9 100644 --- a/tests/variantstudy/model/command/test_create_link.py +++ b/tests/variantstudy/model/command/test_create_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_create_renewables_cluster.py b/tests/variantstudy/model/command/test_create_renewables_cluster.py index a2c6ca1ae0..9919212a42 100644 --- a/tests/variantstudy/model/command/test_create_renewables_cluster.py +++ b/tests/variantstudy/model/command/test_create_renewables_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_create_st_storage.py b/tests/variantstudy/model/command/test_create_st_storage.py index 81093faec8..ba47d59da5 100644 --- a/tests/variantstudy/model/command/test_create_st_storage.py +++ b/tests/variantstudy/model/command/test_create_st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_manage_binding_constraints.py b/tests/variantstudy/model/command/test_manage_binding_constraints.py index 1f3cb55971..3751c9f865 100644 --- a/tests/variantstudy/model/command/test_manage_binding_constraints.py +++ b/tests/variantstudy/model/command/test_manage_binding_constraints.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_manage_district.py b/tests/variantstudy/model/command/test_manage_district.py index 532ec35c19..b99d2ac380 100644 --- a/tests/variantstudy/model/command/test_manage_district.py +++ b/tests/variantstudy/model/command/test_manage_district.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_remove_area.py b/tests/variantstudy/model/command/test_remove_area.py index b3de1c3342..468b468e69 100644 --- a/tests/variantstudy/model/command/test_remove_area.py +++ b/tests/variantstudy/model/command/test_remove_area.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_remove_cluster.py b/tests/variantstudy/model/command/test_remove_cluster.py index bf8db68e03..2b30616a0a 100644 --- a/tests/variantstudy/model/command/test_remove_cluster.py +++ b/tests/variantstudy/model/command/test_remove_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_remove_link.py b/tests/variantstudy/model/command/test_remove_link.py index 305d2f976f..832d8db20b 100644 --- a/tests/variantstudy/model/command/test_remove_link.py +++ b/tests/variantstudy/model/command/test_remove_link.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_remove_renewables_cluster.py b/tests/variantstudy/model/command/test_remove_renewables_cluster.py index a03308e5b3..c2152a08b3 100644 --- a/tests/variantstudy/model/command/test_remove_renewables_cluster.py +++ b/tests/variantstudy/model/command/test_remove_renewables_cluster.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_remove_st_storage.py b/tests/variantstudy/model/command/test_remove_st_storage.py index e58db6db55..01c74235dd 100644 --- a/tests/variantstudy/model/command/test_remove_st_storage.py +++ b/tests/variantstudy/model/command/test_remove_st_storage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_replace_matrix.py b/tests/variantstudy/model/command/test_replace_matrix.py index 95c21eac94..5f676ded29 100644 --- a/tests/variantstudy/model/command/test_replace_matrix.py +++ b/tests/variantstudy/model/command/test_replace_matrix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_update_comments.py b/tests/variantstudy/model/command/test_update_comments.py index 1991e0f179..0bdb91e307 100644 --- a/tests/variantstudy/model/command/test_update_comments.py +++ b/tests/variantstudy/model/command/test_update_comments.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_update_config.py b/tests/variantstudy/model/command/test_update_config.py index ceaff693c2..1857602cb2 100644 --- a/tests/variantstudy/model/command/test_update_config.py +++ b/tests/variantstudy/model/command/test_update_config.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/command/test_update_rawfile.py b/tests/variantstudy/model/command/test_update_rawfile.py index 8081698907..0aa3a4477a 100644 --- a/tests/variantstudy/model/command/test_update_rawfile.py +++ b/tests/variantstudy/model/command/test_update_rawfile.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/model/test_variant_model.py b/tests/variantstudy/model/test_variant_model.py index e2b607a30e..457a41ea67 100644 --- a/tests/variantstudy/model/test_variant_model.py +++ b/tests/variantstudy/model/test_variant_model.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/test_command_factory.py b/tests/variantstudy/test_command_factory.py index e031d07e1e..c4406b50da 100644 --- a/tests/variantstudy/test_command_factory.py +++ b/tests/variantstudy/test_command_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/test_utils.py b/tests/variantstudy/test_utils.py index c47c50aa25..525211ef82 100644 --- a/tests/variantstudy/test_utils.py +++ b/tests/variantstudy/test_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/variantstudy/test_variant_command_extractor.py b/tests/variantstudy/test_variant_command_extractor.py index 45665cf5cf..ff1a1c74ca 100644 --- a/tests/variantstudy/test_variant_command_extractor.py +++ b/tests/variantstudy/test_variant_command_extractor.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/worker/__init__.py b/tests/worker/__init__.py index 058c6b221a..f477ac830c 100644 --- a/tests/worker/__init__.py +++ b/tests/worker/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/worker/test_archive_worker.py b/tests/worker/test_archive_worker.py index 12c42ec699..72ff154c7c 100644 --- a/tests/worker/test_archive_worker.py +++ b/tests/worker/test_archive_worker.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/worker/test_archive_worker_service.py b/tests/worker/test_archive_worker_service.py index 65b3971baf..578e0af107 100644 --- a/tests/worker/test_archive_worker_service.py +++ b/tests/worker/test_archive_worker_service.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/worker/test_worker.py b/tests/worker/test_worker.py index 72b9c4ac00..3388b07730 100644 --- a/tests/worker/test_worker.py +++ b/tests/worker/test_worker.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # diff --git a/tests/xml_compare.py b/tests/xml_compare.py index 1f2761737f..cb44543a3b 100644 --- a/tests/xml_compare.py +++ b/tests/xml_compare.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, RTE (https://www.rte-france.com) +# Copyright (c) 2025, RTE (https://www.rte-france.com) # # See AUTHORS.txt # From 3385369df766b1211ced39710586f5deaaabc8d6 Mon Sep 17 00:00:00 2001 From: Anis Date: Fri, 17 Jan 2025 14:05:04 +0100 Subject: [PATCH 05/38] feat(ui-api, studies): optimize studies listing (#2288) Co-authored-by: Anis SMAIL Co-authored-by: maugde <167874615+maugde@users.noreply.github.com> Co-authored-by: MartinBelthle Co-authored-by: Sylvain Leclerc --- antarest/study/model.py | 22 +- antarest/study/storage/explorer_service.py | 39 ++- antarest/study/storage/utils.py | 12 + antarest/study/web/explorer_blueprint.py | 6 +- .../explorer_blueprint/test_explorer.py | 10 +- .../storage/business/test_explorer_service.py | 19 +- webapp/public/locales/en/main.json | 5 + webapp/public/locales/fr/main.json | 6 +- webapp/src/components/App/Studies/SideNav.tsx | 2 +- .../App/Studies/StudiesList/index.tsx | 46 ++- .../src/components/App/Studies/StudyTree.tsx | 77 ----- .../App/Studies/StudyTree/StudyTreeNode.tsx | 62 ++++ .../Studies/StudyTree/__test__/fixtures.ts | 322 ++++++++++++++++++ .../Studies/StudyTree/__test__/utils.test.ts | 125 +++++++ .../App/Studies/StudyTree/index.tsx | 154 +++++++++ .../components/App/Studies/StudyTree/types.ts | 34 ++ .../components/App/Studies/StudyTree/utils.ts | 281 +++++++++++++++ webapp/src/components/App/Studies/utils.ts | 64 ---- webapp/src/redux/ducks/studies.ts | 2 +- webapp/src/redux/selectors.ts | 6 +- webapp/src/services/api/study.ts | 32 +- 21 files changed, 1135 insertions(+), 191 deletions(-) delete mode 100644 webapp/src/components/App/Studies/StudyTree.tsx create mode 100644 webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx create mode 100644 webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts create mode 100644 webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts create mode 100644 webapp/src/components/App/Studies/StudyTree/index.tsx create mode 100644 webapp/src/components/App/Studies/StudyTree/types.ts create mode 100644 webapp/src/components/App/Studies/StudyTree/utils.ts delete mode 100644 webapp/src/components/App/Studies/utils.ts diff --git a/antarest/study/model.py b/antarest/study/model.py index cc8792ee99..d2ff8b97b9 100644 --- a/antarest/study/model.py +++ b/antarest/study/model.py @@ -19,7 +19,7 @@ from pathlib import Path from antares.study.version import StudyVersion -from pydantic import BeforeValidator, PlainSerializer, field_validator +from pydantic import BeforeValidator, ConfigDict, Field, PlainSerializer, computed_field, field_validator from sqlalchemy import ( # type: ignore Boolean, Column, @@ -334,7 +334,7 @@ class StudyFolder: groups: t.List[Group] -class NonStudyFolder(AntaresBaseModel): +class NonStudyFolderDTO(AntaresBaseModel): """ DTO used by the explorer to list directories that aren't studies directory, this will be usefull for the front so the user can navigate in the hierarchy @@ -343,6 +343,24 @@ class NonStudyFolder(AntaresBaseModel): path: Path workspace: str name: str + has_children: bool = Field( + alias="hasChildren", + ) # true when has at least one non-study-folder children + + model_config = ConfigDict(populate_by_name=True) + + @computed_field(alias="parentPath") + def parent_path(self) -> Path: + """ + This computed field is convenient for the front. + + This field is also aliased as parentPath to match the front-end naming convention. + + Returns: the parent path of the current directory. Starting with the workspace as a root directory (we want /workspafe/folder1/sub... and not workspace/folder1/fsub... ). + """ + workspace_path = Path(f"/{self.workspace}") + full_path = workspace_path.joinpath(self.path) + return full_path.parent class WorkspaceMetadata(AntaresBaseModel): diff --git a/antarest/study/storage/explorer_service.py b/antarest/study/storage/explorer_service.py index 30ff6ffcb6..d312f84552 100644 --- a/antarest/study/storage/explorer_service.py +++ b/antarest/study/storage/explorer_service.py @@ -14,12 +14,12 @@ from typing import List from antarest.core.config import Config -from antarest.study.model import DEFAULT_WORKSPACE_NAME, NonStudyFolder, WorkspaceMetadata +from antarest.study.model import DEFAULT_WORKSPACE_NAME, NonStudyFolderDTO, WorkspaceMetadata from antarest.study.storage.utils import ( get_folder_from_workspace, get_workspace_from_config, - is_study_folder, - should_ignore_folder_for_scan, + has_non_study_folder, + is_non_study_folder, ) logger = logging.getLogger(__name__) @@ -33,7 +33,7 @@ def list_dir( self, workspace_name: str, workspace_directory_path: str, - ) -> List[NonStudyFolder]: + ) -> List[NonStudyFolderDTO]: """ return a list of all directories under workspace_directory_path, that aren't studies. """ @@ -41,18 +41,27 @@ def list_dir( directory_path = get_folder_from_workspace(workspace, workspace_directory_path) directories = [] try: + # this block is skipped in case of permission error children = list(directory_path.iterdir()) - except PermissionError: - children = [] # we don't want to try to read folders we can't access - for child in children: - if ( - child.is_dir() - and not is_study_folder(child) - and not should_ignore_folder_for_scan(child, workspace.filter_in, workspace.filter_out) - ): - # we don't want to expose the full absolute path on the server - child_rel_path = child.relative_to(workspace.path) - directories.append(NonStudyFolder(path=child_rel_path, workspace=workspace_name, name=child.name)) + for child in children: + # if we can't access one child we skip it + try: + if is_non_study_folder(child, workspace.filter_in, workspace.filter_out): + # we don't want to expose the full absolute path on the server + child_rel_path = child.relative_to(workspace.path) + has_children = has_non_study_folder(child, workspace.filter_in, workspace.filter_out) + directories.append( + NonStudyFolderDTO( + path=child_rel_path, + workspace=workspace_name, + name=child.name, + has_children=has_children, + ) + ) + except PermissionError as e: + logger.warning(f"Permission error while accessing {child} or one of its children: {e}") + except PermissionError as e: + logger.warning(f"Permission error while listing {directory_path}: {e}") return directories def list_workspaces( diff --git a/antarest/study/storage/utils.py b/antarest/study/storage/utils.py index 639f9a6495..e8336cc1d1 100644 --- a/antarest/study/storage/utils.py +++ b/antarest/study/storage/utils.py @@ -495,3 +495,15 @@ def should_ignore_folder_for_scan(path: Path, filter_in: t.List[str], filter_out and any(re.search(regex, path.name) for regex in filter_in) and not any(re.search(regex, path.name) for regex in filter_out) ) + + +def has_non_study_folder(path: Path, filter_in: t.List[str], filter_out: t.List[str]) -> bool: + return any(is_non_study_folder(sub_path, filter_in, filter_out) for sub_path in path.iterdir()) + + +def is_non_study_folder(path: Path, filter_in: t.List[str], filter_out: t.List[str]) -> bool: + if is_study_folder(path): + return False + if should_ignore_folder_for_scan(path, filter_in, filter_out): + return False + return True diff --git a/antarest/study/web/explorer_blueprint.py b/antarest/study/web/explorer_blueprint.py index 2c8065fbd2..5b714aff91 100644 --- a/antarest/study/web/explorer_blueprint.py +++ b/antarest/study/web/explorer_blueprint.py @@ -18,7 +18,7 @@ from antarest.core.config import Config from antarest.core.jwt import JWTUser from antarest.login.auth import Auth -from antarest.study.model import NonStudyFolder, WorkspaceMetadata +from antarest.study.model import NonStudyFolderDTO, WorkspaceMetadata from antarest.study.storage.explorer_service import Explorer logger = logging.getLogger(__name__) @@ -40,13 +40,13 @@ def create_explorer_routes(config: Config, explorer: Explorer) -> APIRouter: @bp.get( "/explorer/{workspace}/_list_dir", summary="For a given directory, list sub directories that aren't studies", - response_model=List[NonStudyFolder], + response_model=List[NonStudyFolderDTO], ) def list_dir( workspace: str, path: str, current_user: JWTUser = Depends(auth.get_current_user), - ) -> List[NonStudyFolder]: + ) -> List[NonStudyFolderDTO]: """ Endpoint to list sub directories of a given directory Args: diff --git a/tests/integration/explorer_blueprint/test_explorer.py b/tests/integration/explorer_blueprint/test_explorer.py index 7463602cff..70f554cbf8 100644 --- a/tests/integration/explorer_blueprint/test_explorer.py +++ b/tests/integration/explorer_blueprint/test_explorer.py @@ -14,7 +14,7 @@ import pytest from starlette.testclient import TestClient -from antarest.study.model import NonStudyFolder, WorkspaceMetadata +from antarest.study.model import NonStudyFolderDTO, WorkspaceMetadata BAD_REQUEST_STATUS_CODE = 400 # Status code for directory listing with invalid parameters @@ -65,13 +65,9 @@ def test_explorer(client: TestClient, admin_access_token: str, study_tree: Path) ) res.raise_for_status() directories_res = res.json() - directories_res = [NonStudyFolder(**d) for d in directories_res] + directories_res = [NonStudyFolderDTO(**d) for d in directories_res] directorires_expected = [ - NonStudyFolder( - path=Path("folder/trash"), - workspace="ext", - name="trash", - ) + NonStudyFolderDTO(path=Path("folder/trash"), workspace="ext", name="trash", hasChildren=False) ] assert directories_res == directorires_expected diff --git a/tests/storage/business/test_explorer_service.py b/tests/storage/business/test_explorer_service.py index fb150aad1c..60f5e20f1d 100644 --- a/tests/storage/business/test_explorer_service.py +++ b/tests/storage/business/test_explorer_service.py @@ -16,7 +16,7 @@ import pytest from antarest.core.config import Config, StorageConfig, WorkspaceConfig -from antarest.study.model import DEFAULT_WORKSPACE_NAME, NonStudyFolder, WorkspaceMetadata +from antarest.study.model import DEFAULT_WORKSPACE_NAME, NonStudyFolderDTO, WorkspaceMetadata from antarest.study.storage.explorer_service import Explorer @@ -87,7 +87,7 @@ def test_list_dir_empty_string(config_scenario_a: Config): # We don't want to see the .git folder or the $RECYCLE.BIN as they were ignored in the workspace config assert len(result) == 1 - assert result[0] == NonStudyFolder(path=Path("folder"), workspace="diese", name="folder") + assert result[0] == NonStudyFolderDTO(path=Path("folder"), workspace="diese", name="folder", has_children=True) @pytest.mark.unit_test @@ -97,9 +97,18 @@ def test_list_dir_several_subfolders(config_scenario_a: Config): assert len(result) == 3 folder_path = Path("folder") - assert NonStudyFolder(path=(folder_path / "subfolder1"), workspace="diese", name="subfolder1") in result - assert NonStudyFolder(path=(folder_path / "subfolder2"), workspace="diese", name="subfolder2") in result - assert NonStudyFolder(path=(folder_path / "subfolder3"), workspace="diese", name="subfolder3") in result + assert ( + NonStudyFolderDTO(path=(folder_path / "subfolder1"), workspace="diese", name="subfolder1", has_children=False) + in result + ) + assert ( + NonStudyFolderDTO(path=(folder_path / "subfolder2"), workspace="diese", name="subfolder2", has_children=False) + in result + ) + assert ( + NonStudyFolderDTO(path=(folder_path / "subfolder3"), workspace="diese", name="subfolder3", has_children=False) + in result + ) @pytest.mark.unit_test diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index 7c6a13307a..0368e65fcc 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -643,7 +643,9 @@ "studies.studylaunched": "{{studyname}} launched!", "studies.copySuffix": "Copy", "studies.filters.strictfolder": "Show only direct folder children", + "studies.filters.showChildrens": "Show all children", "studies.scanFolder": "Scan folder", + "studies.recursiveScan": "Recursive scan", "studies.moveStudy": "Move", "studies.movefolderplaceholder": "Path separated by '/'", "studies.importcopy": "Copy to database", @@ -675,6 +677,9 @@ "studies.exportOutputFilter": "Export filtered output", "studies.selectOutput": "Select an output", "studies.variant": "Variant", + "studies.tree.error.failToFetchWorkspace": "Failed to load workspaces", + "studies.tree.error.failToFetchFolder": "Failed to load subfolders for {{path}}", + "studies.tree.fetchFolderLoading": "Loading...", "variants.createNewVariant": "Create new variant", "variants.newVariant": "New variant", "variants.newCommand": "Add new command", diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index 395ed91e7e..ad6ba562bf 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -643,7 +643,9 @@ "studies.studylaunched": "{{studyname}} lancé(s) !", "studies.copySuffix": "Copie", "studies.filters.strictfolder": "Afficher uniquement les descendants directs", + "studies.filters.showChildrens": "Voir les sous-dossiers", "studies.scanFolder": "Scanner le dossier", + "studies.recursiveScan": "Scan récursif", "studies.moveStudy": "Déplacer", "studies.movefolderplaceholder": "Chemin séparé par des '/'", "studies.importcopy": "Copier en base", @@ -674,7 +676,9 @@ "studies.exportOutput": "Exporter une sortie", "studies.exportOutputFilter": "Exporter une sortie filtrée", "studies.selectOutput": "Selectionnez une sortie", - "studies.variant": "Variante", + "studies.tree.error.failToFetchWorkspace": "Échec lors de la récupération de l'espace de travail", + "studies.tree.error.failToFetchFolder": "Échec lors de la récupération des sous dossiers de {{path}}", + "studies.tree.fetchFolderLoading": "Chargement...", "variants.createNewVariant": "Créer une nouvelle variante", "variants.newVariant": "Nouvelle variante", "variants.newCommand": "Ajouter une nouvelle commande", diff --git a/webapp/src/components/App/Studies/SideNav.tsx b/webapp/src/components/App/Studies/SideNav.tsx index c0009ce7d2..b966f27fd6 100644 --- a/webapp/src/components/App/Studies/SideNav.tsx +++ b/webapp/src/components/App/Studies/SideNav.tsx @@ -16,7 +16,7 @@ import { useNavigate } from "react-router"; import { Box, Typography, List, ListItem, ListItemText } from "@mui/material"; import { useTranslation } from "react-i18next"; import { STUDIES_SIDE_NAV_WIDTH } from "../../../theme"; -import StudyTree from "./StudyTree"; +import StudyTree from "@/components/App/Studies/StudyTree"; import useAppSelector from "../../../redux/hooks/useAppSelector"; import { getFavoriteStudies } from "../../../redux/selectors"; diff --git a/webapp/src/components/App/Studies/StudiesList/index.tsx b/webapp/src/components/App/Studies/StudiesList/index.tsx index 6d90785471..89326dfff9 100644 --- a/webapp/src/components/App/Studies/StudiesList/index.tsx +++ b/webapp/src/components/App/Studies/StudiesList/index.tsx @@ -33,7 +33,8 @@ import AutoSizer from "react-virtualized-auto-sizer"; import HomeIcon from "@mui/icons-material/Home"; import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward"; import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward"; -import FolderOffIcon from "@mui/icons-material/FolderOff"; +import FolderIcon from "@mui/icons-material/Folder"; +import AccountTreeIcon from "@mui/icons-material/AccountTree"; import RadarIcon from "@mui/icons-material/Radar"; import { FixedSizeGrid, GridOnScrollProps } from "react-window"; import { v4 as uuidv4 } from "uuid"; @@ -61,6 +62,7 @@ import RefreshButton from "../RefreshButton"; import { scanFolder } from "../../../../services/api/study"; import useEnqueueErrorSnackbar from "../../../../hooks/useEnqueueErrorSnackbar"; import ConfirmationDialog from "../../../common/dialogs/ConfirmationDialog"; +import CheckBoxFE from "@/components/common/fieldEditors/CheckBoxFE"; const CARD_TARGET_WIDTH = 500; const CARD_HEIGHT = 250; @@ -87,7 +89,8 @@ function StudiesList(props: StudiesListProps) { const sortLabelId = useRef(uuidv4()).current; const [selectedStudies, setSelectedStudies] = useState([]); const [selectionMode, setSelectionMode] = useState(false); - const [confirmFolderScan, setConfirmFolderScan] = useState(false); + const [confirmFolderScan, setConfirmFolderScan] = useState(false); + const [isRecursiveScan, setIsRecursiveScan] = useState(false); useEffect(() => { setFolderList(folder.split("/")); @@ -156,13 +159,18 @@ function StudiesList(props: StudiesListProps) { try { // Remove "/root" from the path const folder = folderList.slice(1).join("/"); - await scanFolder(folder); + await scanFolder(folder, isRecursiveScan); setConfirmFolderScan(false); + setIsRecursiveScan(false); } catch (e) { enqueueErrorSnackbar(t("studies.error.scanFolder"), e as AxiosError); } }; + const handleRecursiveScan = () => { + setIsRecursiveScan(!isRecursiveScan); + }; + //////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////// @@ -249,13 +257,21 @@ function StudiesList(props: StudiesListProps) { ({`${studyIds.length} ${t("global.studies").toLowerCase()}`}) - - - - - + + {strictFolderFilter ? ( + + + + + + ) : ( + + + + + + )} + {folder !== "root" && ( setConfirmFolderScan(true)}> @@ -266,12 +282,20 @@ function StudiesList(props: StudiesListProps) { {folder !== "root" && confirmFolderScan && ( setConfirmFolderScan(false)} + onCancel={() => { + setConfirmFolderScan(false); + setIsRecursiveScan(false); + }} onConfirm={handleFolderScan} alert="warning" open > {`${t("studies.scanFolder")} ${folder}?`} + )} diff --git a/webapp/src/components/App/Studies/StudyTree.tsx b/webapp/src/components/App/Studies/StudyTree.tsx deleted file mode 100644 index 7208caaec4..0000000000 --- a/webapp/src/components/App/Studies/StudyTree.tsx +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2024, RTE (https://www.rte-france.com) - * - * See AUTHORS.txt - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of the Antares project. - */ - -import { StudyTreeNode } from "./utils"; -import useAppSelector from "../../../redux/hooks/useAppSelector"; -import { getStudiesTree, getStudyFilters } from "../../../redux/selectors"; -import useAppDispatch from "../../../redux/hooks/useAppDispatch"; -import { updateStudyFilters } from "../../../redux/ducks/studies"; -import TreeItemEnhanced from "../../common/TreeItemEnhanced"; -import { SimpleTreeView } from "@mui/x-tree-view/SimpleTreeView"; -import { getParentPaths } from "../../../utils/pathUtils"; -import * as R from "ramda"; - -function StudyTree() { - const folder = useAppSelector((state) => getStudyFilters(state).folder, R.T); - const studiesTree = useAppSelector(getStudiesTree); - const dispatch = useAppDispatch(); - - //////////////////////////////////////////////////////////////// - // Event Handlers - //////////////////////////////////////////////////////////////// - - const handleTreeItemClick = (itemId: string) => { - dispatch(updateStudyFilters({ folder: itemId })); - }; - - //////////////////////////////////////////////////////////////// - // JSX - //////////////////////////////////////////////////////////////// - - const buildTree = (children: StudyTreeNode[], parentId?: string) => { - return children.map((child) => { - const id = parentId ? `${parentId}/${child.name}` : child.name; - - return ( - handleTreeItemClick(id)} - > - {buildTree(child.children, id)} - - ); - }); - }; - - return ( - - {buildTree([studiesTree])} - - ); -} - -export default StudyTree; diff --git a/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx b/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx new file mode 100644 index 0000000000..9b2d6cdff6 --- /dev/null +++ b/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import { memo } from "react"; +import { StudyTreeNodeProps } from "./types"; +import TreeItemEnhanced from "@/components/common/TreeItemEnhanced"; +import { t } from "i18next"; + +export default memo(function StudyTreeNode({ + studyTreeNode, + parentId, + onNodeClick, +}: StudyTreeNodeProps) { + const isLoadingFolder = + studyTreeNode.hasChildren && studyTreeNode.children.length === 0; + const id = parentId + ? `${parentId}/${studyTreeNode.name}` + : studyTreeNode.name; + + if (isLoadingFolder) { + return ( + onNodeClick(id, studyTreeNode)} + > + + + ); + } + + return ( + onNodeClick(id, studyTreeNode)} + > + {studyTreeNode.children.map((child) => ( + + ))} + + ); +}); diff --git a/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts b/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts new file mode 100644 index 0000000000..1fe3237182 --- /dev/null +++ b/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts @@ -0,0 +1,322 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import { StudyMetadata, StudyType } from "@/common/types"; + +function createStudyMetadata(folder: string, workspace: string): StudyMetadata { + return { + id: "test-study-id", + name: "Test Study", + creationDate: "2024-01-01", + modificationDate: "2024-01-02", + owner: { id: 1, name: "Owner 1" }, + type: StudyType.RAW, + version: "v1", + workspace, + managed: false, + archived: false, + groups: [], + folder, + publicMode: "NONE", + }; +} + +export const FIXTURES = { + basicTree: { + name: "Basic tree with single level", + studyTree: { + name: "Root", + path: "/", + children: [ + { name: "a", path: "/a", children: [] }, + { name: "b", path: "/b", children: [] }, + ], + }, + folders: [ + { + name: "folder1", + path: "folder1", + workspace: "a", + parentPath: "/a", + }, + ], + expected: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "folder1", path: "/a/folder1", children: [] }], + }, + { name: "b", path: "/b", children: [] }, + ], + }, + }, + hasChildren: { + name: "Case where a folder is already in the tree, maybe because he has studies, but now the api return that the folder also contains non study folder", + studyTree: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "folder1", path: "/a/folder1", children: [] }], + }, + { name: "b", path: "/b", children: [] }, + ], + }, + folders: [ + { + name: "folder1", + path: "folder1", + workspace: "a", + parentPath: "/a", + hasChildren: true, + }, + ], + expected: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [ + { + name: "folder1", + path: "/a/folder1", + children: [], + hasChildren: true, + }, + ], + }, + { name: "b", path: "/b", children: [] }, + ], + }, + }, + nestedTree: { + name: "Nested tree structure", + studyTree: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "suba", path: "/a/suba", children: [] }], + }, + ], + }, + folders: [ + { + name: "folder1", + path: "suba/folder1", + workspace: "a", + parentPath: "/a/suba", + }, + ], + expected: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [ + { + name: "suba", + path: "/a/suba", + children: [ + { name: "folder1", path: "/a/suba/folder1", children: [] }, + ], + }, + ], + }, + ], + }, + }, + duplicateCase: { + name: "Tree with potential duplicates", + studyTree: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "folder1", path: "/a/folder1", children: [] }], + }, + ], + }, + folders: [ + { + name: "folder1", + path: "/folder1", + workspace: "a", + parentPath: "/a", + }, + ], + expected: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "folder1", path: "/a/folder1", children: [] }], + }, + ], + }, + }, + multipleFolders: { + name: "Multiple folders merge", + studyTree: { + name: "Root", + path: "/", + children: [{ name: "a", path: "/a", children: [] }], + }, + folders: [ + { + name: "folder1", + path: "/folder1", + workspace: "a", + parentPath: "/a", + }, + { + name: "folder2", + path: "/folder2", + workspace: "a", + parentPath: "/a", + }, + { + name: "folder3", + path: "/folder3", + workspace: "a", + parentPath: "/a", + hasChildren: true, + }, + ], + expected: { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [ + { name: "folder1", path: "/a/folder1", children: [] }, + { name: "folder2", path: "/a/folder2", children: [] }, + { + name: "folder3", + path: "/a/folder3", + children: [], + hasChildren: true, + }, + ], + }, + ], + }, + }, +}; + +export const FIXTURES_BUILD_STUDY_TREE = { + simpleCase: { + name: "Basic case", + studies: [createStudyMetadata("studies/team1/myFolder", "workspace")], + expected: { + name: "root", + path: "", + children: [ + { + name: "workspace", + path: "/workspace", + children: [ + { + name: "studies", + path: "/workspace/studies", + children: [ + { + name: "team1", + path: "/workspace/studies/team1", + children: [], + }, + ], + }, + ], + }, + ], + }, + }, + multiplieStudies: { + name: "Multiple studies case", + studies: [ + createStudyMetadata("studies/team1/study", "workspace"), + createStudyMetadata("studies/team2/study", "workspace"), + createStudyMetadata("studies/team3/study", "workspace"), + createStudyMetadata("archives/team4/study", "workspace2"), + ], + expected: { + name: "root", + path: "", + children: [ + { + name: "workspace", + path: "/workspace", + children: [ + { + name: "studies", + path: "/workspace/studies", + children: [ + { + name: "team1", + path: "/workspace/studies/team1", + children: [], + }, + { + name: "team2", + path: "/workspace/studies/team2", + children: [], + }, + { + name: "team3", + path: "/workspace/studies/team3", + children: [], + }, + ], + }, + ], + }, + { + name: "workspace2", + path: "/workspace2", + children: [ + { + name: "archives", + path: "/workspace2/archives", + children: [ + { + name: "team4", + path: "/workspace2/archives/team4", + children: [], + }, + ], + }, + ], + }, + ], + }, + }, +}; diff --git a/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts b/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts new file mode 100644 index 0000000000..0578313bb1 --- /dev/null +++ b/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import { FIXTURES, FIXTURES_BUILD_STUDY_TREE } from "./fixtures"; +import { + buildStudyTree, + insertFoldersIfNotExist, + insertWorkspacesIfNotExist, +} from "../utils"; +import { NonStudyFolderDTO, StudyTreeNode } from "../types"; + +describe("StudyTree Utils", () => { + describe("mergeStudyTreeAndFolders", () => { + test.each(Object.values(FIXTURES))( + "$name", + ({ studyTree, folders, expected }) => { + const result = insertFoldersIfNotExist(studyTree, folders); + expect(result).toEqual(expected); + }, + ); + + test("should handle empty study tree", () => { + const emptyTree: StudyTreeNode = { + name: "Root", + path: "/", + children: [], + }; + const result = insertFoldersIfNotExist(emptyTree, []); + expect(result).toEqual(emptyTree); + }); + + test("should handle empty folders array", () => { + const tree: StudyTreeNode = { + name: "Root", + path: "/", + children: [{ name: "a", path: "/a", children: [] }], + }; + const result = insertFoldersIfNotExist(tree, []); + expect(result).toEqual(tree); + }); + + test("should handle invalid parent paths", () => { + const tree: StudyTreeNode = { + name: "Root", + path: "/", + children: [{ name: "a", path: "/a", children: [] }], + }; + const invalidFolder: NonStudyFolderDTO = { + name: "invalid", + path: "/invalid", + workspace: "nonexistent", + parentPath: "/nonexistent", + }; + const result = insertFoldersIfNotExist(tree, [invalidFolder]); + expect(result).toEqual(tree); + }); + + test("should handle empty workspaces", () => { + const tree: StudyTreeNode = { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "suba", path: "/a/suba", children: [] }], + }, + ], + }; + const workspaces: string[] = []; + const result = insertWorkspacesIfNotExist(tree, workspaces); + expect(result).toEqual(tree); + }); + + test("should merge workspaces", () => { + const tree: StudyTreeNode = { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "suba", path: "/a/suba", children: [] }], + }, + ], + }; + const expected: StudyTreeNode = { + name: "Root", + path: "/", + children: [ + { + name: "a", + path: "/a", + children: [{ name: "suba", path: "/a/suba", children: [] }], + }, + { name: "workspace1", path: "/workspace1", children: [] }, + { name: "workspace2", path: "/workspace2", children: [] }, + ], + }; + + const workspaces = ["a", "workspace1", "workspace2"]; + const result = insertWorkspacesIfNotExist(tree, workspaces); + expect(result).toEqual(expected); + }); + + test.each(Object.values(FIXTURES_BUILD_STUDY_TREE))( + "$name", + ({ studies, expected }) => { + const result = buildStudyTree(studies); + expect(result).toEqual(expected); + }, + ); + }); +}); diff --git a/webapp/src/components/App/Studies/StudyTree/index.tsx b/webapp/src/components/App/Studies/StudyTree/index.tsx new file mode 100644 index 0000000000..659b05d906 --- /dev/null +++ b/webapp/src/components/App/Studies/StudyTree/index.tsx @@ -0,0 +1,154 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import { StudyTreeNode } from "./types"; +import useAppSelector from "../../../../redux/hooks/useAppSelector"; +import { getStudiesTree, getStudyFilters } from "../../../../redux/selectors"; +import useAppDispatch from "../../../../redux/hooks/useAppDispatch"; +import { updateStudyFilters } from "../../../../redux/ducks/studies"; +import { SimpleTreeView } from "@mui/x-tree-view/SimpleTreeView"; +import { getParentPaths } from "../../../../utils/pathUtils"; +import * as R from "ramda"; +import { useState } from "react"; +import useEnqueueErrorSnackbar from "@/hooks/useEnqueueErrorSnackbar"; +import useUpdateEffectOnce from "@/hooks/useUpdateEffectOnce"; +import { fetchAndInsertSubfolders, fetchAndInsertWorkspaces } from "./utils"; +import { useTranslation } from "react-i18next"; +import { toError } from "@/utils/fnUtils"; +import StudyTreeNodeComponent from "./StudyTreeNode"; + +function StudyTree() { + const initialStudiesTree = useAppSelector(getStudiesTree); + const [studiesTree, setStudiesTree] = useState(initialStudiesTree); + const folder = useAppSelector((state) => getStudyFilters(state).folder, R.T); + const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); + const dispatch = useAppDispatch(); + const [t] = useTranslation(); + + // Initialize folders once we have the tree + // we use useUpdateEffectOnce because at first render initialStudiesTree isn't initialized + useUpdateEffectOnce(() => { + // be carefull to pass initialStudiesTree and not studiesTree at rootNode parameter + // otherwise we'll lose the default workspace + updateTree("root", initialStudiesTree, initialStudiesTree); + }, [initialStudiesTree]); + + /** + * This function is called at the initialization of the component and when the user clicks on a folder. + * + * The study tree is built from the studies in the database. There's a scan process that run on the server + * to update continuously the studies in the database. + * + * However this process can take a long time, and the user shouldn't wait for hours before he can see a study he knows is already uploaded. + * + * Instead of relying on the scan process to update the tree, we'll allow the user to walk into the tree and run a scan process only when he needs to. + * + * To enable this, we'll fetch the subfolders of a folder when the user clicks on it using the explorer API. + * + * @param itemId - The id of the item clicked + * @param rootNode - The root node of the tree + * @param selectedNode - The node of the item clicked + */ + async function updateTree( + itemId: string, + rootNode: StudyTreeNode, + selectedNode: StudyTreeNode, + ) { + if (selectedNode.path.startsWith("/default")) { + // we don't update the tree if the user clicks on the default workspace + // api doesn't allow to fetch the subfolders of the default workspace + return; + } + // Bug fix : this function used to take only the itemId and the selectedNode, and we used to initialize treeAfterWorkspacesUpdate + // with the studiesTree closure, referencing directly the state, like this : treeAfterWorkspacesUpdate = studiesTree; + // The thing is at the first render studiesTree was empty. + // This made updateTree override studiesTree with an empty tree during the first call. This caused a bug where we didn't see the default + // workspace in the UI, as it was overridden by an empty tree at start and then the get workspaces api never returns the default workspace. + // Now we don't use the closure anymore, we pass the root tree as a parameter. Thus at the first call of updateTree, we pass initialStudiesTree. + // You may think why we don't just capture initialStudiesTree then, it's because in the following call we need to pass studiesTree. + let treeAfterWorkspacesUpdate = rootNode; + + let pathsToFetch: string[] = []; + // If the user clicks on the root folder, we fetch the workspaces and insert them. + // Then we fetch the direct subfolders of the workspaces. + if (itemId === "root") { + try { + treeAfterWorkspacesUpdate = await fetchAndInsertWorkspaces(rootNode); + } catch (error) { + enqueueErrorSnackbar( + t("studies.tree.error.failToFetchWorkspace"), + toError(error), + ); + } + pathsToFetch = treeAfterWorkspacesUpdate.children + .filter((t) => t.name !== "default") // We don't fetch the default workspace subfolders, api don't allow it + .map((child) => `root${child.path}`); + } else { + // If the user clicks on a folder, we add the path of the clicked folder to the list of paths to fetch. + pathsToFetch = [`root${selectedNode.path}`]; + } + + const [treeAfterSubfoldersUpdate, failedPath] = + await fetchAndInsertSubfolders(pathsToFetch, treeAfterWorkspacesUpdate); + if (failedPath.length > 0) { + enqueueErrorSnackbar( + t("studies.tree.error.failToFetchFolder", { + path: failedPath.join(" "), + interpolation: { escapeValue: false }, + }), + "", + ); + } + setStudiesTree(treeAfterSubfoldersUpdate); + } + + //////////////////////////////////////////////////////////////// + // Event Handlers + //////////////////////////////////////////////////////////////// + + const handleTreeItemClick = async ( + itemId: string, + studyTreeNode: StudyTreeNode, + ) => { + dispatch(updateStudyFilters({ folder: itemId })); + updateTree(itemId, studiesTree, studyTreeNode); + }; + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + + return ( + + + + ); +} + +export default StudyTree; diff --git a/webapp/src/components/App/Studies/StudyTree/types.ts b/webapp/src/components/App/Studies/StudyTree/types.ts new file mode 100644 index 0000000000..5a67d65627 --- /dev/null +++ b/webapp/src/components/App/Studies/StudyTree/types.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +export interface StudyTreeNode { + name: string; + path: string; + children: StudyTreeNode[]; + hasChildren?: boolean; +} + +export interface NonStudyFolderDTO { + name: string; + path: string; + workspace: string; + parentPath: string; + hasChildren?: boolean; +} + +export interface StudyTreeNodeProps { + studyTreeNode: StudyTreeNode; + parentId: string; + onNodeClick: (id: string, node: StudyTreeNode) => void; +} diff --git a/webapp/src/components/App/Studies/StudyTree/utils.ts b/webapp/src/components/App/Studies/StudyTree/utils.ts new file mode 100644 index 0000000000..4d1132d79b --- /dev/null +++ b/webapp/src/components/App/Studies/StudyTree/utils.ts @@ -0,0 +1,281 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import * as api from "../../../../services/api/study"; +import { StudyMetadata } from "../../../../common/types"; +import { StudyTreeNode, NonStudyFolderDTO } from "./types"; + +/** + * Builds a tree structure from a list of study metadata. + * + * @param studies - Array of study metadata objects. + * @returns A tree structure representing the studies. + */ +export function buildStudyTree(studies: StudyMetadata[]) { + const tree: StudyTreeNode = { + name: "root", + children: [], + path: "", + }; + + for (const study of studies) { + const path = + typeof study.folder === "string" + ? [study.workspace, ...study.folder.split("/").filter(Boolean)] + : [study.workspace]; + + let current = tree; + + for (let i = 0; i < path.length; i++) { + // Skip the last folder, as it represents the study itself + if (i === path.length - 1) { + break; + } + + const folderName = path[i]; + let child = current.children.find((child) => child.name === folderName); + + if (!child) { + child = { + name: folderName, + children: [], + path: current.path + ? `${current.path}/${folderName}` + : `/${folderName}`, + }; + + current.children.push(child); + } + + current = child; + } + } + + return tree; +} + +/** + * Add a folder that was returned by the explorer into the study tree view. + * + * This function doesn't mutate the tree, it returns a new tree with the folder inserted. + * + * If the folder is already in the tree, the tree returnred will be equal to the tree given to the function. + * + * @param studiesTree study tree to insert the folder into + * @param folder folder to inert into the tree + * @returns study tree with the folder inserted if it wasn't already there. + * New branch is created if it contain the folder otherwise the branch is left unchanged. + */ +function insertFolderIfNotExist( + studiesTree: StudyTreeNode, + folder: NonStudyFolderDTO, +): StudyTreeNode { + const currentNodePath = `${studiesTree.path}`; + // Early return if folder doesn't belong in this branch + if (!folder.parentPath.startsWith(currentNodePath)) { + return studiesTree; + } + + // direct child case + if (folder.parentPath == currentNodePath) { + const folderExists = studiesTree.children.find( + (child) => child.name === folder.name, + ); + if (folderExists) { + return { + ...studiesTree, + children: [ + ...studiesTree.children.filter((child) => child.name !== folder.name), + { + ...folderExists, + hasChildren: folder.hasChildren, + }, + ], + }; + } + // parent path is the same, but no folder with the same name at this level + return { + ...studiesTree, + children: [ + ...studiesTree.children, + { + path: `${folder.parentPath}/${folder.name}`, + name: folder.name, + children: [], + hasChildren: folder.hasChildren, + }, + ], + }; + } + + // not a direct child, but does belong to this branch so recursively walk though the tree + return { + ...studiesTree, + children: studiesTree.children.map((child) => + insertFolderIfNotExist(child, folder), + ), + }; +} + +/** + * Insert several folders in the study tree if they don't exist already in the tree. + * + * This function doesn't mutate the tree, it returns a new tree with the folders inserted + * + * The folders are inserted in the order they are given. + * + * @param studiesTree study tree to insert the folder into + * @param folders folders to inert into the tree + * @param studiesTree study tree to insert the folder into + * @param folder folder to inert into the tree + * @returns study tree with the folder inserted if it wasn't already there. + * New branch is created if it contain the folder otherwise the branch is left unchanged. + */ +export function insertFoldersIfNotExist( + studiesTree: StudyTreeNode, + folders: NonStudyFolderDTO[], +): StudyTreeNode { + return folders.reduce((tree, folder) => { + return insertFolderIfNotExist(tree, folder); + }, studiesTree); +} + +/** + * Call the explorer api to fetch the subfolders under the given path. + * + * @param path path of the subfolder to fetch, should sart with root, e.g. root/workspace/folder1 + * @returns list of subfolders under the given path + */ +async function fetchSubfolders(path: string): Promise { + if (path === "root") { + console.error("this function should not be called with path 'root'", path); + // Under root there're workspaces not subfolders + return []; + } + if (!path.startsWith("root/")) { + console.error("path here should start with root/ ", path); + return []; + } + // less than 2 parts means we're at the root level + const pathParts = path.split("/"); + if (pathParts.length < 2) { + console.error( + "this function should not be called with a path that has less than two com", + path, + ); + return []; + } + // path parts should be ["root", workspace, "folder1", ...] + const workspace = pathParts[1]; + const subPath = pathParts.slice(2).join("/"); + return api.getFolders(workspace, subPath); +} + +/** + * Fetch and insert the subfolders under the given paths into the study tree. + * + * This function is used to fill the study tree when the user clicks on a folder. + * + * Subfolders are inserted only if they don't exist already in the tree. + * + * This function doesn't mutate the tree, it returns a new tree with the subfolders inserted + * + * @param paths list of paths to fetch the subfolders for + * @param studiesTree study tree to insert the subfolders into + * @returns a tuple with study tree with the subfolders inserted if they weren't already there and path for which + * the fetch failed. + */ +export async function fetchAndInsertSubfolders( + paths: string[], + studiesTree: StudyTreeNode, +): Promise<[StudyTreeNode, string[]]> { + const results = await Promise.allSettled( + paths.map((path) => fetchSubfolders(path)), + ); + return results.reduce<[StudyTreeNode, string[]]>( + ([tree, failed], result, index) => { + if (result.status === "fulfilled") { + return [insertFoldersIfNotExist(tree, result.value), failed]; + } + console.error("Failed to load path:", paths[index], result.reason); + return [tree, [...failed, paths[index]]]; + }, + [studiesTree, []], + ); +} + +/** + * Insert a workspace into the study tree if it doesn't exist already. + * + * This function doesn't mutate the tree, it returns a new tree with the workspace inserted. + * + * @param workspace key of the workspace + * @param stydyTree study tree to insert the workspace into + * @returns study tree with the empty workspace inserted if it wasn't already there. + */ +function insertWorkspaceIfNotExist( + stydyTree: StudyTreeNode, + workspace: string, +): StudyTreeNode { + const emptyNode = { + name: workspace, + path: `/${workspace}`, + children: [], + }; + if (stydyTree.children.some((child) => child.name === workspace)) { + return stydyTree; + } + return { + ...stydyTree, + children: [...stydyTree.children, emptyNode], + }; +} + +/** + * Insert several workspaces into the study tree if they don't exist already in the tree. + * + * This function doesn't mutate the tree, it returns a new tree with the workspaces inserted. + * + * The workspaces are inserted in the order they are given. + * + * @param workspaces workspaces to insert into the tree + * @param stydyTree study tree to insert the workspaces into + * @returns study tree with the empty workspaces inserted if they weren't already there. + */ +export function insertWorkspacesIfNotExist( + stydyTree: StudyTreeNode, + workspaces: string[], +): StudyTreeNode { + return workspaces.reduce( + (acc, workspace) => insertWorkspaceIfNotExist(acc, workspace), + stydyTree, + ); +} + +/** + * Fetch and insert the workspaces into the study tree. + * + * Workspaces are inserted only if they don't exist already in the tree. + * + * This function doesn't mutate the tree, it returns a new tree with the workspaces inserted. + * + * @param studyTree study tree to insert the workspaces into + * @returns study tree with the workspaces inserted if they weren't already there. + */ +export async function fetchAndInsertWorkspaces( + studyTree: StudyTreeNode, +): Promise { + const workspaces = await api.getWorkspaces(); + return insertWorkspacesIfNotExist(studyTree, workspaces); +} diff --git a/webapp/src/components/App/Studies/utils.ts b/webapp/src/components/App/Studies/utils.ts deleted file mode 100644 index 3f2ff61564..0000000000 --- a/webapp/src/components/App/Studies/utils.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2024, RTE (https://www.rte-france.com) - * - * See AUTHORS.txt - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of the Antares project. - */ - -import { StudyMetadata } from "../../../common/types"; - -export interface StudyTreeNode { - name: string; - path: string; - children: StudyTreeNode[]; -} - -/** - * Builds a tree structure from a list of study metadata. - * - * @param studies - Array of study metadata objects. - * @returns A tree structure representing the studies. - */ -export function buildStudyTree(studies: StudyMetadata[]) { - const tree: StudyTreeNode = { name: "root", children: [], path: "" }; - - for (const study of studies) { - const path = - typeof study.folder === "string" - ? [study.workspace, ...study.folder.split("/").filter(Boolean)] - : [study.workspace]; - - let current = tree; - - for (let i = 0; i < path.length; i++) { - // Skip the last folder, as it represents the study itself - if (i === path.length - 1) { - break; - } - - const folderName = path[i]; - let child = current.children.find((child) => child.name === folderName); - - if (!child) { - child = { - name: folderName, - children: [], - path: current.path ? `${current.path}/${folderName}` : folderName, - }; - - current.children.push(child); - } - - current = child; - } - } - - return tree; -} diff --git a/webapp/src/redux/ducks/studies.ts b/webapp/src/redux/ducks/studies.ts index 3b3e8b04d2..9b4603a23f 100644 --- a/webapp/src/redux/ducks/studies.ts +++ b/webapp/src/redux/ducks/studies.ts @@ -94,7 +94,7 @@ const initialState = studiesAdapter.getInitialState({ filters: { inputValue: "", folder: "root", - strictFolder: false, + strictFolder: true, managed: false, archived: false, variant: false, diff --git a/webapp/src/redux/selectors.ts b/webapp/src/redux/selectors.ts index 5fb8947726..99b6da20a0 100644 --- a/webapp/src/redux/selectors.ts +++ b/webapp/src/redux/selectors.ts @@ -23,7 +23,6 @@ import { StudyMetadata, UserDetailsDTO, } from "../common/types"; -import { buildStudyTree } from "../components/App/Studies/utils"; import { filterStudies, sortStudies } from "../utils/studiesUtils"; import { convertVersions, isGroupAdmin, isUserAdmin } from "../services/utils"; import { AppState } from "./ducks"; @@ -43,6 +42,7 @@ import { StudyMapsState, } from "./ducks/studyMaps"; import { makeLinkId } from "./utils"; +import { buildStudyTree } from "../components/App/Studies/StudyTree/utils"; // TODO resultEqualityCheck @@ -131,7 +131,9 @@ export const getStudyIdsFilteredAndSorted = createSelector( (studies) => studies.map((study) => study.id), ); -export const getStudiesTree = createSelector(getStudies, buildStudyTree); +export const getStudiesTree = createSelector(getStudies, (studies) => + buildStudyTree(studies), +); export const getStudyVersions = ( state: AppState, diff --git a/webapp/src/services/api/study.ts b/webapp/src/services/api/study.ts index 53d4a67925..6636b9d4b6 100644 --- a/webapp/src/services/api/study.ts +++ b/webapp/src/services/api/study.ts @@ -34,6 +34,11 @@ import { getConfig } from "../config"; import { convertStudyDtoToMetadata } from "../utils"; import { FileDownloadTask } from "./downloads"; import { StudyMapDistrict } from "../../redux/ducks/studyMaps"; +import { NonStudyFolderDTO } from "@/components/App/Studies/StudyTree/types"; + +interface Workspace { + name: string; +} const getStudiesRaw = async (): Promise> => { const res = await client.get(`/v1/studies`); @@ -48,6 +53,27 @@ export const getStudies = async (): Promise => { }); }; +export const getWorkspaces = async () => { + const res = await client.get( + `/v1/private/explorer/_list_workspaces`, + ); + return res.data.map((folder) => folder.name); +}; + +/** + * Call the explorer API to get the list of folders in a workspace + * + * @param workspace - workspace name + * @param folderPath - path starting from the workspace root (not including the workspace name) + * @returns list of folders that are not studies, under the given path + */ +export const getFolders = async (workspace: string, folderPath: string) => { + const res = await client.get( + `/v1/private/explorer/${workspace}/_list_dir?path=${encodeURIComponent(folderPath)}`, + ); + return res.data; +}; + export const getStudyVersions = async (): Promise => { const res = await client.get("/v1/studies/_versions"); return res.data; @@ -434,8 +460,10 @@ export const updateStudyMetadata = async ( return res.data; }; -export const scanFolder = async (folderPath: string): Promise => { - await client.post(`/v1/watcher/_scan?path=${encodeURIComponent(folderPath)}`); +export const scanFolder = async (folderPath: string, recursive = false) => { + await client.post( + `/v1/watcher/_scan?path=${encodeURIComponent(folderPath)}&recursive=${recursive}`, + ); }; export const getStudyLayers = async (uuid: string): Promise => { From 684b964f229c176dbd6f10dd679f7965c49575b8 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:01:44 +0100 Subject: [PATCH 06/38] feat(ui-hooks): create useFormCloseProtection --- webapp/src/components/common/Form/index.tsx | 32 ++---------------- .../common/Matrix/hooks/useMatrix/index.ts | 11 +++---- webapp/src/hooks/useCloseFormSecurity.ts | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+), 35 deletions(-) create mode 100644 webapp/src/hooks/useCloseFormSecurity.ts diff --git a/webapp/src/components/common/Form/index.tsx b/webapp/src/components/common/Form/index.tsx index 56b3e2d572..00b0f61d3a 100644 --- a/webapp/src/components/common/Form/index.tsx +++ b/webapp/src/components/common/Form/index.tsx @@ -13,7 +13,7 @@ */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { FormEvent, useEffect, useMemo, useRef, useState } from "react"; +import { FormEvent, useEffect, useMemo, useRef } from "react"; import { DeepPartial, FieldPath, @@ -54,12 +54,12 @@ import { toAutoSubmitConfig, } from "./utils"; import useDebouncedState from "../../../hooks/useDebouncedState"; -import usePrompt from "../../../hooks/usePrompt"; import { SubmitHandlerPlus, UseFormReturnPlus } from "./types"; import FormContext from "./FormContext"; import useFormApiPlus from "./useFormApiPlus"; import useFormUndoRedo from "./useFormUndoRedo"; import { mergeSxProp } from "../../../utils/muiUtils"; +import useFormCloseProtection from "@/hooks/useCloseFormSecurity"; export interface AutoSubmitConfig { enable: boolean; @@ -132,7 +132,6 @@ function Form( const { t } = useTranslation(); const autoSubmitConfig = toAutoSubmitConfig(autoSubmit); - const [isInProgress, setIsInProgress] = useState(false); const [showAutoSubmitLoader, setShowAutoSubmitLoader] = useDebouncedState( false, 750, @@ -246,32 +245,12 @@ function Form( [isSubmitSuccessful], ); - // Prevent browser close if a submit is pending - useEffect(() => { - const listener = (event: BeforeUnloadEvent) => { - if (isInProgress) { - // eslint-disable-next-line no-param-reassign - event.returnValue = t("form.submit.inProgress"); - } else if (isDirty) { - // eslint-disable-next-line no-param-reassign - event.returnValue = t("form.changeNotSaved"); - } - }; - - window.addEventListener("beforeunload", listener); - - return () => { - window.removeEventListener("beforeunload", listener); - }; - }, [t, isInProgress, isDirty]); + useFormCloseProtection({ isSubmitting, isDirty }); useUpdateEffect(() => onStateChange?.(formState), [formState]); useEffect(() => setRef(apiRef, formApiPlus)); - usePrompt(t("form.submit.inProgress"), isInProgress); - usePrompt(t("form.changeNotSaved"), isDirty && !isInProgress); - //////////////////////////////////////////////////////////////// // Submit //////////////////////////////////////////////////////////////// @@ -322,9 +301,6 @@ function Form( ? err.response?.data.description : err?.toString(), }); - }) - .finally(() => { - setIsInProgress(false); }); }, onInvalid); @@ -334,8 +310,6 @@ function Form( const submitDebounced = useDebounce(submit, autoSubmitConfig.wait); const requestSubmit = () => { - setIsInProgress(true); - if (autoSubmitConfig.enable) { submitDebounced(); } else { diff --git a/webapp/src/components/common/Matrix/hooks/useMatrix/index.ts b/webapp/src/components/common/Matrix/hooks/useMatrix/index.ts index e89f99be12..0726b42d4c 100644 --- a/webapp/src/components/common/Matrix/hooks/useMatrix/index.ts +++ b/webapp/src/components/common/Matrix/hooks/useMatrix/index.ts @@ -41,9 +41,9 @@ import useUndo from "use-undo"; import { GridCellKind } from "@glideapps/glide-data-grid"; import { uploadFile } from "../../../../../services/api/studies/raw"; import { fetchMatrixFn } from "../../../../App/Singlestudy/explore/Modelization/Areas/Hydro/utils"; -import usePrompt from "../../../../../hooks/usePrompt"; import { Aggregate, Column, Operation } from "../../shared/constants"; import { aggregatesTheme } from "../../styles"; +import useFormCloseProtection from "@/hooks/useCloseFormSecurity"; interface DataState { data: MatrixDataDTO["data"]; @@ -83,11 +83,10 @@ export function useMatrix( [aggregatesConfig], ); - // Display warning prompts to prevent unintended navigation - // 1. When the matrix is currently being submitted - usePrompt(t("form.submit.inProgress"), isSubmitting); - // 2. When there are unsaved changes in the matrix - usePrompt(t("form.changeNotSaved"), currentState.pendingUpdates.length > 0); + useFormCloseProtection({ + isSubmitting, + isDirty: currentState.pendingUpdates.length > 0, + }); const fetchMatrix = async (loadingState = true) => { // !NOTE This is a temporary solution to ensure the matrix is up to date diff --git a/webapp/src/hooks/useCloseFormSecurity.ts b/webapp/src/hooks/useCloseFormSecurity.ts new file mode 100644 index 0000000000..b20fdee6f6 --- /dev/null +++ b/webapp/src/hooks/useCloseFormSecurity.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import usePrompt from "./usePrompt"; +import { useTranslation } from "react-i18next"; + +export interface UseFormCloseProtectionParams { + isSubmitting: boolean; + isDirty: boolean; +} + +function useFormCloseProtection({ + isSubmitting, + isDirty, +}: UseFormCloseProtectionParams) { + const { t } = useTranslation(); + + usePrompt(t("form.submit.inProgress"), isSubmitting); + usePrompt(t("form.changeNotSaved"), isDirty && !isSubmitting); +} + +export default useFormCloseProtection; From ba87cffd2b44eb59715800036145474588a2853b Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:22:00 +0100 Subject: [PATCH 07/38] feat(ui-common): rename EmptyView and add extraActions prop --- .../Singlestudy/Commands/Edition/index.tsx | 2 +- .../dialogs/ScenarioBuilderDialog/Table.tsx | 2 +- .../Singlestudy/explore/Debug/Data/Folder.tsx | 2 +- .../Singlestudy/explore/Debug/Data/Text.tsx | 2 +- .../explore/Debug/Data/Unsupported.tsx | 2 +- .../explore/Modelization/Areas/index.tsx | 2 +- .../Modelization/BindingConstraints/index.tsx | 2 +- .../explore/Modelization/Links/index.tsx | 2 +- .../explore/Results/ResultDetails/index.tsx | 2 +- .../explore/TableModeList/index.tsx | 2 +- .../explore/Xpansion/Candidates/index.tsx | 2 +- webapp/src/components/common/Matrix/index.tsx | 2 +- webapp/src/components/common/TableMode.tsx | 2 +- .../components/MatrixContent.tsx | 2 +- .../common/dialogs/DigestDialog.tsx | 2 +- .../page/{SimpleContent.tsx => EmptyView.tsx} | 22 +++++++++++++++++-- .../common/utils/UsePromiseCond.tsx | 2 +- 17 files changed, 36 insertions(+), 18 deletions(-) rename webapp/src/components/common/page/{SimpleContent.tsx => EmptyView.tsx} (71%) diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx index f26d44693a..69524ae7d8 100644 --- a/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx +++ b/webapp/src/components/App/Singlestudy/Commands/Edition/index.tsx @@ -57,7 +57,7 @@ import { } from "../../../../../services/webSocket/ws"; import ConfirmationDialog from "../../../../common/dialogs/ConfirmationDialog"; import CheckBoxFE from "../../../../common/fieldEditors/CheckBoxFE"; -import EmptyView from "../../../../common/page/SimpleContent"; +import EmptyView from "../../../../common/page/EmptyView"; import { TaskStatus } from "../../../../../services/api/tasks/constants"; import type { TaskEventPayload, diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioBuilderDialog/Table.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioBuilderDialog/Table.tsx index 9b0648912a..5670fccb2d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioBuilderDialog/Table.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioBuilderDialog/Table.tsx @@ -21,7 +21,7 @@ import { updateScenarioBuilderConfig, } from "./utils"; import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; -import EmptyView from "../../../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../../../common/page/EmptyView"; import useEnqueueErrorSnackbar from "../../../../../../../../hooks/useEnqueueErrorSnackbar"; import { toError } from "../../../../../../../../utils/fnUtils"; import { useOutletContext } from "react-router"; diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx index 88c1aaea1e..dfc763783a 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx @@ -36,7 +36,7 @@ import { canEditFile, } from "../utils"; import { Fragment, useState } from "react"; -import EmptyView from "../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../common/page/EmptyView"; import { useTranslation } from "react-i18next"; import { Filename, Menubar } from "./styles"; import UploadFileButton from "../../../../../common/buttons/UploadFileButton"; diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx index 1ee8be74c0..b77dd93c1f 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx @@ -31,7 +31,7 @@ import DownloadButton from "../../../../../common/buttons/DownloadButton"; import { downloadFile } from "../../../../../../utils/fileUtils"; import { Filename, Flex, Menubar } from "./styles"; import UploadFileButton from "../../../../../common/buttons/UploadFileButton"; -import EmptyView from "@/components/common/page/SimpleContent"; +import EmptyView from "@/components/common/page/EmptyView"; import GridOffIcon from "@mui/icons-material/GridOff"; import { getRawFile } from "@/services/api/studies/raw"; diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Unsupported.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Unsupported.tsx index 81307a4edf..f96f598a77 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Unsupported.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Unsupported.tsx @@ -13,7 +13,7 @@ */ import { useTranslation } from "react-i18next"; -import EmptyView from "../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../common/page/EmptyView"; import BlockIcon from "@mui/icons-material/Block"; import { Filename, Flex, Menubar } from "./styles"; import type { DataCompProps } from "../utils"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx index f5df3c43e0..199a543c27 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx @@ -14,7 +14,7 @@ import { useOutletContext } from "react-router"; import { StudyMetadata } from "../../../../../../common/types"; -import EmptyView from "../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../common/page/EmptyView"; import AreaPropsView from "./AreaPropsView"; import AreasTab from "./AreasTab"; import useStudySynthesis from "../../../../../../redux/hooks/useStudySynthesis"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx index c1e04de1e0..fa48b6aa15 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx @@ -14,7 +14,7 @@ import { useOutletContext } from "react-router"; import { StudyMetadata } from "../../../../../../common/types"; -import EmptyView from "../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../common/page/EmptyView"; import BindingConstPropsView from "./BindingConstPropsView"; import { getBindingConst, diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx index 3749bb784b..29ab7632ba 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx @@ -14,7 +14,7 @@ import { useOutletContext } from "react-router"; import { StudyMetadata } from "../../../../../../common/types"; -import EmptyView from "../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../common/page/EmptyView"; import LinkPropsView from "./LinkPropsView"; import { getCurrentLink } from "../../../../../../redux/selectors"; import useAppDispatch from "../../../../../../redux/hooks/useAppDispatch"; diff --git a/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx b/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx index 1814bd876d..8df3507b76 100644 --- a/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx @@ -63,7 +63,7 @@ import { Column } from "@/components/common/Matrix/shared/constants.ts"; import SplitView from "../../../../../common/SplitView/index.tsx"; import ResultFilters from "./ResultFilters.tsx"; import { toError } from "../../../../../../utils/fnUtils.ts"; -import EmptyView from "../../../../../common/page/SimpleContent.tsx"; +import EmptyView from "../../../../../common/page/EmptyView.tsx"; import { getStudyMatrixIndex } from "../../../../../../services/api/matrix.ts"; import { MatrixGridSynthesis } from "@/components/common/Matrix/components/MatrixGridSynthesis"; import { ResultMatrixDTO } from "@/components/common/Matrix/shared/types.ts"; diff --git a/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx b/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx index bf4655465a..1f381e17bc 100644 --- a/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx @@ -32,7 +32,7 @@ import ConfirmationDialog from "../../../../common/dialogs/ConfirmationDialog"; import TableMode from "../../../../common/TableMode"; import SplitView from "../../../../common/SplitView"; import ViewWrapper from "../../../../common/page/ViewWrapper"; -import EmptyView from "@/components/common/page/SimpleContent"; +import EmptyView from "@/components/common/page/EmptyView"; function TableModeList() { const { t } = useTranslation(); diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx index fafe0236ed..298dc08e01 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx @@ -41,7 +41,7 @@ import CreateCandidateDialog from "./CreateCandidateDialog"; import CandidateForm from "./CandidateForm"; import usePromiseWithSnackbarError from "../../../../../../hooks/usePromiseWithSnackbarError"; import DataViewerDialog from "../../../../../common/dialogs/DataViewerDialog"; -import EmptyView from "../../../../../common/page/SimpleContent"; +import EmptyView from "../../../../../common/page/EmptyView"; import SplitView from "../../../../../common/SplitView"; import { getLinks } from "@/services/api/studies/links"; import { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; diff --git a/webapp/src/components/common/Matrix/index.tsx b/webapp/src/components/common/Matrix/index.tsx index 4bb07202dd..e9898f6292 100644 --- a/webapp/src/components/common/Matrix/index.tsx +++ b/webapp/src/components/common/Matrix/index.tsx @@ -21,7 +21,7 @@ import { useOutletContext } from "react-router"; import { StudyMetadata } from "../../../common/types"; import { MatrixContainer, MatrixHeader, MatrixTitle } from "./styles"; import MatrixActions from "./components/MatrixActions"; -import EmptyView from "../page/SimpleContent"; +import EmptyView from "../page/EmptyView"; import { fetchMatrixFn } from "../../App/Singlestudy/explore/Modelization/Areas/Hydro/utils"; import { AggregateConfig } from "./shared/types"; import { GridOff } from "@mui/icons-material"; diff --git a/webapp/src/components/common/TableMode.tsx b/webapp/src/components/common/TableMode.tsx index 499827537a..1809a93377 100644 --- a/webapp/src/components/common/TableMode.tsx +++ b/webapp/src/components/common/TableMode.tsx @@ -28,7 +28,7 @@ import { SubmitHandlerPlus } from "./Form/types"; import TableForm from "./TableForm"; import UsePromiseCond from "./utils/UsePromiseCond"; import GridOffIcon from "@mui/icons-material/GridOff"; -import EmptyView from "./page/SimpleContent"; +import EmptyView from "./page/EmptyView"; import { useTranslation } from "react-i18next"; export interface TableModeProps { diff --git a/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx b/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx index 3856e72690..c1c17c27b0 100644 --- a/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx +++ b/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx @@ -21,7 +21,7 @@ import ButtonBack from "@/components/common/ButtonBack"; import { getMatrix } from "@/services/api/matrix"; import usePromiseWithSnackbarError from "@/hooks/usePromiseWithSnackbarError"; import { generateDataColumns } from "@/components/common/Matrix/shared/utils"; -import EmptyView from "@/components/common/page/SimpleContent"; +import EmptyView from "@/components/common/page/EmptyView"; import { GridOff } from "@mui/icons-material"; interface MatrixContentProps { diff --git a/webapp/src/components/common/dialogs/DigestDialog.tsx b/webapp/src/components/common/dialogs/DigestDialog.tsx index db169ecaf1..31bf1f0900 100644 --- a/webapp/src/components/common/dialogs/DigestDialog.tsx +++ b/webapp/src/components/common/dialogs/DigestDialog.tsx @@ -20,7 +20,7 @@ import { getStudyData } from "../../../services/api/study"; import usePromise from "../../../hooks/usePromise"; import { useTranslation } from "react-i18next"; import { AxiosError } from "axios"; -import EmptyView from "../page/SimpleContent"; +import EmptyView from "../page/EmptyView"; import SearchOffIcon from "@mui/icons-material/SearchOff"; import { generateDataColumns } from "@/components/common/Matrix/shared/utils"; import { MatrixGridSynthesis } from "@/components/common/Matrix/components/MatrixGridSynthesis"; diff --git a/webapp/src/components/common/page/SimpleContent.tsx b/webapp/src/components/common/page/EmptyView.tsx similarity index 71% rename from webapp/src/components/common/page/SimpleContent.tsx rename to webapp/src/components/common/page/EmptyView.tsx index cd4804272c..5b5610d51c 100644 --- a/webapp/src/components/common/page/SimpleContent.tsx +++ b/webapp/src/components/common/page/EmptyView.tsx @@ -20,10 +20,14 @@ import { SvgIconComponent } from "@mui/icons-material"; export interface EmptyViewProps { title?: string; icon?: SvgIconComponent; + extraActions?: React.ReactNode; } -function EmptyView(props: EmptyViewProps) { - const { title, icon: Icon = LiveHelpRoundedIcon } = props; +function EmptyView({ + title, + icon: Icon = LiveHelpRoundedIcon, + extraActions, +}: EmptyViewProps) { const { t } = useTranslation(); return ( @@ -35,8 +39,22 @@ function EmptyView(props: EmptyViewProps) { flexDirection: "column", alignItems: "center", justifyContent: "center", + position: "relative", }} > + {extraActions && ( + + {extraActions} + + )} {Icon && }
{title || t("common.noContent")}
diff --git a/webapp/src/components/common/utils/UsePromiseCond.tsx b/webapp/src/components/common/utils/UsePromiseCond.tsx index 3d9df26617..0087922521 100644 --- a/webapp/src/components/common/utils/UsePromiseCond.tsx +++ b/webapp/src/components/common/utils/UsePromiseCond.tsx @@ -14,7 +14,7 @@ import { PromiseStatus, UsePromiseResponse } from "../../../hooks/usePromise"; import SimpleLoader from "../loaders/SimpleLoader"; -import EmptyView from "../page/SimpleContent"; +import EmptyView from "../page/EmptyView"; export type Response = Pick< UsePromiseResponse, From 1c590c12f41ebb84107b327cacb91ed10ac0bb21 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:34:28 +0100 Subject: [PATCH 08/38] fix(ui-common): disable undo/redo buttons when submitting in Form --- webapp/src/components/common/Form/index.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/webapp/src/components/common/Form/index.tsx b/webapp/src/components/common/Form/index.tsx index 00b0f61d3a..eeb4bb6058 100644 --- a/webapp/src/components/common/Form/index.tsx +++ b/webapp/src/components/common/Form/index.tsx @@ -413,14 +413,22 @@ function Form( <> - + - + From b164dd6af3491b837e879bf09bd602ae2db77d03 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:35:07 +0100 Subject: [PATCH 09/38] feat(ui-common): create DataGrid component and use it --- webapp/index.html | 2 + webapp/src/components/common/DataGrid.tsx | 337 ++++++++++++++++++ .../components/MatrixGrid/MatrixGrid.test.tsx | 84 ----- .../Matrix/components/MatrixGrid/index.tsx | 100 ++---- .../components/MatrixGridSynthesis/index.tsx | 17 +- .../Matrix/hooks/useColumnMapping/index.ts | 2 +- .../Matrix/hooks/useGridCellContent/index.ts | 2 +- .../Matrix/hooks/useMatrixPortal/index.ts | 76 ---- .../useMatrixPortal/useMatrixPortal.test.tsx | 153 -------- 9 files changed, 373 insertions(+), 400 deletions(-) create mode 100644 webapp/src/components/common/DataGrid.tsx delete mode 100644 webapp/src/components/common/Matrix/hooks/useMatrixPortal/index.ts delete mode 100644 webapp/src/components/common/Matrix/hooks/useMatrixPortal/useMatrixPortal.test.tsx diff --git a/webapp/index.html b/webapp/index.html index b1084b2392..b7e6021a32 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -17,6 +17,8 @@
+ +
diff --git a/webapp/src/components/common/DataGrid.tsx b/webapp/src/components/common/DataGrid.tsx new file mode 100644 index 0000000000..caf1bcb4df --- /dev/null +++ b/webapp/src/components/common/DataGrid.tsx @@ -0,0 +1,337 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import { + CompactSelection, + DataEditor, + GridCellKind, + type EditListItem, + type GridSelection, + type DataEditorProps, +} from "@glideapps/glide-data-grid"; +import "@glideapps/glide-data-grid/dist/index.css"; +import { useCallback, useEffect, useState } from "react"; +import { voidFn } from "@/utils/fnUtils"; +import { darkTheme } from "./Matrix/styles"; + +interface StringRowMarkerOptions { + kind: "string" | "clickable-string"; + getTitle?: (rowIndex: number) => string; +} + +type RowMarkers = + | NonNullable + | StringRowMarkerOptions["kind"] + | StringRowMarkerOptions; + +type RowMarkersOptions = Exclude; + +export interface DataGridProps + extends Omit< + DataEditorProps, + "rowMarkers" | "onGridSelectionChange" | "gridSelection" + > { + rowMarkers?: RowMarkers; + enableColumnResize?: boolean; +} + +function isStringRowMarkerOptions( + rowMarkerOptions: RowMarkersOptions, +): rowMarkerOptions is StringRowMarkerOptions { + return ( + rowMarkerOptions.kind === "string" || + rowMarkerOptions.kind === "clickable-string" + ); +} + +function DataGrid(props: DataGridProps) { + const { + rowMarkers = { kind: "none" }, + getCellContent, + columns: columnsFromProps, + onCellEdited, + onCellsEdited, + onColumnResize, + onColumnResizeStart, + onColumnResizeEnd, + enableColumnResize = true, + freezeColumns, + ...rest + } = props; + + const rowMarkersOptions: RowMarkersOptions = + typeof rowMarkers === "string" ? { kind: rowMarkers } : rowMarkers; + const isStringRowMarkers = isStringRowMarkerOptions(rowMarkersOptions); + const adjustedFreezeColumns = isStringRowMarkers + ? (freezeColumns || 0) + 1 + : freezeColumns; + + const [columns, setColumns] = useState(columnsFromProps); + const [selection, setSelection] = useState({ + columns: CompactSelection.empty(), + rows: CompactSelection.empty(), + }); + + // Add a column for the "string" row markers if needed + useEffect(() => { + setColumns( + isStringRowMarkers + ? [{ id: "", title: "" }, ...columnsFromProps] + : columnsFromProps, + ); + }, [columnsFromProps, isStringRowMarkers]); + + //////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////// + + const ifElseStringRowMarkers = ( + colIndex: number, + onTrue: () => R1, + onFalse: (colIndex: number) => R2, + ) => { + let adjustedColIndex = colIndex; + + if (isStringRowMarkers) { + if (colIndex === 0) { + return onTrue(); + } + + adjustedColIndex = colIndex - 1; + } + + return onFalse(adjustedColIndex); + }; + + const ifNotStringRowMarkers = ( + colIndex: number, + fn: (colIndex: number) => void, + ) => { + return ifElseStringRowMarkers(colIndex, voidFn, fn); + }; + + //////////////////////////////////////////////////////////////// + // Content + //////////////////////////////////////////////////////////////// + + const getCellContentWrapper = useCallback( + (cell) => { + const [colIndex, rowIndex] = cell; + + return ifElseStringRowMarkers( + colIndex, + () => { + const title = + isStringRowMarkers && rowMarkersOptions.getTitle + ? rowMarkersOptions.getTitle(rowIndex) + : `Row ${rowIndex + 1}`; + + return { + kind: GridCellKind.Text, + data: title, + displayData: title, + allowOverlay: false, + readonly: true, + themeOverride: { + bgCell: darkTheme.bgHeader, + }, + }; + }, + (adjustedColIndex) => { + return getCellContent([adjustedColIndex, rowIndex]); + }, + ); + }, + [getCellContent, isStringRowMarkers], + ); + + //////////////////////////////////////////////////////////////// + // Edition + //////////////////////////////////////////////////////////////// + + const handleCellEdited: DataEditorProps["onCellEdited"] = ( + location, + value, + ) => { + const [colIndex, rowIndex] = location; + + ifNotStringRowMarkers(colIndex, (adjustedColIndex) => { + onCellEdited?.([adjustedColIndex, rowIndex], value); + }); + }; + + const handleCellsEdited: DataEditorProps["onCellsEdited"] = (items) => { + if (onCellsEdited) { + const adjustedItems = items + .map((item) => { + const { location } = item; + const [colIndex, rowIndex] = location; + + return ifElseStringRowMarkers( + colIndex, + () => null, + (adjustedColIndex): EditListItem => { + return { ...item, location: [adjustedColIndex, rowIndex] }; + }, + ); + }) + .filter(Boolean); + + return onCellsEdited(adjustedItems); + } + }; + + //////////////////////////////////////////////////////////////// + // Resize + //////////////////////////////////////////////////////////////// + + const handleColumnResize: DataEditorProps["onColumnResize"] = + onColumnResize || enableColumnResize + ? (column, newSize, colIndex, newSizeWithGrow) => { + if (enableColumnResize) { + setColumns( + columns.map((col, index) => + index === colIndex ? { ...col, width: newSize } : col, + ), + ); + } + + if (onColumnResize) { + ifNotStringRowMarkers(colIndex, (adjustedColIndex) => { + onColumnResize( + column, + newSize, + adjustedColIndex, + newSizeWithGrow, + ); + }); + } + } + : undefined; + + const handleColumnResizeStart: DataEditorProps["onColumnResizeStart"] = + onColumnResizeStart + ? (column, newSize, colIndex, newSizeWithGrow) => { + ifNotStringRowMarkers(colIndex, (adjustedColIndex) => { + onColumnResizeStart( + column, + newSize, + adjustedColIndex, + newSizeWithGrow, + ); + }); + } + : undefined; + + const handleColumnResizeEnd: DataEditorProps["onColumnResizeEnd"] = + onColumnResizeEnd + ? (column, newSize, colIndex, newSizeWithGrow) => { + ifNotStringRowMarkers(colIndex, (adjustedColIndex) => { + onColumnResizeEnd( + column, + newSize, + adjustedColIndex, + newSizeWithGrow, + ); + }); + } + : undefined; + + //////////////////////////////////////////////////////////////// + // Selection + //////////////////////////////////////////////////////////////// + + const handleGridSelectionChange = (newSelection: GridSelection) => { + { + if (isStringRowMarkers) { + if (newSelection.current) { + // Select the whole row when clicking on a row marker cell + if ( + rowMarkersOptions.kind === "clickable-string" && + newSelection.current.cell[0] === 0 + ) { + setSelection({ + ...newSelection, + current: undefined, + rows: CompactSelection.fromSingleSelection( + newSelection.current.cell[1], + ), + }); + + return; + } + + // Prevent selecting a row marker cell + if (newSelection.current.range.x === 0) { + return; + } + } + + // Prevent selecting the row marker column + if (newSelection.columns.hasIndex(0)) { + // TODO find a way to have the rows length to select all the rows like other row markers + // setSelection({ + // ...newSelection, + // columns: CompactSelection.empty(), + // rows: CompactSelection.fromSingleSelection([ + // 0, + // // rowsLength + // ]), + // }); + + setSelection({ + ...newSelection, + columns: newSelection.columns.remove(0), + }); + + return; + } + } + + setSelection(newSelection); + } + }; + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + + return ( + + ); +} + +export default DataGrid; diff --git a/webapp/src/components/common/Matrix/components/MatrixGrid/MatrixGrid.test.tsx b/webapp/src/components/common/Matrix/components/MatrixGrid/MatrixGrid.test.tsx index 7f3f44aa7b..b1169ef3df 100644 --- a/webapp/src/components/common/Matrix/components/MatrixGrid/MatrixGrid.test.tsx +++ b/webapp/src/components/common/Matrix/components/MatrixGrid/MatrixGrid.test.tsx @@ -13,10 +13,8 @@ */ import { render } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; import Box from "@mui/material/Box"; import MatrixGrid, { MatrixGridProps } from "."; -import SplitView from "../../../SplitView"; import type { EnhancedGridColumn } from "../../shared/types"; import { mockGetBoundingClientRect } from "../../../../../tests/mocks/mockGetBoundingClientRect"; import { mockHTMLCanvasElement } from "../../../../../tests/mocks/mockHTMLCanvasElement"; @@ -146,86 +144,4 @@ describe("MatrixGrid", () => { assertDimensions(matrix, 300, 400); }); }); - - describe("portal management", () => { - const renderSplitView = () => { - return render( - - - {[0, 1].map((index) => ( - - - - ))} - - , - ); - }; - - const getPortal = () => document.getElementById("portal"); - - test("should manage portal visibility on mount", () => { - renderMatrixGrid(); - expect(getPortal()).toBeInTheDocument(); - expect(getPortal()?.style.display).toBe("none"); - }); - - test("should toggle portal visibility on mouse events", async () => { - const user = userEvent.setup(); - const { container } = renderMatrixGrid(); - const matrix = container.querySelector(".matrix-container"); - expect(matrix).toBeInTheDocument(); - - await user.hover(matrix!); - expect(getPortal()?.style.display).toBe("block"); - - await user.unhover(matrix!); - expect(getPortal()?.style.display).toBe("none"); - }); - - test("should handle portal in split view", async () => { - const user = userEvent.setup(); - renderSplitView(); - const matrices = document.querySelectorAll(".matrix-container"); - - // Test portal behavior with multiple matrices - await user.hover(matrices[0]); - expect(getPortal()?.style.display).toBe("block"); - - await user.hover(matrices[1]); - expect(getPortal()?.style.display).toBe("block"); - - await user.unhover(matrices[1]); - expect(getPortal()?.style.display).toBe("none"); - }); - - test("should maintain portal state when switching between matrices", async () => { - const user = userEvent.setup(); - renderSplitView(); - const matrices = document.querySelectorAll(".matrix-container"); - - for (const matrix of [matrices[0], matrices[1], matrices[0]]) { - await user.hover(matrix); - expect(getPortal()?.style.display).toBe("block"); - } - - await user.unhover(matrices[0]); - expect(getPortal()?.style.display).toBe("none"); - }); - - test("should handle unmounting correctly", () => { - const { unmount } = renderSplitView(); - expect(getPortal()).toBeInTheDocument(); - - unmount(); - expect(getPortal()).toBeInTheDocument(); - expect(getPortal()?.style.display).toBe("none"); - }); - }); }); diff --git a/webapp/src/components/common/Matrix/components/MatrixGrid/index.tsx b/webapp/src/components/common/Matrix/components/MatrixGrid/index.tsx index 688b647cc1..c7956c92ac 100644 --- a/webapp/src/components/common/Matrix/components/MatrixGrid/index.tsx +++ b/webapp/src/components/common/Matrix/components/MatrixGrid/index.tsx @@ -12,31 +12,27 @@ * This file is part of the Antares project. */ -import "@glideapps/glide-data-grid/dist/index.css"; -import DataEditor, { - CompactSelection, - EditableGridCell, - EditListItem, +import { GridCellKind, - GridColumn, - GridSelection, - Item, + type EditableGridCell, + type EditListItem, + type Item, } from "@glideapps/glide-data-grid"; import { useGridCellContent } from "../../hooks/useGridCellContent"; -import { useMemo, useState } from "react"; +import { useMemo } from "react"; import { type EnhancedGridColumn, type GridUpdate, type MatrixAggregates, } from "../../shared/types"; import { useColumnMapping } from "../../hooks/useColumnMapping"; -import { useMatrixPortal } from "../../hooks/useMatrixPortal"; import { darkTheme, readOnlyDarkTheme } from "../../styles"; +import DataGrid from "@/components/common/DataGrid"; export interface MatrixGridProps { data: number[][]; rows: number; - columns: EnhancedGridColumn[]; + columns: readonly EnhancedGridColumn[]; dateTime?: string[]; aggregates?: Partial; rowHeaders?: string[]; @@ -51,7 +47,7 @@ export interface MatrixGridProps { function MatrixGrid({ data, rows, - columns: initialColumns, + columns, dateTime, aggregates, rowHeaders, @@ -62,23 +58,8 @@ function MatrixGrid({ readOnly, showPercent, }: MatrixGridProps) { - const [columns, setColumns] = useState(initialColumns); - const [selection, setSelection] = useState({ - columns: CompactSelection.empty(), - rows: CompactSelection.empty(), - }); - const { gridToData } = useColumnMapping(columns); - // Due to a current limitation of Glide Data Grid, only one id="portal" is active on the DOM - // This is an issue on splited matrices, the second matrix does not have an id="portal" - // Causing the overlay editor to not behave correctly on click - // This hook manage portal creation and cleanup for matrices in split views - // TODO: add a prop to detect matrices in split views and enable this conditionnaly - // !Workaround: a proper solution should be replacing this in the future - const { containerRef, handleMouseEnter, handleMouseLeave } = - useMatrixPortal(); - const theme = useMemo(() => { if (readOnly) { return { @@ -105,19 +86,6 @@ function MatrixGrid({ // Event Handlers //////////////////////////////////////////////////////////////// - const handleColumnResize = ( - column: GridColumn, - newSize: number, - colIndex: number, - newSizeWithGrow: number, - ) => { - const newColumns = columns.map((col, index) => - index === colIndex ? { ...col, width: newSize } : col, - ); - - setColumns(newColumns); - }; - const handleCellEdited = (coordinates: Item, value: EditableGridCell) => { if (value.kind !== GridCellKind.Number) { // Invalid numeric value @@ -172,41 +140,23 @@ function MatrixGrid({ //////////////////////////////////////////////////////////////// return ( - <> -
- -
- + ); } diff --git a/webapp/src/components/common/Matrix/components/MatrixGridSynthesis/index.tsx b/webapp/src/components/common/Matrix/components/MatrixGridSynthesis/index.tsx index ad56f83b49..f7f099ddd4 100644 --- a/webapp/src/components/common/Matrix/components/MatrixGridSynthesis/index.tsx +++ b/webapp/src/components/common/Matrix/components/MatrixGridSynthesis/index.tsx @@ -12,16 +12,17 @@ * This file is part of the Antares project. */ -import DataEditor, { +import { GridCellKind, - GridColumn, - Item, - NumberCell, - TextCell, + type GridColumn, + type Item, + type NumberCell, + type TextCell, } from "@glideapps/glide-data-grid"; import { useMemo } from "react"; import { darkTheme, readOnlyDarkTheme } from "../../styles"; import { formatGridNumber } from "../../shared/utils"; +import DataGrid from "@/components/common/DataGrid"; type CellValue = number | string; @@ -81,17 +82,13 @@ export function MatrixGridSynthesis({ return (
-
diff --git a/webapp/src/components/common/Matrix/hooks/useColumnMapping/index.ts b/webapp/src/components/common/Matrix/hooks/useColumnMapping/index.ts index b9ceb95ebf..6b16f75c3f 100644 --- a/webapp/src/components/common/Matrix/hooks/useColumnMapping/index.ts +++ b/webapp/src/components/common/Matrix/hooks/useColumnMapping/index.ts @@ -46,7 +46,7 @@ import { Column } from "../../shared/constants"; * - dataToGrid: (dataCoord: Item) => Item * Converts data coordinates to grid coordinates. */ -export function useColumnMapping(columns: EnhancedGridColumn[]) { +export function useColumnMapping(columns: readonly EnhancedGridColumn[]) { return useMemo(() => { const dataColumnIndices = columns.reduce((acc, col, index) => { if (col.type === Column.Number) { diff --git a/webapp/src/components/common/Matrix/hooks/useGridCellContent/index.ts b/webapp/src/components/common/Matrix/hooks/useGridCellContent/index.ts index 7b12319381..3052c93ad1 100644 --- a/webapp/src/components/common/Matrix/hooks/useGridCellContent/index.ts +++ b/webapp/src/components/common/Matrix/hooks/useGridCellContent/index.ts @@ -108,7 +108,7 @@ const cellContentGenerators: Record = { */ export function useGridCellContent( data: number[][], - columns: EnhancedGridColumn[], + columns: readonly EnhancedGridColumn[], gridToData: (cell: Item) => Item | null, dateTime?: string[], aggregates?: Partial, diff --git a/webapp/src/components/common/Matrix/hooks/useMatrixPortal/index.ts b/webapp/src/components/common/Matrix/hooks/useMatrixPortal/index.ts deleted file mode 100644 index c6174d39d2..0000000000 --- a/webapp/src/components/common/Matrix/hooks/useMatrixPortal/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2024, RTE (https://www.rte-france.com) - * - * See AUTHORS.txt - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of the Antares project. - */ - -import { useEffect, useRef, useState } from "react"; - -/** - * Custom hook to manage portal creation and cleanup for matrices in split views. - * This hook is specifically designed to work around a limitation where multiple - * Glide Data Grid instances compete for a single portal with id="portal". - * - * @returns Hook handlers and ref to be applied to the matrix container - * - * @example - * ```tsx - * function MatrixGrid() { - * const { containerRef, handleMouseEnter, handleMouseLeave } = useMatrixPortal(); - * - * return ( - *
- * - *
- * ); - * } - * ``` - */ -export function useMatrixPortal() { - const [isActive, setIsActive] = useState(false); - const containerRef = useRef(null); - - useEffect(() => { - let portal = document.getElementById("portal"); - - if (!portal) { - portal = document.createElement("div"); - portal.id = "portal"; - portal.style.position = "fixed"; - portal.style.left = "0"; - portal.style.top = "0"; - portal.style.zIndex = "9999"; - portal.style.display = "none"; - document.body.appendChild(portal); - } - - // Update visibility based on active state - if (containerRef.current && isActive) { - portal.style.display = "block"; - } else { - portal.style.display = "none"; - } - }, [isActive]); - - const handleMouseEnter = () => { - setIsActive(true); - }; - - const handleMouseLeave = () => { - setIsActive(false); - }; - - return { - containerRef, - handleMouseEnter, - handleMouseLeave, - }; -} diff --git a/webapp/src/components/common/Matrix/hooks/useMatrixPortal/useMatrixPortal.test.tsx b/webapp/src/components/common/Matrix/hooks/useMatrixPortal/useMatrixPortal.test.tsx deleted file mode 100644 index 8b3bdfda32..0000000000 --- a/webapp/src/components/common/Matrix/hooks/useMatrixPortal/useMatrixPortal.test.tsx +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Copyright (c) 2024, RTE (https://www.rte-france.com) - * - * See AUTHORS.txt - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of the Antares project. - */ - -import { cleanup, render, screen } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { useMatrixPortal } from "../useMatrixPortal"; - -function NonRefComponent() { - return
Test Container
; -} - -function TestComponent() { - const { containerRef, handleMouseEnter, handleMouseLeave } = - useMatrixPortal(); - return ( -
- Test Container -
- ); -} - -describe("useMatrixPortal", () => { - beforeEach(() => { - cleanup(); - const existingPortal = document.getElementById("portal"); - if (existingPortal) { - existingPortal.remove(); - } - }); - - test("should create hidden portal initially", () => { - render(); - const portal = document.getElementById("portal"); - expect(portal).toBeInTheDocument(); - expect(portal?.style.display).toBe("none"); - }); - - test("should show portal with correct styles when mouse enters", async () => { - const user = userEvent.setup(); - render(); - - const container = screen.getByTestId("ref-container"); - await user.hover(container); - - const portal = document.getElementById("portal"); - expect(portal).toBeInTheDocument(); - expect(portal?.style.display).toBe("block"); - expect(portal?.style.position).toBe("fixed"); - expect(portal?.style.left).toBe("0px"); - expect(portal?.style.top).toBe("0px"); - expect(portal?.style.zIndex).toBe("9999"); - }); - - test("should hide portal when mouse leaves", async () => { - const user = userEvent.setup(); - render(); - - const container = screen.getByTestId("ref-container"); - - // Show portal - await user.hover(container); - expect(document.getElementById("portal")?.style.display).toBe("block"); - - // Hide portal - await user.unhover(container); - expect(document.getElementById("portal")?.style.display).toBe("none"); - }); - - test("should keep portal hidden if containerRef is null", async () => { - const user = userEvent.setup(); - - // First render test component to create portal - render(); - const portal = document.getElementById("portal"); - expect(portal?.style.display).toBe("none"); - - cleanup(); // Clean up the test component - - // Then render component without ref - render(); - const container = screen.getByTestId("non-ref-container"); - await user.hover(container); - - // Portal should stay hidden - expect(portal?.style.display).toBe("none"); - }); - - test("should handle multiple mouse enter/leave cycles", async () => { - const user = userEvent.setup(); - render(); - - const container = screen.getByTestId("ref-container"); - const portal = document.getElementById("portal"); - - // First cycle - await user.hover(container); - expect(portal?.style.display).toBe("block"); - - await user.unhover(container); - expect(portal?.style.display).toBe("none"); - - // Second cycle - await user.hover(container); - expect(portal?.style.display).toBe("block"); - - await user.unhover(container); - expect(portal?.style.display).toBe("none"); - }); - - test("should handle rapid mouse events", async () => { - const user = userEvent.setup(); - render(); - - const container = screen.getByTestId("ref-container"); - const portal = document.getElementById("portal"); - - // Rapid sequence - await user.hover(container); - await user.unhover(container); - await user.hover(container); - - expect(portal?.style.display).toBe("block"); - }); - - test("should maintain portal existence across multiple component instances", () => { - // Render first instance - const { unmount } = render(); - expect(document.getElementById("portal")).toBeInTheDocument(); - - // Unmount first instance - unmount(); - - // Render second instance - render(); - expect(document.getElementById("portal")).toBeInTheDocument(); - }); -}); From 26398acf321cc6edcb0227aa6117968f3eb883e4 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:36:48 +0100 Subject: [PATCH 10/38] feat(ui-common): create DataGridForm component --- webapp/src/components/common/DataGridForm.tsx | 320 ++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 webapp/src/components/common/DataGridForm.tsx diff --git a/webapp/src/components/common/DataGridForm.tsx b/webapp/src/components/common/DataGridForm.tsx new file mode 100644 index 0000000000..1ae6c8064c --- /dev/null +++ b/webapp/src/components/common/DataGridForm.tsx @@ -0,0 +1,320 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import type { IdType } from "@/common/types"; +import { + GridCellKind, + type Item, + type DataEditorProps, + type GridColumn, + type FillHandleDirection, +} from "@glideapps/glide-data-grid"; +import type { DeepPartial } from "react-hook-form"; +import { FormEvent, useCallback, useState } from "react"; +import DataGrid from "./DataGrid"; +import { + Box, + Divider, + IconButton, + SxProps, + Theme, + Tooltip, +} from "@mui/material"; +import useUndo from "use-undo"; +import UndoIcon from "@mui/icons-material/Undo"; +import RedoIcon from "@mui/icons-material/Redo"; +import SaveIcon from "@mui/icons-material/Save"; +import { useTranslation } from "react-i18next"; +import { LoadingButton } from "@mui/lab"; +import { mergeSxProp } from "@/utils/muiUtils"; +import * as R from "ramda"; +import { SubmitHandlerPlus } from "./Form/types"; +import useEnqueueErrorSnackbar from "@/hooks/useEnqueueErrorSnackbar"; +import useFormCloseProtection from "@/hooks/useCloseFormSecurity"; + +type GridFieldValuesByRow = Record< + IdType, + Record +>; + +export interface DataGridFormProps< + TFieldValues extends GridFieldValuesByRow = GridFieldValuesByRow, + SubmitReturnValue = unknown, +> { + defaultData: TFieldValues; + columns: ReadonlyArray; + allowedFillDirections?: FillHandleDirection; + onSubmit?: ( + data: SubmitHandlerPlus, + event?: React.BaseSyntheticEvent, + ) => void | Promise; + onSubmitSuccessful?: ( + data: SubmitHandlerPlus, + submitResult: SubmitReturnValue, + ) => void; + sx?: SxProps; + extraActions?: React.ReactNode; +} + +function DataGridForm({ + defaultData, + columns, + allowedFillDirections = "vertical", + onSubmit, + onSubmitSuccessful, + sx, + extraActions, +}: DataGridFormProps) { + const { t } = useTranslation(); + const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); + const [isSubmitting, setIsSubmitting] = useState(false); + const [savedData, setSavedData] = useState(defaultData); + const [{ present: data }, { set, undo, redo, canUndo, canRedo }] = + useUndo(defaultData); + + const isSubmitAllowed = savedData !== data; + + useFormCloseProtection({ + isSubmitting, + isDirty: isSubmitAllowed, + }); + + //////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////// + + const getRowAndColumnNames = (location: Item) => { + const [colIndex, rowIndex] = location; + const rowNames = Object.keys(data); + const columnIds = columns.map((column) => column.id); + + return [rowNames[rowIndex], columnIds[colIndex]]; + }; + + const getDirtyValues = () => { + return Object.keys(data).reduce((acc, rowName) => { + const rowData = data[rowName]; + const savedRowData = savedData[rowName]; + + const dirtyColumns = Object.keys(rowData).filter( + (columnName) => rowData[columnName] !== savedRowData[columnName], + ); + + if (dirtyColumns.length > 0) { + return { + ...acc, + [rowName]: dirtyColumns.reduce( + (acc, columnName) => ({ + ...acc, + [columnName]: rowData[columnName], + }), + {}, + ), + }; + } + + return acc; + }, {} as DeepPartial); + }; + + //////////////////////////////////////////////////////////////// + // Callbacks + //////////////////////////////////////////////////////////////// + + const getCellContent = useCallback( + (location) => { + const [rowName, columnName] = getRowAndColumnNames(location); + const dataRow = data[rowName]; + const cellData = dataRow?.[columnName]; + + if (typeof cellData == "string") { + return { + kind: GridCellKind.Text, + data: cellData, + displayData: cellData, + allowOverlay: true, + }; + } + + if (typeof cellData == "number") { + return { + kind: GridCellKind.Number, + data: cellData, + displayData: cellData.toString(), + allowOverlay: true, + contentAlign: "right", + thousandSeparator: " ", + }; + } + + if (typeof cellData == "boolean") { + return { + kind: GridCellKind.Boolean, + data: cellData, + allowOverlay: false, + }; + } + + return { + kind: GridCellKind.Text, + data: "", + displayData: "", + allowOverlay: true, + readonly: true, + }; + }, + [data, columns], + ); + + //////////////////////////////////////////////////////////////// + // Event Handlers + //////////////////////////////////////////////////////////////// + + const handleCellsEdited: DataEditorProps["onCellsEdited"] = (items) => { + set( + items.reduce((acc, { location, value }) => { + const [rowName, columnName] = getRowAndColumnNames(location); + const newValue = value.data; + + if (R.isNotNil(newValue)) { + return { + ...acc, + [rowName]: { + ...acc[rowName], + [columnName]: newValue, + }, + }; + } + + return acc; + }, data), + ); + + return true; + }; + + const handleFormSubmit = (event: FormEvent) => { + event.preventDefault(); + + if (!onSubmit) { + return; + } + + setIsSubmitting(true); + + const dataArg = { + values: data, + dirtyValues: getDirtyValues(), + }; + + Promise.resolve(onSubmit(dataArg, event)) + .then((submitRes) => { + setSavedData(data); + onSubmitSuccessful?.(dataArg, submitRes); + }) + .catch((err) => { + enqueueErrorSnackbar(t("form.submit.error"), err); + }) + .finally(() => { + setIsSubmitting(false); + }); + }; + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + + return ( + + Object.keys(data)[index], + }} + fillHandle + allowedFillDirections={allowedFillDirections} + getCellsForSelection + /> + + + + } + > + {t("global.save")} + + + + + + + + + + + + + + + + + {extraActions && ( + + {extraActions} + + )} + + + + ); +} + +export default DataGridForm; From 63bfe448d0593e7bc3e3d587fae1555d279199f9 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:44:42 +0100 Subject: [PATCH 11/38] feat(ui-tablemode): replace Handsontable and remove context menu --- .../explore/TableModeList/index.tsx | 74 +++++++++++-------- .../explore/common/ListElement.tsx | 58 --------------- webapp/src/components/common/Form/types.ts | 1 - webapp/src/components/common/TableMode.tsx | 71 +++++++++++------- 4 files changed, 89 insertions(+), 115 deletions(-) diff --git a/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx b/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx index 1f381e17bc..c281d9c774 100644 --- a/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx @@ -13,10 +13,11 @@ */ import { useEffect, useState } from "react"; -import { MenuItem } from "@mui/material"; +import { Button } from "@mui/material"; import { useOutletContext } from "react-router"; import { useUpdateEffect } from "react-use"; import { useTranslation } from "react-i18next"; +import EditIcon from "@mui/icons-material/Edit"; import DeleteIcon from "@mui/icons-material/Delete"; import { v4 as uuidv4 } from "uuid"; import PropertiesView from "../../../../common/PropertiesView"; @@ -84,7 +85,25 @@ function TableModeList() { // Event Handlers //////////////////////////////////////////////////////////////// - const handleDeleteTemplate = () => { + const handleEditClick = () => { + if (selectedTemplate) { + setDialog({ + type: "edit", + templateId: selectedTemplate.id, + }); + } + }; + + const handleDeleteClick = () => { + if (selectedTemplate) { + setDialog({ + type: "delete", + templateId: selectedTemplate.id, + }); + } + }; + + const handleDelete = () => { setTemplates((templates) => templates.filter((tp) => tp.id !== dialog?.templateId), ); @@ -106,34 +125,6 @@ function TableModeList() { currentElement={selectedTemplate?.id} currentElementKeyToTest="id" setSelectedItem={({ id }) => setSelectedTemplateId(id)} - contextMenuContent={({ element, close }) => ( - <> - { - event.stopPropagation(); - setDialog({ - type: "edit", - templateId: element.id, - }); - close(); - }} - > - Edit - - { - event.stopPropagation(); - setDialog({ - type: "delete", - templateId: element.id, - }); - close(); - }} - > - Delete - - - )} /> } onAdd={() => setDialog({ type: "add", templateId: "" })} @@ -148,6 +139,27 @@ function TableModeList() { studyId={study.id} type={selectedTemplate.type} columns={selectedTemplate.columns} + extraActions={ + <> + + + + } /> )} @@ -173,7 +185,7 @@ function TableModeList() { diff --git a/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx b/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx index 69b9254d61..5e799e1928 100644 --- a/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx +++ b/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx @@ -17,14 +17,11 @@ import { ListItemButton, ListItemIcon, ListItemText, - Menu, - PopoverPosition, SxProps, Theme, Tooltip, } from "@mui/material"; import ArrowRightOutlinedIcon from "@mui/icons-material/ArrowRightOutlined"; -import { useState } from "react"; import { IdType } from "../../../../../common/types"; import { mergeSxProp } from "../../../../../utils/muiUtils"; @@ -33,10 +30,6 @@ interface Props { currentElement?: string; currentElementKeyToTest?: keyof T; setSelectedItem: (item: T, index: number) => void; - contextMenuContent?: (props: { - element: T; - close: VoidFunction; - }) => React.ReactElement; sx?: SxProps; } @@ -45,43 +38,8 @@ function ListElement({ currentElement, currentElementKeyToTest, setSelectedItem, - contextMenuContent: ContextMenuContent, sx, }: Props) { - const [contextMenuPosition, setContextMenuPosition] = - useState(null); - const [elementForContext, setElementForContext] = useState(); - - //////////////////////////////////////////////////////////////// - // Event Handlers - //////////////////////////////////////////////////////////////// - - const handleContextMenu = (element: T) => (event: React.MouseEvent) => { - event.preventDefault(); - - if (!ContextMenuContent) { - return; - } - - setElementForContext(element); - - setContextMenuPosition( - contextMenuPosition === null - ? { - left: event.clientX + 2, - top: event.clientY - 6, - } - : // Repeated context menu when it is already open closes it with Chrome 84 on Ubuntu - // Other native context menus might behave different. - // With this behavior we prevent contextmenu from the backdrop to re-locale existing context menus. - null, - ); - }; - - //////////////////////////////////////////////////////////////// - // JSX - //////////////////////////////////////////////////////////////// - return ( ({ justifyContent: "space-between", py: 0, }} - onContextMenu={handleContextMenu(element)} > ({ > - {ContextMenuContent && elementForContext && ( - setContextMenuPosition(null)} - anchorReference="anchorPosition" - anchorPosition={ - contextMenuPosition !== null ? contextMenuPosition : undefined - } - > - setContextMenuPosition(null)} - /> - - )} ))} diff --git a/webapp/src/components/common/Form/types.ts b/webapp/src/components/common/Form/types.ts index d7f27f94fb..a09272e8f1 100644 --- a/webapp/src/components/common/Form/types.ts +++ b/webapp/src/components/common/Form/types.ts @@ -26,7 +26,6 @@ import { } from "react-hook-form"; export interface SubmitHandlerPlus< - // TODO Make parameter required TFieldValues extends FieldValues = FieldValues, > { values: TFieldValues; diff --git a/webapp/src/components/common/TableMode.tsx b/webapp/src/components/common/TableMode.tsx index 1809a93377..1f5bdf2d8f 100644 --- a/webapp/src/components/common/TableMode.tsx +++ b/webapp/src/components/common/TableMode.tsx @@ -25,47 +25,64 @@ import { TableModeType, } from "../../services/api/studies/tableMode/types"; import { SubmitHandlerPlus } from "./Form/types"; -import TableForm from "./TableForm"; import UsePromiseCond from "./utils/UsePromiseCond"; import GridOffIcon from "@mui/icons-material/GridOff"; import EmptyView from "./page/EmptyView"; import { useTranslation } from "react-i18next"; +import DataGridForm, { type DataGridFormProps } from "./DataGridForm"; +import { startCase } from "lodash"; +import type { GridColumn } from "@glideapps/glide-data-grid"; export interface TableModeProps { studyId: StudyMetadata["id"]; type: T; columns: TableModeColumnsForType; + extraActions?: React.ReactNode; } -function TableMode(props: TableModeProps) { - const { studyId, type, columns } = props; - const [filteredColumns, setFilteredColumns] = useState(columns); +function TableMode({ + studyId, + type, + columns, + extraActions, +}: TableModeProps) { const { t } = useTranslation(); + const [gridColumns, setGridColumns] = useState< + DataGridFormProps["columns"] + >([]); + const columnsDep = columns.join(","); const res = usePromise( () => getTableMode({ studyId, tableType: type, columns }), - [studyId, type, columns.join(",")], + [studyId, type, columnsDep], ); // Filter columns based on the data received, because the API may return // fewer columns than requested depending on the study version - useEffect( - () => { - const dataKeys = Object.keys(res.data || {}); + useEffect(() => { + const data = res.data || {}; + const rowNames = Object.keys(data); - if (dataKeys.length === 0) { - setFilteredColumns([]); - return; - } + if (rowNames.length === 0) { + setGridColumns([]); + return; + } - const data = res.data!; - const dataRowKeys = Object.keys(data[dataKeys[0]]); + const columnNames = Object.keys(data[rowNames[0]]); - setFilteredColumns(columns.filter((col) => dataRowKeys.includes(col))); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [res.data, columns.join(",")], - ); + setGridColumns( + columns + .filter((col) => columnNames.includes(col)) + .map((col) => { + const title = startCase(col); + return { + title, + id: col, + width: title.length * 10, + } satisfies GridColumn; + }), + ); + }, [res.data, columnsDep]); //////////////////////////////////////////////////////////////// // Event Handlers @@ -83,15 +100,19 @@ function TableMode(props: TableModeProps) { - filteredColumns.length > 0 ? ( - 0 ? ( + ) : ( - + ) } /> From 3f957770b1f29bf5ddcebd0818aa469ed965c02f Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:50:27 +0100 Subject: [PATCH 12/38] feat(ui-playlist): replace Handsontable --- webapp/public/locales/en/main.json | 7 +- webapp/public/locales/fr/main.json | 9 +- .../dialogs/ScenarioPlaylistDialog.tsx | 192 ++++++++++++++++++ .../dialogs/ScenarioPlaylistDialog/index.tsx | 156 -------------- .../dialogs/ScenarioPlaylistDialog/utils.ts | 43 ---- .../TimeSeriesManagement/index.tsx | 2 +- webapp/src/components/common/DataGridForm.tsx | 131 +++++++----- webapp/src/components/common/Form/index.tsx | 2 +- webapp/src/hooks/useConfirm.ts | 30 ++- .../api/studies/config/playlist/constants.ts | 15 ++ .../api/studies/config/playlist/index.ts | 36 ++++ .../api/studies/config/playlist/types.ts | 28 +++ 12 files changed, 390 insertions(+), 261 deletions(-) create mode 100644 webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog.tsx delete mode 100644 webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/index.tsx delete mode 100644 webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/utils.ts create mode 100644 webapp/src/services/api/studies/config/playlist/constants.ts create mode 100644 webapp/src/services/api/studies/config/playlist/index.ts create mode 100644 webapp/src/services/api/studies/config/playlist/types.ts diff --git a/webapp/public/locales/en/main.json b/webapp/public/locales/en/main.json index 0368e65fcc..2873e51239 100644 --- a/webapp/public/locales/en/main.json +++ b/webapp/public/locales/en/main.json @@ -80,6 +80,7 @@ "global.semicolon": "Semicolon", "global.language": "Language", "global.path": "Path", + "global.weight": "Weight", "global.time.hourly": "Hourly", "global.time.daily": "Daily", "global.time.weekly": "Weekly", @@ -136,8 +137,8 @@ "maintenance.error.messageInfoError": "Unable to retrieve message info", "maintenance.error.maintenanceError": "Unable to retrieve maintenance status", "form.submit.error": "Error while submitting", - "form.submit.inProgress": "The form is being submitted. Are you sure you want to leave the page?", - "form.changeNotSaved": "The form has not been saved. Are you sure you want to leave the page?", + "form.submit.inProgress": "The form is being submitted. Are you sure you want to close it?", + "form.changeNotSaved": "The form has not been saved. Are you sure you want to close it?", "form.asyncDefaultValues.error": "Failed to get values", "form.field.required": "Field required", "form.field.duplicate": "Value already exists", @@ -361,8 +362,6 @@ "study.configuration.general.mcScenarioPlaylist.action.disableAll": "Disable all", "study.configuration.general.mcScenarioPlaylist.action.reverse": "Reverse", "study.configuration.general.mcScenarioPlaylist.action.resetWeights": "Reset weights", - "study.configuration.general.mcScenarioPlaylist.status": "Status", - "study.configuration.general.mcScenarioPlaylist.weight": "Weight", "study.configuration.general.geographicTrimming": "Geographic trimming", "study.configuration.general.thematicTrimming": "Thematic trimming", "study.configuration.general.thematicTrimming.action.enableAll": "Enable all", diff --git a/webapp/public/locales/fr/main.json b/webapp/public/locales/fr/main.json index ad6ba562bf..0cf1689f75 100644 --- a/webapp/public/locales/fr/main.json +++ b/webapp/public/locales/fr/main.json @@ -80,6 +80,7 @@ "global.semicolon": "Point-virgule", "global.language": "Langue", "global.path": "Chemin", + "global.weight": "Poids", "global.time.hourly": "Horaire", "global.time.daily": "Journalier", "global.time.weekly": "Hebdomadaire", @@ -136,8 +137,8 @@ "maintenance.error.messageInfoError": "Impossible de récupérer le message d'info", "maintenance.error.maintenanceError": "Impossible de récupérer le status de maintenance de l'application", "form.submit.error": "Erreur lors de la soumission", - "form.submit.inProgress": "Le formulaire est en cours de soumission. Etes-vous sûr de vouloir quitter la page ?", - "form.changeNotSaved": "Le formulaire n'a pas été sauvegardé. Etes-vous sûr de vouloir quitter la page ?", + "form.submit.inProgress": "Le formulaire est en cours de soumission. Etes-vous sûr de vouloir le fermer ?", + "form.changeNotSaved": "Le formulaire n'a pas été sauvegardé. Etes-vous sûr de vouloir le fermer ?", "form.asyncDefaultValues.error": "Impossible d'obtenir les valeurs", "form.field.required": "Champ requis", "form.field.duplicate": "Cette valeur existe déjà", @@ -360,9 +361,7 @@ "study.configuration.general.mcScenarioPlaylist.action.enableAll": "Activer tous", "study.configuration.general.mcScenarioPlaylist.action.disableAll": "Désactiver tous", "study.configuration.general.mcScenarioPlaylist.action.reverse": "Inverser", - "study.configuration.general.mcScenarioPlaylist.action.resetWeights": "Reset weights", - "study.configuration.general.mcScenarioPlaylist.status": "Status", - "study.configuration.general.mcScenarioPlaylist.weight": "Weight", + "study.configuration.general.mcScenarioPlaylist.action.resetWeights": "Réinitialiser les poids", "study.configuration.general.geographicTrimming": "Geographic trimming", "study.configuration.general.thematicTrimming": "Thematic trimming", "study.configuration.general.thematicTrimming.action.enableAll": "Activer tout", diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog.tsx new file mode 100644 index 0000000000..b0a237eb0a --- /dev/null +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog.tsx @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import { Button, ButtonGroup, Divider } from "@mui/material"; +import { useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import * as R from "ramda"; +import * as RA from "ramda-adjunct"; +import type { StudyMetadata } from "../../../../../../../common/types"; +import usePromise from "../../../../../../../hooks/usePromise"; +import BasicDialog from "../../../../../../common/dialogs/BasicDialog"; +import UsePromiseCond from "../../../../../../common/utils/UsePromiseCond"; +import type { SubmitHandlerPlus } from "../../../../../../common/Form/types"; +import DataGridForm, { + DataGridFormState, + type DataGridFormApi, +} from "@/components/common/DataGridForm"; +import ConfirmationDialog from "@/components/common/dialogs/ConfirmationDialog"; +import useConfirm from "@/hooks/useConfirm"; +import type { PlaylistData } from "@/services/api/studies/config/playlist/types"; +import { + getPlaylistData, + setPlaylistData, +} from "@/services/api/studies/config/playlist"; +import { DEFAULT_WEIGHT } from "@/services/api/studies/config/playlist/constants"; + +interface Props { + study: StudyMetadata; + open: boolean; + onClose: VoidFunction; +} + +function ScenarioPlaylistDialog(props: Props) { + const { study, open, onClose } = props; + const { t } = useTranslation(); + const dataGridApiRef = useRef>(null); + const [isSubmitting, setIsSubmitting] = useState(false); + const [isDirty, setIsDirty] = useState(false); + const closeAction = useConfirm(); + const res = usePromise( + () => getPlaylistData({ studyId: study.id }), + [study.id], + ); + + const columns = useMemo(() => { + return [ + { + id: "status" as const, + title: t("global.status"), + grow: 1, + }, + { + id: "weight" as const, + title: t("global.weight"), + grow: 1, + }, + ]; + }, [t]); + + //////////////////////////////////////////////////////////////// + // Event Handlers + //////////////////////////////////////////////////////////////// + + const handleUpdateStatus = (fn: RA.Pred) => () => { + if (dataGridApiRef.current) { + const { data, setData } = dataGridApiRef.current; + setData(R.map(R.evolve({ status: fn }), data)); + } + }; + + const handleResetWeights = () => { + if (dataGridApiRef.current) { + const { data, setData } = dataGridApiRef.current; + setData(R.map(R.assoc("weight", DEFAULT_WEIGHT), data)); + } + }; + + const handleSubmit = (data: SubmitHandlerPlus) => { + return setPlaylistData({ studyId: study.id, data: data.values }); + }; + + const handleClose = () => { + if (isSubmitting) { + return; + } + + if (isDirty) { + return closeAction.showConfirm().then((confirm) => { + if (confirm) { + onClose(); + } + }); + } + + onClose(); + }; + + const handleFormStateChange = (formState: DataGridFormState) => { + setIsSubmitting(formState.isSubmitting); + setIsDirty(formState.isDirty); + }; + + //////////////////////////////////////////////////////////////// + // JSX + //////////////////////////////////////////////////////////////// + + return ( + + {t("global.close")} + + } + PaperProps={{ sx: { height: 700 } }} + maxWidth="md" + fullWidth + > + ( + <> + + + + + + + + + `MC Year ${index + 1}`, + }} + onSubmit={handleSubmit} + onStateChange={handleFormStateChange} + apiRef={dataGridApiRef} + enableColumnResize={false} + /> + + {t("form.changeNotSaved")} + + + )} + /> + + ); +} + +export default ScenarioPlaylistDialog; diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/index.tsx deleted file mode 100644 index abb04d0a88..0000000000 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/index.tsx +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Copyright (c) 2024, RTE (https://www.rte-france.com) - * - * See AUTHORS.txt - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of the Antares project. - */ - -import { Box, Button, Divider } from "@mui/material"; -import { useRef } from "react"; -import { useTranslation } from "react-i18next"; -import * as R from "ramda"; -import * as RA from "ramda-adjunct"; -import Handsontable from "handsontable"; -import { StudyMetadata } from "../../../../../../../../common/types"; -import usePromise from "../../../../../../../../hooks/usePromise"; -import BasicDialog from "../../../../../../../common/dialogs/BasicDialog"; -import TableForm from "../../../../../../../common/TableForm"; -import UsePromiseCond from "../../../../../../../common/utils/UsePromiseCond"; -import { - DEFAULT_WEIGHT, - getPlaylist, - PlaylistData, - setPlaylist, -} from "./utils"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; -import { - HandsontableProps, - HotTableClass, -} from "../../../../../../../common/Handsontable"; - -interface Props { - study: StudyMetadata; - open: boolean; - onClose: VoidFunction; -} - -function ScenarioPlaylistDialog(props: Props) { - const { study, open, onClose } = props; - const { t } = useTranslation(); - const tableRef = useRef({} as HotTableClass); - const res = usePromise(() => getPlaylist(study.id), [study.id]); - - //////////////////////////////////////////////////////////////// - // Event Handlers - //////////////////////////////////////////////////////////////// - - const handleUpdateStatus = (fn: RA.Pred) => () => { - const api = tableRef.current.hotInstance; - if (!api) { - return; - } - - const changes: Array<[number, string, boolean]> = api - .getDataAtProp("status") - .map((status, index) => [index, "status", fn(status)]); - - api.setDataAtRowProp(changes); - }; - - const handleResetWeights = () => { - const api = tableRef.current.hotInstance as Handsontable; - - api.setDataAtRowProp( - api.rowIndexMapper - .getIndexesSequence() - .map((rowIndex) => [rowIndex, "weight", DEFAULT_WEIGHT]), - ); - }; - - const handleSubmit = (data: SubmitHandlerPlus) => { - return setPlaylist(study.id, data.values); - }; - - const handleCellsRender: HandsontableProps["cells"] = function cells( - this, - row, - column, - prop, - ) { - if (prop === "weight") { - const status = this.instance.getDataAtRowProp(row, "status"); - return { readOnly: !status }; - } - return {}; - }; - - //////////////////////////////////////////////////////////////// - // JSX - //////////////////////////////////////////////////////////////// - - return ( - {t("global.close")}} - // TODO: add `maxHeight` and `fullHeight` in BasicDialog` - PaperProps={{ sx: { height: 500 } }} - maxWidth="sm" - fullWidth - > - ( - <> - - - - - - - - - `MC Year ${row.id}`, - tableRef, - stretchH: "all", - className: "htCenter", - cells: handleCellsRender, - }} - /> - - )} - /> - - ); -} - -export default ScenarioPlaylistDialog; diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/utils.ts b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/utils.ts deleted file mode 100644 index bd7c015df8..0000000000 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ScenarioPlaylistDialog/utils.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2024, RTE (https://www.rte-france.com) - * - * See AUTHORS.txt - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - * - * This file is part of the Antares project. - */ - -import { StudyMetadata } from "../../../../../../../../common/types"; -import client from "../../../../../../../../services/api/client"; - -interface PlaylistColumns extends Record { - status: boolean; - weight: number; -} - -export type PlaylistData = Record; - -export const DEFAULT_WEIGHT = 1; - -function makeRequestURL(studyId: StudyMetadata["id"]): string { - return `v1/studies/${studyId}/config/playlist/form`; -} - -export async function getPlaylist( - studyId: StudyMetadata["id"], -): Promise { - const res = await client.get(makeRequestURL(studyId)); - return res.data; -} - -export function setPlaylist( - studyId: StudyMetadata["id"], - data: PlaylistData, -): Promise { - return client.put(makeRequestURL(studyId), data); -} diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx index c888c774ab..3c04d03707 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx @@ -31,7 +31,7 @@ function TimeSeriesManagement() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const { t } = useTranslation(); const [launchTaskInProgress, setLaunchTaskInProgress] = useState(false); - const apiRef = useRef>(); + const apiRef = useRef>(null); const handleGenerateTs = usePromiseHandler({ fn: generateTimeSeries, diff --git a/webapp/src/components/common/DataGridForm.tsx b/webapp/src/components/common/DataGridForm.tsx index 1ae6c8064c..3e1cde6871 100644 --- a/webapp/src/components/common/DataGridForm.tsx +++ b/webapp/src/components/common/DataGridForm.tsx @@ -12,7 +12,6 @@ * This file is part of the Antares project. */ -import type { IdType } from "@/common/types"; import { GridCellKind, type Item, @@ -21,17 +20,18 @@ import { type FillHandleDirection, } from "@glideapps/glide-data-grid"; import type { DeepPartial } from "react-hook-form"; -import { FormEvent, useCallback, useState } from "react"; -import DataGrid from "./DataGrid"; +import { FormEvent, useCallback, useEffect, useMemo, useState } from "react"; +import DataGrid, { DataGridProps } from "./DataGrid"; import { Box, Divider, IconButton, + setRef, SxProps, Theme, Tooltip, } from "@mui/material"; -import useUndo from "use-undo"; +import useUndo, { type Actions } from "use-undo"; import UndoIcon from "@mui/icons-material/Undo"; import RedoIcon from "@mui/icons-material/Redo"; import SaveIcon from "@mui/icons-material/Save"; @@ -42,53 +42,88 @@ import * as R from "ramda"; import { SubmitHandlerPlus } from "./Form/types"; import useEnqueueErrorSnackbar from "@/hooks/useEnqueueErrorSnackbar"; import useFormCloseProtection from "@/hooks/useCloseFormSecurity"; +import { useUpdateEffect } from "react-use"; +import { toError } from "@/utils/fnUtils"; -type GridFieldValuesByRow = Record< - IdType, - Record ->; +type Data = Record>; + +export interface DataGridFormState { + isDirty: boolean; + isSubmitting: boolean; +} + +export interface DataGridFormApi { + data: TData; + setData: Actions["set"]; + formState: DataGridFormState; +} export interface DataGridFormProps< - TFieldValues extends GridFieldValuesByRow = GridFieldValuesByRow, + TData extends Data = Data, SubmitReturnValue = unknown, > { - defaultData: TFieldValues; - columns: ReadonlyArray; + defaultData: TData; + columns: ReadonlyArray; + rowMarkers?: DataGridProps["rowMarkers"]; allowedFillDirections?: FillHandleDirection; - onSubmit?: ( - data: SubmitHandlerPlus, + enableColumnResize?: boolean; + onSubmit: ( + data: SubmitHandlerPlus, event?: React.BaseSyntheticEvent, ) => void | Promise; onSubmitSuccessful?: ( - data: SubmitHandlerPlus, + data: SubmitHandlerPlus, submitResult: SubmitReturnValue, ) => void; + onStateChange?: (state: DataGridFormState) => void; sx?: SxProps; extraActions?: React.ReactNode; + apiRef?: React.Ref>; } -function DataGridForm({ +function DataGridForm({ defaultData, columns, allowedFillDirections = "vertical", + enableColumnResize, + rowMarkers, onSubmit, onSubmitSuccessful, + onStateChange, sx, extraActions, -}: DataGridFormProps) { + apiRef, +}: DataGridFormProps) { const { t } = useTranslation(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const [isSubmitting, setIsSubmitting] = useState(false); const [savedData, setSavedData] = useState(defaultData); - const [{ present: data }, { set, undo, redo, canUndo, canRedo }] = + const [{ present: data }, { set: setData, undo, redo, canUndo, canRedo }] = useUndo(defaultData); - const isSubmitAllowed = savedData !== data; + // Shallow comparison to check if the data has changed. + // So even if the content are the same, we consider it as dirty. + // Deep comparison fix the issue but with big data it can be slow. + const isDirty = savedData !== data; + + const rowNames = Object.keys(data); + + const formState = useMemo( + () => ({ + isDirty, + isSubmitting, + }), + [isDirty, isSubmitting], + ); + + useFormCloseProtection({ isSubmitting, isDirty }); - useFormCloseProtection({ - isSubmitting, - isDirty: isSubmitAllowed, - }); + useUpdateEffect(() => onStateChange?.(formState), [formState]); + + useEffect( + () => setRef(apiRef, { data, setData, formState }), + [apiRef, data, setData, formState], + ); //////////////////////////////////////////////////////////////// // Utils @@ -96,14 +131,13 @@ function DataGridForm({ const getRowAndColumnNames = (location: Item) => { const [colIndex, rowIndex] = location; - const rowNames = Object.keys(data); const columnIds = columns.map((column) => column.id); return [rowNames[rowIndex], columnIds[colIndex]]; }; const getDirtyValues = () => { - return Object.keys(data).reduce((acc, rowName) => { + return rowNames.reduce((acc, rowName) => { const rowData = data[rowName]; const savedRowData = savedData[rowName]; @@ -125,11 +159,11 @@ function DataGridForm({ } return acc; - }, {} as DeepPartial); + }, {} as DeepPartial); }; //////////////////////////////////////////////////////////////// - // Callbacks + // Content //////////////////////////////////////////////////////////////// const getCellContent = useCallback( @@ -182,7 +216,7 @@ function DataGridForm({ //////////////////////////////////////////////////////////////// const handleCellsEdited: DataEditorProps["onCellsEdited"] = (items) => { - set( + setData( items.reduce((acc, { location, value }) => { const [rowName, columnName] = getRowAndColumnNames(location); const newValue = value.data; @@ -204,13 +238,9 @@ function DataGridForm({ return true; }; - const handleFormSubmit = (event: FormEvent) => { + const handleSubmit = async (event: FormEvent) => { event.preventDefault(); - if (!onSubmit) { - return; - } - setIsSubmitting(true); const dataArg = { @@ -218,17 +248,15 @@ function DataGridForm({ dirtyValues: getDirtyValues(), }; - Promise.resolve(onSubmit(dataArg, event)) - .then((submitRes) => { - setSavedData(data); - onSubmitSuccessful?.(dataArg, submitRes); - }) - .catch((err) => { - enqueueErrorSnackbar(t("form.submit.error"), err); - }) - .finally(() => { - setIsSubmitting(false); - }); + try { + const submitRes = await onSubmit(dataArg, event); + setSavedData(data); + onSubmitSuccessful?.(dataArg, submitRes); + } catch (err) { + enqueueErrorSnackbar(t("form.submit.error"), toError(err)); + } finally { + setIsSubmitting(false); + } }; //////////////////////////////////////////////////////////////// @@ -247,19 +275,22 @@ function DataGridForm({ sx, )} component="form" - onSubmit={handleFormSubmit} + onSubmit={handleSubmit} > Object.keys(data)[index], - }} + rowMarkers={ + rowMarkers || { + kind: "clickable-string", + getTitle: (index) => rowNames[index], + } + } fillHandle allowedFillDirections={allowedFillDirections} + enableColumnResize={enableColumnResize} getCellsForSelection /> ({ ; - apiRef?: React.Ref | undefined>; + apiRef?: React.Ref>; } export function useFormContextPlus() { diff --git a/webapp/src/hooks/useConfirm.ts b/webapp/src/hooks/useConfirm.ts index 4df7890c7f..537674d220 100644 --- a/webapp/src/hooks/useConfirm.ts +++ b/webapp/src/hooks/useConfirm.ts @@ -22,7 +22,35 @@ function errorFunction() { /** * Hook that allows to wait for a confirmation from the user with a `Promise`. * It is intended to be used in conjunction with a confirm view (like `ConfirmationDialog`). - + * + * @example + * ```tsx + * const action = useConfirm(); + * + * return ( + * <> + * + * + * Are you sure? + * + * + * ); + * ``` + * * @returns An object with the following properties: * - `showConfirm`: A function that returns a `Promise` that resolves to `true` if the user confirms, * `false` if the user refuses, and `null` if the user cancel. diff --git a/webapp/src/services/api/studies/config/playlist/constants.ts b/webapp/src/services/api/studies/config/playlist/constants.ts new file mode 100644 index 0000000000..bec0c020cb --- /dev/null +++ b/webapp/src/services/api/studies/config/playlist/constants.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +export const DEFAULT_WEIGHT = 1; diff --git a/webapp/src/services/api/studies/config/playlist/index.ts b/webapp/src/services/api/studies/config/playlist/index.ts new file mode 100644 index 0000000000..40ee7b21c1 --- /dev/null +++ b/webapp/src/services/api/studies/config/playlist/index.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import type { StudyMetadata } from "@/common/types"; +import client from "@/services/api/client"; +import { format } from "@/utils/stringUtils"; +import type { PlaylistData, SetPlaylistDataParams } from "./types"; + +const URL = "/v1/studies/{studyId}/config/playlist/form"; + +export async function getPlaylistData(params: { + studyId: StudyMetadata["id"]; +}) { + const url = format(URL, { studyId: params.studyId }); + const { data } = await client.get(url); + return data; +} + +export async function setPlaylistData({ + studyId, + data, +}: SetPlaylistDataParams) { + const url = format(URL, { studyId }); + await client.put(url, data); +} diff --git a/webapp/src/services/api/studies/config/playlist/types.ts b/webapp/src/services/api/studies/config/playlist/types.ts new file mode 100644 index 0000000000..9eeae5441e --- /dev/null +++ b/webapp/src/services/api/studies/config/playlist/types.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import type { StudyMetadata } from "@/common/types"; + +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +export type Playlist = { + status: boolean; + weight: number; +}; + +export type PlaylistData = Record; + +export interface SetPlaylistDataParams { + studyId: StudyMetadata["id"]; + data: PlaylistData; +} From d14454ab3b5d91dc9136a89fea044485b8305b2e Mon Sep 17 00:00:00 2001 From: Theo Pascoli <48944759+TheoPascoli@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:48:36 +0100 Subject: [PATCH 13/38] =?UTF-8?q?feat:=20add=20an=20endpoint=20to=20allow?= =?UTF-8?q?=20multiple=20deletion=20of=20binding=20constrain=E2=80=A6=20(#?= =?UTF-8?q?2298)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/binding_constraint_management.py | 40 +++++++ .../variantstudy/business/command_reverter.py | 11 ++ .../storage/variantstudy/command_factory.py | 4 + .../model/command/binding_constraint_utils.py | 35 ++++++ .../variantstudy/model/command/common.py | 1 + .../command/create_binding_constraint.py | 22 +--- .../command/remove_binding_constraint.py | 2 +- .../remove_multiple_binding_constraints.py | 111 ++++++++++++++++++ antarest/study/web/study_data_blueprint.py | 19 +++ .../test_binding_constraints.py | 36 ++++++ tests/variantstudy/test_command_factory.py | 10 ++ 11 files changed, 269 insertions(+), 22 deletions(-) create mode 100644 antarest/study/storage/variantstudy/model/command/binding_constraint_utils.py create mode 100644 antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py diff --git a/antarest/study/business/binding_constraint_management.py b/antarest/study/business/binding_constraint_management.py index 1fb5d48a0d..fd3970b9b1 100644 --- a/antarest/study/business/binding_constraint_management.py +++ b/antarest/study/business/binding_constraint_management.py @@ -70,6 +70,9 @@ ) from antarest.study.storage.variantstudy.model.command.icommand import ICommand from antarest.study.storage.variantstudy.model.command.remove_binding_constraint import RemoveBindingConstraint +from antarest.study.storage.variantstudy.model.command.remove_multiple_binding_constraints import ( + RemoveMultipleBindingConstraints, +) from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix from antarest.study.storage.variantstudy.model.command.update_binding_constraint import ( UpdateBindingConstraint, @@ -589,6 +592,18 @@ def terms_to_coeffs(terms: t.Sequence[ConstraintTerm]) -> t.Dict[str, t.List[flo coeffs[term.id].append(term.offset) return coeffs + def check_binding_constraints_exists(self, study: Study, bc_ids: t.List[str]) -> None: + storage_service = self.storage_service.get_storage(study) + file_study = storage_service.get_raw(study) + existing_constraints = file_study.tree.get(["input", "bindingconstraints", "bindingconstraints"]) + + existing_ids = {constraint["id"] for constraint in existing_constraints.values()} + + missing_bc_ids = [bc_id for bc_id in bc_ids if bc_id not in existing_ids] + + if missing_bc_ids: + raise BindingConstraintNotFound(f"Binding constraint(s) '{missing_bc_ids}' not found") + def get_binding_constraint(self, study: Study, bc_id: str) -> ConstraintOutput: """ Retrieves a binding constraint by its ID within a given study. @@ -1018,6 +1033,31 @@ def remove_binding_constraint(self, study: Study, binding_constraint_id: str) -> ) execute_or_add_commands(study, file_study, [command], self.storage_service) + def remove_multiple_binding_constraints(self, study: Study, binding_constraints_ids: t.List[str]) -> None: + """ + Removes multiple binding constraints from a study. + + Args: + study: The study from which to remove the constraint. + binding_constraints_ids: The IDs of the binding constraints to remove. + + Raises: + BindingConstraintNotFound: If at least one binding constraint within the specified list is not found. + """ + + self.check_binding_constraints_exists(study, binding_constraints_ids) + + command_context = self.storage_service.variant_study_service.command_factory.command_context + file_study = self.storage_service.get_storage(study).get_raw(study) + + command = RemoveMultipleBindingConstraints( + ids=binding_constraints_ids, + command_context=command_context, + study_version=file_study.config.version, + ) + + execute_or_add_commands(study, file_study, [command], self.storage_service) + def _update_constraint_with_terms( self, study: Study, bc: ConstraintOutput, terms: t.Mapping[str, ConstraintTerm] ) -> None: diff --git a/antarest/study/storage/variantstudy/business/command_reverter.py b/antarest/study/storage/variantstudy/business/command_reverter.py index d5971dd69e..4b74d2a0ba 100644 --- a/antarest/study/storage/variantstudy/business/command_reverter.py +++ b/antarest/study/storage/variantstudy/business/command_reverter.py @@ -38,6 +38,9 @@ from antarest.study.storage.variantstudy.model.command.remove_cluster import RemoveCluster from antarest.study.storage.variantstudy.model.command.remove_district import RemoveDistrict from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink +from antarest.study.storage.variantstudy.model.command.remove_multiple_binding_constraints import ( + RemoveMultipleBindingConstraints, +) from antarest.study.storage.variantstudy.model.command.remove_renewables_cluster import RemoveRenewablesCluster from antarest.study.storage.variantstudy.model.command.remove_st_storage import RemoveSTStorage from antarest.study.storage.variantstudy.model.command.remove_user_resource import RemoveUserResource @@ -163,6 +166,14 @@ def _revert_remove_binding_constraint( ) -> t.List[ICommand]: raise NotImplementedError("The revert function for RemoveBindingConstraint is not available") + @staticmethod + def _revert_remove_multiple_binding_constraints( + base_command: RemoveMultipleBindingConstraints, + history: t.List["ICommand"], + base: FileStudy, + ) -> t.List[ICommand]: + raise NotImplementedError("The revert function for RemoveMultipleBindingConstraints is not available") + @staticmethod def _revert_update_scenario_builder( base_command: UpdateScenarioBuilder, diff --git a/antarest/study/storage/variantstudy/command_factory.py b/antarest/study/storage/variantstudy/command_factory.py index 9638141643..f20f0ef58d 100644 --- a/antarest/study/storage/variantstudy/command_factory.py +++ b/antarest/study/storage/variantstudy/command_factory.py @@ -37,6 +37,9 @@ from antarest.study.storage.variantstudy.model.command.remove_cluster import RemoveCluster from antarest.study.storage.variantstudy.model.command.remove_district import RemoveDistrict from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink +from antarest.study.storage.variantstudy.model.command.remove_multiple_binding_constraints import ( + RemoveMultipleBindingConstraints, +) from antarest.study.storage.variantstudy.model.command.remove_renewables_cluster import RemoveRenewablesCluster from antarest.study.storage.variantstudy.model.command.remove_st_storage import RemoveSTStorage from antarest.study.storage.variantstudy.model.command.remove_user_resource import RemoveUserResource @@ -63,6 +66,7 @@ CommandName.CREATE_BINDING_CONSTRAINT.value: CreateBindingConstraint, CommandName.UPDATE_BINDING_CONSTRAINT.value: UpdateBindingConstraint, CommandName.REMOVE_BINDING_CONSTRAINT.value: RemoveBindingConstraint, + CommandName.REMOVE_MULTIPLE_BINDING_CONSTRAINTS.value: RemoveMultipleBindingConstraints, CommandName.CREATE_THERMAL_CLUSTER.value: CreateCluster, CommandName.REMOVE_THERMAL_CLUSTER.value: RemoveCluster, CommandName.CREATE_RENEWABLES_CLUSTER.value: CreateRenewablesCluster, diff --git a/antarest/study/storage/variantstudy/model/command/binding_constraint_utils.py b/antarest/study/storage/variantstudy/model/command/binding_constraint_utils.py new file mode 100644 index 0000000000..45d40d5bc5 --- /dev/null +++ b/antarest/study/storage/variantstudy/model/command/binding_constraint_utils.py @@ -0,0 +1,35 @@ +# Copyright (c) 2025, RTE (https://www.rte-france.com) +# +# See AUTHORS.txt +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# SPDX-License-Identifier: MPL-2.0 +# +# This file is part of the Antares project. +import typing as t + +from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy + + +def remove_bc_from_scenario_builder(study_data: FileStudy, removed_groups: t.Set[str]) -> None: + """ + Update the scenario builder by removing the rows that correspond to the BC groups to remove. + + NOTE: this update can be very long if the scenario builder configuration is large. + """ + if not removed_groups: + return + + rulesets = study_data.tree.get(["settings", "scenariobuilder"]) + + for ruleset in rulesets.values(): + for key in list(ruleset): + # The key is in the form "symbol,group,year" + symbol, *parts = key.split(",") + if symbol == "bc" and parts[0] in removed_groups: + del ruleset[key] + + study_data.tree.save(rulesets, ["settings", "scenariobuilder"]) diff --git a/antarest/study/storage/variantstudy/model/command/common.py b/antarest/study/storage/variantstudy/model/command/common.py index 744c87d22c..e91a0e2e58 100644 --- a/antarest/study/storage/variantstudy/model/command/common.py +++ b/antarest/study/storage/variantstudy/model/command/common.py @@ -39,6 +39,7 @@ class CommandName(Enum): CREATE_BINDING_CONSTRAINT = "create_binding_constraint" UPDATE_BINDING_CONSTRAINT = "update_binding_constraint" REMOVE_BINDING_CONSTRAINT = "remove_binding_constraint" + REMOVE_MULTIPLE_BINDING_CONSTRAINTS = "remove_multiple_binding_constraints" CREATE_THERMAL_CLUSTER = "create_cluster" REMOVE_THERMAL_CLUSTER = "remove_cluster" CREATE_RENEWABLES_CLUSTER = "create_renewables_cluster" diff --git a/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py index b76f092086..766934c8ee 100644 --- a/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py @@ -38,6 +38,7 @@ from antarest.study.storage.variantstudy.business.utils_binding_constraint import ( parse_bindings_coeffs_and_save_into_config, ) +from antarest.study.storage.variantstudy.model.command.binding_constraint_utils import remove_bc_from_scenario_builder from antarest.study.storage.variantstudy.model.command.common import CommandName, CommandOutput from antarest.study.storage.variantstudy.model.command.icommand import MATCH_SIGNATURE_SEPARATOR, ICommand from antarest.study.storage.variantstudy.model.command_listener.command_listener import ICommandListener @@ -503,24 +504,3 @@ def match(self, other: "ICommand", equal: bool = False) -> bool: if not equal: return self.name == other.name return super().match(other, equal) - - -def remove_bc_from_scenario_builder(study_data: FileStudy, removed_groups: t.Set[str]) -> None: - """ - Update the scenario builder by removing the rows that correspond to the BC groups to remove. - - NOTE: this update can be very long if the scenario builder configuration is large. - """ - if not removed_groups: - return - - rulesets = study_data.tree.get(["settings", "scenariobuilder"]) - - for ruleset in rulesets.values(): - for key in list(ruleset): - # The key is in the form "symbol,group,year" - symbol, *parts = key.split(",") - if symbol == "bc" and parts[0] in removed_groups: - del ruleset[key] - - study_data.tree.save(rulesets, ["settings", "scenariobuilder"]) diff --git a/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py index b05b51efc4..482ffc5a1b 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py @@ -19,8 +19,8 @@ from antarest.study.storage.rawstudy.model.filesystem.config.binding_constraint import DEFAULT_GROUP from antarest.study.storage.rawstudy.model.filesystem.config.model import FileStudyTreeConfig from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy +from antarest.study.storage.variantstudy.model.command.binding_constraint_utils import remove_bc_from_scenario_builder from antarest.study.storage.variantstudy.model.command.common import CommandName, CommandOutput -from antarest.study.storage.variantstudy.model.command.create_binding_constraint import remove_bc_from_scenario_builder from antarest.study.storage.variantstudy.model.command.icommand import MATCH_SIGNATURE_SEPARATOR, ICommand from antarest.study.storage.variantstudy.model.command_listener.command_listener import ICommandListener from antarest.study.storage.variantstudy.model.model import CommandDTO diff --git a/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py b/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py new file mode 100644 index 0000000000..7747f4945f --- /dev/null +++ b/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py @@ -0,0 +1,111 @@ +# Copyright (c) 2025, RTE (https://www.rte-france.com) +# +# See AUTHORS.txt +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# SPDX-License-Identifier: MPL-2.0 +# +# This file is part of the Antares project. +import typing as t + +from typing_extensions import override + +from antarest.study.model import STUDY_VERSION_8_7 +from antarest.study.storage.rawstudy.model.filesystem.config.binding_constraint import DEFAULT_GROUP +from antarest.study.storage.rawstudy.model.filesystem.config.model import FileStudyTreeConfig +from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy +from antarest.study.storage.variantstudy.model.command.binding_constraint_utils import remove_bc_from_scenario_builder +from antarest.study.storage.variantstudy.model.command.common import CommandName, CommandOutput +from antarest.study.storage.variantstudy.model.command.icommand import MATCH_SIGNATURE_SEPARATOR, ICommand, OutputTuple +from antarest.study.storage.variantstudy.model.command_listener.command_listener import ICommandListener +from antarest.study.storage.variantstudy.model.model import CommandDTO + + +class RemoveMultipleBindingConstraints(ICommand): + """ + Command used to remove multiple binding constraints at once. + """ + + command_name: CommandName = CommandName.REMOVE_MULTIPLE_BINDING_CONSTRAINTS + version: int = 1 + + # Properties of the `REMOVE_MULTIPLE_BINDING_CONSTRAINTS` command: + ids: t.List[str] + + @override + def _apply_config(self, study_data: FileStudyTreeConfig) -> OutputTuple: + # If at least one bc is missing in the database, we raise an error + already_existing_ids = {binding.id for binding in study_data.bindings} + missing_bc_ids = [id_ for id_ in self.ids if id_ not in already_existing_ids] + if missing_bc_ids: + return CommandOutput(status=False, message=f"Binding constraint not found: '{missing_bc_ids}'"), {} + return CommandOutput(status=True), {} + + @override + def _apply(self, study_data: FileStudy, listener: t.Optional[ICommandListener] = None) -> CommandOutput: + command_output, _ = self._apply_config(study_data.config) + + if not command_output.status: + return command_output + + binding_constraints = study_data.tree.get(["input", "bindingconstraints", "bindingconstraints"]) + + old_groups = {bd.get("group", DEFAULT_GROUP).lower() for bd in binding_constraints.values()} + + deleted_binding_constraints = [] + + for key in list(binding_constraints.keys()): + if binding_constraints[key].get("id") in self.ids: + deleted_binding_constraints.append(binding_constraints.pop(key)) + + study_data.tree.save( + binding_constraints, + ["input", "bindingconstraints", "bindingconstraints"], + ) + + existing_files = study_data.tree.get(["input", "bindingconstraints"], depth=1) + for bc in deleted_binding_constraints: + if study_data.config.version < STUDY_VERSION_8_7: + study_data.tree.delete(["input", "bindingconstraints", bc.get("id")]) + else: + for term in ["lt", "gt", "eq"]: + matrix_id = f"{bc.get('id')}_{term}" + if matrix_id in existing_files: + study_data.tree.delete(["input", "bindingconstraints", matrix_id]) + + new_groups = {bd.get("group", DEFAULT_GROUP).lower() for bd in binding_constraints.values()} + removed_groups = old_groups - new_groups + remove_bc_from_scenario_builder(study_data, removed_groups) + + return command_output + + @override + def to_dto(self) -> CommandDTO: + return CommandDTO( + action=CommandName.REMOVE_MULTIPLE_BINDING_CONSTRAINTS.value, + args={ + "ids": self.ids, + }, + study_version=self.study_version, + ) + + @override + def match_signature(self) -> str: + return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + ",".join(self.ids)) + + @override + def match(self, other: ICommand, equal: bool = False) -> bool: + if not isinstance(other, RemoveMultipleBindingConstraints): + return False + return self.ids == other.ids + + @override + def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: + return [] + + @override + def get_inner_matrices(self) -> t.List[str]: + return [] diff --git a/antarest/study/web/study_data_blueprint.py b/antarest/study/web/study_data_blueprint.py index 9be21c1743..95659ecd7f 100644 --- a/antarest/study/web/study_data_blueprint.py +++ b/antarest/study/web/study_data_blueprint.py @@ -1378,6 +1378,25 @@ def delete_binding_constraint( study = study_service.check_study_access(uuid, StudyPermissionType.WRITE, params) return study_service.binding_constraint_manager.remove_binding_constraint(study, binding_constraint_id) + @bp.delete( + "/studies/{uuid}/bindingconstraints", + tags=[APITag.study_data], + summary="Delete multiple binding constraints", + response_model=None, + ) + def delete_multiple_binding_constraints( + uuid: str, binding_constraints_ids: t.List[str], current_user: JWTUser = Depends(auth.get_current_user) + ) -> None: + logger.info( + f"Deleting the binding constraints {binding_constraints_ids!r} for study {uuid}", + extra={"user": current_user.id}, + ) + params = RequestParameters(user=current_user) + study = study_service.check_study_access(uuid, StudyPermissionType.WRITE, params) + return study_service.binding_constraint_manager.remove_multiple_binding_constraints( + study, binding_constraints_ids + ) + @bp.post( "/studies/{uuid}/bindingconstraints/{binding_constraint_id}/term", tags=[APITag.study_data], diff --git a/tests/integration/study_data_blueprint/test_binding_constraints.py b/tests/integration/study_data_blueprint/test_binding_constraints.py index 408cef124d..84b27ded12 100644 --- a/tests/integration/study_data_blueprint/test_binding_constraints.py +++ b/tests/integration/study_data_blueprint/test_binding_constraints.py @@ -972,6 +972,26 @@ def test_for_version_870(self, client: TestClient, user_access_token: str, study binding_constraints_list = preparer.get_binding_constraints(study_id) assert len(binding_constraints_list) == 2 + # Delete multiple binding constraint + preparer.create_binding_constraint(study_id, name="bc1", group="grp1", **args) + preparer.create_binding_constraint(study_id, name="bc2", group="grp2", **args) + + binding_constraints_list = preparer.get_binding_constraints(study_id) + assert len(binding_constraints_list) == 4 + + res = client.request( + "DELETE", + f"/v1/studies/{study_id}/bindingconstraints", + json=["bc1", "bc2"], + ) + assert res.status_code == 200, res.json() + + # Asserts that the deletion worked + binding_constraints_list = preparer.get_binding_constraints(study_id) + assert len(binding_constraints_list) == 2 + actual_ids = [constraint["id"] for constraint in binding_constraints_list] + assert actual_ids == ["binding_constraint_1", "binding_constraint_3"] + # ============================= # CONSTRAINT DUPLICATION # ============================= @@ -1015,6 +1035,22 @@ def test_for_version_870(self, client: TestClient, user_access_token: str, study # ERRORS # ============================= + # Deletion multiple binding constraints, one does not exist. Make sure none is deleted + + binding_constraints_list = preparer.get_binding_constraints(study_id) + assert len(binding_constraints_list) == 3 + + res = client.request( + "DELETE", + f"/v1/studies/{study_id}/bindingconstraints", + json=["binding_constraint_1", "binding_constraint_2", "binding_constraint_3"], + ) + assert res.status_code == 404, res.json() + assert res.json()["description"] == "Binding constraint(s) '['binding_constraint_2']' not found" + + binding_constraints_list = preparer.get_binding_constraints(study_id) + assert len(binding_constraints_list) == 3 + # Creation with wrong matrix according to version for operator in ["less", "equal", "greater", "both"]: args["operator"] = operator diff --git a/tests/variantstudy/test_command_factory.py b/tests/variantstudy/test_command_factory.py index c4406b50da..a2c392785a 100644 --- a/tests/variantstudy/test_command_factory.py +++ b/tests/variantstudy/test_command_factory.py @@ -159,6 +159,16 @@ CommandDTO( action=CommandName.REMOVE_BINDING_CONSTRAINT.value, args=[{"id": "id"}], study_version=STUDY_VERSION_8_8 ), + CommandDTO( + action=CommandName.REMOVE_MULTIPLE_BINDING_CONSTRAINTS.value, + args={"ids": ["id"]}, + study_version=STUDY_VERSION_8_8, + ), + CommandDTO( + action=CommandName.REMOVE_MULTIPLE_BINDING_CONSTRAINTS.value, + args=[{"ids": ["id"]}], + study_version=STUDY_VERSION_8_8, + ), CommandDTO( action=CommandName.CREATE_THERMAL_CLUSTER.value, args={ From f0f93036243c3e6ba7535bf0b81e002f081bf10e Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:23:30 +0100 Subject: [PATCH 14/38] chore(ui): update Node version, ESLint and Prettier (#2294) ANT-2231 --- .github/workflows/deploy.yml | 2 +- .github/workflows/main.yml | 8 +- docs/CHANGELOG.md | 2 +- docs/developer-guide/install/0-INSTALL.md | 2 +- webapp/.eslintrc.cjs | 89 - webapp/.nvmrc | 2 +- webapp/.prettierrc.json | 3 +- webapp/eslint.config.js | 130 + webapp/package-lock.json | 7009 +++++++++-------- webapp/package.json | 25 +- webapp/src/components/App/Api.tsx | 4 +- .../src/components/App/Data/DataListing.tsx | 10 +- .../src/components/App/Data/DataPropsView.tsx | 6 +- .../App/Data/DatasetCreationDialog.tsx | 44 +- .../src/components/App/Data/MatrixDialog.tsx | 2 +- webapp/src/components/App/Data/index.tsx | 34 +- webapp/src/components/App/Data/utils.tsx | 24 +- .../components/App/Settings/Groups/Header.tsx | 2 +- .../Groups/dialog/CreateGroupDialog.tsx | 38 +- .../dialog/GroupFormDialog/GroupForm.tsx | 35 +- .../Groups/dialog/GroupFormDialog/index.tsx | 9 +- .../Groups/dialog/UpdateGroupDialog.tsx | 28 +- .../components/App/Settings/Groups/index.tsx | 24 +- .../App/Settings/Maintenance/index.tsx | 11 +- .../components/App/Settings/Tokens/Header.tsx | 2 +- .../Tokens/dialog/CreateTokenDialog.tsx | 39 +- .../dialog/TokenFormDialog/TokenForm.tsx | 30 +- .../Tokens/dialog/TokenFormDialog/index.tsx | 11 +- .../Tokens/dialog/TokenInfoDialog.tsx | 10 +- .../components/App/Settings/Tokens/index.tsx | 67 +- .../components/App/Settings/Users/Header.tsx | 2 +- .../Users/dialog/CreateUserDialog.tsx | 29 +- .../Users/dialog/UpdateUserDialog.tsx | 40 +- .../Users/dialog/UserFormDialog/UserForm.tsx | 30 +- .../Users/dialog/UserFormDialog/index.tsx | 6 +- .../components/App/Settings/Users/index.tsx | 18 +- webapp/src/components/App/Settings/index.tsx | 12 +- webapp/src/components/App/Settings/utils.ts | 6 +- .../DraggableCommands/CommandImportButton.tsx | 8 +- .../CommandListItem/CommandDetails.tsx | 17 +- .../CommandListItem/CommandMatrixViewer.tsx | 6 +- .../CommandListItem/index.tsx | 46 +- .../DraggableCommands/CommandListView.tsx | 6 +- .../Commands/Edition/commandTypes.ts | 2 +- .../Singlestudy/Commands/Edition/index.tsx | 44 +- .../App/Singlestudy/Commands/Edition/utils.ts | 24 +- .../App/Singlestudy/Commands/index.tsx | 7 +- .../App/Singlestudy/FreezeStudy.tsx | 30 +- .../InformationView/CreateVariantDialog.tsx | 12 +- .../LauncherHistory/JobStepper.tsx | 30 +- .../InformationView/LauncherHistory/index.tsx | 47 +- .../InformationView/LauncherHistory/style.ts | 7 +- .../InformationView/Notes/DetailsList.tsx | 2 +- .../Notes/NodeEditorModal/index.tsx | 33 +- .../HomeView/InformationView/Notes/index.tsx | 36 +- .../HomeView/InformationView/Notes/utils.ts | 75 +- .../HomeView/InformationView/index.tsx | 30 +- .../HomeView/StudyTreeView/index.tsx | 32 +- .../HomeView/StudyTreeView/utils.ts | 11 +- .../App/Singlestudy/HomeView/index.tsx | 2 +- .../App/Singlestudy/NavHeader/Actions.tsx | 25 +- .../App/Singlestudy/NavHeader/ActionsMenu.tsx | 6 +- .../App/Singlestudy/NavHeader/Details.tsx | 6 +- .../App/Singlestudy/NavHeader/index.tsx | 10 +- .../App/Singlestudy/PropertiesDialog.tsx | 18 +- .../App/Singlestudy/UpgradeDialog.tsx | 8 +- .../Configuration/AdequacyPatch/Fields.tsx | 34 +- .../Configuration/AdequacyPatch/index.tsx | 18 +- .../Configuration/AdequacyPatch/utils.ts | 2 +- .../AdvancedParameters/Fields.tsx | 84 +- .../AdvancedParameters/index.tsx | 10 +- .../Configuration/AdvancedParameters/utils.ts | 24 +- .../explore/Configuration/General/Fields.tsx | 44 +- .../dialogs/ScenarioBuilderDialog/Table.tsx | 14 +- .../dialogs/ScenarioBuilderDialog/index.tsx | 32 +- .../dialogs/ScenarioBuilderDialog/utils.ts | 23 +- .../ScenarioBuilderDialog/withAreas.tsx | 47 +- .../dialogs/ScenarioPlaylistDialog.tsx | 30 +- .../dialogs/ThematicTrimmingDialog/index.tsx | 44 +- .../dialogs/ThematicTrimmingDialog/utils.ts | 4 +- .../explore/Configuration/General/index.tsx | 32 +- .../explore/Configuration/General/utils.ts | 14 +- .../Configuration/Optimization/Fields.tsx | 16 +- .../Configuration/Optimization/index.tsx | 10 +- .../Configuration/Optimization/utils.ts | 23 +- .../TimeSeriesManagement/Fields.tsx | 25 +- .../TimeSeriesManagement/index.tsx | 7 +- .../TimeSeriesManagement/utils.ts | 4 +- .../explore/Configuration/index.tsx | 2 +- .../Singlestudy/explore/Debug/Data/Folder.tsx | 16 +- .../Singlestudy/explore/Debug/Data/Json.tsx | 13 +- .../Singlestudy/explore/Debug/Data/Text.tsx | 13 +- .../Singlestudy/explore/Debug/Data/index.tsx | 5 +- .../explore/Debug/Tree/FileTreeItem.tsx | 2 +- .../Singlestudy/explore/Debug/Tree/index.tsx | 12 +- .../App/Singlestudy/explore/Debug/index.tsx | 13 +- .../App/Singlestudy/explore/Debug/utils.ts | 41 +- .../Modelization/Areas/AreaPropsView.tsx | 6 +- .../explore/Modelization/Areas/AreasTab.tsx | 6 +- .../Hydro/Allocation/AllocationField.tsx | 4 +- .../Areas/Hydro/Allocation/Fields.tsx | 4 +- .../Areas/Hydro/Allocation/index.tsx | 9 +- .../Areas/Hydro/Allocation/utils.ts | 19 +- .../Hydro/Correlation/CorrelationField.tsx | 4 +- .../Areas/Hydro/Correlation/Fields.tsx | 9 +- .../Areas/Hydro/Correlation/index.tsx | 6 +- .../Areas/Hydro/Correlation/utils.ts | 19 +- .../Modelization/Areas/Hydro/HydroMatrix.tsx | 2 +- .../Areas/Hydro/HydroMatrixDialog.tsx | 16 +- .../Areas/Hydro/InflowStructure/index.tsx | 4 +- .../Areas/Hydro/ManagementOptions/Fields.tsx | 35 +- .../Areas/Hydro/ManagementOptions/index.tsx | 6 +- .../Areas/Hydro/ManagementOptions/utils.ts | 11 +- .../Areas/Hydro/SplitHydroMatrix.tsx | 10 +- .../Areas/Hydro/ViewMatrixButton.tsx | 7 +- .../Areas/Hydro/hooks/useAreasOptions.ts | 10 +- .../Modelization/Areas/Hydro/index.tsx | 10 +- .../explore/Modelization/Areas/Hydro/style.ts | 3 +- .../explore/Modelization/Areas/Hydro/utils.ts | 15 +- .../explore/Modelization/Areas/MiscGen.tsx | 4 +- .../Modelization/Areas/Properties/Fields.tsx | 4 +- .../Modelization/Areas/Properties/index.tsx | 6 +- .../Modelization/Areas/Properties/utils.ts | 9 +- .../Modelization/Areas/Renewables/Fields.tsx | 13 +- .../Modelization/Areas/Renewables/Form.tsx | 14 +- .../Modelization/Areas/Renewables/Matrix.tsx | 2 +- .../Modelization/Areas/Renewables/index.tsx | 85 +- .../Modelization/Areas/Renewables/utils.ts | 43 +- .../explore/Modelization/Areas/Reserve.tsx | 11 +- .../Modelization/Areas/Storages/Fields.tsx | 15 +- .../Modelization/Areas/Storages/Form.tsx | 12 +- .../Modelization/Areas/Storages/Matrix.tsx | 16 +- .../Modelization/Areas/Storages/index.tsx | 37 +- .../Modelization/Areas/Storages/utils.ts | 22 +- .../Modelization/Areas/Thermal/Fields.tsx | 14 +- .../Modelization/Areas/Thermal/Form.tsx | 16 +- .../Modelization/Areas/Thermal/Matrix.tsx | 7 +- .../Modelization/Areas/Thermal/index.tsx | 85 +- .../Modelization/Areas/Thermal/utils.ts | 44 +- .../Areas/common/clustersUtils.ts | 11 +- .../explore/Modelization/Areas/index.tsx | 17 +- .../BindingConstraints/AddDialog.tsx | 26 +- .../BindingConstPropsView.tsx | 14 +- .../AddConstraintTermForm/OptionsList.tsx | 15 +- .../AddConstraintTermForm/index.tsx | 13 +- .../AddConstraintTermDialog/index.tsx | 31 +- .../BindingConstView/BindingConstForm.tsx | 41 +- .../BindingConstView/ConstraintFields.tsx | 19 +- .../ConstraintTerm/OptionsList.tsx | 34 +- .../BindingConstView/ConstraintTerm/index.tsx | 25 +- .../BindingConstView/Matrix.tsx | 20 +- .../constraintviews/ConstraintElement.tsx | 13 +- .../constraintviews/OffsetInput.tsx | 3 +- .../BindingConstView/constraintviews/style.ts | 3 +- .../BindingConstView/index.tsx | 23 +- .../BindingConstView/utils.ts | 22 +- .../Modelization/BindingConstraints/index.tsx | 11 +- .../Modelization/Links/LinkPropsView.tsx | 10 +- .../Modelization/Links/LinkView/LinkForm.tsx | 22 +- .../Links/LinkView/LinkMatrixView.tsx | 18 +- .../Modelization/Links/LinkView/index.tsx | 2 +- .../Modelization/Links/LinkView/utils.ts | 4 +- .../explore/Modelization/Links/index.tsx | 11 +- .../Modelization/Map/Areas/AreaConfig.tsx | 6 +- .../Modelization/Map/Areas/AreaLink.tsx | 7 +- .../Modelization/Map/Areas/AreaLinks.tsx | 22 +- .../Map/Areas/DeleteAreaDialog.tsx | 31 +- .../explore/Modelization/Map/Areas/index.tsx | 23 +- .../Modelization/Map/CreateAreaDialog.tsx | 5 +- .../Districts/CreateDistrictDialog.tsx | 7 +- .../Districts/UpdateDistrictDialog.tsx | 25 +- .../Map/MapConfig/Districts/index.tsx | 33 +- .../MapConfig/Layers/CreateLayerDialog.tsx | 13 +- .../MapConfig/Layers/UpdateLayerDialog.tsx | 15 +- .../Map/MapConfig/Layers/index.tsx | 20 +- .../Modelization/Map/MapConfig/index.tsx | 10 +- .../Modelization/Map/MapControlButtons.tsx | 7 +- .../explore/Modelization/Map/MapGraph.tsx | 35 +- .../explore/Modelization/Map/MapHeader.tsx | 20 +- .../explore/Modelization/Map/Node.tsx | 2 +- .../explore/Modelization/Map/index.tsx | 25 +- .../explore/Modelization/Map/style.ts | 54 +- .../explore/Modelization/Map/utils.ts | 22 +- .../explore/Modelization/index.tsx | 8 +- .../Results/ResultDetails/ResultFilters.tsx | 30 +- .../explore/Results/ResultDetails/index.tsx | 81 +- .../explore/Results/ResultDetails/utils.ts | 6 +- .../App/Singlestudy/explore/Results/index.tsx | 58 +- .../App/Singlestudy/explore/TabWrapper.tsx | 40 +- .../dialogs/CreateTemplateTableDialog.tsx | 12 +- .../dialogs/TableTemplateFormDialog.tsx | 14 +- .../dialogs/UpdateTemplateTableDialog.tsx | 13 +- .../explore/TableModeList/index.tsx | 26 +- .../explore/TableModeList/utils.ts | 2 +- .../Xpansion/Candidates/CandidateForm.tsx | 113 +- .../Candidates/CreateCandidateDialog.tsx | 31 +- .../Xpansion/Candidates/XpansionPropsView.tsx | 20 +- .../explore/Xpansion/Candidates/index.tsx | 80 +- .../Singlestudy/explore/Xpansion/FileList.tsx | 25 +- .../Xpansion/Settings/SettingsForm.tsx | 66 +- .../explore/Xpansion/Settings/index.tsx | 11 +- .../Singlestudy/explore/Xpansion/index.tsx | 30 +- .../explore/common/ListElement.tsx | 17 +- .../explore/common/OutputFilters.tsx | 10 +- .../App/Singlestudy/explore/common/types.ts | 7 +- .../src/components/App/Singlestudy/index.tsx | 18 +- .../components/App/Studies/BatchModeMenu.tsx | 13 +- .../App/Studies/CreateStudyDialog.tsx | 11 +- .../Filter/MultipleLinkElement/index.tsx | 13 +- .../ExportModal/ExportFilter/Filter/index.tsx | 20 +- .../ExportModal/ExportFilter/index.tsx | 36 +- .../App/Studies/ExportModal/index.tsx | 45 +- .../components/App/Studies/FilterDrawer.tsx | 25 +- .../components/App/Studies/HeaderBottom.tsx | 9 +- .../components/App/Studies/HeaderTopRight.tsx | 10 +- .../components/App/Studies/LauncherDialog.tsx | 62 +- .../App/Studies/MoveStudyDialog.tsx | 15 +- webapp/src/components/App/Studies/SideNav.tsx | 4 +- .../App/Studies/StudiesList/StudyCardCell.tsx | 9 +- .../App/Studies/StudiesList/index.tsx | 38 +- .../App/Studies/StudyCard/ActionsMenu.tsx | 59 +- .../App/Studies/StudyCard/index.tsx | 38 +- .../App/Studies/StudyTree/StudyTreeNode.tsx | 14 +- .../Studies/StudyTree/__test__/fixtures.ts | 6 +- .../Studies/StudyTree/__test__/utils.test.ts | 30 +- .../App/Studies/StudyTree/index.tsx | 24 +- .../components/App/Studies/StudyTree/utils.ts | 57 +- webapp/src/components/App/Studies/index.tsx | 9 +- .../src/components/App/Tasks/JobTableView.tsx | 28 +- .../components/App/Tasks/LaunchJobLogView.tsx | 17 +- .../App/Tasks/NotificationBadge.tsx | 13 +- webapp/src/components/App/Tasks/index.tsx | 163 +- webapp/src/components/App/index.tsx | 78 +- webapp/src/components/common/DataGrid.tsx | 88 +- webapp/src/components/common/DataGridForm.tsx | 52 +- webapp/src/components/common/DocLink.tsx | 13 +- webapp/src/components/common/DownloadLink.tsx | 3 +- .../common/DynamicDataTable/TableRowGroup.tsx | 26 +- .../common/DynamicDataTable/TableRowItem.tsx | 32 +- .../common/DynamicDataTable/TableToolbar.tsx | 14 +- .../common/DynamicDataTable/index.tsx | 43 +- .../common/DynamicDataTable/utils.ts | 17 +- webapp/src/components/common/DynamicList.tsx | 4 +- webapp/src/components/common/Fieldset.tsx | 17 +- webapp/src/components/common/FileTable.tsx | 30 +- webapp/src/components/common/Form/index.tsx | 79 +- webapp/src/components/common/Form/types.ts | 28 +- .../components/common/Form/useFormApiPlus.ts | 42 +- .../components/common/Form/useFormUndoRedo.ts | 14 +- webapp/src/components/common/Form/utils.ts | 6 +- .../common/GroupedDataTable/CreateDialog.tsx | 17 +- .../GroupedDataTable/DuplicateDialog.tsx | 9 +- .../common/GroupedDataTable/index.tsx | 40 +- .../common/GroupedDataTable/utils.ts | 17 +- webapp/src/components/common/Handsontable.tsx | 63 +- .../components/common/JSONEditor/index.tsx | 21 +- .../common/LinearProgressWithLabel.tsx | 16 +- webapp/src/components/common/LogModal.tsx | 29 +- .../MatrixActions/MatrixActions.test.tsx | 2 +- .../Matrix/components/MatrixActions/index.tsx | 37 +- .../components/MatrixGrid/MatrixGrid.test.tsx | 24 +- .../common/Matrix/components/MatrixUpload.tsx | 11 +- .../useColumnMapping/__tests__/fixtures.ts | 5 +- .../__tests__/useColumnMapping.test.ts | 9 +- .../hooks/useColumnMapping/__tests__/utils.ts | 8 +- .../Matrix/hooks/useColumnMapping/index.ts | 9 +- .../__tests__/assertions.ts | 14 +- .../__tests__/useGridCellContent.test.ts | 31 +- .../useGridCellContent/__tests__/utils.ts | 12 +- .../Matrix/hooks/useGridCellContent/index.ts | 39 +- .../Matrix/hooks/useGridCellContent/types.ts | 2 +- .../common/Matrix/hooks/useMatrix/index.ts | 57 +- .../Matrix/hooks/useMatrix/useMatrix.test.tsx | 22 +- webapp/src/components/common/Matrix/index.tsx | 14 +- .../Matrix/shared/__tests__/fixtures.ts | 8 +- .../Matrix/shared/__tests__/utils.test.ts | 63 +- .../common/Matrix/shared/constants.ts | 11 +- .../components/common/Matrix/shared/types.ts | 11 +- .../components/common/Matrix/shared/utils.ts | 46 +- webapp/src/components/common/Matrix/styles.ts | 2 +- .../src/components/common/PropertiesView.tsx | 17 +- webapp/src/components/common/SelectMulti.tsx | 20 +- webapp/src/components/common/SelectSingle.tsx | 19 +- .../components/common/SnackErrorMessage.tsx | 143 +- .../src/components/common/SplitLayoutView.tsx | 13 +- .../src/components/common/SplitView/index.tsx | 2 +- webapp/src/components/common/StarToggle.tsx | 10 +- .../src/components/common/TableForm/Table.tsx | 55 +- .../src/components/common/TableForm/index.tsx | 28 +- webapp/src/components/common/TableMode.tsx | 17 +- webapp/src/components/common/TabsView.tsx | 8 +- .../src/components/common/TextSeparator.tsx | 2 +- .../components/common/TreeItemEnhanced.tsx | 6 +- .../common/buttons/DownloadButton.tsx | 19 +- .../common/buttons/DownloadMatrixButton.tsx | 13 +- .../components/common/buttons/SplitButton.tsx | 2 +- .../common/buttons/UploadFileButton.tsx | 4 +- .../components/common/dialogs/BasicDialog.tsx | 27 +- .../common/dialogs/ConfirmationDialog.tsx | 23 +- .../common/dialogs/DataViewerDialog/index.tsx | 18 +- .../components/MatrixContent.tsx | 15 +- .../dialogs/DatabaseUploadDialog/index.tsx | 14 +- .../common/dialogs/DigestDialog.tsx | 21 +- .../components/common/dialogs/FormDialog.tsx | 36 +- .../components/common/dialogs/OkDialog.tsx | 11 +- .../common/dialogs/UploadDialog.tsx | 27 +- .../common/fieldEditors/BooleanFE.tsx | 18 +- .../common/fieldEditors/CheckBoxFE.tsx | 18 +- .../common/fieldEditors/CheckboxesTagsFE.tsx | 15 +- .../fieldEditors/ColorPickerFE/index.tsx | 20 +- .../fieldEditors/ColorPickerFE/utils.ts | 8 +- .../common/fieldEditors/ListFE/index.tsx | 52 +- .../common/fieldEditors/ListFE/utils.ts | 4 +- .../common/fieldEditors/NumberFE.tsx | 2 +- .../common/fieldEditors/PasswordFE.tsx | 2 +- .../common/fieldEditors/RadioFE.tsx | 15 +- .../common/fieldEditors/SearchFE.tsx | 13 +- .../common/fieldEditors/SelectFE.tsx | 10 +- .../common/fieldEditors/StringFE.tsx | 2 +- .../common/fieldEditors/SwitchFE.tsx | 14 +- .../components/common/loaders/AppLoader.tsx | 11 +- .../common/loaders/GlobalPageLoadingError.tsx | 18 +- .../common/loaders/SimpleLoader.tsx | 7 +- .../src/components/common/page/BasicPage.tsx | 5 +- .../src/components/common/page/EmptyView.tsx | 8 +- .../src/components/common/page/RootPage.tsx | 11 +- .../common/utils/UsePromiseCond.tsx | 17 +- .../src/components/common/utils/constants.ts | 2 +- .../src/components/wrappers/LoginWrapper.tsx | 15 +- .../MaintenanceWrapper/MessageInfoDialog.tsx | 7 +- .../wrappers/MaintenanceWrapper/index.tsx | 4 +- .../components/wrappers/MenuWrapper/index.tsx | 42 +- .../components/wrappers/MenuWrapper/styles.ts | 6 +- webapp/src/hoc/reactHookFormSupport.tsx | 64 +- webapp/src/hooks/useBlocker.ts | 2 +- webapp/src/hooks/useCloseFormSecurity.ts | 5 +- webapp/src/hooks/useDebounce.ts | 10 +- webapp/src/hooks/useDebouncedEffect.ts | 17 +- webapp/src/hooks/useDebouncedState.ts | 8 +- webapp/src/hooks/useEnqueueErrorSnackbar.tsx | 8 +- webapp/src/hooks/useNavigateOnCondition.ts | 4 +- .../src/hooks/useOperationInProgressCount.ts | 4 +- webapp/src/hooks/usePromise.ts | 8 +- webapp/src/hooks/usePromiseHandler.ts | 7 +- .../src/hooks/usePromiseWithSnackbarError.ts | 2 +- webapp/src/hooks/useUpdateEffectOnce.ts | 2 +- webapp/src/i18n.ts | 4 +- webapp/src/index.tsx | 2 +- .../components/UseAsyncAppSelectorCond.tsx | 11 +- webapp/src/redux/ducks/auth.ts | 76 +- webapp/src/redux/ducks/groups.ts | 25 +- webapp/src/redux/ducks/index.ts | 4 +- webapp/src/redux/ducks/studies.ts | 145 +- webapp/src/redux/ducks/studyMaps.ts | 223 +- webapp/src/redux/ducks/studySyntheses.ts | 53 +- webapp/src/redux/ducks/ui.ts | 22 +- webapp/src/redux/ducks/users.ts | 25 +- webapp/src/redux/hooks/useAppDispatch.ts | 2 +- webapp/src/redux/hooks/useAppSelector.ts | 4 +- webapp/src/redux/hooks/useAsyncAppSelector.ts | 8 +- webapp/src/redux/hooks/useStudyMaps.ts | 22 +- webapp/src/redux/hooks/useStudySynthesis.ts | 14 +- .../middlewares/localStorageMiddleware.ts | 4 +- webapp/src/redux/selectors.ts | 192 +- webapp/src/redux/store.ts | 6 +- webapp/src/redux/utils.ts | 23 +- webapp/src/services/api/auth.ts | 9 +- webapp/src/services/api/client.ts | 9 +- webapp/src/services/api/downloads.ts | 7 +- webapp/src/services/api/launcher.ts | 4 +- webapp/src/services/api/matrix.ts | 31 +- .../api/studies/config/playlist/index.ts | 9 +- .../studies/config/thematicTrimming/index.ts | 4 +- .../studies/config/thematicTrimming/types.ts | 2 +- .../src/services/api/studies/links/index.ts | 11 +- .../src/services/api/studies/links/types.ts | 11 +- webapp/src/services/api/studies/raw/index.ts | 24 +- webapp/src/services/api/studies/raw/types.ts | 4 +- .../services/api/studies/tableMode/index.ts | 11 +- .../services/api/studies/tableMode/types.ts | 9 +- webapp/src/services/api/studies/timeseries.ts | 10 +- webapp/src/services/api/study.ts | 144 +- webapp/src/services/api/studydata.ts | 48 +- webapp/src/services/api/tasks/types.ts | 4 +- webapp/src/services/api/user.ts | 29 +- webapp/src/services/api/variant.ts | 81 +- webapp/src/services/api/xpansion.ts | 146 +- webapp/src/services/config.ts | 17 +- webapp/src/services/utils/index.ts | 64 +- webapp/src/services/utils/localStorage.ts | 10 +- webapp/src/services/webSocket/constants.ts | 3 +- webapp/src/services/webSocket/types.ts | 8 +- webapp/src/services/webSocket/ws.ts | 31 +- .../src/tests/mocks/mockHTMLCanvasElement.ts | 4 +- webapp/src/theme.ts | 1 - webapp/src/utils/feUtils.ts | 10 +- webapp/src/utils/i18nUtils.ts | 4 +- webapp/src/utils/muiUtils.ts | 2 +- webapp/src/utils/reactUtils.ts | 12 +- webapp/src/utils/stringUtils.ts | 14 +- webapp/src/utils/studiesUtils.ts | 131 +- webapp/src/utils/tsUtils.ts | 2 +- .../utils/validation/__tests__/array.test.ts | 12 +- .../utils/validation/__tests__/number.test.ts | 40 +- .../utils/validation/__tests__/string.test.ts | 44 +- webapp/src/utils/validation/array.ts | 7 +- webapp/src/utils/validation/number.ts | 13 +- webapp/src/utils/validation/string.ts | 25 +- webapp/tsconfig.json | 5 +- 409 files changed, 6817 insertions(+), 9439 deletions(-) delete mode 100644 webapp/.eslintrc.cjs create mode 100644 webapp/eslint.config.js diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1338b744f4..2b67b599d4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -27,7 +27,7 @@ jobs: - name: 💚 Set up Node.js uses: actions/setup-node@v4 with: - node-version: 18.16.1 + node-version: 22.13.0 - name: 💚 Install dependencies run: npm install diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c0f87cc216..a5207a3d20 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -69,7 +69,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 18.16.1 + node-version: 22.13.0 - name: Cache node modules uses: actions/cache@v4 with: @@ -92,7 +92,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 18.16.1 + node-version: 22.13.0 - name: Restore node modules uses: actions/cache@v4 with: @@ -112,7 +112,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 18.16.1 + node-version: 22.13.0 - name: Restore node modules uses: actions/cache@v4 with: @@ -132,7 +132,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 18.16.1 + node-version: 22.13.0 - name: Restore node modules uses: actions/cache@v4 with: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 959376e0d5..dd0f10a9f5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1096,7 +1096,7 @@ v2.15.0 (2023-09-30) ### Chore -* **github-actions:** update Node.js version to 18.16.1 [`b9988f6`](https://github.com/AntaresSimulatorTeam/AntaREST/commit/b9988f6dedc5a653de00bf5becc917487ce589e6) +* **github-actions:** update Node.js version to 22.13.0 [`b9988f6`](https://github.com/AntaresSimulatorTeam/AntaREST/commit/b9988f6dedc5a653de00bf5becc917487ce589e6) * correct handling of base class with no `__annotations__` in `AllOptionalMetaclass` [`d9ed61f`](https://github.com/AntaresSimulatorTeam/AntaREST/commit/d9ed61fdaaa32974431b41e9cce44be09bb92e79) * correct indentation [`4af01b4`](https://github.com/AntaresSimulatorTeam/AntaREST/commit/4af01b4023cb828093f8fd9b139f76429806c7b8) * increase line length limit to 120 characters for Black and iSort [`586fb43`](https://github.com/AntaresSimulatorTeam/AntaREST/commit/586fb438607824899c66db66f183451fbe4a88e4) diff --git a/docs/developer-guide/install/0-INSTALL.md b/docs/developer-guide/install/0-INSTALL.md index 8206af7c6e..b223683f0a 100644 --- a/docs/developer-guide/install/0-INSTALL.md +++ b/docs/developer-guide/install/0-INSTALL.md @@ -9,7 +9,7 @@ A local build allows using Antares Web as a desktop application. Requirements: - python : 3.11.x -- node : 18.16.1 +- node : 22.13.0 Then perform the following steps: diff --git a/webapp/.eslintrc.cjs b/webapp/.eslintrc.cjs deleted file mode 100644 index 29270da704..0000000000 --- a/webapp/.eslintrc.cjs +++ /dev/null @@ -1,89 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - es2022: true, - }, - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", // TODO: replace with recommended-type-checked - "plugin:@typescript-eslint/stylistic", // TODO: replace with stylistic-type-checked - "plugin:react/recommended", - "plugin:react/jsx-runtime", - "plugin:react-hooks/recommended", - "plugin:jsdoc/recommended-typescript", - "plugin:prettier/recommended", // Must be the last one - ], - plugins: [ - "license-header", - "react-refresh", - ], - ignorePatterns: [ - "dist", - "license-header.js", - ".eslintrc.cjs", - ], - parser: "@typescript-eslint/parser", - parserOptions: { - // `ecmaVersion` is automatically sets by `esXXXX` in `env` - sourceType: "module", - project: ["./tsconfig.json", "./tsconfig.node.json"], - tsconfigRootDir: __dirname, - }, - settings: { - react: { - version: "detect", - }, - }, - rules: { - "@typescript-eslint/array-type": ["error", { default: "array-simple" }], - "@typescript-eslint/no-unused-vars": [ - "error", - { args: "none", ignoreRestSiblings: true }, - ], - camelcase: [ - "error", - { - properties: "never", // TODO: remove when server responses are camel case - allow: [ - "MRT_", // For material-react-table - ], - }, - ], - curly: "error", - "jsdoc/no-defaults": "off", - "jsdoc/require-jsdoc": "off", - "jsdoc/require-hyphen-before-param-description": "warn", - "jsdoc/tag-lines": ["warn", "any", { startLines: 1 }], // Expected 1 line after block description - "license-header/header": ["error", "license-header.js"], - "no-console": "warn", - "no-param-reassign": [ - "error", - { - props: true, - ignorePropertyModificationsForRegex: [ - // For immer, 'acc' for - "^draft", - // For `Array.prototype.reduce()` - "acc", - "accumulator", - ], - }, - ], - "no-use-before-define": [ - "error", - { - // Function declarations are hoisted, so it’s safe. - functions: false, - }, - ], - "react-refresh/only-export-components": [ - "warn", - { allowConstantExport: true }, - ], - "react/hook-use-state": "error", - "react/prop-types": "off", - "react/self-closing-comp": "error", - "require-await": "warn", // TODO: switch to "error" when the quantity of warning will be low - }, -}; diff --git a/webapp/.nvmrc b/webapp/.nvmrc index 3876fd4986..6fa8dec4cd 100644 --- a/webapp/.nvmrc +++ b/webapp/.nvmrc @@ -1 +1 @@ -18.16.1 +22.13.0 diff --git a/webapp/.prettierrc.json b/webapp/.prettierrc.json index 168d9d2a0c..b1e09779e9 100644 --- a/webapp/.prettierrc.json +++ b/webapp/.prettierrc.json @@ -1,3 +1,4 @@ { - "endOfLine": "auto" + "endOfLine": "auto", + "printWidth": 100 } diff --git a/webapp/eslint.config.js b/webapp/eslint.config.js new file mode 100644 index 0000000000..5614d04606 --- /dev/null +++ b/webapp/eslint.config.js @@ -0,0 +1,130 @@ +/** + * Copyright (c) 2024, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import globals from "globals"; +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; +import reactPlugin from "eslint-plugin-react"; +import reactHookPlugin from "eslint-plugin-react-hooks"; +import jsdocPlugin from "eslint-plugin-jsdoc"; +import prettierPluginRecommended from "eslint-plugin-prettier/recommended"; +import licenseHeaderPlugin from "eslint-plugin-license-header"; +import reactRefreshPlugin from "eslint-plugin-react-refresh"; + +export default [ + // Must be defined here to be applied to all configurations. + // cf. https://github.com/eslint/eslint/discussions/18304 + { + ignores: ["dist/*", "license-header.js"], + }, + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.stylistic, + { + ...reactPlugin.configs.flat.recommended, + settings: { + react: { + version: "detect", + }, + }, + }, + reactPlugin.configs.flat["jsx-runtime"], + jsdocPlugin.configs["flat/recommended-typescript"], + prettierPluginRecommended, // Must be the last one + { + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { + ...globals.browser, + ...globals.es2022, + }, + }, + plugins: { + "license-header": licenseHeaderPlugin, + "react-hooks": reactHookPlugin, + "react-refresh": reactRefreshPlugin, + }, + rules: { + ...reactHookPlugin.configs.recommended.rules, + "@typescript-eslint/array-type": ["error", { default: "array-simple" }], + "@typescript-eslint/no-restricted-imports": [ + "error", + { + paths: [ + { + name: "lodash", + message: + 'Import method directly `import [METHOD] from "lodash/[METHOD]"` (safest for bundle size).', + allowTypeImports: true, + }, + ], + patterns: [ + { + group: ["react"], + importNamePattern: + "^(React|Function|Ref|Mutable|CSS|Component|Props|Form)|(Event|Handler|Attributes)$", + message: + 'Use `React.[TYPE]` (e.g. `React.ReactNode`) instead of importing it directly from "react".', + }, + ], + }, + ], + "@typescript-eslint/no-unused-expressions": ["error", { allowTernary: true }], + "@typescript-eslint/no-unused-vars": ["error", { args: "none", ignoreRestSiblings: true }], + camelcase: [ + "error", + { + properties: "never", // TODO: remove when server responses are camel case + allow: [ + "MRT_", // For material-react-table + ], + }, + ], + curly: "error", + "jsdoc/no-defaults": "off", + "jsdoc/require-jsdoc": "off", + "jsdoc/require-hyphen-before-param-description": "warn", + "jsdoc/tag-lines": ["warn", "any", { startLines: 1 }], // Expected 1 line after block description + "license-header/header": ["error", "license-header.js"], + "no-console": "warn", + "no-duplicate-imports": "error", + "no-param-reassign": [ + "error", + { + props: true, + ignorePropertyModificationsForRegex: [ + // For immer, 'acc' for + "^draft", + // For `Array.prototype.reduce()` + "acc", + "accumulator", + ], + }, + ], + "no-use-before-define": [ + "error", + { + // Function declarations are hoisted, so it’s safe. + functions: false, + }, + ], + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], + "react/hook-use-state": "error", + "react/prop-types": "off", + "react/self-closing-comp": "error", + "require-await": "warn", // TODO: switch to "error" when the quantity of warning will be low + }, + }, +]; diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 7fcf0b0270..2f7b3c31a4 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -69,12 +69,12 @@ "xml-js": "1.6.11" }, "devDependencies": { + "@eslint/js": "9.18.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/react": "16.0.1", "@testing-library/user-event": "14.5.2", "@total-typescript/ts-reset": "0.6.1", "@types/d3": "5.16.0", - "@types/date-fns": "2.6.0", "@types/debug": "4.1.12", "@types/draft-convert": "2.1.8", "@types/draft-js": "0.11.18", @@ -94,43 +94,44 @@ "@types/react-virtualized-auto-sizer": "1.0.4", "@types/react-window": "1.8.8", "@types/swagger-ui-react": "4.18.3", - "@types/testing-library__jest-dom": "6.0.0", "@types/tinycolor2": "1.4.6", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "7.2.0", - "@typescript-eslint/parser": "7.2.0", "@vitejs/plugin-react-swc": "3.7.0", "@vitest/coverage-v8": "2.1.1", "@vitest/ui": "2.1.1", - "eslint": "8.57.1", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-jsdoc": "48.10.0", + "eslint": "9.18.0", + "eslint-config-prettier": "10.0.1", + "eslint-plugin-jsdoc": "50.6.1", "eslint-plugin-license-header": "0.6.1", "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.37.0", - "eslint-plugin-react-hooks": "4.6.2", - "eslint-plugin-react-refresh": "0.4.12", + "eslint-plugin-react": "7.37.4", + "eslint-plugin-react-hooks": "5.1.0", + "eslint-plugin-react-refresh": "0.4.18", + "globals": "15.14.0", "husky": "9.1.6", "jsdom": "25.0.1", - "prettier": "3.3.3", + "prettier": "3.4.2", "typescript": "5.4.5", + "typescript-eslint": "8.19.1", "vite": "5.4.8", "vitest": "2.1.1" }, "engines": { - "node": "18.16.1" + "node": "22.13.0" } }, "node_modules/@adobe/css-tools": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", - "dev": true + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -139,12 +140,38 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.2.tgz", + "integrity": "sha512-RtWv9jFN2/bLExuZgFFZ0I3pWWeezAHGgrmjqGGWclATl1aDe3yhCUaI0Ilkp6OCk9zX7+FjvDasEX8Q9Rxc5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^11.0.2" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -152,28 +179,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -191,30 +220,34 @@ "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==" + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -223,26 +256,27 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -252,81 +286,61 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -340,6 +354,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -355,6 +370,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -366,6 +382,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -374,13 +391,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -390,9 +407,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -401,9 +419,10 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", - "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", + "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", + "license": "MIT", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -413,28 +432,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -442,14 +463,23 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -459,17 +489,20 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@braintree/sanitize-url": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.0.2.tgz", - "integrity": "sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==" + "integrity": "sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==", + "license": "MIT" }, "node_modules/@choojs/findup": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "license": "MIT", "dependencies": { "commander": "^2.15.1" }, @@ -477,16 +510,132 @@ "findup": "bin/findup.js" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", - "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -496,13 +645,14 @@ } }, "node_modules/@emotion/cache": { - "version": "11.13.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", - "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } @@ -510,12 +660,14 @@ "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" } @@ -523,12 +675,14 @@ "node_modules/@emotion/memoize": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" }, "node_modules/@emotion/react": { "version": "11.13.3", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", @@ -549,26 +703,29 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", - "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.1", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" }, "node_modules/@emotion/styled": { "version": "11.13.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", @@ -590,35 +747,40 @@ "node_modules/@emotion/unitless": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", - "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", - "integrity": "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", "dev": true, + "license": "MIT", "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { "node": ">=16" @@ -632,6 +794,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -648,6 +811,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -664,6 +828,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -680,6 +845,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -696,6 +862,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -712,6 +879,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -728,6 +896,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -744,6 +913,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -760,6 +930,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -776,6 +947,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -792,6 +964,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -808,6 +981,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -824,6 +998,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -840,6 +1015,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -856,6 +1032,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -872,6 +1049,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -888,6 +1066,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -904,6 +1083,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -920,6 +1100,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -936,6 +1117,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -952,6 +1134,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -968,6 +1151,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -984,6 +1168,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -993,39 +1178,110 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1033,7 +1289,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1044,21 +1300,20 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1069,6 +1324,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1077,35 +1333,63 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.8" + "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", - "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" + "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/react-dom": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -1115,14 +1399,16 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" }, "node_modules/@glideapps/glide-data-grid": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@glideapps/glide-data-grid/-/glide-data-grid-6.0.3.tgz", "integrity": "sha512-YXKggiNOaEemf0jP0jORq2EQKz+zXms+6mGzZc+q0mLMjmgzzoGLOQC1uYcynXSj1R61bd27JcPFsoH+Gj37Vg==", + "license": "MIT", "dependencies": { "@linaria/react": "^4.5.3", "canvas-hypertxt": "^1.0.3", @@ -1139,51 +1425,54 @@ "node_modules/@handsontable/pikaday": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@handsontable/pikaday/-/pikaday-1.0.0.tgz", - "integrity": "sha512-1VN6N38t5/DcjJ7y7XUYrDx1LuzvvzlrFdBdMG90Qo1xc8+LXHqbWbsTEm5Ec5gXTEbDEO53vUT35R+2COmOyg==" + "integrity": "sha512-1VN6N38t5/DcjJ7y7XUYrDx1LuzvvzlrFdBdMG90Qo1xc8+LXHqbWbsTEm5Ec5gXTEbDEO53vUT35R+2COmOyg==", + "license": "(0BSD OR MIT)" }, "node_modules/@handsontable/react": { "version": "14.5.0", "resolved": "https://registry.npmjs.org/@handsontable/react/-/react-14.5.0.tgz", "integrity": "sha512-Z6weZTELY1hqgW8TDno000xScd+I1sQ0DcswX2AdnCCwvvQkmC74xmIREalwtFE9CCi0Y/kiSvq/G0bYgl//pQ==", + "license": "SEE LICENSE IN LICENSE.txt", "peerDependencies": { "handsontable": ">=14.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "Apache-2.0", "engines": { - "node": "*" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1191,6 +1480,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" }, @@ -1199,17 +1489,25 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@icons/material": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "license": "MIT", "peerDependencies": { "react": "*" } @@ -1219,6 +1517,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -1231,46 +1530,21 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1284,6 +1558,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1292,6 +1567,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1300,6 +1576,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1309,12 +1586,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1324,6 +1603,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/@linaria/core/-/core-4.5.4.tgz", "integrity": "sha512-vMs/5iU0stxjfbBCxobIgY+wSQx4G8ukNwrhjPVD+6bF9QrTwi5rl0mKaCMxaGMjnfsLRiiM3i+hnWLIEYLdSg==", + "license": "MIT", "dependencies": { "@linaria/logger": "^4.5.0", "@linaria/tags": "^4.5.4", @@ -1337,6 +1617,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/@linaria/logger/-/logger-4.5.0.tgz", "integrity": "sha512-XdQLk242Cpcsc9a3Cz1ktOE5ysTo2TpxdeFQEPwMm8Z/+F/S6ZxBDdHYJL09srXWz3hkJr3oS2FPuMZNH1HIxw==", + "license": "MIT", "dependencies": { "debug": "^4.1.1", "picocolors": "^1.0.0" @@ -1349,6 +1630,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/@linaria/react/-/react-4.5.4.tgz", "integrity": "sha512-/dhCVCsfdGPfQCPV0q5yy+DDlFXepvfXrw/os2fC+Xo1v9J/9gyiaBBWHzcumauvNNFj8aN6vRkj89fMujPHew==", + "license": "MIT", "dependencies": { "@emotion/is-prop-valid": "^1.2.0", "@linaria/core": "^4.5.4", @@ -1369,6 +1651,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/@linaria/tags/-/tags-4.5.4.tgz", "integrity": "sha512-HPxLB6HlJWLi6o8+8lTLegOmDnbMbuzEE+zzunaPZEGSoIIYx8HAv5VbY/sG/zNyxDElk6laiAwEVWN8h5/zxg==", + "license": "MIT", "dependencies": { "@babel/generator": "^7.22.9", "@linaria/logger": "^4.5.0", @@ -1382,6 +1665,7 @@ "version": "4.5.3", "resolved": "https://registry.npmjs.org/@linaria/utils/-/utils-4.5.3.tgz", "integrity": "sha512-tSpxA3Zn0DKJ2n/YBnYAgiDY+MNvkmzAHrD8R9PKrpGaZ+wz1jQEmE1vGn1cqh8dJyWK0NzPAA8sf1cqa+RmAg==", + "license": "MIT", "dependencies": { "@babel/core": "^7.22.9", "@babel/generator": "^7.22.9", @@ -1404,6 +1688,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "license": "ISC", "dependencies": { "get-stream": "^6.0.1", "minimist": "^1.2.6" @@ -1415,7 +1700,8 @@ "node_modules/@mapbox/geojson-types": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", + "license": "ISC" }, "node_modules/@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", @@ -1429,6 +1715,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", + "license": "BSD-3-Clause", "peerDependencies": { "mapbox-gl": ">=0.32.1 <2.0.0" } @@ -1436,22 +1723,26 @@ "node_modules/@mapbox/point-geometry": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" }, "node_modules/@mapbox/tiny-sdf": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", + "license": "BSD-2-Clause" }, "node_modules/@mapbox/unitbezier": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", + "license": "BSD-2-Clause" }, "node_modules/@mapbox/vector-tile": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", "dependencies": { "@mapbox/point-geometry": "~0.1.0" } @@ -1460,14 +1751,16 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", "engines": { "node": ">=6.0.0" } }, "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.3.1.tgz", - "integrity": "sha512-5ueL4UDitzVtceQ8J4kY+Px3WK+eZTsmGwha3MBKHKqiHvKrjWWwBCIl1K8BuJSc5OFh83uI8IFNoFvQxX2uUw==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", + "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", + "license": "ISC", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", @@ -1475,7 +1768,6 @@ "minimist": "^1.2.8", "quickselect": "^2.0.0", "rw": "^1.3.3", - "sort-object": "^3.0.3", "tinyqueue": "^3.0.0" }, "bin": { @@ -1487,17 +1779,20 @@ "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" }, "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" }, "node_modules/@mui/base": { "version": "5.0.0-beta.58", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.58.tgz", "integrity": "sha512-P0E7ZrxOuyYqBvVv9w8k7wm+Xzx/KRu+BGgFcR2htTsGCpJNQJCSUXNUZ50MUmSU9hzqhwbQWNXhV1MBTl6F7A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "@floating-ui/react-dom": "^2.1.1", @@ -1529,6 +1824,7 @@ "version": "6.0.0-rc.0", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.0.0-rc.0.tgz", "integrity": "sha512-tBp0ILEXDL0bbDDT8PnZOjCqSm5Dfk2N0Z45uzRw+wVl6fVvloC9zw8avl+OdX1Bg3ubs/ttKn8nRNv17bpM5A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "@mui/types": "^7.2.15", @@ -1555,9 +1851,10 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.1.tgz", - "integrity": "sha512-VdQC1tPIIcZAnf62L2M1eQif0x2vlKg3YK4kGYbtijSH4niEgI21GnstykW1vQIs+Bc6L+Hua2GATYVjilJ22A==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.3.1.tgz", + "integrity": "sha512-2OmnEyoHpj5//dJJpMuxOeLItCCHdf99pjMFfUFdBteCunAK9jW+PwEo4mtdGcLs7P+IgZ+85ypd52eY4AigoQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" @@ -1567,6 +1864,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.1.tgz", "integrity": "sha512-sy/YKwcLPW8VcacNP2uWMYR9xyWuwO9NN9FXuGEU90bRshBXj8pdKk+joe3TCW7oviVS3zXLHlc94wQ0jNsQRQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6" }, @@ -1592,6 +1890,7 @@ "version": "6.0.0-beta.10", "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.10.tgz", "integrity": "sha512-eqCBz5SZS8Un9To3UcjH01AxkOOgvme/g0ZstFC8Nz1Kg5/EJMA0ByhKS5AvUMzUKrv0FXMdbuPqbBvF3bVrXg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/base": "5.0.0-beta.58", @@ -1636,6 +1935,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.1.tgz", "integrity": "sha512-b+eULldTqtqTCbN++2BtBWCir/1LwEYw+2mIlOt2GiEUh1EBBw4/wIukGKKNt3xrCZqRA80yLLkV6tF61Lq3cA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/core-downloads-tracker": "^6.1.1", @@ -1681,12 +1981,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.1.tgz", - "integrity": "sha512-JlrjIdhyZUtewtdAuUsvi3ZnO0YS49IW4Mfz19ZWTlQ0sDGga6LNPVwHClWr2/zJK2we2BQx9/i8M32rgKuzrg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.3.1.tgz", + "integrity": "sha512-g0u7hIUkmXmmrmmf5gdDYv9zdAig0KoxhIQn1JN8IVqApzf/AyRhH3uDGx5mSvs8+a1zb4+0W6LC260SyTTtdQ==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^6.1.1", + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.3.1", "prop-types": "^15.8.1" }, "engines": { @@ -1707,12 +2008,14 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.1.tgz", - "integrity": "sha512-HJyIoMpFb11fnHuRtUILOXgq6vj4LhIlE8maG4SwP/W+E5sa7HFexhnB3vOMT7bKys4UKNxhobC8jwWxYilGsA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.3.1.tgz", + "integrity": "sha512-/7CC0d2fIeiUxN5kCCwYu4AWUDd9cCTxWCyo0v/Rnv6s8uk6hWgJC3VLZBoDENBHf/KjqDZuYJ2CR+7hD6QYww==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@emotion/cache": "^11.13.1", + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1739,15 +2042,16 @@ } }, "node_modules/@mui/system": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.1.tgz", - "integrity": "sha512-PaYsCz2tUOcpu3T0okDEsSuP/yCDIj9JZ4Tox1JovRSKIjltHpXPsXZSGr3RiWdtM1MTQMFMCZzu0+CKbyy+Kw==", - "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/private-theming": "^6.1.1", - "@mui/styled-engine": "^6.1.1", - "@mui/types": "^7.2.17", - "@mui/utils": "^6.1.1", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.3.1.tgz", + "integrity": "sha512-AwqQ3EAIT2np85ki+N15fF0lFXX1iFPqenCzVOSl3QXKy2eifZeGd9dGtt7pGMoFw5dzW4dRGGzRpLAq9rkl7A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.3.1", + "@mui/styled-engine": "^6.3.1", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.3.1", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1778,9 +2082,10 @@ } }, "node_modules/@mui/types": { - "version": "7.2.17", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.17.tgz", - "integrity": "sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ==", + "version": "7.2.21", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz", + "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==", + "license": "MIT", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -1791,16 +2096,17 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.1.tgz", - "integrity": "sha512-HlRrgdJSPbYDXPpoVMWZV8AE7WcFtAk13rWNWAEVWKSanzBBkymjz3km+Th/Srowsh4pf1fTSP1B0L116wQBYw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.3.1.tgz", + "integrity": "sha512-sjGjXAngoio6lniQZKJ5zGfjm+LD2wvLwco7FbKe1fu8A7VIFmz2SwkLb+MDPLNX1lE7IscvNNyh1pobtZg2tw==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/types": "^7.2.17", - "@types/prop-types": "^15.7.12", + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.21", + "@types/prop-types": "^15.7.14", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.3.1" + "react-is": "^19.0.0" }, "engines": { "node": ">=14.0.0" @@ -1819,15 +2125,22 @@ } } }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, "node_modules/@mui/x-date-pickers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz", - "integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.23.6.tgz", + "integrity": "sha512-jt6rEAYLju3NZe3y2S+I5KcTiSHV79FW0jeNUEUTceg1qsPzseHbND66k3zVF0hO3N2oZtLtPywof6vN5Doe+Q==", + "license": "MIT", "peer": true, "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.18.0", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-internals": "7.23.6", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -1846,14 +2159,14 @@ "@mui/material": "^5.15.14 || ^6.0.0", "@mui/system": "^5.15.14 || ^6.0.0", "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", "dayjs": "^1.10.7", "luxon": "^3.0.2", "moment": "^2.29.4", - "moment-hijri": "^2.1.2", + "moment-hijri": "^2.1.2 || ^3.0.0", "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1885,43 +2198,15 @@ } } }, - "node_modules/@mui/x-date-pickers/node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@mui/x-internals": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", - "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.23.6.tgz", + "integrity": "sha512-hT1Pa4PNCnxwiauPbYMC3p4DiEF1x05Iu4C1MtC/jMJ1LtthymLmTuQ6ZQ53/R9FeqK6sYd6A6noR+vNMjp5DA==", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6" + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0" }, "engines": { "node": ">=14.0.0" @@ -1931,42 +2216,14 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@mui/x-internals/node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@mui/x-tree-view": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.18.0.tgz", "integrity": "sha512-3UJAYtBquc0SzKxEEdM68XlKOuuCl70ktZPqqI3z4wTZ0HK445XXc32t/s0VPIL94kRxWQcGPpgWFauScDwhug==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/utils": "^5.16.6", @@ -2001,16 +2258,17 @@ } }, "node_modules/@mui/x-tree-view/node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "version": "5.16.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz", + "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/types": "^7.2.15", "@types/prop-types": "^15.7.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.3.1" + "react-is": "^19.0.0" }, "engines": { "node": ">=12.0.0" @@ -2020,8 +2278,8 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2029,11 +2287,38 @@ } } }, + "node_modules/@mui/x-tree-view/node_modules/@mui/x-internals": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", + "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-tree-view/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2047,6 +2332,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" } @@ -2056,6 +2342,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" @@ -2069,6 +2356,7 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -2079,6 +2367,7 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -2089,12 +2378,14 @@ "node_modules/@plotly/d3": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.2.tgz", - "integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==" + "integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==", + "license": "BSD-3-Clause" }, "node_modules/@plotly/d3-sankey": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1", "d3-collection": "1", @@ -2105,6 +2396,7 @@ "version": "0.33.1", "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "license": "MIT", "dependencies": { "d3-array": "^1.2.1", "d3-collection": "^1.0.4", @@ -2116,6 +2408,7 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", + "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/geojson-types": "^1.0.2", @@ -2148,6 +2441,7 @@ "version": "3.1.9", "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "license": "MIT", "dependencies": { "array-bounds": "^1.0.1", "binary-search-bounds": "^2.0.4", @@ -2165,12 +2459,14 @@ "version": "1.0.0-next.28", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2180,6 +2476,7 @@ "version": "1.9.6", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.6.tgz", "integrity": "sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw==", + "license": "MIT", "dependencies": { "immer": "^9.0.21", "redux": "^4.2.1", @@ -2203,231 +2500,299 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz", - "integrity": "sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz", - "integrity": "sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz", - "integrity": "sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz", - "integrity": "sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz", - "integrity": "sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz", - "integrity": "sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz", - "integrity": "sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz", - "integrity": "sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz", - "integrity": "sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz", - "integrity": "sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz", - "integrity": "sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz", - "integrity": "sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz", - "integrity": "sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz", - "integrity": "sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz", - "integrity": "sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz", - "integrity": "sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@sphinxxxx/color-conversion": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", - "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", + "license": "ISC" }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-alpha.9.tgz", - "integrity": "sha512-SAOQrFSFwgDiI4QSIPDwAIJEb4Za+8bu45sNojgV3RMtCz+n4Agw66iqGsDib5YSI/Cg1h4AKFovT3iWdfGWfw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.6.tgz", + "integrity": "sha512-AAxEN/xTcH/ORpn/zEEuPPgtqX6/Q9EZC8RX2R7AlRdUeGZieE9OZ91mXYrg48FcHWi/xwWYqkPPHjyXTQkfww==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2435,13 +2800,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-alpha.9.tgz", - "integrity": "sha512-vGl8BWRf6ODl39fxElcIOjRE2QG5AJhn8tTNMqjjHB/2WppNBuxOVStYZeVJoWfK03OPK8v4Fp/TAcaP9+R7DQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.6.tgz", + "integrity": "sha512-gmHpE5+wJgUmpkb0C3ZIM6VsMXj0heujwQeXqEcFRkp1d0u4crCNmQ5iPTewzvILcnMbxac0AUFFKuJbBpqzPg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -2451,36 +2817,39 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-alpha.9.tgz", - "integrity": "sha512-FU/2sFSgsICB9HYFELJ79caRpXXzlAV41QTHsAM46WfRehbzZUQpOBQm4jRi3qJGSa/Jk+mQ7Vt8HLRFMpJFfg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.6.tgz", + "integrity": "sha512-bLttwjXj0u9pHIzc71L5rZWvhtcPFmGdvPDpXMoK4XOjmfpw9hqQKg1DGWKQHxNiMP/zlWAWO1RxjFQNYcO70g==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-alpha.9.tgz", - "integrity": "sha512-/W8Ktbgbs29zdhed6KHTFk0qmuIRbvEFi8wu2MHGQ5UT4i99Bdu2OyUiayhnpejWztfQxDgL08pjrQPEwgY8Yg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.6.tgz", + "integrity": "sha512-9XdWnouDGnn8UCr48TgtB16e4s37L7ibWFFgn4ercSkUMsJKMzHULabZ005IKVfP20UbhdIa5/r2W/i8iRk8Vg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-alpha.9.tgz", - "integrity": "sha512-aduC2vbwGgn6ia9IkKpqBYBaKyIDGM/80M3oU3DFgaYIIwynzuwVpN1TkBOLIFy3mAzkWoYKUS0jdZJhMy/6Ug==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.6.tgz", + "integrity": "sha512-Qycf1LbBP5KxtxCeXHIAKazekKnz8kOHfnn2JT/FkWojM4reTECHBMi40DwQOQbj1CsWSasoTbnKjG64BxoJRg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2488,14 +2857,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-hZjxXJgMt517ADnAauWJh01k7WNRwkbWT5p6b7AXF2H3tl549A2hhLnIg3BBSE3GwB3Nv25GyrI3aA/1dFVC8A==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.6.tgz", + "integrity": "sha512-bQ0eNdDYrrkr4Y4iyUcgXiYBFzj+wwJiBGKI8OBJ9hTVEDbDCb/8ZzlZw3wMQNGFMw6/NC2F6MEbocApDx9vnQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2503,13 +2873,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-alpha.9.tgz", - "integrity": "sha512-OfX4UBb08C0xD5+F80dQAM2yt5lXxcURWkVEeCwxz7i23BB3nNEbnZXNV91Qo9eaJflPh8dO9iiHQxvfw5IgSg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.6.tgz", + "integrity": "sha512-Cn4+CH8ZqniejbmbD7nfUzw/N+S9lwGztOB5ZSoS23r1/mFzcya/bTOSuUW6BJ4Pa1L+AvUWhqmRlzG66Ta0gA==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2517,15 +2888,16 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-alpha.9.tgz", - "integrity": "sha512-qzUVRSSrnlYGMhK6w57o/RboNvy1FO0iFgEnTk56dD4wN49JRNuFqKI18IgXc1W2r9tTTG70nG1khe4cPE8TNg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.6.tgz", + "integrity": "sha512-zwD2cKjbXBynMNFAyXHLsNz16Wbd4SOSehAZ1WJcWTJflC0GVk0kkFmzGFz92WI0YQihnrYwrAhpmZohUlHUWg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2533,15 +2905,16 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-alpha.9.tgz", - "integrity": "sha512-Zml8Z8VCckdFjvTogaec1dabd85hg1+xZDseWcCuD0tYkaTY/sZ8zzI0dz6/4HsKCb58qjiWSa0w60N8Syr6WQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.6.tgz", + "integrity": "sha512-T1LMWiHitPJt9pM4G4FTPaGJntW8x6v/Y6236dEt8gO5aw5T3528PtaqEGfmI4uIvJO4dBwrobEte9GUXWVxig==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2549,15 +2922,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-WUZxt7Gs7P4EQsGtoD6cKAjf0uDJhkUxsIW9Bb4EAgO6tdp7LlXhbJ0fJ2QycCLY717SfJbvGLfhuSfTYo4Iow==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.6.tgz", + "integrity": "sha512-SY+h67maS88egPr9o7E8yep2xdw4N/vRYO1vCRcX4Y6UfFpiAn3jSKxQkOP983DJGXwDLVirVML/ezb9VXbnDg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2565,14 +2939,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-7ra5uoZGrfCn1LabfJLueChPcYXyg24//LCYBtjTstyueqd5Vp7JCPeP5NnJSAaqVAP47r8ygceBPoxNp9k1EQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.6.tgz", + "integrity": "sha512-fqsF35X8O2yaENr74wbZtPqSgiuuomu9mT9KKj9P7z6in6SjBSTMMmGkbsjximdr+hVCrNm8ActDF1HRq3av7Q==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2580,15 +2955,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-nQOwNQgf0C8EVjf2loAAl4ifRuVOdcqycvXUdcTpsUfHN3fbndR8IKpb26mQNmnACmqgmX+LkbMdW9b+K6089g==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.6.tgz", + "integrity": "sha512-GOtloezNXZExvhmSp5OT2NO7XLMwUY12stXUWl0bWR3O/6I6U522JFgoO9SHKxuSed5ateJpE7eR39HCJ/pyOQ==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2596,14 +2972,15 @@ } }, "node_modules/@swagger-api/apidom-ns-workflows-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-yKo0p8OkQmDib93Kt1yqWmI7JsD6D9qUHxr/SCuAmNNWny1hxm7cZGoKJwJlGd0uAg84j4vmzWOlG3AsJbnT8g==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-workflows-1/-/apidom-ns-workflows-1-1.0.0-beta.6.tgz", + "integrity": "sha512-5ViXxpioBNfkJJyGmgbp76OyvY3IRsfNwN9tXTl39vgpyPnQVtBPwhKwuViiqDr+GmyZgMCotB3QlYPNcxqEoA==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2611,263 +2988,323 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-xfVMR4HrTzXU0HB4TtxwkNbUIa/cQrPa0BWutJZ0fMYMAtUox2s8GsFYnJfZP52XfpSHFM1VPclivorZqET14g==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.6.tgz", + "integrity": "sha512-HLcCDO7QdBjPFQ/Mf4XmG0qcmwW+AnDZyPYzMOAyK1hU3xwQjAIn5zOlgp0feTe3vNUMzNY1NDHvCeDXSbN5sQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-alpha.9.tgz", - "integrity": "sha512-lJZkrhZ8qRTtc5fSLKefCv8j7Xzo8UBfMjpqTJhmETAtU8YfVV2i2znjgxJpm0QwV6FVQqGfK1+ASZQWPLiVcA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.6.tgz", + "integrity": "sha512-jL2fZv1a+3S6SiIVYc3kC0NAAk8bszNGcVTsBV8ehHgZxc0I+EANEJwgZE/YOcL3TlNEFscfjUcGhjyWkEQksQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-65nmKdPzw4C1bmtYn+3zoxXCI6Gnobr0StI9XE0YWiK+lpso7RH3Cgyl1yPZ0DBRVGzP+Fn9FVzmDNulEfR95w==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.6.tgz", + "integrity": "sha512-hwSOnUwfZ78+wHXsokB/ho6xOgxK0qnWviSj1QkLvd2bomfP6RM0d4Uk19ND/Mh39oDXDwxiQ7jXHQsU8/Tq/g==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-RLI4FpVB3vB6mIuT77yrsv5V2LMZ80dW9XpV+Fmbd4Jkdj+ysAFwT38cI4AsUMOxixpTDIXY1oWD7AjvylHhQQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.6.tgz", + "integrity": "sha512-NecW+P4oUgioPW/l1Ang6S76v26QevjTDls+5p0I9a7Kyln8xHbfzYOGH9AEopeygZmhaburC/TO6ochxBZqkw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-alpha.9.tgz", - "integrity": "sha512-aOewp8/3zobf/O+5Jx8y7+bX3BPRfRlHIv15qp4YVTsLs6gLISWSzTO9JpWe9cR+AfhpsAalFq4t1LwIkmLk4A==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.6.tgz", + "integrity": "sha512-a2ymHU7BJ11XcZvNpghmUjsyxa+hwf2Jt7MgLIKQGg6Kmnx+pHesx1/ZlqqvhkaKk6ZXbefpK7PTOBcGRerjlQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-json": "=0.20.2", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-zgtsAfkplCFusX2P/saqdn10J8P3kQizCXxHLvxd2j0EhMJk2wfu4HYN5Pej/7/qf/OR1QZxqtacwebd4RfpXA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.6.tgz", + "integrity": "sha512-NgbHpVUMqE81f6rDPU9bO0qbWmiwu7FlrFvBwePktZTbbFaxwt73jFQpqyzKmIumNrg/mCckxzTrbSEW7k85Vw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-iPuHf0cAZSUhSv8mB0FnVgatTc26cVYohgqz2cvjoGofdqoh5KKIfxOkWlIhm+qGuBp71CfZUrPYPRsd0dHgeg==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.6.tgz", + "integrity": "sha512-cnFcTkzN7xAr6Zal5UnzRRkQpSe3fI910bYs9mjNMUYReo5D+hUyL16PtOf832Qa8vyDlU3WBHqAQuOEk1fepA==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-jwkfO7tzZyyrAgok+O9fKFOv1q/5njMb9DBc3D/ZF3ZLTcnEw8uj4V2HkjKxUweH5k8ip/gc8ueKmO/i7p2fng==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.6.tgz", + "integrity": "sha512-xkqyXhLWg6iWyriH/t/am3CHFTZOSIUrNP7uSZBHoD6PbvDArYSB+/gtnO7e/NphSSOkqlkRC4+7VTybA9LK+A==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jEIDpjbjwFKXQXS/RHJeA4tthsguLoz+nJPYS3AOLfuSiby5QXsKTxgqHXxG/YJqF1xJbZL+5KcF8UyiDePumw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.6.tgz", + "integrity": "sha512-M91gx/QpM6xSf4m2k/OYaPw8Hapir+6KJMEIcLV8aP6UAnb+S2z6XoSLQ633n7QQjLYeLUL0pTzRgU1UPL9cyg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-alpha.9.tgz", - "integrity": "sha512-ieJL8dfIF8fmP3uJRNh/duJa3cCIIv6MzUe6o4uPT/oTDroy4qIATvnq9Dq/gtAv6rcPRpA9VhyghJ1DmjKsZQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.6.tgz", + "integrity": "sha512-GdQ8jIgoYaPeIVp3Em5BGi1XwFB+LWa48mKQ7Z/M3S0u1I6YSo7P1iNhm2eRaeoL+LNb7C0ygEwixiJBaSmeew==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-EatIH7PZQSNDsRn9ompc62MYzboY7wAkjfYz+2FzBaSA8Vl5/+740qGQj22tu/xhwW4K72aV2NNL1m47QVF7hA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.6.tgz", + "integrity": "sha512-52guWmqVa9IReg0NRf4KKUZFmlV/fMniJAKk80Xv62XN5X/MduW2P7zln2+FJAA6uGV0rBZip0Zg1McVkPowSw==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-workflows-json-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-LylC2cQdAmvR7bXqwMwBt6FHTMVGinwIdI8pjl4EbPT9hCVm1rdED53caTYM4gCm+CJGRw20r4gb9vn3+N6RrA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-json-1/-/apidom-parser-adapter-workflows-json-1-1.0.0-beta.6.tgz", + "integrity": "sha512-B5WW7CSVKjU+1Lt3StUEKgJvaNGF1IHYKg91eH7nvhMfJ/oY6rNpE2+ziVkYETifbZeCWMFqbQYHPzJyqomnQQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-workflows-yaml-1": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-alpha.9.tgz", - "integrity": "sha512-TlA4+1ca33D7fWxO5jKBytSCv86IGI4Lze4JfrawWUXZ5efhi4LiNmW5TrGlZUyvL7yJtZcA4tn3betlj6jVwA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-workflows-yaml-1/-/apidom-parser-adapter-workflows-yaml-1-1.0.0-beta.6.tgz", + "integrity": "sha512-2lzE8JemYy998RDlGJ3l4d9SL3Rs1yxEMGC5a/bIml5QVXT2FSu0ohwaxzkX+HB6LbMd1PMlQZ75IJIlxmcb0Q==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.9", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-beta.6", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-alpha.9.tgz", - "integrity": "sha512-jSIHEB7lbh+MP3BhYIXFkeivDR01kugXN70e5FskW7oet2TIARsVEPheWKQFSP1U8bUZA4bsp9h9gOQ9xEeErw==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.6.tgz", + "integrity": "sha512-iwoSjTdyM4DeYtJEenMEKA51EOsOLxMADOXu/9ixTqMpYghp2GMnkryrtH3mq6oCX+jO3ysADx1dfp/CaukBsg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-ast": "^1.0.0-alpha.9", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", - "@swagger-api/apidom-error": "^1.0.0-alpha.9", + "@swagger-api/apidom-ast": "^1.0.0-beta.6", + "@swagger-api/apidom-core": "^1.0.0-beta.6", + "@swagger-api/apidom-error": "^1.0.0-beta.6", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", - "tree-sitter": "=0.20.4", - "tree-sitter-yaml": "=0.5.0", - "web-tree-sitter": "=0.20.3" + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-alpha.9.tgz", - "integrity": "sha512-KQ6wB5KplqdSsjxdA8BaQulj5zlF5VBCd5KP3RN/9vvixgsD/gyrVY59nisdzmPTqiL6yjhk612eQ96MgG8KiA==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.6.tgz", + "integrity": "sha512-GdVPd+YAOWdAuJUJ5so63pZ4i0xlBNGClHJfTHirxZbEH9UQjNTKSkQgawUD0UBpg1HeQVzecl1cehoOp/+Uhw==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7", - "@swagger-api/apidom-core": "^1.0.0-alpha.9", + "@swagger-api/apidom-core": "^1.0.0-beta.6", "@types/ramda": "~0.30.0", - "axios": "^1.4.0", + "axios": "^1.7.4", "minimatch": "^7.4.3", "process": "^0.11.10", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-error": "^1.0.0-alpha.1", - "@swagger-api/apidom-json-pointer": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-ns-workflows-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-alpha.1", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-alpha.1" + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-workflows-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-workflows-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-workflows-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0" } }, "node_modules/@swagger-api/apidom-reference/node_modules/minimatch": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2878,15 +3315,28 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@swaggerexpert/cookie": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swaggerexpert/cookie/-/cookie-1.4.1.tgz", + "integrity": "sha512-ZRbRC2017wMs+uZeIOC55ghwgbTxeolo+s6I0njzqina7MTrOhz8WMfTj0KGk3hfBUO/yhTQD/aQZ0lQHEIKxQ==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.3" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.7.tgz", + "integrity": "sha512-py91kjI1jV5D5W/Q+PurBdGsdU5TFbrzamP7zSCqLdMcHkKi3rQEM5jkQcZr0MXXSJTaayLxS3MWYTBIkzPDrg==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@swc/types": "^0.1.17" }, "engines": { "node": ">=10" @@ -2896,16 +3346,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26" + "@swc/core-darwin-arm64": "1.10.7", + "@swc/core-darwin-x64": "1.10.7", + "@swc/core-linux-arm-gnueabihf": "1.10.7", + "@swc/core-linux-arm64-gnu": "1.10.7", + "@swc/core-linux-arm64-musl": "1.10.7", + "@swc/core-linux-x64-gnu": "1.10.7", + "@swc/core-linux-x64-musl": "1.10.7", + "@swc/core-win32-arm64-msvc": "1.10.7", + "@swc/core-win32-ia32-msvc": "1.10.7", + "@swc/core-win32-x64-msvc": "1.10.7" }, "peerDependencies": { "@swc/helpers": "*" @@ -2917,13 +3367,14 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.7.tgz", + "integrity": "sha512-SI0OFg987P6hcyT0Dbng3YRISPS9uhLX1dzW4qRrfqQdb0i75lPJ2YWe9CN47HBazrIA5COuTzrD2Dc0TcVsSQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -2933,13 +3384,14 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.7.tgz", + "integrity": "sha512-RFIAmWVicD/l3RzxgHW0R/G1ya/6nyMspE2cAeDcTbjHi0I5qgdhBWd6ieXOaqwEwiCd0Mot1g2VZrLGoBLsjQ==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -2949,13 +3401,14 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.7.tgz", + "integrity": "sha512-QP8vz7yELWfop5mM5foN6KkLylVO7ZUgWSF2cA0owwIaziactB2hCPZY5QU690coJouk9KmdFsPWDnaCFUP8tg==", "cpu": [ "arm" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -2965,13 +3418,14 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.7.tgz", + "integrity": "sha512-NgUDBGQcOeLNR+EOpmUvSDIP/F7i/OVOKxst4wOvT5FTxhnkWrW+StJGKj+DcUVSK5eWOYboSXr1y+Hlywwokw==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -2981,13 +3435,14 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.7.tgz", + "integrity": "sha512-gp5Un3EbeSThBIh6oac5ZArV/CsSmTKj5jNuuUAuEsML3VF9vqPO+25VuxCvsRf/z3py+xOWRaN2HY/rjMeZog==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -2997,13 +3452,14 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.7.tgz", + "integrity": "sha512-k/OxLLMl/edYqbZyUNg6/bqEHTXJT15l9WGqsl/2QaIGwWGvles8YjruQYQ9d4h/thSXLT9gd8bExU2D0N+bUA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -3013,13 +3469,14 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.7.tgz", + "integrity": "sha512-XeDoURdWt/ybYmXLCEE8aSiTOzEn0o3Dx5l9hgt0IZEmTts7HgHHVeRgzGXbR4yDo0MfRuX5nE1dYpTmCz0uyA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -3029,13 +3486,14 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.7.tgz", + "integrity": "sha512-nYAbi/uLS+CU0wFtBx8TquJw2uIMKBnl04LBmiVoFrsIhqSl+0MklaA9FVMGA35NcxSJfcm92Prl2W2LfSnTqQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -3045,13 +3503,14 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.7.tgz", + "integrity": "sha512-+aGAbsDsIxeLxw0IzyQLtvtAcI1ctlXVvVcXZMNXIXtTURM876yNrufRo4ngoXB3jnb1MLjIIjgXfFs/eZTUSw==", "cpu": [ "ia32" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -3061,13 +3520,14 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.7.tgz", + "integrity": "sha512-TBf4clpDBjF/UUnkKrT0/th76/zwvudk5wwobiTFqDywMApHip5O0VpBgZ+4raY2TM8k5+ujoy7bfHb22zu17Q==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -3080,13 +3540,15 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", + "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" } @@ -3095,6 +3557,7 @@ "version": "8.19.4", "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "license": "MIT", "dependencies": { "remove-accents": "0.5.0" }, @@ -3110,6 +3573,7 @@ "version": "8.20.5", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "license": "MIT", "dependencies": { "@tanstack/table-core": "8.20.5" }, @@ -3129,6 +3593,7 @@ "version": "3.10.6", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz", "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==", + "license": "MIT", "dependencies": { "@tanstack/virtual-core": "3.10.6" }, @@ -3145,6 +3610,7 @@ "version": "8.20.5", "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3157,6 +3623,7 @@ "version": "3.10.6", "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz", "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -3167,6 +3634,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -3182,87 +3650,12 @@ "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/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, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/jest-dom": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", @@ -3278,26 +3671,12 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3306,56 +3685,19 @@ "node": ">=8" } }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/@testing-library/react": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -3383,6 +3725,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" @@ -3395,68 +3738,74 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.6.1.tgz", "integrity": "sha512-cka47fVSo6lfQDIATYqb/vO1nvFfbPw7uWLayIXIhGETj0wcOOlrlkobOMDNQOFr9QOafegUPq13V2+6vtD7yg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@turf/area": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.1.0.tgz", - "integrity": "sha512-w91FEe02/mQfMPRX2pXua48scFuKJ2dSVMF2XmJ6+BJfFiCPxp95I3+Org8+ZsYv93CDNKbf0oLNEPnuQdgs2g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.2.0.tgz", + "integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.1.0", - "@turf/meta": "^7.1.0", + "@turf/helpers": "^7.2.0", + "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", - "tslib": "^2.6.2" + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/bbox": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.1.0.tgz", - "integrity": "sha512-PdWPz9tW86PD78vSZj2fiRaB8JhUHy6piSa/QXb83lucxPK+HTAdzlDQMTKj5okRCU8Ox/25IR2ep9T8NdopRA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.2.0.tgz", + "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.1.0", - "@turf/meta": "^7.1.0", + "@turf/helpers": "^7.2.0", + "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", - "tslib": "^2.6.2" + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/centroid": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.1.0.tgz", - "integrity": "sha512-1Y1b2l+ZB1CZ+ITjUCsGqC4/tSjwm/R4OUfDztVqyyCq/VvezkLmTNqvXTGXgfP0GXkpv68iCfxF5M7QdM5pJQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.2.0.tgz", + "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.1.0", - "@turf/meta": "^7.1.0", + "@turf/helpers": "^7.2.0", + "@turf/meta": "^7.2.0", "@types/geojson": "^7946.0.10", - "tslib": "^2.6.2" + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/helpers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.1.0.tgz", - "integrity": "sha512-dTeILEUVeNbaEeoZUOhxH5auv7WWlOShbx7QSd4s0T4Z0/iz90z9yaVCtZOLbU89umKotwKaJQltBNO9CzVgaQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", + "license": "MIT", "dependencies": { "@types/geojson": "^7946.0.10", - "tslib": "^2.6.2" + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/meta": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.1.0.tgz", - "integrity": "sha512-ZgGpWWiKz797Fe8lfRj7HKCkGR+nSJ/5aKXMyofCvLSc2PuYJs/qyyifDPWjASQQCzseJ7AlF2Pc/XQ/3XkkuA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz", + "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.1.0", + "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10" }, "funding": { @@ -3467,13 +3816,15 @@ "version": "0.0.52", "resolved": "https://registry.npmjs.org/@types/ace/-/ace-0.0.52.tgz", "integrity": "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/d3": { @@ -3481,6 +3832,7 @@ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.16.0.tgz", "integrity": "sha512-BPe6m763fJet428zPK3/fLBzgGlh204kEEisUcZGsUqgQHh0V+fOHhuGV3pyJtT2QLe+E0y5oqxNYix32OgmHA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "^1", "@types/d3-axis": "^1", @@ -3519,13 +3871,15 @@ "version": "1.2.12", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.12.tgz", "integrity": "sha512-zIq9wCg/JO7MGC6vq3HRDaVYkqgSPIDjpo3JhAQxl7PHYVPA5D9SMiBfjW/ZoAvPd2a+rkovqBg0nS0QOChsJQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.19.tgz", "integrity": "sha512-rXxE2jJYv6kar/6YWS8rM0weY+jjvnJvBxHKrIUqt3Yzomrfbf5tncpKG6jq6Aaw6TZyBcb1bxEWc0zGzcmbiw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "^1" } @@ -3535,6 +3889,7 @@ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.8.tgz", "integrity": "sha512-tPVjYAjJt02fgazF9yiX/309sj6qhIiIopLuHhP4FFFq9VKqu9NQBeCK3ger0RHVZGs9RKaSBUWyPUzii5biGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "^1" } @@ -3543,25 +3898,29 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.14.tgz", "integrity": "sha512-W9rCIbSAhwtmydW5iGg9dwTQIi3SGBOh68/T3ke3PyOgejuSLozmtAMaWNViGaGJCeuM4aFJHTUHQvMedl4ugA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-collection": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.13.tgz", "integrity": "sha512-v0Rgw3IZebRyamcwVmtTDCZ8OmQcj4siaYjNc7wGMZT7PmdSHawGsCOQMxyLvZ7lWjfohYLK0oXtilMOMgfY8A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.3.6.tgz", "integrity": "sha512-RM/QHCx8j1ovj/p4cWCM3b48EIas6TTmfG+LR2Ud8npTqgrWTjMNCpHtoj47Qa3dJsifONXGu54VuFkXWL2mIg==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "^1", "@types/geojson": "*" @@ -3571,13 +3930,15 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.12.tgz", "integrity": "sha512-vrhleoVNhGJGx7GQZ4207lYGyMbW/yj/iJTSvLKyfAp8nXFF+19dnMpPN/nEVs6fudIsQc7ZelBFUMe3aJDmKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.8.tgz", "integrity": "sha512-QM6H8E6r9/51BcE4NEluQ0f9dTECCTDEALJSQIWn183+Mtz/6KvEjOxW8VzKYSnhhL+qMljMKKA1WOUUf/4Qhw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "^1" } @@ -3586,19 +3947,22 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.13.tgz", "integrity": "sha512-VAA4H8YNaNN0+UNIlpkwkLOj7xL5EGdyiQpdlAvOIRHckjGFCLK8eMoUd4+IMNEhQgweq0Yk/Dfzr70xhUo6hA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } @@ -3607,19 +3971,22 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.7.tgz", "integrity": "sha512-zySqZfnxn67RVEGWzpD9dQA0AbNIp4Rj0qGvAuUdUNfGLrwuGCbEGAGze5hEdNaHJKQT2gTqr6j+qAzncm11ew==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-format": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.5.tgz", "integrity": "sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.12.7.tgz", "integrity": "sha512-QetZrWWjuMfCe0BHLjD+dOThlgk7YGZ2gj+yhFAbDN5TularNBEQiBs5/CIgX0+IBDjt7/fbkDd5V70J1LjjKA==", "dev": true, + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -3628,13 +3995,15 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz", "integrity": "sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -3643,31 +4012,36 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.10.tgz", "integrity": "sha512-+hbHsFdCMs23vk9p/SpvIkHkCpl0vxkP2qWR2vEk0wRi0BXODWgB/6aHnfrz/BeQnk20XzZiQJIZ+11TGxuYMQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.13.tgz", "integrity": "sha512-BAQD6gTHnXqmI7JRhXwM2pEYJJF27AT1f6zCC192BKAUhigzd5HZjdje5ufRXmYcUM/fr2IJ9KqVMeXaljmmOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-random": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.5.tgz", "integrity": "sha512-gB5CR+7xYMj56pt5zmSyDBjTNMEy96PdfUb2qBaAT9bmPcf4P/YHfhhTI5y8JoiqaSRLJY+3mqtaE9loBgB6Ng==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-time": "*" } @@ -3676,19 +4050,22 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.4.tgz", "integrity": "sha512-HwLVEm8laYTNOR9Kc9745XDKgRa69VIIChNkSKJgrJOsDLI9QSiFSH2Bi4wMbGrvFs+X64azev7NfBPq+VOFVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-selection": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.6.tgz", - "integrity": "sha512-0MhJ/LzJe6/vQVxiYJnvNq5CD/MF6Qy0dLp4BEQ6Dz8oOaB0EMXfx1GGeBFSW+3VzgjaUrxK6uECDQj9VLa/Mg==", - "dev": true + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.7.tgz", + "integrity": "sha512-aLaTOjdOJEFPhij59NdNwppvpHBheZFlLbcb7cIZZYLC0he9Wmdd/u4+1NZxlr7ncK+mq1PLmowMPw1GONrIQg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "1.3.12", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-path": "^1" } @@ -3697,25 +4074,29 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.12.tgz", "integrity": "sha512-Tv9tkA4y3UvGQnrHyYAQhf5x/297FuYwotS4UW2TpwLblvRahbyL8r9HFYTJLPfPRqS63hwlqRItjKGmKtJxNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -3724,33 +4105,26 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz", "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-zoom": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, - "node_modules/@types/date-fns": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/date-fns/-/date-fns-2.6.0.tgz", - "integrity": "sha512-9DSw2ZRzV0Tmpa6PHHJbMcZn79HHus+BBBohcOaDzkK/G3zMjDUDYjJIWBFLbkh+1+/IOS0A59BpQfdr37hASg==", - "deprecated": "This is a stub types definition for date-fns (https://github.com/date-fns/date-fns). date-fns provides its own type definitions, so you don't need @types/date-fns installed!", - "dev": true, - "dependencies": { - "date-fns": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -3760,6 +4134,7 @@ "resolved": "https://registry.npmjs.org/@types/draft-convert/-/draft-convert-2.1.8.tgz", "integrity": "sha512-gzHXLnOhDqdDv3ieMCZjqbmP992MBBn1u9HrhrCQ4+sip2pFz7d+fXL4GqaBgFjM/A5+iSNRhkr4ZP4tMR3jWw==", "dev": true, + "license": "MIT", "dependencies": { "@types/draft-js": "*", "@types/react": "*" @@ -3770,6 +4145,7 @@ "resolved": "https://registry.npmjs.org/@types/draft-js/-/draft-js-0.11.18.tgz", "integrity": "sha512-lP6yJ+EKv5tcG1dflWgDKeezdwBa8wJ7KkiNrrHqXuXhl/VGes1SKjEfKHDZqOz19KQbrAhFvNhDPWwnQXYZGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*", "immutable": "~3.7.4" @@ -3780,24 +4156,50 @@ "resolved": "https://registry.npmjs.org/@types/draftjs-to-html/-/draftjs-to-html-0.8.4.tgz", "integrity": "sha512-5FZcjFoJL57N/IttLCTCNI0krX+181oCl5hf76u3TqPkqBAphHrJAO9ReYesx9138kcObaYmpnWC2Yrqxoqd2Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/draft-js": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "license": "MIT" }, "node_modules/@types/geojson-vt": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -3806,14 +4208,16 @@ "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -3823,18 +4227,21 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", - "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==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/jsoneditor": { "version": "9.9.5", "resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-9.9.5.tgz", "integrity": "sha512-+Wex7QCirPcG90WA8/CmvDO21KUjz63/G7Yk52Yx/NhWHw5DyeET/L+wjZHAeNeNCCnMOTEtVX5gc3F4UXwXMQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ace": "*", "ajv": "^6.12.0" @@ -3844,17 +4251,20 @@ "version": "4.17.9", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mapbox__point-geometry": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", + "license": "MIT" }, "node_modules/@types/mapbox__vector-tile": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "license": "MIT", "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", @@ -3865,12 +4275,14 @@ "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "22.7.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.3.tgz", "integrity": "sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA==", + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } @@ -3878,36 +4290,42 @@ "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, "node_modules/@types/pbf": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", + "license": "MIT" }, "node_modules/@types/pikaday": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/@types/pikaday/-/pikaday-1.7.4.tgz", "integrity": "sha512-0KsHVyw5pTG829nqG4IRu7m+BFQlFEBdbE/1i3S5182HeKUKv1uEW0gyEmkJVp5i4IV+9pyh23O83+KpRkSQbw==", + "license": "MIT", "dependencies": { "moment": ">=2.14.0" } }, "node_modules/@types/plotly.js": { - "version": "2.33.4", - "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.33.4.tgz", - "integrity": "sha512-BzAbsJTiUQyALkkYx1D31YZ9YvcU2ag3LlE/iePMo19eDPvM30cbM2EFNIcu31n39EhXj/9G7800XLA8/rfApA==", - "dev": true + "version": "2.35.2", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.35.2.tgz", + "integrity": "sha512-tn0Kp7F6VWiu96jknCvR/PcdIGIATeIK+Z5WXH3bEvG6CRwUNfhy34yBhfPYmTea7mMQxXvTZKGMm6/Y4wxESg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" }, "node_modules/@types/ramda": { "version": "0.30.2", "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.2.tgz", "integrity": "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==", + "license": "MIT", "dependencies": { "types-ramda": "^0.30.1" } @@ -3916,6 +4334,7 @@ "version": "18.3.9", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.9.tgz", "integrity": "sha512-+BpAVyTpJkNWWSSnaLBk6ePpHLOGJKnEQNbINNovPWzvEUyAe3e+/d494QdEh71RekM/qV7lw6jzf1HGrJyAtQ==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -3926,6 +4345,7 @@ "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz", "integrity": "sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3935,6 +4355,7 @@ "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.12.tgz", "integrity": "sha512-pr3uKE3lSvf7GFo1Rn2K3QktiZQFFrSgSGJ/3iMvSOYWt2pPAJ97rVdVfhWxYJZ8prAEXzoP2XX//3qGSQgu7Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*", "@types/reactcss": "*" @@ -3945,6 +4366,7 @@ "resolved": "https://registry.npmjs.org/@types/react-d3-graph/-/react-d3-graph-2.6.5.tgz", "integrity": "sha512-bao1+Zu1qhuFyE7K/Nk9HdmDlz39YdDB2z6TpKhujip4IjoIfE3smL2cIe4pFirL772rVxaJdAARhwok1cB/sA==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3954,6 +4376,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "devOptional": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3963,6 +4386,7 @@ "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.6.3.tgz", "integrity": "sha512-HBQwyGuu/dGXDsWhnQrhH+xcJSsHvjkwfSRjP+YpOsCCWryIuXF78ZCBjpfgO3sCc0Jo8sYp4NOGtqT7Cn3epQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/plotly.js": "*", "@types/react": "*" @@ -3972,6 +4396,7 @@ "version": "7.1.34", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -3984,15 +4409,17 @@ "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", - "dependencies": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, @@ -4001,6 +4428,7 @@ "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.4.tgz", "integrity": "sha512-nhYwlFiYa8M3S+O2T9QO/e1FQUYMr/wJENUdf/O0dhRi1RS/93rjrYQFYdbUqtdFySuhrtnEDX29P6eKOttY+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -4010,29 +4438,26 @@ "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/reactcss": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.12.tgz", - "integrity": "sha512-BrXUQ86/wbbFiZv8h/Q1/Q1XOsaHneYmCb/tHe9+M8XBAAUc2EHfdY0DY22ZZjVSaXr5ix7j+zsqO2eGZub8lQ==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.13.tgz", + "integrity": "sha512-gi3S+aUi6kpkF5vdhUsnkwbiSEIU/BEJyD7kBy2SudWBUuKmJk8AQKE0OVcQQeEy40Azh0lV6uynxlikYIJuwg==", "dev": true, - "dependencies": { + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@types/supercluster": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -4042,128 +4467,104 @@ "resolved": "https://registry.npmjs.org/@types/swagger-ui-react/-/swagger-ui-react-4.18.3.tgz", "integrity": "sha512-Mo/R7IjDVwtiFPs84pWvh5pI9iyNGBjmfielxqbOh2Jv+8WVSDVe8Nu25kb5BOuV2xmGS3o33jr6nwDJMBcX+Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/testing-library__jest-dom": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-6.0.0.tgz", - "integrity": "sha512-bnreXCgus6IIadyHNlN/oI5FfX4dWgvGhOPvpr7zzCYDGAPIfvyIoAozMBINmhmsVuqV0cncejF2y5KC7ScqOg==", - "deprecated": "This is a stub types definition. @testing-library/jest-dom provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "@testing-library/jest-dom": "*" - } - }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", + "license": "MIT" }, "node_modules/@types/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz", + "integrity": "sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/type-utils": "8.19.1", + "@typescript-eslint/utils": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/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, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz", + "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", + "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4171,39 +4572,37 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.1.tgz", + "integrity": "sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/typescript-estree": "8.19.1", + "@typescript-eslint/utils": "8.19.1", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", + "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", "dev": true, + "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4211,46 +4610,30 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", + "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { @@ -4258,6 +4641,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" }, @@ -4266,70 +4650,53 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.1.tgz", + "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/utils/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, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", + "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.19.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", "dev": true, + "license": "MIT", "dependencies": { "@swc/core": "^1.5.7" }, @@ -4342,6 +4709,7 @@ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.1.tgz", "integrity": "sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^0.2.3", @@ -4374,6 +4742,7 @@ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/spy": "2.1.1", "@vitest/utils": "2.1.1", @@ -4389,6 +4758,7 @@ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/spy": "^2.1.0-beta.1", "estree-walker": "^3.0.3", @@ -4416,6 +4786,7 @@ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dev": true, + "license": "MIT", "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -4428,6 +4799,7 @@ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/utils": "2.1.1", "pathe": "^1.1.2" @@ -4441,6 +4813,7 @@ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/pretty-format": "2.1.1", "magic-string": "^0.30.11", @@ -4455,6 +4828,7 @@ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", "dev": true, + "license": "MIT", "dependencies": { "tinyspy": "^3.0.0" }, @@ -4467,6 +4841,7 @@ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.1.tgz", "integrity": "sha512-IIxo2LkQDA+1TZdPLYPclzsXukBWd5dX2CKpGqH8CCt8Wh0ZuDn4+vuQ9qlppEju6/igDGzjWF/zyorfsf+nHg==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/utils": "2.1.1", "fflate": "^0.8.2", @@ -4488,6 +4863,7 @@ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/pretty-format": "2.1.1", "loupe": "^3.1.1", @@ -4498,182 +4874,203 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xobotyi/scrollbar-width": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", - "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", + "license": "MIT" }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause", "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0", "peer": true }, "node_modules/abs-svg-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", - "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==" + "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", + "license": "MIT" }, "node_modules/ace-builds": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.36.2.tgz", - "integrity": "sha512-eqqfbGwx/GKjM/EnFu4QtQ+d2NNBu84MGgxoG8R5iyFpcVeQ4p9YlTL+ZzdEJqhdkASqoqOxCSNNGyB6lvMm+A==" + "version": "1.37.4", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.37.4.tgz", + "integrity": "sha512-niaXM/b7Nm6l/GKpc/jtG0jjExBOkqRN1pZbyV/ngb3GrQQF5fCB2032n5qaaAr7hWSGbc+PGfZ3C0LsmYQptA==", + "license": "BSD-3-Clause" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4681,32 +5078,22 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -4715,6 +5102,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4726,10 +5114,53 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", "peer": true, "peerDependencies": { "ajv": "^6.9.1" @@ -4738,38 +5169,47 @@ "node_modules/almost-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", - "integrity": "sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==" + "integrity": "sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==", + "license": "MIT" }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/apg-lite": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/apg-lite/-/apg-lite-1.0.4.tgz", - "integrity": "sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==" + "integrity": "sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==", + "license": "BSD-2-Clause" }, "node_modules/are-docs-informative": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -4777,38 +5217,34 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-bounds": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", - "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==", + "license": "MIT" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -4821,6 +5257,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4830,6 +5267,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4849,6 +5287,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "license": "MIT", "dependencies": { "array-bounds": "^1.0.0" } @@ -4856,27 +5295,21 @@ "node_modules/array-range": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", - "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==" + "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==", + "license": "MIT" }, "node_modules/array-rearrange": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", - "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==", + "license": "MIT" }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4893,15 +5326,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4911,15 +5345,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4933,6 +5368,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4945,19 +5381,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -4969,34 +5405,30 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/attr-accept": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -5005,6 +5437,7 @@ "version": "3.16.2", "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" } @@ -5014,6 +5447,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -5028,6 +5462,7 @@ "version": "1.7.7", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5039,6 +5474,7 @@ "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-3.0.0.tgz", "integrity": "sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", "dependencies": { "deepmerge": "^2.2.1", "object.omit": "^3.0.0" @@ -5051,6 +5487,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -5064,17 +5501,20 @@ "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==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base16": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", + "license": "MIT" }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -5096,12 +5536,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bignumber.js": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==", + "license": "MIT", "engines": { "node": "*" } @@ -5109,22 +5551,26 @@ "node_modules/binary-search-bounds": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", - "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", + "license": "MIT" }, "node_modules/bit-twiddle": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" + "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==", + "license": "MIT" }, "node_modules/bitmap-sdf": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", - "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==" + "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==", + "license": "MIT" }, "node_modules/bl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "license": "MIT", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -5134,6 +5580,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -5143,6 +5590,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" }, @@ -5151,9 +5599,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -5168,11 +5616,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -5181,72 +5630,64 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytewise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", - "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", - "dependencies": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" - } - }, - "node_modules/bytewise-core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", - "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", - "dependencies": { - "typewise-core": "^1.2" - } + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5259,14 +5700,15 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001664", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", - "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "funding": [ { "type": "opencollective", @@ -5280,12 +5722,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/canvas-fit": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", + "license": "MIT", "dependencies": { "element-size": "^1.1.1" } @@ -5293,13 +5737,15 @@ "node_modules/canvas-hypertxt": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/canvas-hypertxt/-/canvas-hypertxt-1.0.3.tgz", - "integrity": "sha512-+VsMpRr64jYgKq2IeFUNel3vCZH/IzS+iXSHxmUV3IUH5dXlC9xHz4AwtPZisDxZ5MWcuK0V+TXgPKFPiZnxzg==" + "integrity": "sha512-+VsMpRr64jYgKq2IeFUNel3vCZH/IzS+iXSHxmUV3IUH5dXlC9xHz4AwtPZisDxZ5MWcuK0V+TXgPKFPiZnxzg==", + "license": "MIT" }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -5312,30 +5758,27 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5345,6 +5788,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5354,6 +5798,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5364,6 +5809,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 16" } @@ -5372,21 +5818,17 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "license": "Apache-2.0", "optional": true, "dependencies": { "regexp-to-ast": "0.4.0" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=6.0" @@ -5395,17 +5837,20 @@ "node_modules/clamp": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" + "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==", + "license": "MIT" }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -5414,6 +5859,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "license": "MIT", "dependencies": { "color-parse": "^1.3.8" } @@ -5422,35 +5868,44 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", + "license": "MIT", "dependencies": { "color-name": "^1.0.0" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-id": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "license": "MIT", "dependencies": { "clamp": "^1.0.1" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/color-normalize": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "license": "MIT", "dependencies": { "clamp": "^1.0.1", "color-rgba": "^2.1.1", @@ -5461,6 +5916,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", + "license": "MIT", "dependencies": { "color-name": "^1.0.0" } @@ -5469,6 +5925,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "license": "MIT", "dependencies": { "clamp": "^1.0.1", "color-parse": "^1.3.8", @@ -5479,6 +5936,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", + "license": "MIT", "dependencies": { "color-name": "^1.0.0" } @@ -5487,6 +5945,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "license": "MIT", "dependencies": { "hsluv": "^0.0.3", "mumath": "^3.3.4" @@ -5496,6 +5955,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5507,6 +5967,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5515,13 +5976,15 @@ "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" }, "node_modules/comment-parser": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.0.0" } @@ -5530,7 +5993,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -5539,6 +6003,7 @@ "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5549,39 +6014,35 @@ "node_modules/convert-source-map": { "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==" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" } }, "node_modules/core-js": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-pure": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", - "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.40.0.tgz", + "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -5590,12 +6051,14 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -5610,21 +6073,24 @@ "node_modules/country-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", - "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==" + "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==", + "license": "MIT" }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "node-fetch": "^2.7.0" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.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", @@ -5638,6 +6104,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", "dependencies": { "tiny-invariant": "^1.0.6" } @@ -5646,6 +6113,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", + "license": "MIT", "dependencies": { "css-font-size-keywords": "^1.0.0", "css-font-stretch-keywords": "^1.0.1", @@ -5661,32 +6129,38 @@ "node_modules/css-font-size-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", - "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==" + "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==", + "license": "MIT" }, "node_modules/css-font-stretch-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", - "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==" + "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==", + "license": "MIT" }, "node_modules/css-font-style-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", - "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==" + "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==", + "license": "MIT" }, "node_modules/css-font-weight-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", - "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==" + "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==", + "license": "MIT" }, "node_modules/css-global-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", - "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==" + "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==", + "license": "MIT" }, "node_modules/css-in-js-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", "dependencies": { "hyphenate-style-name": "^1.0.3" } @@ -5695,6 +6169,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -5729,6 +6204,7 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5739,12 +6215,14 @@ "node_modules/css-system-font-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", - "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==" + "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==", + "license": "MIT" }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -5757,6 +6235,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5764,17 +6243,20 @@ "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" }, "node_modules/csscolorparser": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "license": "MIT" }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -5783,26 +6265,37 @@ } }, "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", "dev": true, + "license": "MIT", "dependencies": { - "rrweb-cssom": "^0.7.1" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" }, "engines": { "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/d": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", "dependencies": { "es5-ext": "^0.10.64", "type": "^2.7.2" @@ -5815,6 +6308,7 @@ "version": "5.16.0", "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1", "d3-axis": "1", @@ -5852,17 +6346,20 @@ "node_modules/d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "license": "BSD-3-Clause" }, "node_modules/d3-axis": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-brush": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-drag": "1", @@ -5875,6 +6372,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1", "d3-path": "1" @@ -5883,17 +6381,20 @@ "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", + "license": "BSD-3-Clause" }, "node_modules/d3-color": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==", + "license": "BSD-3-Clause" }, "node_modules/d3-contour": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^1.1.1" } @@ -5901,12 +6402,14 @@ "node_modules/d3-dispatch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" }, "node_modules/d3-drag": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-selection": "1" @@ -5916,6 +6419,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "license": "BSD-3-Clause", "dependencies": { "commander": "2", "iconv-lite": "0.4", @@ -5936,12 +6440,14 @@ "node_modules/d3-ease": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-fetch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "license": "BSD-3-Clause", "dependencies": { "d3-dsv": "1" } @@ -5950,6 +6456,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "license": "BSD-3-Clause", "dependencies": { "d3-collection": "1", "d3-dispatch": "1", @@ -5960,12 +6467,14 @@ "node_modules/d3-format": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-geo": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1" } @@ -5974,6 +6483,7 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", + "license": "BSD-3-Clause", "dependencies": { "commander": "2", "d3-array": "1", @@ -5991,12 +6501,14 @@ "node_modules/d3-hierarchy": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-interpolate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1" } @@ -6004,27 +6516,32 @@ "node_modules/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" }, "node_modules/d3-polygon": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-quadtree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==", + "license": "BSD-3-Clause" }, "node_modules/d3-random": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-scale": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -6038,6 +6555,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1", "d3-interpolate": "1" @@ -6046,12 +6564,14 @@ "node_modules/d3-selection": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==", + "license": "BSD-3-Clause" }, "node_modules/d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" } @@ -6059,12 +6579,14 @@ "node_modules/d3-time": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==", + "license": "BSD-3-Clause" }, "node_modules/d3-time-format": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-time": "1" } @@ -6072,12 +6594,14 @@ "node_modules/d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" }, "node_modules/d3-transition": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1", "d3-dispatch": "1", @@ -6090,12 +6614,14 @@ "node_modules/d3-voronoi": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==", + "license": "BSD-3-Clause" }, "node_modules/d3-zoom": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-drag": "1", @@ -6109,6 +6635,7 @@ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -6118,14 +6645,15 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6135,29 +6663,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -6172,6 +6702,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -6181,6 +6712,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -6197,28 +6729,15 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true, + "license": "MIT" }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6227,6 +6746,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -6235,12 +6755,14 @@ "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/deepmerge": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6250,6 +6772,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6267,6 +6790,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -6283,6 +6807,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6291,6 +6816,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -6300,6 +6826,7 @@ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6307,39 +6834,20 @@ "node_modules/detect-kerning": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", - "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==", + "license": "MIT" }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dom-accessibility-api": { @@ -6347,26 +6855,30 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "node_modules/dompurify": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.7.tgz", - "integrity": "sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q==" + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.8.tgz", + "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/draft-convert": { "version": "2.1.13", "resolved": "https://registry.npmjs.org/draft-convert/-/draft-convert-2.1.13.tgz", "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.5.5", "immutable": "~3.7.4", @@ -6382,6 +6894,7 @@ "version": "0.11.7", "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz", "integrity": "sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg==", + "license": "MIT", "dependencies": { "fbjs": "^2.0.0", "immutable": "~3.7.4", @@ -6395,12 +6908,14 @@ "node_modules/draftjs-to-html": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/draftjs-to-html/-/draftjs-to-html-0.9.1.tgz", - "integrity": "sha512-fFstE6+IayaVFBEvaFt/wN8vdj8FsTRzij7dy7LI9QIwf5LgfHFi9zSpvCg+feJ2tbYVqHxUkjcibwpsTpgFVQ==" + "integrity": "sha512-fFstE6+IayaVFBEvaFt/wN8vdj8FsTRzij7dy7LI9QIwf5LgfHFi9zSpvCg+feJ2tbYVqHxUkjcibwpsTpgFVQ==", + "license": "MIT" }, "node_modules/drange": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -6409,6 +6924,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", + "license": "MIT", "dependencies": { "abs-svg-path": "~0.1.1", "normalize-svg-path": "~0.1.0" @@ -6418,19 +6934,37 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==", + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/dup": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", - "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==" + "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==", + "license": "MIT" }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -6441,28 +6975,33 @@ "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.29", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", - "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==" + "version": "1.5.80", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz", + "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==", + "license": "ISC" }, "node_modules/element-size": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" + "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==", + "license": "MIT" }, "node_modules/elementary-circuits-directed-graph": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "license": "MIT", "dependencies": { "strongly-connected-components": "^1.0.1" } @@ -6471,20 +7010,23 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -6499,6 +7041,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" }, @@ -6510,6 +7053,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -6518,62 +7062,69 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -6583,13 +7134,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6599,45 +7148,51 @@ "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" } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.1.tgz", + "integrity": "sha512-BPOBuyUF9QIVhuNLhbToCLHP6+0MHwZ7xLBkPPCZqK4JmpJgGnv10035STzzQwFpqdzNFMB3irvDI63IagvDwA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -6646,14 +7201,16 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6664,19 +7221,21 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -6690,6 +7249,7 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "hasInstallScript": true, + "license": "ISC", "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -6704,6 +7264,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", "dependencies": { "d": "1", "es5-ext": "^0.10.35", @@ -6714,6 +7275,7 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", "dependencies": { "d": "^1.0.2", "ext": "^1.7.0" @@ -6726,6 +7288,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", "dependencies": { "d": "1", "es5-ext": "^0.10.46", @@ -6739,6 +7302,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6775,6 +7339,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6783,6 +7348,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6794,6 +7360,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -6814,89 +7381,98 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", + "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", "dev": true, + "license": "MIT", "bin": { - "eslint-config-prettier": "bin/cli.js" + "eslint-config-prettier": "build/bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.10.0.tgz", - "integrity": "sha512-BEli0k8E0dzhJairAllwlkGnyYDZVKNn4WDmyKy+v6J5qGNuofjzxwNUi+55BOGmyO9mKBhqaidwGy+dxndn/Q==", + "version": "50.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.1.tgz", + "integrity": "sha512-UWyaYi6iURdSfdVVqvfOs2vdCVz0J40O/z/HTsv2sFjdjmdlUI/qlKLOTmwbPQ2tAfQnE5F9vqx+B+poF71DBQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.46.0", + "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.3.5", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports": "^2.1.1", "semver": "^7.6.3", @@ -6915,6 +7491,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" }, @@ -6927,6 +7504,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.6.1.tgz", "integrity": "sha512-9aIz8q3OaMr1/uQmCGCWySjTs5nEXUJexNegz/8lluNcZbEl82Ag1Vyr1Hu3oIveRW1NbXDPs6nu4zu9mbrmWA==", "dev": true, + "license": "MIT", "dependencies": { "requireindex": "^1.2.0" } @@ -6936,6 +7514,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" @@ -6962,28 +7541,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz", - "integrity": "sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==", + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { @@ -6994,24 +7574,26 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", - "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.18.tgz", + "integrity": "sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw==", "dev": true, + "license": "MIT", "peerDependencies": { - "eslint": ">=7" + "eslint": ">=8.40" } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { @@ -7019,28 +7601,18 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint-plugin-react/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7053,6 +7625,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7066,166 +7639,87 @@ } }, "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==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "*" } }, - "node_modules/eslint/node_modules/color-convert": { + "node_modules/esniff": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" }, "engines": { "node": ">=0.10" } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7235,6 +7729,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7248,6 +7743,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -7259,6 +7755,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7270,6 +7767,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -7279,6 +7777,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -7287,6 +7786,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -7295,6 +7795,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", "dependencies": { "d": "1", "es5-ext": "~0.10.14" @@ -7304,50 +7805,25 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", "dependencies": { "type": "^2.7.2" } }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/falafel": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "license": "MIT", "dependencies": { "acorn": "^7.1.1", "isarray": "^2.0.1" @@ -7360,6 +7836,7 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -7370,25 +7847,28 @@ "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==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "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-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -7399,6 +7879,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" }, @@ -7410,6 +7891,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "license": "MIT", "dependencies": { "is-string-blank": "^1.0.1" } @@ -7417,34 +7899,56 @@ "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" }, "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "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-shallow-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" }, + "node_modules/fast-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", + "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, "node_modules/fastest-stable-stringify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", - "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", + "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -7453,6 +7957,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", "dependencies": { "format": "^0.2.0" }, @@ -7465,6 +7970,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "license": "BSD-3-Clause", "dependencies": { "fbjs": "^3.0.0" } @@ -7473,6 +7979,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -7484,9 +7991,9 @@ } }, "node_modules/fbemitter/node_modules/ua-parser-js": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", "funding": [ { "type": "opencollective", @@ -7501,6 +8008,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "bin": { "ua-parser-js": "script/cli.js" }, @@ -7512,6 +8020,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz", "integrity": "sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ==", + "license": "MIT", "dependencies": { "core-js": "^3.6.4", "cross-fetch": "^3.0.4", @@ -7526,30 +8035,49 @@ "node_modules/fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-selector": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "license": "MIT", "dependencies": { "tslib": "^2.4.0" }, @@ -7562,6 +8090,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" }, @@ -7572,12 +8101,14 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7590,29 +8121,31 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/flatten-vertex-data": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "license": "MIT", "dependencies": { "dtype": "^2.0.0" } @@ -7621,6 +8154,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "license": "BSD-3-Clause", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -7633,6 +8167,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -7644,9 +8179,9 @@ } }, "node_modules/flux/node_modules/ua-parser-js": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", "funding": [ { "type": "opencollective", @@ -7661,6 +8196,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "bin": { "ua-parser-js": "script/cli.js" }, @@ -7678,6 +8214,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7691,6 +8228,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "license": "MIT", "dependencies": { "css-font": "^1.0.0" } @@ -7699,6 +8237,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "license": "MIT", "dependencies": { "css-font": "^1.2.0" } @@ -7708,6 +8247,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -7717,6 +8257,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -7729,9 +8270,10 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7753,29 +8295,19 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "optional": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7788,20 +8320,24 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -7815,6 +8351,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7823,6 +8360,7 @@ "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==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -7830,33 +8368,32 @@ "node_modules/geojson-vt": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", + "license": "ISC" }, "node_modules/get-canvas-context": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", - "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==" - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } + "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==", + "license": "MIT" }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7865,10 +8402,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7877,14 +8429,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -7893,34 +8446,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "optional": true - }, "node_modules/gl-mat4": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", - "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==", + "license": "Zlib" }, "node_modules/gl-matrix": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", + "license": "MIT" }, "node_modules/gl-text": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.4.0.tgz", "integrity": "sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ==", + "license": "MIT", "dependencies": { "bit-twiddle": "^1.0.2", "color-normalize": "^1.5.0", @@ -7945,6 +8487,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", + "license": "MIT", "dependencies": { "is-browser": "^2.0.1", "is-firefox": "^1.0.3", @@ -7956,21 +8499,21 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7981,6 +8524,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" }, @@ -7992,34 +8536,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==", + "license": "BSD-2-Clause", "peer": true }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/global-prefix": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "license": "MIT", "dependencies": { "ini": "^4.1.3", "kind-of": "^6.0.3", @@ -8033,6 +8557,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", "engines": { "node": ">=16" } @@ -8041,6 +8566,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -8052,11 +8578,16 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -8064,6 +8595,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -8075,30 +8607,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glsl-inject-defines": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "license": "MIT", "dependencies": { "glsl-token-inject-block": "^1.0.0", "glsl-token-string": "^1.0.1", @@ -8109,6 +8622,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "license": "MIT", "dependencies": { "resolve": "^0.6.1", "xtend": "^2.1.2" @@ -8117,7 +8631,8 @@ "node_modules/glsl-resolve/node_modules/resolve": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", + "license": "MIT" }, "node_modules/glsl-resolve/node_modules/xtend": { "version": "2.2.0", @@ -8130,12 +8645,14 @@ "node_modules/glsl-token-assignments": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", - "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==", + "license": "MIT" }, "node_modules/glsl-token-defines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "license": "MIT", "dependencies": { "glsl-tokenizer": "^2.0.0" } @@ -8143,12 +8660,14 @@ "node_modules/glsl-token-depth": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", - "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==", + "license": "MIT" }, "node_modules/glsl-token-descope": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "license": "MIT", "dependencies": { "glsl-token-assignments": "^2.0.0", "glsl-token-depth": "^1.1.0", @@ -8159,32 +8678,38 @@ "node_modules/glsl-token-inject-block": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", - "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==", + "license": "MIT" }, "node_modules/glsl-token-properties": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", - "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==", + "license": "MIT" }, "node_modules/glsl-token-scope": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", - "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==", + "license": "MIT" }, "node_modules/glsl-token-string": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", - "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==", + "license": "MIT" }, "node_modules/glsl-token-whitespace-trim": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", - "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==", + "license": "MIT" }, "node_modules/glsl-tokenizer": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "license": "MIT", "dependencies": { "through2": "^0.6.3" } @@ -8192,12 +8717,14 @@ "node_modules/glsl-tokenizer/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" }, "node_modules/glsl-tokenizer/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -8208,12 +8735,14 @@ "node_modules/glsl-tokenizer/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" }, "node_modules/glsl-tokenizer/node_modules/through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "license": "MIT", "dependencies": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -8223,6 +8752,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "license": "MIT", "dependencies": { "bl": "^2.2.1", "concat-stream": "^1.5.2", @@ -8248,6 +8778,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "license": "MIT", "dependencies": { "glsl-inject-defines": "^1.0.1", "glsl-token-defines": "^1.0.0", @@ -8265,6 +8796,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "license": "ISC", "dependencies": { "@choojs/findup": "^0.2.0", "events": "^3.2.0", @@ -8277,20 +8809,22 @@ } }, "node_modules/goober": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz", - "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", + "license": "MIT", "peerDependencies": { "csstype": "^3.0.10" } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8299,23 +8833,27 @@ "node_modules/graceful-fs": { "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==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "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/grid-index": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", + "license": "ISC" }, "node_modules/handsontable": { "version": "14.5.0", "resolved": "https://registry.npmjs.org/handsontable/-/handsontable-14.5.0.tgz", "integrity": "sha512-fxCjDZS4z2LFwrmHXqtEKIcfrPxoD8+5AmX7r3pEYp2rjIhmtYKA45DFQ/3PP8PYvSFW8BGR58ZaKecMpGfJXg==", + "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@handsontable/pikaday": "^1.0.0", "@types/pikaday": "1.7.4", @@ -8330,26 +8868,32 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-hover": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", + "license": "MIT", "dependencies": { "is-browser": "^2.0.1" } @@ -8358,6 +8902,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "license": "MIT", "dependencies": { "is-browser": "^2.0.1" } @@ -8367,6 +8912,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -8375,10 +8921,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -8387,10 +8937,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8403,6 +8954,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" }, @@ -8417,6 +8969,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -8428,6 +8981,7 @@ "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -8437,6 +8991,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", @@ -8453,6 +9008,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz", "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==", + "license": "MIT", "engines": { "node": ">= 16", "npm": ">= 8" @@ -8462,6 +9018,7 @@ "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", "engines": { "node": "*" } @@ -8470,6 +9027,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.6" } @@ -8478,6 +9036,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -8485,23 +9044,27 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/hsluv": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", - "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==" + "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==", + "license": "MIT" }, "node_modules/html-element-attributes": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/html-element-attributes/-/html-element-attributes-1.3.1.tgz", - "integrity": "sha512-UrRKgp5sQmRnDy4TEwAUsu14XBUlzKB8U3hjIYDjcZ3Hbp86Jtftzxfgrv6E/ii/h78tsaZwAnAE8HwnHr0dPA==" + "integrity": "sha512-UrRKgp5sQmRnDy4TEwAUsu14XBUlzKB8U3hjIYDjcZ3Hbp86Jtftzxfgrv6E/ii/h78tsaZwAnAE8HwnHr0dPA==", + "license": "MIT" }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^3.1.1" }, @@ -8513,12 +9076,14 @@ "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/html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", "dependencies": { "void-elements": "3.1.0" } @@ -8528,6 +9093,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" @@ -8537,12 +9103,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -8554,6 +9121,7 @@ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true, + "license": "MIT", "bin": { "husky": "bin.js" }, @@ -8568,6 +9136,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/hyperformula/-/hyperformula-2.7.1.tgz", "integrity": "sha512-mpVF5zOyNpksZzgTaCQyRAzdC/X43+taz5x1n7zNbs/PUUv0AuLmsy2yfihCr+vihUzN/pk+gXBbOfNpXKOpgA==", + "license": "GPL-3.0-only", "optional": true, "dependencies": { "chevrotain": "^6.5.0", @@ -8577,7 +9146,8 @@ "node_modules/hyphenate-style-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", - "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" }, "node_modules/i18next": { "version": "23.15.1", @@ -8597,6 +9167,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -8605,6 +9176,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.0.tgz", "integrity": "sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -8613,6 +9185,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz", "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==", + "license": "MIT", "dependencies": { "cross-fetch": "4.0.0" } @@ -8621,6 +9194,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } @@ -8629,6 +9203,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -8640,6 +9215,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -8664,13 +9240,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "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" } @@ -8679,6 +9257,7 @@ "version": "10.1.1", "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -8688,6 +9267,7 @@ "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.8.0" } @@ -8696,6 +9276,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8712,6 +9293,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -8721,30 +9303,22 @@ "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" } }, - "node_modules/inflight": { - "version": "1.0.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.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "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": "4.1.3", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -8753,19 +9327,21 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", "dependencies": { "css-in-js-utils": "^3.1.0" } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8775,6 +9351,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -8783,6 +9360,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8792,6 +9370,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" @@ -8802,13 +9381,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -8820,15 +9401,20 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", + "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8838,25 +9424,30 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8868,13 +9459,15 @@ "node_modules/is-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", - "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==", + "license": "MIT" }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8883,9 +9476,10 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -8897,11 +9491,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -8912,12 +9509,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8930,6 +9529,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8939,6 +9539,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -8951,17 +9552,22 @@ "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" } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8971,6 +9577,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "license": "MIT", "engines": { "node": ">=0.10.0" }, @@ -8982,6 +9589,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8991,17 +9599,22 @@ "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" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9015,6 +9628,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" }, @@ -9026,6 +9640,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9035,6 +9650,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9044,6 +9660,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9054,36 +9671,28 @@ "node_modules/is-mobile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", - "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", "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" } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9096,23 +9705,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9121,6 +9723,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -9132,16 +9735,20 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "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-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9155,6 +9762,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9163,12 +9771,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9178,12 +9787,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9195,20 +9806,25 @@ "node_modules/is-string-blank": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", - "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==", + "license": "MIT" }, "node_modules/is-svg-path": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", - "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==" + "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==", + "license": "MIT" }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9218,12 +9834,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -9237,6 +9854,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9245,25 +9863,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9275,18 +9898,21 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" }, "node_modules/isexe": { "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/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9296,6 +9922,7 @@ "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" } @@ -9305,6 +9932,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", @@ -9314,32 +9942,12 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", @@ -9354,6 +9962,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -9363,16 +9972,21 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -9380,6 +9994,7 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -9393,12 +10008,14 @@ "node_modules/javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "license": "MIT" }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -9409,19 +10026,11 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -9437,6 +10046,7 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", "engines": { "node": ">= 0.6.0" } @@ -9445,6 +10055,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", "engines": { "node": ">=14" } @@ -9452,17 +10063,20 @@ "node_modules/js-file-download": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz", - "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==" + "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -9471,10 +10085,11 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } @@ -9484,6 +10099,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dev": true, + "license": "MIT", "dependencies": { "cssstyle": "^4.1.0", "data-urls": "^5.0.0", @@ -9520,52 +10136,60 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "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": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/json-source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", - "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==", + "license": "MIT" }, "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/json-stringify-pretty-compact": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "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==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -9577,6 +10201,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-10.1.0.tgz", "integrity": "sha512-s+BP/x9Rx9ukNyTjeWCvIAGTEvXwCw6l4NX4mlxXfkK87F1ZgsesHbD9SsyZDLP27dvcFgr9H/j1jy/Bzzk07Q==", + "license": "Apache-2.0", "dependencies": { "ace-builds": "^1.35.0", "ajv": "^6.12.6", @@ -9590,9 +10215,10 @@ } }, "node_modules/jsonrepair": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.8.1.tgz", - "integrity": "sha512-5wnjaO53EJOhfLFY92nvBz2B9gqF9ql/D4HKUb1WOSBaqtVcAifFfmurblnhCJn/ySqKFA8U3n7nhGMAu/hEjQ==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.11.2.tgz", + "integrity": "sha512-ejydGcTq0qKk1r0NUBwjtvswbPFhs19+QEfwSeGwB8KJZ59W7/AOFmQh04c68mkJ+2hGk+OkOmkr2bKG4tGlLQ==", + "license": "ISC", "bin": { "jsonrepair": "bin/cli.js" } @@ -9602,6 +10228,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -9616,6 +10243,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", "engines": { "node": ">=18" } @@ -9623,13 +10251,15 @@ "node_modules/kdbush": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", - "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" }, "node_modules/keyv": { "version": "4.5.4", "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" } @@ -9638,6 +10268,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9647,6 +10278,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" @@ -9658,12 +10290,14 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", "peer": true, "engines": { "node": ">=6.11.5" @@ -9673,6 +10307,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -9686,37 +10321,44 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" }, "node_modules/lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", + "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==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -9725,18 +10367,17 @@ } }, "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } + "license": "MIT" }, "node_modules/lowlight": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" @@ -9750,6 +10391,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -9759,16 +10401,18 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, + "license": "MIT", "peer": true, "bin": { "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -9778,6 +10422,7 @@ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", @@ -9789,6 +10434,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" }, @@ -9804,6 +10450,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" }, @@ -9815,6 +10462,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "license": "MIT", "dependencies": { "once": "~1.3.0" } @@ -9823,6 +10471,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -9831,6 +10480,7 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", + "license": "SEE LICENSE IN LICENSE.txt", "peer": true, "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", @@ -9864,6 +10514,7 @@ "version": "4.7.1", "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", + "license": "BSD-3-Clause", "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", @@ -9903,37 +10554,44 @@ "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", - "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", + "license": "BSD-2-Clause" }, "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" }, "node_modules/maplibre-gl/node_modules/earcut": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", - "integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz", + "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==", + "license": "ISC" }, "node_modules/maplibre-gl/node_modules/geojson-vt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", + "license": "ISC" }, "node_modules/maplibre-gl/node_modules/potpack": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", - "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==", + "license": "ISC" }, "node_modules/maplibre-gl/node_modules/quickselect": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" }, "node_modules/maplibre-gl/node_modules/supercluster": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "license": "ISC", "dependencies": { "kdbush": "^4.0.2" } @@ -9941,12 +10599,14 @@ "node_modules/maplibre-gl/node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", "peer": true, "bin": { "marked": "bin/marked.js" @@ -9958,12 +10618,14 @@ "node_modules/material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", + "license": "ISC" }, "node_modules/material-react-table": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-3.0.1.tgz", "integrity": "sha512-RP+bnpsOAH5j6zwP04u9HB37fyqbd6mVv9mkT4IUJC3e3gEqixZmkNdJMVM1ZVHoq7yIaM381xf22mpBVe0IaA==", + "license": "MIT", "dependencies": { "@tanstack/match-sorter-utils": "8.19.4", "@tanstack/react-table": "8.20.5", @@ -9987,10 +10649,21 @@ "react-dom": ">=18.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/math-log2": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9998,17 +10671,20 @@ "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT", "peer": true }, "node_modules/merge2": { @@ -10016,6 +10692,7 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -10025,6 +10702,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10033,10 +10711,24 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10045,6 +10737,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -10052,23 +10745,12 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10077,6 +10759,7 @@ "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", "integrity": "sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==", + "license": "MIT", "dependencies": { "lodash": "^4.15.0" }, @@ -10088,6 +10771,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10102,6 +10786,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" } @@ -10111,25 +10796,22 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "node_modules/mobius1-selectr": { "version": "2.4.13", "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", - "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" + "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==", + "license": "MIT" }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", "engines": { "node": "*" } @@ -10138,6 +10820,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", + "license": "MIT", "dependencies": { "mouse-event": "^1.0.0" } @@ -10145,17 +10828,20 @@ "node_modules/mouse-event": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==" + "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==", + "license": "MIT" }, "node_modules/mouse-event-offset": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", - "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==" + "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==", + "license": "MIT" }, "node_modules/mouse-wheel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", + "license": "MIT", "dependencies": { "right-now": "^1.0.0", "signum": "^1.0.0", @@ -10167,6 +10853,7 @@ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -10174,13 +10861,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/mumath": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", "integrity": "sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==", "deprecated": "Redundant dependency in your project.", + "license": "Unlicense", "dependencies": { "almost-equal": "^1.1.0" } @@ -10188,18 +10877,14 @@ "node_modules/murmurhash-js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" - }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" }, "node_modules/nano-css": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "license": "Unlicense", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "css-tree": "^1.1.2", @@ -10216,20 +10901,22 @@ } }, "node_modules/nano-css/node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.5.tgz", + "integrity": "sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==", + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10237,27 +10924,24 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "optional": true - }, "node_modules/native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==" + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", + "license": "MIT" }, "node_modules/natural-compare": { "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/needle": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "license": "MIT", "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -10274,6 +10958,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -10282,12 +10967,14 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT", "peer": true }, "node_modules/neotraverse": { "version": "0.6.18", "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -10295,36 +10982,24 @@ "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.0.tgz", + "integrity": "sha512-8VOpLHFrOQlAH+qA0ZzuGRlALRA6/LVh8QJldbrC4DY0hXoMP0l4Acq8TzFC018HztWiRqyCEj2aTWY2UvnJUg==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } }, "node_modules/node-domexception": { "version": "1.0.0", @@ -10340,6 +11015,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -10348,6 +11024,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10367,6 +11044,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch-commonjs/-/node-fetch-commonjs-3.3.2.tgz", "integrity": "sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==", + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -10382,36 +11060,54 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" }, "node_modules/normalize-svg-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", - "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==" + "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", + "license": "MIT" }, "node_modules/notistack": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/notistack/-/notistack-3.0.1.tgz", "integrity": "sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA==", + "license": "MIT", "dependencies": { "clsx": "^1.1.0", "goober": "^2.0.33" @@ -10433,6 +11129,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -10441,6 +11138,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", + "license": "MIT", "dependencies": { "is-finite": "^1.0.1" }, @@ -10452,6 +11150,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", + "license": "MIT", "dependencies": { "bignumber.js": "^8.0.1" }, @@ -10460,24 +11159,27 @@ } }, "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", - "dev": true + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true, + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10490,19 +11192,23 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -10517,6 +11223,7 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10531,6 +11238,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10548,6 +11256,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", + "license": "MIT", "dependencies": { "is-extendable": "^1.0.0" }, @@ -10556,12 +11265,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -10576,27 +11287,30 @@ "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" } }, "node_modules/openapi-path-templating": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-1.6.0.tgz", - "integrity": "sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.1.0.tgz", + "integrity": "sha512-fLs5eJmLyU8wPRz+JSH5uLE7TE4Ohg6VHOtj0C0AlD3GTCCcw2LgKW6MSN1A8ZBKHEg2O4/d02knmVU1nvGAKQ==", + "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" } }, "node_modules/openapi-server-url-templating": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.1.0.tgz", - "integrity": "sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", + "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.3" + "apg-lite": "^1.0.4" }, "engines": { "node": ">=12.20.0" @@ -10607,6 +11321,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", @@ -10619,10 +11334,29 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10637,6 +11371,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -10651,12 +11386,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -10667,12 +11404,14 @@ "node_modules/parenthesis": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", - "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" + "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==", + "license": "MIT" }, "node_modules/parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -10691,6 +11430,7 @@ "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", "dev": true, + "license": "Apache-2.0 AND MIT", "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" @@ -10703,6 +11443,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -10720,6 +11461,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "license": "MIT", "dependencies": { "pick-by-alias": "^1.2.0" } @@ -10727,20 +11469,23 @@ "node_modules/parse-svg-path": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==" + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "license": "MIT" }, "node_modules/parse-unit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==" + "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==", + "license": "MIT" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -10750,24 +11495,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "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" } @@ -10775,13 +11513,15 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -10797,12 +11537,14 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -10811,13 +11553,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.16" } @@ -10826,6 +11570,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" @@ -10837,25 +11582,29 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" }, "node_modules/pick-by-alias": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", - "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==" + "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==", + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -10864,17 +11613,20 @@ "node_modules/picomodal": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz", - "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==" + "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==", + "license": "MIT" }, "node_modules/pikaday": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.8.2.tgz", - "integrity": "sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew==" + "integrity": "sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew==", + "license": "(0BSD OR MIT)" }, "node_modules/plotly.js": { "version": "2.35.2", "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.35.2.tgz", "integrity": "sha512-s0knlWzRvLQXxzf3JQ6qbm8FpwKuMjkr+6r04f8/yCEByAQ+I0jkUzY/hSGRGb+u7iljTh9hgpEiiJP90vjyeQ==", + "license": "MIT", "dependencies": { "@plotly/d3": "3.8.2", "@plotly/d3-sankey": "0.7.2", @@ -10934,6 +11686,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -10944,26 +11697,29 @@ "node_modules/point-in-polygon": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", + "license": "MIT" }, "node_modules/polybooljs": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.2.tgz", - "integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==" + "integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==", + "license": "MIT" }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.0.tgz", + "integrity": "sha512-27VKOqrYfPncKA2NrFOVhP5MGAfHKLYn/Q0mz9cNQyRAKYi3VNHwYU2qKKqPCqgBmeeJ0uAFB56NumXZ5ZReXg==", "funding": [ { "type": "opencollective", @@ -10978,9 +11734,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -10991,6 +11748,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -10999,12 +11757,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -11015,11 +11774,12 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -11032,6 +11792,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -11043,9 +11804,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11057,53 +11819,31 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/potpack": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" }, "node_modules/prelude-ls": { "version": "1.2.1", "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.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -11119,6 +11859,7 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -11131,6 +11872,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^5.0.1", @@ -11146,6 +11888,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -11159,12 +11902,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11173,6 +11918,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "license": "MIT", "dependencies": { "lodash.merge": "^4.6.2", "needle": "^2.5.2", @@ -11183,6 +11929,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -11190,12 +11937,14 @@ "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/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", "dependencies": { "asap": "~2.0.3" } @@ -11204,6 +11953,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -11213,12 +11963,14 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", "dependencies": { "xtend": "^4.0.0" }, @@ -11230,27 +11982,20 @@ "node_modules/protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "license": "MIT" }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11258,12 +12003,14 @@ "node_modules/pure-color": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", + "license": "MIT" }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -11283,17 +12030,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quickselect": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", "dependencies": { "performance-now": "^2.1.0" } @@ -11301,12 +12051,14 @@ "node_modules/raf-schd": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" }, "node_modules/ramda": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -11316,6 +12068,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-5.1.0.tgz", "integrity": "sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.3" }, @@ -11331,6 +12084,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "license": "MIT", "dependencies": { "drange": "^1.0.2", "ret": "^0.2.0" @@ -11343,44 +12097,16 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -11392,6 +12118,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "license": "MIT", "dependencies": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -11403,6 +12130,8 @@ "version": "13.1.1", "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "deprecated": "react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.9.2", "css-box-model": "^1.2.0", @@ -11420,12 +12149,14 @@ "node_modules/react-beautiful-dnd/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/react-beautiful-dnd/node_modules/react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -11450,6 +12181,7 @@ "version": "2.19.3", "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "license": "MIT", "dependencies": { "@icons/material": "^0.2.4", "lodash": "^4.17.15", @@ -11467,6 +12199,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "license": "MIT", "dependencies": { "copy-to-clipboard": "^3.3.1", "prop-types": "^15.8.1" @@ -11479,6 +12212,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-d3-graph/-/react-d3-graph-2.6.0.tgz", "integrity": "sha512-U72didZuPuYEqAi1n2bJvnph+9MviIw2x9I0eoxb1IKk3cyEwsJV96n3RL72z/7HDsa1FOvDKuOJE7ujSNZB/Q==", + "license": "MIT", "engines": { "node": ">=8.9.0" }, @@ -11491,6 +12225,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.3.0.tgz", "integrity": "sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==", + "license": "MIT", "dependencies": { "lodash.debounce": "^4", "prop-types": "^15.8.1" @@ -11503,6 +12238,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -11515,6 +12251,7 @@ "version": "14.2.3", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", "file-selector": "^0.6.0", @@ -11531,6 +12268,7 @@ "version": "0.0.21", "resolved": "https://registry.npmjs.org/react-easy-swipe/-/react-easy-swipe-0.0.21.tgz", "integrity": "sha512-OeR2jAxdoqUMHIn/nS9fgreI5hSpgGoL5ezdal4+oO7YSSgJR8ga+PkYGJrSrJ9MKlPcQjMQXnketrD7WNmNsg==", + "license": "MIT", "peer": true, "dependencies": { "prop-types": "^15.5.8" @@ -11543,6 +12281,7 @@ "version": "7.53.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz", "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==", + "license": "MIT", "engines": { "node": ">=18.0.0" }, @@ -11558,6 +12297,7 @@ "version": "1.4.6", "resolved": "https://registry.npmjs.org/react-html-attributes/-/react-html-attributes-1.4.6.tgz", "integrity": "sha512-uS3MmThNKFH2EZUQQw4k5pIcU7XIr208UE5dktrj/GOH1CMagqxDl4DCLpt3o2l9x+IB5nVYBeN3Cr4IutBXAg==", + "license": "MIT", "dependencies": { "html-element-attributes": "^1.0.0" } @@ -11566,6 +12306,7 @@ "version": "15.0.2", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.2.tgz", "integrity": "sha512-z0W3/RES9Idv3MmJUcf0mDNeeMOUXe+xoL0kPfQPbDoZHmni/XsIoq5zgT2MCFUiau283GuBUK578uD/mkAbLQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "html-parse-stringify": "^3.0.1" @@ -11587,6 +12328,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz", "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==", + "license": "MIT", "dependencies": { "invariant": "^2.2.2" }, @@ -11598,6 +12340,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz", "integrity": "sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==", + "license": "MIT", "peerDependencies": { "immutable": ">= 2 || >= 4.0.0-rc", "react": ">= 16.6", @@ -11608,6 +12351,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.2.tgz", "integrity": "sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==", + "license": "MIT", "peerDependencies": { "react": "^16.8.4 || ^17.0.0 || ^18.0.0" } @@ -11615,12 +12359,14 @@ "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, "node_modules/react-json-view": { "version": "1.21.3", "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "license": "MIT", "dependencies": { "flux": "^4.0.1", "react-base16-styling": "^0.6.0", @@ -11635,21 +12381,24 @@ "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" }, "node_modules/react-number-format": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.2.tgz", - "integrity": "sha512-cg//jVdS49PYDgmcYoBnMMHl4XNTMuV723ZnHD2aXYtWWWqbVF3hjQ8iB+UZEuXapLbeA8P8H+1o6ZB1lcw3vg==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.3.tgz", + "integrity": "sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ==", + "license": "MIT", "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-plotly.js": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==", + "license": "MIT", "dependencies": { "prop-types": "^15.8.1" }, @@ -11662,6 +12411,7 @@ "version": "8.1.3", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -11700,6 +12450,7 @@ "version": "3.2.23", "resolved": "https://registry.npmjs.org/react-responsive-carousel/-/react-responsive-carousel-3.2.23.tgz", "integrity": "sha512-pqJLsBaKHWJhw/ItODgbVoziR2z4lpcJg+YwmRlSk4rKH32VE633mAtZZ9kDXjy4wFO+pgUZmDKPsPe1fPmHCg==", + "license": "MIT", "peer": true, "dependencies": { "classnames": "^2.2.5", @@ -11711,6 +12462,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "license": "MIT", "dependencies": { "history": "^5.2.0" }, @@ -11722,6 +12474,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "license": "MIT", "dependencies": { "history": "^5.2.0", "react-router": "6.3.0" @@ -11735,6 +12488,7 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==", + "license": "MIT", "dependencies": { "prop-types": "^15.5.7", "split.js": "^1.6.0" @@ -11747,6 +12501,7 @@ "version": "15.5.0", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", @@ -11759,9 +12514,10 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", - "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", + "version": "8.5.7", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.7.tgz", + "integrity": "sha512-2MqJ3p0Jh69yt9ktFIaZmORHXw4c4bxSIhCeWiFwmJ9EYKgLmuNII3e9c9b2UO+ijl4StnpZdqpxNIhTdHvqtQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", @@ -11771,13 +12527,14 @@ "node": ">=10" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -11802,6 +12559,7 @@ "version": "17.5.1", "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.5.1.tgz", "integrity": "sha512-LG/uPEVRflLWMwi3j/sZqR00nF6JGqTTDblkXK2nzXsIvij06hXl1V/MZIlwj1OKIQUtlh1l9jK8gLsRyCQxMg==", + "license": "Unlicense", "dependencies": { "@types/js-cookie": "^2.2.6", "@xobotyi/scrollbar-width": "^1.9.5", @@ -11826,17 +12584,20 @@ "node_modules/react-use/node_modules/@types/js-cookie": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", - "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==", + "license": "MIT" }, "node_modules/react-use/node_modules/js-cookie": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "license": "MIT" }, "node_modules/react-virtualized-auto-sizer": { "version": "1.0.24", "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", + "license": "MIT", "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" @@ -11846,6 +12607,7 @@ "version": "1.8.10", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -11862,6 +12624,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "license": "MIT", "dependencies": { "lodash": "^4.0.1" } @@ -11870,6 +12633,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11883,18 +12647,21 @@ "node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -11907,6 +12674,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -11915,23 +12683,26 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "license": "MIT", "peerDependencies": { "redux": "^4" } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -11944,6 +12715,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", @@ -11958,6 +12730,7 @@ "version": "1.27.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11965,24 +12738,29 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/regexp-to-ast": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "license": "MIT", "optional": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -11995,12 +12773,14 @@ "name": "@plotly/regl", "version": "2.1.2", "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", - "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==" + "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", + "license": "MIT" }, "node_modules/regl-error2d": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "license": "MIT", "dependencies": { "array-bounds": "^1.0.1", "color-normalize": "^1.5.0", @@ -12015,6 +12795,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.3.tgz", "integrity": "sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==", + "license": "MIT", "dependencies": { "array-bounds": "^1.0.1", "array-find-index": "^1.0.2", @@ -12033,6 +12814,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", + "license": "MIT", "dependencies": { "@plotly/point-cluster": "^3.1.9", "array-range": "^1.0.1", @@ -12055,6 +12837,7 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "license": "MIT", "dependencies": { "array-bounds": "^1.0.1", "array-range": "^1.0.1", @@ -12070,6 +12853,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "license": "MIT", "dependencies": { "argparse": "^1.0.10", "autolinker": "^3.11.0" @@ -12085,6 +12869,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -12092,21 +12877,34 @@ "node_modules/remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", "engines": { "node": ">=0.10" } }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "node_modules/require-from-string": { + "version": "2.0.2", + "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==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.5" } @@ -12114,30 +12912,37 @@ "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==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" }, "node_modules/reselect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "license": "MIT" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12146,6 +12951,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -12154,6 +12960,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", "dependencies": { "protocol-buffers-schema": "^3.3.1" } @@ -12162,6 +12969,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -12171,6 +12979,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -12179,29 +12988,15 @@ "node_modules/right-now": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==", + "license": "MIT" }, "node_modules/rollup": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.5.tgz", - "integrity": "sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -12213,22 +13008,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.5", - "@rollup/rollup-android-arm64": "4.22.5", - "@rollup/rollup-darwin-arm64": "4.22.5", - "@rollup/rollup-darwin-x64": "4.22.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.5", - "@rollup/rollup-linux-arm-musleabihf": "4.22.5", - "@rollup/rollup-linux-arm64-gnu": "4.22.5", - "@rollup/rollup-linux-arm64-musl": "4.22.5", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.5", - "@rollup/rollup-linux-riscv64-gnu": "4.22.5", - "@rollup/rollup-linux-s390x-gnu": "4.22.5", - "@rollup/rollup-linux-x64-gnu": "4.22.5", - "@rollup/rollup-linux-x64-musl": "4.22.5", - "@rollup/rollup-win32-arm64-msvc": "4.22.5", - "@rollup/rollup-win32-ia32-msvc": "4.22.5", - "@rollup/rollup-win32-x64-msvc": "4.22.5", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -12236,12 +13034,14 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rtl-css-js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" } @@ -12265,6 +13065,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -12272,17 +13073,20 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -12309,17 +13113,36 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "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-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -12331,18 +13154,21 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -12354,6 +13180,7 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -12362,6 +13189,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -12380,6 +13208,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" }, @@ -12391,6 +13220,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -12399,6 +13229,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -12413,6 +13244,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "randombytes": "^2.1.0" @@ -12423,6 +13255,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12440,6 +13273,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12454,41 +13288,37 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "license": "Unlicense", "engines": { "node": ">=6.9" } }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -12500,13 +13330,15 @@ "node_modules/shallow-copy": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", + "license": "MIT" }, "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" }, @@ -12519,6 +13351,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" } @@ -12527,21 +13360,80 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", + "license": "Apache-2.0", "bin": { "short-unique-id": "bin/short-unique-id", "suid": "bin/short-unique-id" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12554,13 +13446,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -12571,58 +13465,15 @@ "node_modules/signum": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } + "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==", + "license": "MIT" }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -12632,65 +13483,18 @@ "node": ">= 10" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/slashes": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true - }, - "node_modules/sort-asc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", - "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-desc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", - "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-object": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", - "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", - "dependencies": { - "bytewise": "^1.1.0", - "get-value": "^2.0.2", - "is-extendable": "^0.1.1", - "sort-asc": "^0.2.0", - "sort-desc": "^0.2.0", - "union-value": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-object/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } + "dev": true, + "license": "ISC" }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12699,6 +13503,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12707,6 +13512,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -12717,6 +13523,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -12726,6 +13533,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -12735,13 +13543,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" @@ -12751,45 +13561,26 @@ "version": "3.0.20", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "dev": true, + "license": "CC0-1.0" }, "node_modules/split.js": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", - "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==", + "license": "MIT" }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/stack-generator": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } @@ -12806,17 +13597,20 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" }, "node_modules/stacktrace-gps": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "license": "MIT", "dependencies": { "source-map": "0.5.6", "stackframe": "^1.3.4" @@ -12826,6 +13620,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12834,6 +13629,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "license": "MIT", "dependencies": { "error-stack-parser": "^2.0.6", "stack-generator": "^2.0.5", @@ -12844,20 +13640,23 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "license": "MIT", "dependencies": { "escodegen": "^2.1.0" } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" }, "node_modules/stream-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "license": "MIT", "dependencies": { "debug": "2" } @@ -12866,6 +13665,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12873,17 +13673,20 @@ "node_modules/stream-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "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/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -12891,12 +13694,14 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/string-split-by": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "license": "MIT", "dependencies": { "parenthesis": "^3.1.5" } @@ -12906,6 +13711,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -12924,6 +13730,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", @@ -12937,53 +13744,42 @@ "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 - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "license": "MIT" }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12997,21 +13793,26 @@ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13021,15 +13822,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13039,6 +13845,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13052,15 +13859,19 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -13069,6 +13880,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" }, @@ -13076,11 +13888,25 @@ "node": ">=8" } }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -13093,6 +13919,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" }, @@ -13103,12 +13930,14 @@ "node_modules/strongly-connected-components": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", - "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==" + "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==", + "license": "MIT" }, "node_modules/style-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "license": "MIT", "engines": { "node": ">= 18.12.0" }, @@ -13123,12 +13952,14 @@ "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" }, "node_modules/supercluster": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", + "license": "ISC", "dependencies": { "kdbush": "^3.0.0" } @@ -13136,28 +13967,33 @@ "node_modules/supercluster/node_modules/kdbush": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", + "license": "ISC" }, "node_modules/superscript-text": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", - "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==" + "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==", + "license": "MIT" }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13168,12 +14004,14 @@ "node_modules/svg-arc-to-cubic-bezier": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC" }, "node_modules/svg-path-bounds": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "license": "MIT", "dependencies": { "abs-svg-path": "^0.1.1", "is-svg-path": "^1.0.1", @@ -13185,6 +14023,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "license": "MIT", "dependencies": { "svg-arc-to-cubic-bezier": "^3.0.0" } @@ -13193,6 +14032,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "license": "MIT", "dependencies": { "bitmap-sdf": "^1.0.0", "draw-svg-path": "^1.0.0", @@ -13202,25 +14042,27 @@ } }, "node_modules/swagger-client": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.29.3.tgz", - "integrity": "sha512-OhhMAO2dwDEaxtUNDxwaqzw75uiZY5lX/2vx+U6eKCYZYhXWQ5mylU/0qfk/xMR20VyitsnzRc6KcFFjRoCS7A==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.33.2.tgz", + "integrity": "sha512-LL91X4+KZr3qMdm2knL1ncF104LlmQMNlrlQwm83r793eQiOdB5iuEz1ppdRv/r211vZE66m38VzHclXmqwW7A==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", - "@swagger-api/apidom-core": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-error": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-json-pointer": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "@swagger-api/apidom-reference": ">=1.0.0-alpha.9 <1.0.0-beta.0", - "cookie": "~0.6.0", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.6 <1.0.0-rc.0", + "@swaggerexpert/cookie": "^1.4.1", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", "js-yaml": "^4.1.0", "neotraverse": "=0.6.18", "node-abort-controller": "^3.1.1", "node-fetch-commonjs": "^3.3.2", - "openapi-path-templating": "^1.5.1", - "openapi-server-url-templating": "^1.0.0", + "openapi-path-templating": "^2.0.1", + "openapi-server-url-templating": "^1.2.0", "ramda": "^0.30.1", "ramda-adjunct": "^5.0.0" } @@ -13229,6 +14071,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13237,6 +14080,7 @@ "version": "5.17.14", "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.17.14.tgz", "integrity": "sha512-mCXerZrbcn4ftPYifUF0+iKIRTHoVCv0HcJc/sXl9nCe3oeWdsjmOWVqKabzzAkAa0NwsbKNJFv2UL/Ivnf6VQ==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.24.5", "@braintree/sanitize-url": "=7.0.2", @@ -13277,30 +14121,39 @@ "react-dom": ">=16.8.0 <19" } }, + "node_modules/swagger-ui-react/node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/swagger-ui-react/node_modules/dompurify": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.4.tgz", - "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==" + "integrity": "sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==", + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/swagger-ui-react/node_modules/immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/swagger-ui-react/node_modules/react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", "redux": "^5.0.0" }, "peerDependenciesMeta": { @@ -13315,12 +14168,14 @@ "node_modules/swagger-ui-react/node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" }, "node_modules/swagger-ui-react/node_modules/redux-immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==", + "license": "BSD-3-Clause", "peerDependencies": { "immutable": "^3.8.1 || ^4.0.0-rc.1" } @@ -13328,19 +14183,22 @@ "node_modules/swagger-ui-react/node_modules/reselect": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -13353,71 +14211,20 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "peer": true, "engines": { - "node": ">= 6" + "node": ">=6" } }, "node_modules/terser": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", - "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13433,16 +14240,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -13466,11 +14274,69 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "peer": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", @@ -13480,36 +14346,11 @@ "node": ">=18" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, "node_modules/throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "license": "MIT", "engines": { "node": ">=10" } @@ -13518,6 +14359,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -13527,74 +14369,55 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT", "optional": true }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", - "dev": true + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.6.tgz", - "integrity": "sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dev": true, + "license": "MIT", "dependencies": { - "fdir": "^6.3.0", + "fdir": "^6.4.2", "picomatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -13602,13 +14425,15 @@ "node_modules/tinyqueue": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "license": "ISC" }, "node_modules/tinyrainbow": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -13618,45 +14443,42 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tldts": { - "version": "6.1.48", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.48.tgz", - "integrity": "sha512-SPbnh1zaSzi/OsmHb1vrPNnYuwJbdWjwo5TbBYYMlTtH3/1DSb41t8bcSxkwDmmbG2q6VLPVvQc7Yf23T+1EEw==", + "version": "6.1.71", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.71.tgz", + "integrity": "sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw==", "dev": true, + "license": "MIT", "dependencies": { - "tldts-core": "^6.1.48" + "tldts-core": "^6.1.71" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.48", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.48.tgz", - "integrity": "sha512-3gD9iKn/n2UuFH1uilBviK9gvTNT6iYwdqrj1Vr5mh8FuelvpRNaYVH4pNYqUgOGU4aAdL9X35eLuuj0gRsx+A==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } + "version": "6.1.71", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.71.tgz", + "integrity": "sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==", + "dev": true, + "license": "MIT" }, "node_modules/to-float32": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", - "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==", + "license": "MIT" }, "node_modules/to-px": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", + "license": "MIT", "dependencies": { "parse-unit": "^1.0.1" } @@ -13666,6 +14488,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" }, @@ -13676,12 +14499,14 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" }, "node_modules/topojson-client": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", "dependencies": { "commander": "2" }, @@ -13696,15 +14521,17 @@ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" }, @@ -13717,6 +14544,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, @@ -13725,57 +14553,62 @@ } }, "node_modules/tree-sitter": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.4.tgz", - "integrity": "sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", "hasInstallScript": true, + "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "nan": "^2.17.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" } }, "node_modules/tree-sitter-json": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.2.tgz", - "integrity": "sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.18.0" - } - }, - "node_modules/tree-sitter-yaml": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz", - "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==", + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { - "nan": "^2.14.0" + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-easing": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", - "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", + "license": "Unlicense" }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", + "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -13786,40 +14619,33 @@ "node_modules/ts-mixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", - "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" }, "node_modules/ts-toolbelt": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", - "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "license": "Apache-2.0" }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" }, "node_modules/type-check": { "version": "0.4.0", "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" }, @@ -13831,6 +14657,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -13839,30 +14666,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -13872,17 +14701,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -13892,17 +14723,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -13914,12 +14746,14 @@ "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/typedarray-pool": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "license": "MIT", "dependencies": { "bit-twiddle": "^1.0.0", "dup": "^1.0.0" @@ -13929,6 +14763,7 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", + "license": "MIT", "dependencies": { "ts-toolbelt": "^9.6.0" } @@ -13938,6 +14773,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13946,23 +14782,33 @@ "node": ">=14.17" } }, - "node_modules/typewise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", - "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "node_modules/typescript-eslint": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.19.1.tgz", + "integrity": "sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==", + "dev": true, + "license": "MIT", "dependencies": { - "typewise-core": "^1.2.0" + "@typescript-eslint/eslint-plugin": "8.19.1", + "@typescript-eslint/parser": "8.19.1", + "@typescript-eslint/utils": "8.19.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/typewise-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", - "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" - }, "node_modules/ua-parser-js": { - "version": "0.7.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.39.tgz", - "integrity": "sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==", + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", "funding": [ { "type": "opencollective", @@ -13977,6 +14823,7 @@ "url": "https://github.com/sponsors/faisalman" } ], + "license": "MIT", "bin": { "ua-parser-js": "script/cli.js" }, @@ -13985,15 +14832,19 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14002,44 +14853,25 @@ "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" }, "node_modules/unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" }, "node_modules/unraw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==" + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", + "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "funding": [ { "type": "opencollective", @@ -14054,9 +14886,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14068,12 +14901,14 @@ "node_modules/update-diff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", - "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==" + "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==", + "license": "MIT" }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -14082,25 +14917,33 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", + "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz", + "integrity": "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -14109,14 +14952,15 @@ } }, "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", + "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", + "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -14128,22 +14972,25 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/use-undo": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/use-undo/-/use-undo-1.1.1.tgz", "integrity": "sha512-2NNpJv7TDQpyETgRTG5I/CsABX5nhExpx8PEhWiDsnW9C5BA6Xnn8G9u/lPeg3+JsBrBtUx8/5bMbGmpnWz1Cw==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.6", "react-dom": ">=16.8.6" @@ -14152,7 +14999,8 @@ "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/uuid": { "version": "10.0.0", @@ -14162,6 +15010,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -14170,6 +15019,7 @@ "version": "2.12.3", "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.3.tgz", "integrity": "sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ==", + "license": "ISC", "dependencies": { "@sphinxxxx/color-conversion": "^2.2.2" } @@ -14179,6 +15029,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -14238,6 +15089,7 @@ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.6", @@ -14259,6 +15111,7 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/expect": "2.1.1", "@vitest/mocker": "2.1.1", @@ -14322,6 +15175,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14330,6 +15184,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "license": "MIT", "dependencies": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", @@ -14341,6 +15196,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -14352,6 +15208,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -14364,26 +15221,30 @@ "node_modules/weak-map": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", - "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==" + "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==", + "license": "Apache-2.0" }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/web-tree-sitter": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.3.tgz", - "integrity": "sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==", + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", + "license": "MIT", "optional": true }, "node_modules/webgl-context": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", + "license": "MIT", "dependencies": { "get-canvas-context": "^1.0.1" } @@ -14393,23 +15254,25 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/webpack": { - "version": "5.95.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", - "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "license": "MIT", "peer": true, "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -14447,6 +15310,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", "peer": true, "engines": { "node": ">=10.13.0" @@ -14456,6 +15320,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "esrecurse": "^4.3.0", @@ -14469,6 +15334,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=4.0" @@ -14479,6 +15345,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -14491,6 +15358,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14503,15 +15371,17 @@ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" @@ -14525,6 +15395,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" }, @@ -14536,39 +15407,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -14582,6 +15459,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -14596,15 +15474,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -14619,6 +15499,7 @@ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -14635,6 +15516,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" } @@ -14643,6 +15525,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==", + "license": "MIT", "dependencies": { "object-assign": "^4.1.0" } @@ -14652,6 +15535,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -14670,6 +15554,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", @@ -14682,50 +15567,19 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "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-cjs/node_modules/string-width": { "version": "4.2.3", "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", @@ -14735,16 +15589,17 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -14752,6 +15607,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -14759,31 +15615,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/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": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -14803,12 +15646,14 @@ "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" }, "node_modules/xml-but-prettier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==", + "license": "MIT", "dependencies": { "repeat-string": "^1.5.2" } @@ -14817,6 +15662,7 @@ "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -14829,6 +15675,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18" } @@ -14837,12 +15684,14 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/xtend": { "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" } @@ -14850,12 +15699,14 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } @@ -14864,6 +15715,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -14874,7 +15726,8 @@ "node_modules/zenscroll": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", - "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==" + "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==", + "license": "Unlicense" } } } diff --git a/webapp/package.json b/webapp/package.json index aea940a029..44b17df552 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -8,7 +8,7 @@ "clean": "rm -rf dist node_modules/.vite", "coverage": "vitest run --coverage", "dev": "vite", - "lint": "tsc --noEmit && eslint . --ext ts,tsx --report-unused-disable-directives", + "lint": "tsc --noEmit && eslint . --report-unused-disable-directives", "preview": "vite preview", "test": "vitest", "test:ui": "vitest --ui" @@ -75,12 +75,12 @@ "xml-js": "1.6.11" }, "devDependencies": { + "@eslint/js": "9.18.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/react": "16.0.1", "@testing-library/user-event": "14.5.2", "@total-typescript/ts-reset": "0.6.1", "@types/d3": "5.16.0", - "@types/date-fns": "2.6.0", "@types/debug": "4.1.12", "@types/draft-convert": "2.1.8", "@types/draft-js": "0.11.18", @@ -100,31 +100,30 @@ "@types/react-virtualized-auto-sizer": "1.0.4", "@types/react-window": "1.8.8", "@types/swagger-ui-react": "4.18.3", - "@types/testing-library__jest-dom": "6.0.0", "@types/tinycolor2": "1.4.6", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "7.2.0", - "@typescript-eslint/parser": "7.2.0", "@vitejs/plugin-react-swc": "3.7.0", "@vitest/coverage-v8": "2.1.1", "@vitest/ui": "2.1.1", - "eslint": "8.57.1", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-jsdoc": "48.10.0", + "eslint": "9.18.0", + "eslint-config-prettier": "10.0.1", + "eslint-plugin-jsdoc": "50.6.1", "eslint-plugin-license-header": "0.6.1", "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.37.0", - "eslint-plugin-react-hooks": "4.6.2", - "eslint-plugin-react-refresh": "0.4.12", + "eslint-plugin-react": "7.37.4", + "eslint-plugin-react-hooks": "5.1.0", + "eslint-plugin-react-refresh": "0.4.18", + "globals": "15.14.0", "husky": "9.1.6", "jsdom": "25.0.1", - "prettier": "3.3.3", + "prettier": "3.4.2", "typescript": "5.4.5", + "typescript-eslint": "8.19.1", "vite": "5.4.8", "vitest": "2.1.1" }, "engines": { - "node": "18.16.1" + "node": "22.13.0" }, "overrides": { "react-d3-graph": { diff --git a/webapp/src/components/App/Api.tsx b/webapp/src/components/App/Api.tsx index 837b80e729..7f661903d0 100644 --- a/webapp/src/components/App/Api.tsx +++ b/webapp/src/components/App/Api.tsx @@ -30,9 +30,7 @@ function Api() { sx={{ backgroundColor: "#eee" }} > - + ); diff --git a/webapp/src/components/App/Data/DataListing.tsx b/webapp/src/components/App/Data/DataListing.tsx index 30968f4f30..ef552cc100 100644 --- a/webapp/src/components/App/Data/DataListing.tsx +++ b/webapp/src/components/App/Data/DataListing.tsx @@ -15,9 +15,9 @@ import { memo } from "react"; import { Typography, Box, styled } from "@mui/material"; import AutoSizer from "react-virtualized-auto-sizer"; -import { FixedSizeList, areEqual, ListChildComponentProps } from "react-window"; +import { FixedSizeList, areEqual, type ListChildComponentProps } from "react-window"; import ArrowRightIcon from "@mui/icons-material/ArrowRight"; -import { MatrixDataSetDTO } from "../../../common/types"; +import type { MatrixDataSetDTO } from "../../../common/types"; const ROW_ITEM_SIZE = 45; const BUTTONS_SIZE = 40; @@ -107,11 +107,7 @@ function DataListing(props: PropsType) { const idealHeight = ROW_ITEM_SIZE * datasets.length; return ( height - ? height + ROW_ITEM_SIZE - BUTTONS_SIZE - : idealHeight - } + height={idealHeight > height ? height + ROW_ITEM_SIZE - BUTTONS_SIZE : idealHeight} width={width} itemCount={datasets.length} itemSize={ROW_ITEM_SIZE} diff --git a/webapp/src/components/App/Data/DataPropsView.tsx b/webapp/src/components/App/Data/DataPropsView.tsx index c4b5215cf5..75a07b6ef7 100644 --- a/webapp/src/components/App/Data/DataPropsView.tsx +++ b/webapp/src/components/App/Data/DataPropsView.tsx @@ -13,7 +13,7 @@ */ import { useState } from "react"; -import { MatrixDataSetDTO, MatrixInfoDTO } from "../../../common/types"; +import type { MatrixDataSetDTO, MatrixInfoDTO } from "../../../common/types"; import PropertiesView from "../../common/PropertiesView"; import DataListing from "./DataListing"; import { StyledListingBox } from "./styles"; @@ -33,9 +33,7 @@ function DataPropsView(props: PropTypes) { return dataset.filter( (item) => item.name.search(input) >= 0 || - !!item.matrices.find( - (matrix: MatrixInfoDTO) => matrix.id.search(input) >= 0, - ), + !!item.matrices.find((matrix: MatrixInfoDTO) => matrix.id.search(input) >= 0), ); }; diff --git a/webapp/src/components/App/Data/DatasetCreationDialog.tsx b/webapp/src/components/App/Data/DatasetCreationDialog.tsx index 90764a1977..a58cf72d25 100644 --- a/webapp/src/components/App/Data/DatasetCreationDialog.tsx +++ b/webapp/src/components/App/Data/DatasetCreationDialog.tsx @@ -12,22 +12,14 @@ * This file is part of the Antares project. */ -import { useState, useEffect, forwardRef, ChangeEvent } from "react"; -import { - Box, - TextField, - Typography, - Button, - Checkbox, - Chip, - Tooltip, -} from "@mui/material"; +import { useState, useEffect, forwardRef } from "react"; +import { Box, TextField, Typography, Button, Checkbox, Chip, Tooltip } from "@mui/material"; import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; -import axios, { AxiosError } from "axios"; +import axios, { type AxiosError } from "axios"; import HelpIcon from "@mui/icons-material/Help"; import { getGroups } from "../../../services/api/user"; -import { GroupDTO, MatrixDataSetDTO } from "../../../common/types"; +import type { GroupDTO, MatrixDataSetDTO } from "../../../common/types"; import { saveMatrix } from "./utils"; import useEnqueueErrorSnackbar from "../../../hooks/useEnqueueErrorSnackbar"; import SimpleLoader from "../../common/loaders/SimpleLoader"; @@ -104,7 +96,7 @@ function DatasetCreationDialog(props: PropTypes) { } }; - const onUpload = (e: ChangeEvent) => { + const onUpload = (e: React.ChangeEvent) => { const { target } = e; if (target && target.files && target.files.length === 1) { setCurrentFile(target.files[0]); @@ -115,9 +107,7 @@ function DatasetCreationDialog(props: PropTypes) { if (add) { setSelectedGroupList(selectedGroupList.concat([item])); } else { - setSelectedGroupList( - selectedGroupList.filter((elm) => item.id !== elm.id), - ); + setSelectedGroupList(selectedGroupList.filter((elm) => item.id !== elm.id)); } }; @@ -133,7 +123,7 @@ function DatasetCreationDialog(props: PropTypes) { setPublicStatus(data.public); setName(data.name); } - } catch (e) { + } catch { enqueueSnackbar(t("settings.error.groupsError"), { variant: "error", }); @@ -150,10 +140,7 @@ function DatasetCreationDialog(props: PropTypes) { return ( {uploadProgress < 100 ? ( - + ) : ( )} @@ -238,10 +225,7 @@ function DatasetCreationDialog(props: PropTypes) { > {currentFile ? currentFile.name : t("global.chooseFile")} - + @@ -287,9 +271,7 @@ function DatasetCreationDialog(props: PropTypes) { }} > {groupList.map((item) => { - const index = selectedGroupList.findIndex( - (elm) => item.id === elm.id, - ); + const index = selectedGroupList.findIndex((elm) => item.id === elm.id); if (index >= 0) { return ( onGroupClick(true, item)} - /> + onGroupClick(true, item)} /> ); })} diff --git a/webapp/src/components/App/Data/MatrixDialog.tsx b/webapp/src/components/App/Data/MatrixDialog.tsx index 4d2b0b7765..7c26d54178 100644 --- a/webapp/src/components/App/Data/MatrixDialog.tsx +++ b/webapp/src/components/App/Data/MatrixDialog.tsx @@ -13,7 +13,7 @@ */ import { useTranslation } from "react-i18next"; -import { MatrixInfoDTO } from "../../../common/types"; +import type { MatrixInfoDTO } from "../../../common/types"; import BasicDialog from "@/components/common/dialogs/BasicDialog"; import MatrixContent from "@/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent"; import { Button } from "@mui/material"; diff --git a/webapp/src/components/App/Data/index.tsx b/webapp/src/components/App/Data/index.tsx index 6b7fd4469b..f64764b3e0 100644 --- a/webapp/src/components/App/Data/index.tsx +++ b/webapp/src/components/App/Data/index.tsx @@ -13,7 +13,7 @@ */ import { useState, useEffect } from "react"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; import DeleteIcon from "@mui/icons-material/Delete"; @@ -28,7 +28,7 @@ import { getMatrixList, getExportMatrixUrl, } from "../../../services/api/matrix"; -import { MatrixInfoDTO, MatrixDataSetDTO } from "../../../common/types"; +import type { MatrixInfoDTO, MatrixDataSetDTO } from "../../../common/types"; import DatasetCreationDialog from "./DatasetCreationDialog"; import ConfirmationDialog from "../../common/dialogs/ConfirmationDialog"; import RootPage from "../../common/page/RootPage"; @@ -52,15 +52,10 @@ function Data() { // User modal const [openModal, setOpenModal] = useState(false); - const [openConfirmationModal, setOpenConfirmationModal] = - useState(false); + const [openConfirmationModal, setOpenConfirmationModal] = useState(false); const [matrixModal, setMatrixModal] = useState(false); - const [currentData, setCurrentData] = useState< - MatrixDataSetDTO | undefined - >(); - const [currentMatrix, setCurrentMatrix] = useState< - MatrixInfoDTO | undefined - >(); + const [currentData, setCurrentData] = useState(); + const [currentMatrix, setCurrentMatrix] = useState(); const handleCreation = () => { setCurrentData(undefined); @@ -170,9 +165,7 @@ function Data() { item.id === selectedItem)?.owner - .id ? ( + user.id === dataList.find((item) => item.id === selectedItem)?.owner.id ? ( - {`Matrices - ${ - dataList.find((item) => item.id === selectedItem) - ?.name - }`} + {`Matrices - ${dataList.find((item) => item.id === selectedItem)?.name}`} @@ -238,9 +228,7 @@ function Data() { alignItems: "center", }} > - {`Matrices - ${ - dataList.find((item) => item.id === selectedItem)?.name - }`} + {`Matrices - ${dataList.find((item) => item.id === selectedItem)?.name}`} ) } @@ -258,11 +246,7 @@ function Data() { )} {!loaded && } {matrixModal && currentMatrix && ( - + )} {openModal && ( 0) { - const promises = permissions.map( - (perm: { user: UserDTO; type: number }) => - createRole({ - group_id: newGroup.id, - type: perm.type, - identity_id: perm.user.id, - }), + const promises = permissions.map((perm: { user: UserDTO; type: number }) => + createRole({ + group_id: newGroup.id, + type: perm.type, + identity_id: perm.user.id, + }), ); const res: RoleDetailsDTO[] = await mounted(Promise.all(promises)); @@ -93,10 +86,7 @@ function CreateGroupDialog(props: Props) { // Because we cannot recover roles eventually created reloadFetchGroups(); - enqueueErrorSnackbar( - t("settings.error.userRolesSave", { 0: newGroup.name }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.userRolesSave", { 0: newGroup.name }), e as Error); } closeDialog(); diff --git a/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/GroupForm.tsx b/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/GroupForm.tsx index 87e47d9db2..f440270aee 100644 --- a/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/GroupForm.tsx +++ b/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/GroupForm.tsx @@ -31,24 +31,20 @@ import { ListItemIcon, ListItemText, CircularProgress, - SelectChangeEvent, + type SelectChangeEvent, } from "@mui/material"; import { Controller, useFieldArray } from "react-hook-form"; import { v4 as uuidv4 } from "uuid"; import DeleteIcon from "@mui/icons-material/Delete"; import GroupIcon from "@mui/icons-material/Group"; -import { - RESERVED_GROUP_NAMES, - RESERVED_USER_NAMES, - ROLE_TYPE_KEYS, -} from "../../../utils"; -import { RoleType, UserDTO } from "../../../../../../common/types"; +import { RESERVED_GROUP_NAMES, RESERVED_USER_NAMES, ROLE_TYPE_KEYS } from "../../../utils"; +import { RoleType, type UserDTO } from "../../../../../../common/types"; import { roleToString, sortByName } from "../../../../../../services/utils"; import usePromise from "../../../../../../hooks/usePromise"; import { getGroups, getUsers } from "../../../../../../services/api/user"; import { getAuthUser } from "../../../../../../redux/selectors"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; -import { UseFormReturnPlus } from "../../../../../common/Form/types"; +import type { UseFormReturnPlus } from "../../../../../common/Form/types"; import { validateString } from "@/utils/validation/string"; function GroupForm(props: UseFormReturnPlus) { @@ -66,10 +62,7 @@ function GroupForm(props: UseFormReturnPlus) { const { data: users, isLoading: isUsersLoading } = usePromise(getUsers); const { data: groups } = usePromise(getGroups); - const existingGroups = useMemo( - () => groups?.map((group) => group.name), - [groups], - ); + const existingGroups = useMemo(() => groups?.map((group) => group.name), [groups]); const { fields, append, remove } = useFieldArray({ control, @@ -78,9 +71,7 @@ function GroupForm(props: UseFormReturnPlus) { const allowToAddPermission = selectedUser && - !getValues("permissions").some( - ({ user }: { user: UserDTO }) => user.id === selectedUser.id, - ); + !getValues("permissions").some(({ user }: { user: UserDTO }) => user.id === selectedUser.id); const filteredAndSortedUsers = useMemo(() => { if (!users) { @@ -88,10 +79,7 @@ function GroupForm(props: UseFormReturnPlus) { } return sortByName( - users.filter( - (user) => - !RESERVED_USER_NAMES.includes(user.name) && user.id !== authUser?.id, - ), + users.filter((user) => !RESERVED_USER_NAMES.includes(user.name) && user.id !== authUser?.id), ); }, [users, authUser]); @@ -138,8 +126,7 @@ function GroupForm(props: UseFormReturnPlus) { sx={{ p: 2, mt: 2, - backgroundImage: - "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", + backgroundImage: "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", }} > {t("global.permissions")} @@ -211,11 +198,7 @@ function GroupForm(props: UseFormReturnPlus) { disablePadding dense > - + diff --git a/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/index.tsx b/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/index.tsx index ef29ca1722..66d4cd1132 100644 --- a/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/index.tsx +++ b/webapp/src/components/App/Settings/Groups/dialog/GroupFormDialog/index.tsx @@ -12,14 +12,11 @@ * This file is part of the Antares project. */ -import FormDialog, { - FormDialogProps, -} from "../../../../../common/dialogs/FormDialog"; -import { RoleType, UserDTO } from "../../../../../../common/types"; +import FormDialog, { type FormDialogProps } from "../../../../../common/dialogs/FormDialog"; +import type { RoleType, UserDTO } from "../../../../../../common/types"; import GroupForm from "./GroupForm"; -export interface GroupFormDialogProps - extends Omit { +export interface GroupFormDialogProps extends Omit { defaultValues?: { name?: string; permissions?: Array<{ user: UserDTO; type: RoleType }>; diff --git a/webapp/src/components/App/Settings/Groups/dialog/UpdateGroupDialog.tsx b/webapp/src/components/App/Settings/Groups/dialog/UpdateGroupDialog.tsx index 42e4541ed9..a609b06d0e 100644 --- a/webapp/src/components/App/Settings/Groups/dialog/UpdateGroupDialog.tsx +++ b/webapp/src/components/App/Settings/Groups/dialog/UpdateGroupDialog.tsx @@ -18,7 +18,7 @@ import { useTranslation } from "react-i18next"; import { usePromise as usePromiseWrapper } from "react-use"; import { useSnackbar } from "notistack"; import * as R from "ramda"; -import { GroupDetailsDTO } from "../../../../../common/types"; +import type { GroupDetailsDTO } from "../../../../../common/types"; import { createRole, deleteUserRole, @@ -26,16 +26,11 @@ import { updateGroup, } from "../../../../../services/api/user"; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; -import GroupFormDialog, { GroupFormDialogProps } from "./GroupFormDialog"; -import { GroupEdit } from ".."; -import { SubmitHandlerPlus } from "../../../../common/Form/types"; +import GroupFormDialog, { type GroupFormDialogProps } from "./GroupFormDialog"; +import type { GroupEdit } from ".."; +import type { SubmitHandlerPlus } from "../../../../common/Form/types"; -type InheritPropsToOmit = - | "title" - | "titleIcon" - | "defaultValues" - | "onSubmit" - | "onCancel"; +type InheritPropsToOmit = "title" | "titleIcon" | "defaultValues" | "onSubmit" | "onCancel"; interface Props extends Omit { group: GroupDetailsDTO; @@ -76,8 +71,7 @@ function UpdateGroupDialog(props: Props) { //////////////////////////////////////////////////////////////// const handleSubmit = async (data: SubmitHandlerPlus) => { - const { name, permissions }: GroupFormDialogProps["defaultValues"] = - data.dirtyValues; + const { name, permissions }: GroupFormDialogProps["defaultValues"] = data.dirtyValues; const groupName = name || group.name; const notifySuccess = R.once(() => @@ -92,10 +86,7 @@ function UpdateGroupDialog(props: Props) { editGroup({ id: group.id, name: groupName }); notifySuccess(); } catch (e) { - enqueueErrorSnackbar( - t("settings.error.groupSave", { 0: groupName }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.groupSave", { 0: groupName }), e as Error); throw e; } } @@ -152,10 +143,7 @@ function UpdateGroupDialog(props: Props) { // Because we cannot recover roles eventually deleted/created reloadFetchUsers(); - enqueueErrorSnackbar( - t("settings.error.groupRolesSave", { 0: groupName }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.groupRolesSave", { 0: groupName }), e as Error); } } diff --git a/webapp/src/components/App/Settings/Groups/index.tsx b/webapp/src/components/App/Settings/Groups/index.tsx index b92e62ffe8..ede5b9012b 100644 --- a/webapp/src/components/App/Settings/Groups/index.tsx +++ b/webapp/src/components/App/Settings/Groups/index.tsx @@ -25,16 +25,16 @@ import { Typography, } from "@mui/material"; import { produce } from "immer"; -import { ReactNode, useMemo, useReducer, useState } from "react"; +import { useMemo, useReducer, useState } from "react"; import { useTranslation } from "react-i18next"; import { usePromise as usePromiseWrapper, useUpdateEffect } from "react-use"; -import { Action } from "redux"; +import type { Action } from "redux"; import DeleteIcon from "@mui/icons-material/Delete"; import EditIcon from "@mui/icons-material/Edit"; import * as R from "ramda"; import GroupIcon from "@mui/icons-material/Group"; import { useSnackbar } from "notistack"; -import { GroupDetailsDTO } from "../../../../common/types"; +import type { GroupDetailsDTO } from "../../../../common/types"; import usePromiseWithSnackbarError from "../../../../hooks/usePromiseWithSnackbarError"; import { deleteGroup, getGroups } from "../../../../services/api/user"; import { sortByName } from "../../../../services/utils"; @@ -59,11 +59,7 @@ export type GroupEdit = Partial & { }; interface GroupAction extends Action { - payload?: - | GroupDetailsDTO["id"] - | GroupDetailsDTO - | GroupDetailsDTO[] - | GroupEdit; + payload?: GroupDetailsDTO["id"] | GroupDetailsDTO | GroupDetailsDTO[] | GroupEdit; } const reducer = produce((draft, action) => { @@ -171,10 +167,7 @@ function Groups() { }); }) .catch((err) => { - enqueueErrorSnackbar( - t("settings.error.groupDelete", { 0: group.name }), - err, - ); + enqueueErrorSnackbar(t("settings.error.groupDelete", { 0: group.name }), err); }) .finally(() => { setGroupsInLoading((prev) => prev.filter((u) => u !== group)); @@ -208,7 +201,7 @@ function Groups() { - )) as ReactNode, + )) as React.ReactNode, ], // Group list [ @@ -227,10 +220,7 @@ function Groups() { setGroupToEdit(group)}> - setGroupToDelete(group)} - > + setGroupToDelete(group)}> diff --git a/webapp/src/components/App/Settings/Maintenance/index.tsx b/webapp/src/components/App/Settings/Maintenance/index.tsx index 624006a4e6..352540fbf9 100644 --- a/webapp/src/components/App/Settings/Maintenance/index.tsx +++ b/webapp/src/components/App/Settings/Maintenance/index.tsx @@ -24,7 +24,7 @@ import { } from "@mui/material"; import { useSnackbar } from "notistack"; import { useState } from "react"; -import { Controller, FieldValues, useForm } from "react-hook-form"; +import { Controller, useForm, type FieldValues } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useUpdateEffect } from "react-use"; import useEnqueueErrorSnackbar from "../../../../hooks/useEnqueueErrorSnackbar"; @@ -113,9 +113,7 @@ function Maintenance() { return ( <> - + - ({ - group: perm.group.id, - role: perm.type, - }), - ) as BotCreateDTO["roles"]; + const roles = permissions.map((perm: { group: GroupDTO; type: RoleType }) => ({ + group: perm.group.id, + role: perm.type, + })) as BotCreateDTO["roles"]; - const tokenValue = await mounted( - createBot({ name, is_author: false, roles }), - ); + const tokenValue = await mounted(createBot({ name, is_author: false, roles })); setTokenValueToDisplay(tokenValue); @@ -73,10 +64,7 @@ function CreateTokenDialog(props: Props) { variant: "success", }); } catch (e) { - enqueueErrorSnackbar( - t("settings.error.tokenSave", { 0: name }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.tokenSave", { 0: name }), e as Error); closeDialog(); } finally { reloadFetchTokens(); @@ -84,9 +72,7 @@ function CreateTokenDialog(props: Props) { }; const handleCopyClick = () => { - navigator.clipboard - .writeText(tokenValueToDisplay) - .then(() => setShowCopiedTooltip(true)); + navigator.clipboard.writeText(tokenValueToDisplay).then(() => setShowCopiedTooltip(true)); }; //////////////////////////////////////////////////////////////// @@ -122,10 +108,7 @@ function CreateTokenDialog(props: Props) { }} > {tokenValueToDisplay} - + !RESERVED_GROUP_NAMES.includes(group.name)), - ); + return sortByName(groups.filter((group) => !RESERVED_GROUP_NAMES.includes(group.name))); }, [groups]); //////////////////////////////////////////////////////////////// @@ -109,9 +104,7 @@ function TokenForm(props: Props) { } const group = authUser?.groups?.find((gp) => gp.name === groupName); - return group - ? ROLE_TYPE_KEYS.filter((key) => RoleType[key] <= group.role) - : []; + return group ? ROLE_TYPE_KEYS.filter((key) => RoleType[key] <= group.role) : []; }; //////////////////////////////////////////////////////////////// @@ -140,8 +133,7 @@ function TokenForm(props: Props) { sx={{ p: 2, mt: 2, - backgroundImage: - "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", + backgroundImage: "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", }} > {t("global.permissions")} @@ -225,11 +217,7 @@ function TokenForm(props: Props) { disablePadding dense > - + diff --git a/webapp/src/components/App/Settings/Tokens/dialog/TokenFormDialog/index.tsx b/webapp/src/components/App/Settings/Tokens/dialog/TokenFormDialog/index.tsx index 24516f6b7e..c7ee54b9be 100644 --- a/webapp/src/components/App/Settings/Tokens/dialog/TokenFormDialog/index.tsx +++ b/webapp/src/components/App/Settings/Tokens/dialog/TokenFormDialog/index.tsx @@ -12,13 +12,10 @@ * This file is part of the Antares project. */ -import FormDialog, { - FormDialogProps, -} from "../../../../../common/dialogs/FormDialog"; +import FormDialog, { type FormDialogProps } from "../../../../../common/dialogs/FormDialog"; import TokenForm from "./TokenForm"; -export interface TokenFormDialogProps - extends Omit { +export interface TokenFormDialogProps extends Omit { onlyPermissions?: boolean; } @@ -27,9 +24,7 @@ function TokenFormDialog(props: TokenFormDialogProps) { return ( - {(formObj) => ( - - )} + {(formObj) => } ); } diff --git a/webapp/src/components/App/Settings/Tokens/dialog/TokenInfoDialog.tsx b/webapp/src/components/App/Settings/Tokens/dialog/TokenInfoDialog.tsx index 23f12dc088..6d7f1ad31b 100644 --- a/webapp/src/components/App/Settings/Tokens/dialog/TokenInfoDialog.tsx +++ b/webapp/src/components/App/Settings/Tokens/dialog/TokenInfoDialog.tsx @@ -16,9 +16,9 @@ import { DialogContentText } from "@mui/material"; import { useTranslation } from "react-i18next"; import InfoIcon from "@mui/icons-material/Info"; import { useMemo } from "react"; -import { FieldValues } from "react-hook-form"; -import { BotDetailsDTO } from "../../../../../common/types"; -import OkDialog, { OkDialogProps } from "../../../../common/dialogs/OkDialog"; +import type { FieldValues } from "react-hook-form"; +import type { BotDetailsDTO } from "../../../../../common/types"; +import OkDialog, { type OkDialogProps } from "../../../../common/dialogs/OkDialog"; import TokenForm from "./TokenFormDialog/TokenForm"; import Form from "../../../../common/Form"; @@ -54,9 +54,7 @@ function TokenInfoDialog(props: Props) { title={t("global.permissions")} titleIcon={InfoIcon} > - - {t("settings.currentToken", { 0: token.name })} - + {t("settings.currentToken", { 0: token.name })}
{(formObj) => } diff --git a/webapp/src/components/App/Settings/Tokens/index.tsx b/webapp/src/components/App/Settings/Tokens/index.tsx index 18aa3b4d9a..85e5ee4ec8 100644 --- a/webapp/src/components/App/Settings/Tokens/index.tsx +++ b/webapp/src/components/App/Settings/Tokens/index.tsx @@ -25,23 +25,18 @@ import { Typography, } from "@mui/material"; import { produce } from "immer"; -import { ReactNode, useMemo, useReducer, useState } from "react"; +import { useMemo, useReducer, useState } from "react"; import { useTranslation } from "react-i18next"; import { usePromise as usePromiseWrapper, useUpdateEffect } from "react-use"; -import { Action } from "redux"; +import type { Action } from "redux"; import DeleteIcon from "@mui/icons-material/Delete"; import InfoIcon from "@mui/icons-material/Info"; import TokenIcon from "@mui/icons-material/Token"; import * as R from "ramda"; import { useSnackbar } from "notistack"; -import { BotDTO, BotDetailsDTO, UserDTO } from "../../../../common/types"; +import type { BotDTO, BotDetailsDTO, UserDTO } from "../../../../common/types"; import usePromiseWithSnackbarError from "../../../../hooks/usePromiseWithSnackbarError"; -import { - deleteBot, - getBots, - getUser, - getUsers, -} from "../../../../services/api/user"; +import { deleteBot, getBots, getUser, getUsers } from "../../../../services/api/user"; import { isUserAdmin, sortByProp } from "../../../../services/utils"; import ConfirmationDialog from "../../../common/dialogs/ConfirmationDialog"; import useEnqueueErrorSnackbar from "../../../../hooks/useEnqueueErrorSnackbar"; @@ -65,27 +60,25 @@ interface TokenAction extends Action { payload?: BotDTO["id"] | BotDTO | BotDTO[]; } -const reducer = produce( - (draft, action) => { - const { payload } = action; +const reducer = produce((draft, action) => { + const { payload } = action; - switch (action.type) { - case TokenActionKind.ADD: { - draft.push(payload as BotDetailsDtoWithUser); - return; - } - case TokenActionKind.DELETE: { - const index = draft.findIndex((token) => token.id === payload); - if (index > -1) { - draft.splice(index, 1); - } - return; + switch (action.type) { + case TokenActionKind.ADD: { + draft.push(payload as BotDetailsDtoWithUser); + return; + } + case TokenActionKind.DELETE: { + const index = draft.findIndex((token) => token.id === payload); + if (index > -1) { + draft.splice(index, 1); } - case TokenActionKind.RESET: - return payload as BotDetailsDtoWithUser[]; + return; } - }, -); + case TokenActionKind.RESET: + return payload as BotDetailsDtoWithUser[]; + } +}); function Tokens() { const [tokenToDisplayInfo, setTokenToDisplayInfo] = useState(); @@ -175,10 +168,7 @@ function Tokens() { }); }) .catch((err) => { - enqueueErrorSnackbar( - t("settings.error.tokenDelete", { 0: token.name }), - err, - ); + enqueueErrorSnackbar(t("settings.error.tokenDelete", { 0: token.name }), err); }) .finally(() => { setTokensInLoading((prev) => prev.filter((u) => u !== token)); @@ -212,7 +202,7 @@ function Tokens() { - )) as ReactNode, + )) as React.ReactNode, ], // Token list [ @@ -228,15 +218,10 @@ function Tokens() {
) : ( <> - setTokenToDisplayInfo(token)} - > + setTokenToDisplayInfo(token)}> - setTokenToDelete(token)} - > + setTokenToDelete(token)}> @@ -252,9 +237,7 @@ function Tokens() { primary={ {token.name} - + {token.user.name} diff --git a/webapp/src/components/App/Settings/Users/Header.tsx b/webapp/src/components/App/Settings/Users/Header.tsx index 47969745bf..3340e5f836 100644 --- a/webapp/src/components/App/Settings/Users/Header.tsx +++ b/webapp/src/components/App/Settings/Users/Header.tsx @@ -17,7 +17,7 @@ import PersonAddAltIcon from "@mui/icons-material/PersonAddAlt"; import { useTranslation } from "react-i18next"; import { useState } from "react"; import CreateUserDialog from "./dialog/CreateUserDialog"; -import { UserDetailsDTO } from "../../../../common/types"; +import type { UserDetailsDTO } from "../../../../common/types"; import SearchFE from "../../../common/fieldEditors/SearchFE"; interface Props { diff --git a/webapp/src/components/App/Settings/Users/dialog/CreateUserDialog.tsx b/webapp/src/components/App/Settings/Users/dialog/CreateUserDialog.tsx index 298b7fb84d..2e1d710317 100644 --- a/webapp/src/components/App/Settings/Users/dialog/CreateUserDialog.tsx +++ b/webapp/src/components/App/Settings/Users/dialog/CreateUserDialog.tsx @@ -16,7 +16,7 @@ import PersonAddIcon from "@mui/icons-material/PersonAdd"; import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; import { usePromise as usePromiseWrapper } from "react-use"; -import { +import type { GroupDTO, RoleDetailsDTO, RoleType, @@ -25,8 +25,8 @@ import { } from "../../../../../common/types"; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; import { createRole, createUser } from "../../../../../services/api/user"; -import { SubmitHandlerPlus } from "../../../../common/Form/types"; -import UserFormDialog, { UserFormDialogProps } from "./UserFormDialog"; +import type { SubmitHandlerPlus } from "../../../../common/Form/types"; +import UserFormDialog, { type UserFormDialogProps } from "./UserFormDialog"; type InheritPropsToOmit = "title" | "titleIcon" | "onSubmit" | "onCancel"; @@ -57,10 +57,7 @@ function CreateUserDialog(props: Props) { variant: "success", }); } catch (e) { - enqueueErrorSnackbar( - t("settings.error.userSave", { 0: username }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.userSave", { 0: username }), e as Error); throw e; } @@ -68,13 +65,12 @@ function CreateUserDialog(props: Props) { let roles: UserDetailsDTO["roles"] = []; if (permissions.length > 0) { - const promises = permissions.map( - (perm: { group: GroupDTO; type: RoleType }) => - createRole({ - group_id: perm.group.id, - type: perm.type, - identity_id: newUser.id, - }), + const promises = permissions.map((perm: { group: GroupDTO; type: RoleType }) => + createRole({ + group_id: perm.group.id, + type: perm.type, + identity_id: newUser.id, + }), ); const res: RoleDetailsDTO[] = await mounted(Promise.all(promises)); @@ -92,10 +88,7 @@ function CreateUserDialog(props: Props) { // Because we cannot recover roles eventually created reloadFetchUsers(); - enqueueErrorSnackbar( - t("settings.error.userRolesSave", { 0: newUser.name }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.userRolesSave", { 0: newUser.name }), e as Error); } closeDialog(); diff --git a/webapp/src/components/App/Settings/Users/dialog/UpdateUserDialog.tsx b/webapp/src/components/App/Settings/Users/dialog/UpdateUserDialog.tsx index 1f8f6afabb..e796c5a3ce 100644 --- a/webapp/src/components/App/Settings/Users/dialog/UpdateUserDialog.tsx +++ b/webapp/src/components/App/Settings/Users/dialog/UpdateUserDialog.tsx @@ -17,23 +17,14 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { usePromise as usePromiseWrapper } from "react-use"; import { useSnackbar } from "notistack"; -import { - GroupDTO, - RoleType, - UserDetailsDTO, -} from "../../../../../common/types"; +import type { GroupDTO, RoleType, UserDetailsDTO } from "../../../../../common/types"; import { createRole, deleteUserRoles } from "../../../../../services/api/user"; -import UserFormDialog, { UserFormDialogProps } from "./UserFormDialog"; -import { UserEdit } from ".."; +import UserFormDialog, { type UserFormDialogProps } from "./UserFormDialog"; +import type { UserEdit } from ".."; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; -import { SubmitHandlerPlus } from "../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../common/Form/types"; -type InheritPropsToOmit = - | "title" - | "titleIcon" - | "defaultValues" - | "onSubmit" - | "onCancel"; +type InheritPropsToOmit = "title" | "titleIcon" | "defaultValues" | "onSubmit" | "onCancel"; interface Props extends Omit { user: UserDetailsDTO; @@ -43,8 +34,7 @@ interface Props extends Omit { } function UpdateUserDialog(props: Props) { - const { user, closeDialog, editUser, reloadFetchUsers, ...dialogProps } = - props; + const { user, closeDialog, editUser, reloadFetchUsers, ...dialogProps } = props; const { t } = useTranslation(); const mounted = usePromiseWrapper(); const { enqueueSnackbar } = useSnackbar(); @@ -75,13 +65,12 @@ function UpdateUserDialog(props: Props) { try { await mounted(deleteUserRoles(user.id)); - const promises = permissions.map( - (perm: { group: GroupDTO; type: RoleType }) => - createRole({ - group_id: perm.group.id, - type: perm.type, - identity_id: user.id, - }), + const promises = permissions.map((perm: { group: GroupDTO; type: RoleType }) => + createRole({ + group_id: perm.group.id, + type: perm.type, + identity_id: user.id, + }), ); const res = await mounted(Promise.all(promises)); @@ -102,10 +91,7 @@ function UpdateUserDialog(props: Props) { // Because we cannot recover roles eventually deleted/created reloadFetchUsers(); - enqueueErrorSnackbar( - t("settings.error.userRolesSave", { 0: user.name }), - e as Error, - ); + enqueueErrorSnackbar(t("settings.error.userRolesSave", { 0: user.name }), e as Error); } closeDialog(); diff --git a/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/UserForm.tsx b/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/UserForm.tsx index 7607a4a00f..9a388f8f1b 100644 --- a/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/UserForm.tsx +++ b/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/UserForm.tsx @@ -31,23 +31,19 @@ import { ListItemIcon, ListItemText, CircularProgress, - SelectChangeEvent, + type SelectChangeEvent, } from "@mui/material"; import { Controller, useFieldArray } from "react-hook-form"; import { v4 as uuidv4 } from "uuid"; import DeleteIcon from "@mui/icons-material/Delete"; import GroupIcon from "@mui/icons-material/Group"; -import { - RESERVED_GROUP_NAMES, - RESERVED_USER_NAMES, - ROLE_TYPE_KEYS, -} from "../../../utils"; -import { GroupDTO, RoleType } from "../../../../../../common/types"; +import { RESERVED_GROUP_NAMES, RESERVED_USER_NAMES, ROLE_TYPE_KEYS } from "../../../utils"; +import { RoleType, type GroupDTO } from "../../../../../../common/types"; import { roleToString, sortByName } from "../../../../../../services/utils"; import usePromise from "../../../../../../hooks/usePromise"; import { getGroups, getUsers } from "../../../../../../services/api/user"; -import { UserFormDialogProps } from "."; -import { UseFormReturnPlus } from "../../../../../common/Form/types"; +import type { UserFormDialogProps } from "."; +import type { UseFormReturnPlus } from "../../../../../common/Form/types"; import { validatePassword, validateString } from "@/utils/validation/string"; interface Props extends UseFormReturnPlus { @@ -91,9 +87,7 @@ function UserForm(props: Props) { if (!groups) { return []; } - return sortByName( - groups.filter((group) => !RESERVED_GROUP_NAMES.includes(group.name)), - ); + return sortByName(groups.filter((group) => !RESERVED_GROUP_NAMES.includes(group.name))); }, [groups]); //////////////////////////////////////////////////////////////// @@ -148,8 +142,7 @@ function UserForm(props: Props) { {...commonTextFieldProps} {...register("confirmPassword", { validate: (v) => - v === getValues("password") || - t("settings.user.form.error.passwordMismatch"), + v === getValues("password") || t("settings.user.form.error.passwordMismatch"), })} /> @@ -159,8 +152,7 @@ function UserForm(props: Props) { sx={{ p: 2, mt: 2, - backgroundImage: - "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", + backgroundImage: "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", }} > {t("global.permissions")} @@ -232,11 +224,7 @@ function UserForm(props: Props) { disablePadding dense > - + diff --git a/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/index.tsx b/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/index.tsx index cc2dd19efd..425a3adbe2 100644 --- a/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/index.tsx +++ b/webapp/src/components/App/Settings/Users/dialog/UserFormDialog/index.tsx @@ -13,10 +13,8 @@ */ import { DialogContentText } from "@mui/material"; -import FormDialog, { - FormDialogProps, -} from "../../../../../common/dialogs/FormDialog"; -import { GroupDTO, RoleType } from "../../../../../../common/types"; +import FormDialog, { type FormDialogProps } from "../../../../../common/dialogs/FormDialog"; +import type { GroupDTO, RoleType } from "../../../../../../common/types"; import UserForm from "./UserForm"; export interface UserFormDialogProps extends Omit { diff --git a/webapp/src/components/App/Settings/Users/index.tsx b/webapp/src/components/App/Settings/Users/index.tsx index 373ca36b84..67ac430351 100644 --- a/webapp/src/components/App/Settings/Users/index.tsx +++ b/webapp/src/components/App/Settings/Users/index.tsx @@ -26,12 +26,12 @@ import { } from "@mui/material"; import DeleteIcon from "@mui/icons-material/Delete"; import EditIcon from "@mui/icons-material/Edit"; -import { useMemo, useReducer, useState, ReactNode } from "react"; +import { useMemo, useReducer, useState } from "react"; import { useTranslation } from "react-i18next"; import PersonIcon from "@mui/icons-material/Person"; import { produce } from "immer"; import { usePromise as usePromiseWrapper, useUpdateEffect } from "react-use"; -import { Action } from "redux"; +import type { Action } from "redux"; import { useSnackbar } from "notistack"; import * as R from "ramda"; import { deleteUser, getUsers } from "../../../../services/api/user"; @@ -40,7 +40,7 @@ import useEnqueueErrorSnackbar from "../../../../hooks/useEnqueueErrorSnackbar"; import ConfirmationDialog from "../../../common/dialogs/ConfirmationDialog"; import Header from "./Header"; import { RESERVED_USER_NAMES } from "../utils"; -import { UserDetailsDTO } from "../../../../common/types"; +import type { UserDetailsDTO } from "../../../../common/types"; import UpdateUserDialog from "./dialog/UpdateUserDialog"; import { sortByName } from "../../../../services/utils"; import { isSearchMatching } from "../../../../utils/stringUtils"; @@ -154,10 +154,7 @@ function Users() { }); }) .catch((err) => { - enqueueErrorSnackbar( - t("settings.error.userDelete", { 0: user.name }), - err, - ); + enqueueErrorSnackbar(t("settings.error.userDelete", { 0: user.name }), err); }) .finally(() => { setUsersInLoading((prev) => prev.filter((u) => u !== user)); @@ -191,7 +188,7 @@ function Users() { - )) as ReactNode, + )) as React.ReactNode, ], // User list [ @@ -210,10 +207,7 @@ function Users() { setUserToEdit(user)}> - setUserToDelete(user)} - > + setUserToDelete(user)}> diff --git a/webapp/src/components/App/Settings/index.tsx b/webapp/src/components/App/Settings/index.tsx index 60063a8e1b..ff5919e36a 100644 --- a/webapp/src/components/App/Settings/index.tsx +++ b/webapp/src/components/App/Settings/index.tsx @@ -15,7 +15,7 @@ import SettingsIcon from "@mui/icons-material/Settings"; import { TabContext, TabList, TabPanel } from "@mui/lab"; import { Box, Tab } from "@mui/material"; -import { SyntheticEvent, useMemo, useState } from "react"; +import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import RootPage from "../../common/page/RootPage"; import Groups from "./Groups"; @@ -24,10 +24,7 @@ import Tokens from "./Tokens"; import Users from "./Users"; import General from "./General"; import useAppSelector from "../../../redux/hooks/useAppSelector"; -import { - isAuthUserAdmin, - isAuthUserInGroupAdmin, -} from "../../../redux/selectors"; +import { isAuthUserAdmin, isAuthUserInGroupAdmin } from "../../../redux/selectors"; import { tuple } from "../../../utils/tsUtils"; function Settings() { @@ -40,8 +37,7 @@ function Settings() { return [ tuple(t("global.general"), () => ), isUserAdmin && tuple(t("global.users"), () => ), - (isUserAdmin || isUserInGroupAdmin) && - tuple(t("global.group"), () => ), + (isUserAdmin || isUserInGroupAdmin) && tuple(t("global.group"), () => ), tuple(t("global.tokens"), () => ), isUserAdmin && tuple(t("global.maintenance"), () => ), ].filter(Boolean); @@ -51,7 +47,7 @@ function Settings() { // Event Handlers //////////////////////////////////////////////////////////////// - const handleTabChange = (event: SyntheticEvent, newValue: string) => { + const handleTabChange = (event: React.SyntheticEvent, newValue: string) => { setTabValue(newValue); }; diff --git a/webapp/src/components/App/Settings/utils.ts b/webapp/src/components/App/Settings/utils.ts index b074304987..3e2ceb4b05 100644 --- a/webapp/src/components/App/Settings/utils.ts +++ b/webapp/src/components/App/Settings/utils.ts @@ -18,6 +18,6 @@ import { RoleType } from "../../../common/types"; export const RESERVED_USER_NAMES = ["admin"]; export const RESERVED_GROUP_NAMES = ["admin"]; -export const ROLE_TYPE_KEYS = Object.values(RoleType).filter( - RA.isString, -) as Array; +export const ROLE_TYPE_KEYS = Object.values(RoleType).filter(RA.isString) as Array< + keyof typeof RoleType +>; diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandImportButton.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandImportButton.tsx index 3c0912d1f4..dab8eeac63 100644 --- a/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandImportButton.tsx +++ b/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandImportButton.tsx @@ -51,7 +51,7 @@ function CommandImportButton(props: PropTypes) { const json = JSON.parse(text as string); onImport(json); } - } catch (error) { + } catch { enqueueSnackbar(t("variants.error.jsonParsing"), { variant: "error", }); @@ -64,11 +64,7 @@ function CommandImportButton(props: PropTypes) { return ( - + , + icon: , text: item.user || t("global.unknown"), }, { - icon: , + icon: , text: item.updatedAt ? formatDate(item.updatedAt) : t("global.unknown"), - tooltip: item.updatedAt - ? formatDateWithLocale(item.updatedAt) - : t("global.unknown"), + tooltip: item.updatedAt ? formatDateWithLocale(item.updatedAt) : t("global.unknown"), }, ]; @@ -61,9 +60,7 @@ function CommandDetails({ item }: Props) { {details.map((detail, index) => ( - {index > 0 && ( - - )} + {index > 0 && } {detail.icon} {detail.tooltip ? ( diff --git a/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandListItem/CommandMatrixViewer.tsx b/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandListItem/CommandMatrixViewer.tsx index 51fbb8a7f4..f55b061ed9 100644 --- a/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandListItem/CommandMatrixViewer.tsx +++ b/webapp/src/components/App/Singlestudy/Commands/Edition/DraggableCommands/CommandListItem/CommandMatrixViewer.tsx @@ -13,11 +13,11 @@ */ import { Box, Button } from "@mui/material"; -import { isString } from "ramda-adjunct"; +import * as RA from "ramda-adjunct"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import MatrixDialog from "../../../../../Data/MatrixDialog"; -import { CommandEnum, CommandItem } from "../../commandTypes"; +import { CommandEnum, type CommandItem } from "../../commandTypes"; interface PropTypes { command: CommandItem; @@ -31,7 +31,7 @@ function CommandMatrixViewer(props: PropTypes) { const [openViewer, setOpenViewer] = useState(false); const [t] = useTranslation(); - if (action === CommandEnum.REPLACE_MATRIX && isString(matrixId)) { + if (action === CommandEnum.REPLACE_MATRIX && RA.isString(matrixId)) { return ( - @@ -114,16 +99,10 @@ function NoteEditorModal(props: Props) { >
- onStyleClick("BOLD")} - > + onStyleClick("BOLD")}> B - onStyleClick("ITALIC")} - > + onStyleClick("ITALIC")}> I - EditorState.createEmpty(), - ); + const [editorState, setEditorState] = useState(() => EditorState.createEmpty()); const [editionMode, setEditionMode] = useState(false); const [content, setContent] = useState(""); const { status: synthesisStatus } = useStudySynthesis({ studyId: study.id }); const areas = useAppSelector((state) => getAreas(state, study.id)); const links = useAppSelector((state) => getLinks(state, study.id)); - const { data: diskUsage, isLoading: isDiskUsageLoading } = - usePromiseWithSnackbarError(() => getStudyDiskUsage(study.id), { + const { data: diskUsage, isLoading: isDiskUsageLoading } = usePromiseWithSnackbarError( + () => getStudyDiskUsage(study.id), + { errorMessage: t("studies.error.retrieveData"), deps: [study?.id], - }); + }, + ); const commentRes = usePromiseWithSnackbarError(() => getComments(study.id), { errorMessage: t("studies.error.retrieveData"), @@ -115,9 +111,7 @@ function Notes({ study }: Props) { useEffect(() => { const comments = commentRes.data; if (comments) { - setEditorState( - EditorState.createWithContent(convertXMLToDraftJS(comments)), - ); + setEditorState(EditorState.createWithContent(convertXMLToDraftJS(comments))); setContent(comments); } }, [commentRes.data]); @@ -129,9 +123,7 @@ function Notes({ study }: Props) { const handleSave = async (newContent: string) => { const prevEditorState = editorState; setEditionMode("loading"); - setEditorState( - EditorState.createWithContent(convertXMLToDraftJS(newContent)), - ); + setEditorState(EditorState.createWithContent(convertXMLToDraftJS(newContent))); try { await editComments(study.id, newContent); @@ -200,11 +192,7 @@ function Notes({ study }: Props) { - ) : ( - convertSize(diskUsage || 0) - ), + content: isDiskUsageLoading ? : convertSize(diskUsage || 0), label: t("study.diskUsage"), icon: StorageIcon, iconColor: getColorForSize(diskUsage || 0), diff --git a/webapp/src/components/App/Singlestudy/HomeView/InformationView/Notes/utils.ts b/webapp/src/components/App/Singlestudy/HomeView/InformationView/Notes/utils.ts index 4f2d146330..5e5d2fd643 100644 --- a/webapp/src/components/App/Singlestudy/HomeView/InformationView/Notes/utils.ts +++ b/webapp/src/components/App/Singlestudy/HomeView/InformationView/Notes/utils.ts @@ -14,10 +14,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable no-param-reassign */ -import { ContentState, convertToRaw, EditorState } from "draft-js"; +import { convertToRaw, type ContentState, type EditorState } from "draft-js"; import draftToHtml from "draftjs-to-html"; import { convertFromHTML } from "draft-convert"; -import { Element as XMLElement, js2xml, xml2json } from "xml-js"; +import { js2xml, xml2json, type Element as XMLElement } from "xml-js"; import theme from "../../../../../../theme"; interface BlockMap { @@ -143,17 +143,12 @@ const parseXMLToHTMLNode = ( if (attributesUtils.list !== undefined) { if (prevListSeq === undefined) { attributesUtils.openBalise = `${ - attributesUtils.list === "Numbered List" - ? "
  1. " - : "
    • " + attributesUtils.list === "Numbered List" ? "
      1. " : "
        • " }${attributesUtils.openBalise}`; } else if (prevListSeq !== attributesUtils.list) { - const closePrevBalise = - prevListSeq === "Numbered List" ? "
      " : "
    "; // Close previous list + const closePrevBalise = prevListSeq === "Numbered List" ? "
" : ""; // Close previous list attributesUtils.openBalise = `${closePrevBalise}${ - attributesUtils.list === "Numbered List" - ? "
  1. " - : "
    • " + attributesUtils.list === "Numbered List" ? "
      1. " : "
        • " }${attributesUtils.openBalise}`; } else { attributesUtils.openBalise = `
        • ${attributesUtils.openBalise}`; @@ -164,21 +159,16 @@ const parseXMLToHTMLNode = ( attributesUtils.list === "Numbered List" ? "
      " : "
    "; } } else if (prevListSeq !== undefined) { - const closePrevBalise = - prevListSeq === "Numbered List" ? "
" : ""; // Close previous list + const closePrevBalise = prevListSeq === "Numbered List" ? "" : ""; // Close previous list attributesUtils.openBalise = `${closePrevBalise}<${ (XmlToHTML as any)[node.name] }>${attributesUtils.openBalise}`; - attributesUtils.closeBalise += ``; + attributesUtils.closeBalise += ``; } else { attributesUtils.openBalise = `<${(XmlToHTML as any)[node.name]}>${ attributesUtils.openBalise }`; - attributesUtils.closeBalise += ``; + attributesUtils.closeBalise += ``; } } @@ -194,10 +184,7 @@ const parseXMLToHTMLNode = ( res.result += completeResult.result; } return { - result: - attributesUtils.openBalise + - res.result + - attributesUtils.closeBalise, + result: attributesUtils.openBalise + res.result + attributesUtils.closeBalise, listSeq: attributesUtils.list, }; } @@ -265,18 +252,12 @@ const parseHTMLToXMLNode = ( ): ParseHTMLToXMLNodeActions => { let action: ParseHTMLToXMLNodeActions = ParseHTMLToXMLNodeActions.NONE; const parseChild = (nodeElement: XMLElement): ParseHTMLToXMLNodeActions => { - let resultAction: ParseHTMLToXMLNodeActions = - ParseHTMLToXMLNodeActions.NONE; + let resultAction: ParseHTMLToXMLNodeActions = ParseHTMLToXMLNodeActions.NONE; if (nodeElement.elements !== undefined) { const actionList: ParseHTMLToXMLActionList[] = []; - let childAction: ParseHTMLToXMLNodeActions = - ParseHTMLToXMLNodeActions.NONE; + let childAction: ParseHTMLToXMLNodeActions = ParseHTMLToXMLNodeActions.NONE; for (let i = 0; i < nodeElement.elements.length; i++) { - childAction = parseHTMLToXMLNode( - nodeElement.elements[i], - nodeElement, - i, - ); + childAction = parseHTMLToXMLNode(nodeElement.elements[i], nodeElement, i); if (childAction !== ParseHTMLToXMLNodeActions.NONE) { actionList.push({ action: childAction, @@ -287,25 +268,14 @@ const parseHTMLToXMLNode = ( actionList.forEach((elm: ParseHTMLToXMLActionList) => { if (nodeElement.elements !== undefined) { if (elm.action === ParseHTMLToXMLNodeActions.DELETE) { - nodeElement.elements = nodeElement.elements.filter( - (item) => item !== elm.node, - ); - } else if ( - elm.node.elements !== undefined && - elm.node.elements.length > 0 - ) { + nodeElement.elements = nodeElement.elements.filter((item) => item !== elm.node); + } else if (elm.node.elements !== undefined && elm.node.elements.length > 0) { let newElements: XMLElement[] = []; - const index = nodeElement.elements.findIndex( - (item) => item === elm.node, - ); + const index = nodeElement.elements.findIndex((item) => item === elm.node); if (index !== undefined && index >= 0) { - newElements = newElements.concat( - nodeElement.elements.slice(0, index), - ); + newElements = newElements.concat(nodeElement.elements.slice(0, index)); newElements = newElements.concat(elm.node.elements); - newElements = newElements.concat( - nodeElement.elements.slice(index + 1), - ); + newElements = newElements.concat(nodeElement.elements.slice(index + 1)); node.elements = newElements; if (elm.action === ParseHTMLToXMLNodeActions.TEXTTOELEMENTS) { @@ -331,8 +301,7 @@ const parseHTMLToXMLNode = ( { type: "text", text: - quoteList[j][0] === " " || - quoteList[j][quoteList[j].length - 1] === " " + quoteList[j][0] === " " || quoteList[j][quoteList[j].length - 1] === " " ? `"${quoteList[j]}"` : quoteList[j], }, @@ -359,10 +328,7 @@ const parseHTMLToXMLNode = ( elements: [ { type: "text", - text: - data[0] === " " || data[data.length - 1] === " " - ? `"${data}"` - : data, + text: data[0] === " " || data[data.length - 1] === " " ? `"${data}"` : data, }, ], }); @@ -438,8 +404,7 @@ const parseHTMLToXMLNode = ( leftsubindent: "60", bulletstyle: parent.name === "ol" ? "4353" : "512", bulletnumber: lastListSeq.toString(), - liststyle: - parent.name === "ol" ? "Numbered List" : "Bullet List", + liststyle: parent.name === "ol" ? "Numbered List" : "Bullet List", }; if (parent.name === "ul") { node.attributes = { diff --git a/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx b/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx index 52b57f4935..7fc12cb8ca 100644 --- a/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx +++ b/webapp/src/components/App/Singlestudy/HomeView/InformationView/index.tsx @@ -16,16 +16,13 @@ import { useState } from "react"; import { Paper, Button, Box, Divider } from "@mui/material"; import { useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import { AxiosError } from "axios"; -import { StudyMetadata, VariantTree } from "../../../../../common/types"; +import type { AxiosError } from "axios"; +import type { StudyMetadata, VariantTree } from "../../../../../common/types"; import CreateVariantDialog from "./CreateVariantDialog"; import LauncherHistory from "./LauncherHistory"; import Notes from "./Notes"; import LauncherDialog from "../../../Studies/LauncherDialog"; -import { - copyStudy, - unarchiveStudy as callUnarchiveStudy, -} from "../../../../../services/api/study"; +import { copyStudy, unarchiveStudy as callUnarchiveStudy } from "../../../../../services/api/study"; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; interface Props { @@ -43,11 +40,7 @@ function InformationView(props: Props) { const importStudy = async (study: StudyMetadata) => { try { - await copyStudy( - study.id, - `${study.name} (${t("studies.copySuffix")})`, - false, - ); + await copyStudy(study.id, `${study.name} (${t("studies.copySuffix")})`, false); } catch (e) { enqueueErrorSnackbar(t("studies.error.copyStudy"), e as AxiosError); } @@ -100,12 +93,7 @@ function InformationView(props: Props) { alignItems="flex-start" py={1.5} > - + )} diff --git a/webapp/src/components/App/Singlestudy/HomeView/StudyTreeView/index.tsx b/webapp/src/components/App/Singlestudy/HomeView/StudyTreeView/index.tsx index 3e483c8e21..400db365d3 100644 --- a/webapp/src/components/App/Singlestudy/HomeView/StudyTreeView/index.tsx +++ b/webapp/src/components/App/Singlestudy/HomeView/StudyTreeView/index.tsx @@ -13,10 +13,9 @@ */ import { useEffect, useMemo, useState } from "react"; -import * as React from "react"; import { Box, styled } from "@mui/material"; -import { StudyMetadata, VariantTree } from "../../../../../common/types"; -import { StudyTree, getTreeNodes } from "./utils"; +import type { StudyMetadata, VariantTree } from "../../../../../common/types"; +import { getTreeNodes, type StudyTree } from "./utils"; import { CIRCLE_RADIUS, colors, @@ -89,11 +88,7 @@ export default function CustomizedTreeView(props: Props) { setHoverId(""); }; - const buildRecursiveTree = ( - tree: StudyTree, - i = 0, - j = 0, - ): React.ReactNode[] => { + const buildRecursiveTree = (tree: StudyTree, i = 0, j = 0): React.ReactNode[] => { const { drawOptions, name, attributes, children } = tree; const { id } = attributes; const { nbAllChildrens } = drawOptions; @@ -105,22 +100,14 @@ export default function CustomizedTreeView(props: Props) { let verticalLineEnd = 0; if (children.length > 0) { - verticalLineEnd = - nbAllChildrens - - children[children.length - 1].drawOptions.nbAllChildrens; + verticalLineEnd = nbAllChildrens - children[children.length - 1].drawOptions.nbAllChildrens; verticalLineEnd = (j + verticalLineEnd) * TILE_SIZE_Y + CIRCLE_RADIUS; } const cx = i * TILE_SIZE_X + DCX; const cy = j * TILE_SIZE_Y + DCY; let res: React.ReactNode[] = [ - , + , { return nodeDatum; }; -const buildTree = async ( - node: StudyTree, - childrenTree: VariantTree, -): Promise => { +const buildTree = async (node: StudyTree, childrenTree: VariantTree): Promise => { if ((childrenTree.children || []).length === 0) { node.drawOptions.depth = 1; node.drawOptions.nbAllChildrens = 0; diff --git a/webapp/src/components/App/Singlestudy/HomeView/index.tsx b/webapp/src/components/App/Singlestudy/HomeView/index.tsx index 83f4d765a5..d48e184f34 100644 --- a/webapp/src/components/App/Singlestudy/HomeView/index.tsx +++ b/webapp/src/components/App/Singlestudy/HomeView/index.tsx @@ -15,7 +15,7 @@ import { useNavigate } from "react-router-dom"; import { Box } from "@mui/material"; import Split from "react-split"; -import { StudyMetadata, VariantTree } from "../../../../common/types"; +import type { StudyMetadata, VariantTree } from "../../../../common/types"; import "./Split.css"; import StudyTreeView from "./StudyTreeView"; import InformationView from "./InformationView"; diff --git a/webapp/src/components/App/Singlestudy/NavHeader/Actions.tsx b/webapp/src/components/App/Singlestudy/NavHeader/Actions.tsx index fb9dca2669..236e80c00b 100644 --- a/webapp/src/components/App/Singlestudy/NavHeader/Actions.tsx +++ b/webapp/src/components/App/Singlestudy/NavHeader/Actions.tsx @@ -19,7 +19,7 @@ import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router"; import MoreVertIcon from "@mui/icons-material/MoreVert"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; -import { StudyMetadata, StudyType } from "../../../../common/types"; +import { StudyType, type StudyMetadata } from "../../../../common/types"; import { toggleFavorite } from "../../../../redux/ducks/studies"; import StarToggle from "../../../common/StarToggle"; import useAppDispatch from "../../../../redux/hooks/useAppDispatch"; @@ -85,21 +85,13 @@ function Actions({ }} > - - - - @@ -181,9 +161,7 @@ function ThematicTrimmingDialog(props: Props) { disableGutters > }> - {t( - `study.configuration.general.thematicTrimming.group.${group}`, - )} + {t(`study.configuration.general.thematicTrimming.group.${group}`)} diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ThematicTrimmingDialog/utils.ts b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ThematicTrimmingDialog/utils.ts index a3a16e5661..80b571b9a6 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ThematicTrimmingDialog/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/General/dialogs/ThematicTrimmingDialog/utils.ts @@ -13,8 +13,8 @@ */ import * as R from "ramda"; -import { ThematicTrimmingConfig } from "../../../../../../../../services/api/studies/config/thematicTrimming/types"; -import { O } from "ts-toolbelt"; +import type { ThematicTrimmingConfig } from "../../../../../../../../services/api/studies/config/thematicTrimming/types"; +import type { O } from "ts-toolbelt"; export const THEMATIC_TRIMMING_GROUPS = [ "general", diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/General/index.tsx index 9d9ea519d9..d20953b5aa 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/General/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/General/index.tsx @@ -15,20 +15,20 @@ import { useOutletContext } from "react-router"; import * as R from "ramda"; import { useState } from "react"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import Form from "../../../../../common/Form"; import Fields from "./Fields"; import ThematicTrimmingDialog from "./dialogs/ThematicTrimmingDialog"; import ScenarioPlaylistDialog from "./dialogs/ScenarioPlaylistDialog"; import { - GeneralFormFields, getGeneralFormFields, hasDayField, pickDayFields, - SetDialogStateType, setGeneralFormFields, + type GeneralFormFields, + type SetDialogStateType, } from "./utils"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; import ScenarioBuilderDialog from "./dialogs/ScenarioBuilderDialog"; function General() { @@ -71,33 +71,15 @@ function General() { {R.cond([ [ R.equals("thematicTrimming"), - () => ( - - ), + () => , ], [ R.equals("scenarioBuilder"), - () => ( - - ), + () => , ], [ R.equals("scenarioPlaylist"), - () => ( - - ), + () => , ], ])(dialog)} diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/General/utils.ts b/webapp/src/components/App/Singlestudy/explore/Configuration/General/utils.ts index 612e43080f..1476874c2e 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/General/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/General/utils.ts @@ -13,7 +13,7 @@ */ import * as R from "ramda"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import client from "../../../../../../services/api/client"; //////////////////////////////////////////////////////////////// @@ -84,11 +84,7 @@ export interface GeneralFormFields { thematicTrimming?: boolean; } -export type SetDialogStateType = - | "thematicTrimming" - | "scenarioPlaylist" - | "scenarioBuilder" - | ""; +export type SetDialogStateType = "thematicTrimming" | "scenarioPlaylist" | "scenarioBuilder" | ""; //////////////////////////////////////////////////////////////// // Constants @@ -147,11 +143,7 @@ export function setGeneralFormFields( return client.put(makeRequestURL(studyId), values); } -export const hasDayField = R.anyPass([ - R.has("firstDay"), - R.has("lastDay"), - R.has("leapYear"), -]); +export const hasDayField = R.anyPass([R.has("firstDay"), R.has("lastDay"), R.has("leapYear")]); export const pickDayFields = ( values: GeneralFormFields, diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/Fields.tsx index 143b3108ed..a4a2caaab3 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/Fields.tsx @@ -14,18 +14,18 @@ import { Box } from "@mui/material"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import SelectFE from "../../../../../common/fieldEditors/SelectFE"; import SwitchFE from "../../../../../common/fieldEditors/SwitchFE"; import Fieldset from "../../../../../common/Fieldset"; import { useFormContextPlus } from "../../../../../common/Form"; import { LEGACY_TRANSMISSION_CAPACITIES_OPTIONS, - OptimizationFormFields, SIMPLEX_OPTIMIZATION_RANGE_OPTIONS, toBooleanIfNeeded, TRANSMISSION_CAPACITIES_OPTIONS, UNFEASIBLE_PROBLEM_BEHAVIOR_OPTIONS, + type OptimizationFormFields, } from "./utils"; interface Props { @@ -42,9 +42,7 @@ function Fields(props: Props) {
-
+
diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/index.tsx index 775665d746..1269fccafe 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/index.tsx @@ -13,14 +13,14 @@ */ import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import Form from "../../../../../common/Form"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; import Fields from "./Fields"; import { getOptimizationFormFields, - OptimizationFormFields, setOptimizationFormFields, + type OptimizationFormFields, } from "./utils"; function Optimization() { @@ -30,9 +30,7 @@ function Optimization() { // Event Handlers //////////////////////////////////////////////////////////////// - const handleSubmit = async ( - data: SubmitHandlerPlus, - ) => { + const handleSubmit = async (data: SubmitHandlerPlus) => { return setOptimizationFormFields(study.id, data.dirtyValues); }; diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/utils.ts b/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/utils.ts index 319509ac63..d1f9404c7b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/Optimization/utils.ts @@ -18,7 +18,7 @@ import * as R from "ramda"; // Enums //////////////////////////////////////////////////////////////// -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import client from "../../../../../../services/api/client"; enum UnfeasibleProblemBehavior { @@ -54,10 +54,7 @@ enum TransmissionCapacities { export interface OptimizationFormFields { bindingConstraints: boolean; hurdleCosts: boolean; - transmissionCapacities: - | boolean - | LegacyTransmissionCapacities.Infinite - | TransmissionCapacities; + transmissionCapacities: boolean | LegacyTransmissionCapacities.Infinite | TransmissionCapacities; thermalClustersMinStablePower: boolean; thermalClustersMinUdTime: boolean; dayAheadReserve: boolean; @@ -73,18 +70,10 @@ export interface OptimizationFormFields { // Constants //////////////////////////////////////////////////////////////// -export const UNFEASIBLE_PROBLEM_BEHAVIOR_OPTIONS = Object.values( - UnfeasibleProblemBehavior, -); -export const SIMPLEX_OPTIMIZATION_RANGE_OPTIONS = Object.values( - SimplexOptimizationRange, -); -export const LEGACY_TRANSMISSION_CAPACITIES_OPTIONS = Object.values( - LegacyTransmissionCapacities, -); -export const TRANSMISSION_CAPACITIES_OPTIONS = Object.values( - TransmissionCapacities, -); +export const UNFEASIBLE_PROBLEM_BEHAVIOR_OPTIONS = Object.values(UnfeasibleProblemBehavior); +export const SIMPLEX_OPTIMIZATION_RANGE_OPTIONS = Object.values(SimplexOptimizationRange); +export const LEGACY_TRANSMISSION_CAPACITIES_OPTIONS = Object.values(LegacyTransmissionCapacities); +export const TRANSMISSION_CAPACITIES_OPTIONS = Object.values(TransmissionCapacities); //////////////////////////////////////////////////////////////// // Functions diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/Fields.tsx index 0a361dc214..336cd8af53 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/Fields.tsx @@ -12,18 +12,11 @@ * This file is part of the Antares project. */ -import { - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, -} from "@mui/material"; -import { capitalize } from "lodash"; +import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; +import capitalize from "lodash/capitalize"; import NumberFE from "../../../../../common/fieldEditors/NumberFE"; import { useFormContextPlus } from "../../../../../common/Form"; -import { TSFormFields, TSType } from "./utils"; +import { TSType, type TSFormFields } from "./utils"; import BooleanFE from "../../../../../common/fieldEditors/BooleanFE"; import { useTranslation } from "react-i18next"; import { validateNumber } from "@/utils/validation/number"; @@ -67,19 +60,13 @@ function Fields() { }} > - - {capitalize(TSType.Thermal)} - + {capitalize(TSType.Thermal)} diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx index 3c04d03707..d8bd798c24 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx @@ -15,12 +15,9 @@ import { useOutletContext } from "react-router"; import type { StudyMetadata } from "../../../../../../common/types"; import Form from "../../../../../common/Form"; -import type { - SubmitHandlerPlus, - UseFormReturnPlus, -} from "../../../../../common/Form/types"; +import type { SubmitHandlerPlus, UseFormReturnPlus } from "../../../../../common/Form/types"; import Fields from "./Fields"; -import { DEFAULT_VALUES, setTimeSeriesFormFields, TSFormFields } from "./utils"; +import { DEFAULT_VALUES, setTimeSeriesFormFields, type TSFormFields } from "./utils"; import { useTranslation } from "react-i18next"; import usePromiseHandler from "../../../../../../hooks/usePromiseHandler"; import { generateTimeSeries } from "../../../../../../services/api/studies/timeseries"; diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/utils.ts b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/utils.ts index 22eef49008..1ae9e51f20 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/utils.ts @@ -12,8 +12,8 @@ * This file is part of the Antares project. */ -import { DeepPartial } from "react-hook-form"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { DeepPartial } from "react-hook-form"; +import type { StudyMetadata } from "../../../../../../common/types"; import client from "../../../../../../services/api/client"; //////////////////////////////////////////////////////////////// diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/index.tsx index 2cb4312daa..4b154c85a9 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/index.tsx @@ -16,7 +16,7 @@ import * as R from "ramda"; import { useMemo, useState } from "react"; import { useOutletContext } from "react-router"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../common/types"; +import type { StudyMetadata } from "../../../../../common/types"; import PropertiesView from "../../../../common/PropertiesView"; import ListElement from "../common/ListElement"; import AdequacyPatch from "./AdequacyPatch"; diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx index dfc763783a..d5d9ddaf01 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Folder.tsx @@ -50,15 +50,7 @@ import type { StudyMetadata } from "../../../../../../common/types"; import { useSnackbar } from "notistack"; function Folder(props: DataCompProps) { - const { - filename, - filePath, - treeData, - canEdit, - setSelectedFile, - reloadTreeData, - studyId, - } = props; + const { filename, filePath, treeData, canEdit, setSelectedFile, reloadTreeData, studyId } = props; const { t } = useTranslation(); const { study } = useOutletContext<{ study: StudyMetadata }>(); @@ -207,11 +199,7 @@ function Folder(props: DataCompProps) { )} {/* Items menu */} - + {t("global.delete")} diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Json.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Json.tsx index 5df699950b..336a640ae2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Json.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Json.tsx @@ -15,7 +15,7 @@ import { useTranslation } from "react-i18next"; import { useSnackbar } from "notistack"; import { editStudy, getStudyData } from "../../../../../../services/api/study"; -import JSONEditor, { JSONEditorProps } from "../../../../../common/JSONEditor"; +import JSONEditor, { type JSONEditorProps } from "../../../../../common/JSONEditor"; import usePromiseWithSnackbarError from "../../../../../../hooks/usePromiseWithSnackbarError"; import UsePromiseCond from "../../../../../common/utils/UsePromiseCond"; import type { DataCompProps } from "../utils"; @@ -29,13 +29,10 @@ function Json({ filePath, filename, studyId, canEdit }: DataCompProps) { const [t] = useTranslation(); const { enqueueSnackbar } = useSnackbar(); - const jsonRes = usePromiseWithSnackbarError( - () => getStudyData(studyId, filePath, -1), - { - errorMessage: t("studies.error.retrieveData"), - deps: [studyId, filePath], - }, - ); + const jsonRes = usePromiseWithSnackbarError(() => getStudyData(studyId, filePath, -1), { + errorMessage: t("studies.error.retrieveData"), + deps: [studyId, filePath], + }); //////////////////////////////////////////////////////////////// // Event Handlers diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx index b77dd93c1f..24a0452d86 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/Text.tsx @@ -17,10 +17,7 @@ import { Box, useTheme } from "@mui/material"; import { getStudyData } from "../../../../../../services/api/study"; import usePromiseWithSnackbarError from "../../../../../../hooks/usePromiseWithSnackbarError"; import UsePromiseCond from "../../../../../common/utils/UsePromiseCond"; -import { - Light as SyntaxHighlighter, - type SyntaxHighlighterProps, -} from "react-syntax-highlighter"; +import { Light as SyntaxHighlighter, type SyntaxHighlighterProps } from "react-syntax-highlighter"; import xml from "react-syntax-highlighter/dist/esm/languages/hljs/xml"; import plaintext from "react-syntax-highlighter/dist/esm/languages/hljs/plaintext"; import ini from "react-syntax-highlighter/dist/esm/languages/hljs/ini"; @@ -66,13 +63,7 @@ function getSyntaxProps(data: string | string[]): SyntaxHighlighterProps { }; } -function Text({ - studyId, - filePath, - filename, - fileType, - canEdit, -}: DataCompProps) { +function Text({ studyId, filePath, filename, fileType, canEdit }: DataCompProps) { const { t } = useTranslation(); const theme = useTheme(); diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Data/index.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Data/index.tsx index 9d09c246a5..cd69da5d1c 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Data/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Data/index.tsx @@ -12,7 +12,6 @@ * This file is part of the Antares project. */ -import { ComponentType } from "react"; import Text from "./Text"; import Unsupported from "./Unsupported"; import Matrix from "./Matrix"; @@ -22,8 +21,8 @@ import { getEffectiveFileType, type FileInfo, type FileType, + type DataCompProps, } from "../utils"; -import type { DataCompProps } from "../utils"; import ViewWrapper from "../../../../../common/page/ViewWrapper"; import type { StudyMetadata } from "../../../../../../common/types"; import Json from "./Json"; @@ -34,7 +33,7 @@ interface Props extends FileInfo { reloadTreeData: () => void; } -const componentByFileType: Record> = { +const componentByFileType: Record> = { matrix: Matrix, json: Json, text: Text, diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Tree/FileTreeItem.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Tree/FileTreeItem.tsx index dbc52c5a9f..5e2cf303e9 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Tree/FileTreeItem.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Tree/FileTreeItem.tsx @@ -13,7 +13,7 @@ */ import { Box } from "@mui/material"; -import { TreeData, getFileType, getFileIcon, isFolder } from "../utils"; +import { getFileType, getFileIcon, isFolder, type TreeData } from "../utils"; import DebugContext from "../DebugContext"; import { useContext } from "react"; import TreeItemEnhanced from "../../../../../common/TreeItemEnhanced"; diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/Tree/index.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/Tree/index.tsx index 417ef33b4f..7a51a19be4 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/Tree/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/Tree/index.tsx @@ -32,10 +32,7 @@ function Tree(props: Props) { // Event Handlers //////////////////////////////////////////////////////////////// - const handleExpandedItemsChange = ( - event: React.SyntheticEvent, - itemIds: string[], - ) => { + const handleExpandedItemsChange = (event: React.SyntheticEvent, itemIds: string[]) => { setExpandedItems(itemIds); }; @@ -59,12 +56,7 @@ function Tree(props: Props) { onExpandedItemsChange={handleExpandedItemsChange} > {Object.keys(data).map((filename) => ( - + ))} ); diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/index.tsx b/webapp/src/components/App/Singlestudy/explore/Debug/index.tsx index 953219eb98..eb081d8cfe 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Debug/index.tsx @@ -18,17 +18,12 @@ import { useOutletContext, useSearchParams } from "react-router-dom"; import { Box } from "@mui/material"; import Tree from "./Tree"; import Data from "./Data"; -import { StudyMetadata } from "../../../../../common/types"; +import type { StudyMetadata } from "../../../../../common/types"; import UsePromiseCond from "../../../../common/utils/UsePromiseCond"; import usePromiseWithSnackbarError from "../../../../../hooks/usePromiseWithSnackbarError"; import { getStudyData } from "../../../../../services/api/study"; import DebugContext from "./DebugContext"; -import { - getFileType, - type TreeData, - type FileInfo, - type TreeFolder, -} from "./utils"; +import { getFileType, type TreeData, type FileInfo, type TreeFolder } from "./utils"; import * as R from "ramda"; import SplitView from "../../../../common/SplitView"; import { useUpdateEffect } from "react-use"; @@ -66,9 +61,7 @@ function Debug() { const firstChildTreeData = R.path([firstChildName], res.data); const pathInUrlParts = pathInUrl?.split("/"); - const urlPathTreeData = pathInUrlParts - ? R.path(pathInUrlParts, res.data) - : null; + const urlPathTreeData = pathInUrlParts ? R.path(pathInUrlParts, res.data) : null; let fileInfo: FileInfo | null = null; diff --git a/webapp/src/components/App/Singlestudy/explore/Debug/utils.ts b/webapp/src/components/App/Singlestudy/explore/Debug/utils.ts index d546a1e4dc..0266a1331d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Debug/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Debug/utils.ts @@ -17,10 +17,10 @@ import TextSnippetIcon from "@mui/icons-material/TextSnippet"; import BlockIcon from "@mui/icons-material/Block"; import FolderIcon from "@mui/icons-material/Folder"; import DatasetIcon from "@mui/icons-material/Dataset"; -import { SvgIconComponent } from "@mui/icons-material"; +import type { SvgIconComponent } from "@mui/icons-material"; import * as RA from "ramda-adjunct"; import type { StudyMetadata } from "../../../../../common/types"; -import { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; +import type { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; //////////////////////////////////////////////////////////////// // Types @@ -65,14 +65,7 @@ const URL_SCHEMES = { FILE: "file://", } as const; -const SUPPORTED_EXTENSIONS = [ - ".txt", - ".log", - ".csv", - ".tsv", - ".ini", - ".yml", -] as const; +const SUPPORTED_EXTENSIONS = [".txt", ".log", ".csv", ".tsv", ".ini", ".yml"] as const; // Maps file types to their corresponding icon components. const iconByFileType: Record = { @@ -126,9 +119,7 @@ export function getFileType(treeData: TreeData): FileType { // We filter to only allow extensions that can be properly displayed (.txt, .log, .csv, .tsv, .ini) // Other extensions (like .RDS or .xlsx) are marked as unsupported since they can't be shown in the UI return treeData.startsWith(URL_SCHEMES.FILE) && - SUPPORTED_EXTENSIONS.some((ext) => - treeData.toLowerCase().endsWith(ext.toLowerCase()), - ) + SUPPORTED_EXTENSIONS.some((ext) => treeData.toLowerCase().endsWith(ext.toLowerCase())) ? "text" : "unsupported"; } @@ -170,9 +161,7 @@ export function isInOutputFolder(path: string): boolean { */ export function isEmptyContent(text: string | string[]): boolean { if (Array.isArray(text)) { - return ( - !text || text.every((line) => typeof line === "string" && !line.trim()) - ); + return !text || text.every((line) => typeof line === "string" && !line.trim()); } return typeof text === "string" && !text.trim(); @@ -209,10 +198,7 @@ export function isEmptyContent(text: string | string[]): boolean { * @param originalType - Original file type as determined by the system * @returns Modified file type (forces 'text' for matrices in output folders) */ -export function getEffectiveFileType( - filePath: string, - originalType: FileType, -): FileType { +export function getEffectiveFileType(filePath: string, originalType: FileType): FileType { if (isInOutputFolder(filePath) && originalType === "matrix") { return "text"; } @@ -227,9 +213,7 @@ export function getEffectiveFileType( * @returns String representation of the matrix */ function formatMatrixToString(matrix: number[][]): string { - return matrix - .map((row) => row.map((val) => val.toString()).join("\t")) - .join("\n"); + return matrix.map((row) => row.map((val) => val.toString()).join("\t")).join("\n"); } /** @@ -248,13 +232,11 @@ function parseResponse(res: string | MatrixDataDTO): string { try { // Handle case where API returns unparsed JSON string // Replace special numeric values with their string representations - const sanitizedJson = res - .replace(/NaN/g, '"NaN"') - .replace(/Infinity/g, '"Infinity"'); + const sanitizedJson = res.replace(/NaN/g, '"NaN"').replace(/Infinity/g, '"Infinity"'); const parsed = JSON.parse(sanitizedJson); return formatMatrixToString(parsed.data); - } catch (e) { + } catch { // If JSON parsing fails, assume it's plain text return res; } @@ -267,10 +249,7 @@ function parseResponse(res: string | MatrixDataDTO): string { * @param options - Configuration options including file path and type * @returns Processed content ready for display */ -export function parseContent( - content: string, - options: ContentParsingOptions, -): string { +export function parseContent(content: string, options: ContentParsingOptions): string { const { filePath, fileType } = options; if (isInOutputFolder(filePath) && fileType === "matrix") { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreaPropsView.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreaPropsView.tsx index feb39df236..808036abf9 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreaPropsView.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreaPropsView.tsx @@ -13,7 +13,7 @@ */ import { useEffect, useState } from "react"; -import { Area } from "../../../../../../common/types"; +import type { Area } from "../../../../../../common/types"; import PropertiesView from "../../../../../common/PropertiesView"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; import { getAreas } from "../../../../../../redux/selectors"; @@ -35,9 +35,7 @@ function AreaPropsView(props: PropsType) { const filter = (): Area[] => { if (areas) { return areas.filter( - (s) => - !areaNameFilter || - s.name.search(new RegExp(areaNameFilter, "i")) !== -1, + (s) => !areaNameFilter || s.name.search(new RegExp(areaNameFilter, "i")) !== -1, ); } return []; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreasTab.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreasTab.tsx index 508e75705a..f2be85e33d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreasTab.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/AreasTab.tsx @@ -15,7 +15,7 @@ import { useEffect, useMemo } from "react"; import { useLocation, useNavigate, useOutletContext } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import TabWrapper from "../../TabWrapper"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../redux/selectors"; @@ -55,9 +55,7 @@ function AreasTab({ renewablesClustering }: Props) { }, [areaId, navigate, location.pathname]); const tabList = useMemo(() => { - const basePath = `/studies/${ - study.id - }/explore/modelization/area/${encodeURI(areaId)}`; + const basePath = `/studies/${study.id}/explore/modelization/area/${encodeURI(areaId)}`; const tabs = [ { label: "study.modelization.properties", pathSuffix: "properties" }, diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/AllocationField.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/AllocationField.tsx index b95d995a48..89556d66e2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/AllocationField.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/AllocationField.tsx @@ -13,10 +13,10 @@ */ import { Typography, Grid } from "@mui/material"; -import { FieldArrayWithId } from "react-hook-form"; +import type { FieldArrayWithId } from "react-hook-form"; import NumberFE from "../../../../../../../common/fieldEditors/NumberFE"; import { useFormContextPlus } from "../../../../../../../common/Form"; -import { AllocationFormFields } from "./utils"; +import type { AllocationFormFields } from "./utils"; import { validateNumber } from "@/utils/validation/number"; interface Props { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/Fields.tsx index ce708a4771..bc3a9e3b5e 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/Fields.tsx @@ -15,12 +15,12 @@ import { useFieldArray } from "react-hook-form"; import { useOutletContext } from "react-router"; import { useFormContextPlus } from "../../../../../../../common/Form"; -import { AllocationFormFields } from "./utils"; +import type { AllocationFormFields } from "./utils"; import AllocationField from "./AllocationField"; import DynamicList from "../../../../../../../common/DynamicList"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getAreasById } from "../../../../../../../../redux/selectors"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import { useAreasOptions } from "../hooks/useAreasOptions"; function Fields() { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/index.tsx index fc50dff4a8..e487c1b679 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/index.tsx @@ -17,15 +17,15 @@ import { useOutletContext } from "react-router"; import { useState } from "react"; import Form from "../../../../../../../common/Form"; import Fields from "./Fields"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../../redux/selectors"; import { - AllocationFormFields, getAllocationFormFields, setAllocationFormFields, + type AllocationFormFields, } from "./utils"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import HydroMatrixDialog from "../HydroMatrixDialog"; import { HydroMatrix } from "../utils"; import { FormBox, FormPaper } from "../style"; @@ -56,8 +56,7 @@ function Allocation() { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/utils.ts index 5d5d054a11..281646e233 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Allocation/utils.ts @@ -12,10 +12,10 @@ * This file is part of the Antares project. */ -import { StudyMetadata, Area } from "../../../../../../../../common/types"; +import type { StudyMetadata, Area } from "../../../../../../../../common/types"; import client from "../../../../../../../../services/api/client"; -import { MatrixDataDTO } from "../../../../../../../common/Matrix/shared/types"; -import { AreaCoefficientItem } from "../utils"; +import type { MatrixDataDTO } from "../../../../../../../common/Matrix/shared/types"; +import type { AreaCoefficientItem } from "../utils"; //////////////////////////////////////////////////////////////// // Types @@ -29,10 +29,7 @@ export interface AllocationFormFields { // Utils //////////////////////////////////////////////////////////////// -function makeRequestURL( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string { +function makeRequestURL(studyId: StudyMetadata["id"], areaId: Area["name"]): string { return `v1/studies/${studyId}/areas/${areaId}/hydro/allocation/form`; } @@ -53,11 +50,7 @@ export async function setAllocationFormFields( return res.data; } -export const getAllocationMatrix = async ( - studyId: StudyMetadata["id"], -): Promise => { - const res = await client.get( - `v1/studies/${studyId}/areas/hydro/allocation/matrix`, - ); +export const getAllocationMatrix = async (studyId: StudyMetadata["id"]): Promise => { + const res = await client.get(`v1/studies/${studyId}/areas/hydro/allocation/matrix`); return res.data; }; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/CorrelationField.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/CorrelationField.tsx index 0dd9f41016..cd66057cd4 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/CorrelationField.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/CorrelationField.tsx @@ -13,10 +13,10 @@ */ import { Typography, Grid } from "@mui/material"; -import { FieldArrayWithId } from "react-hook-form"; +import type { FieldArrayWithId } from "react-hook-form"; import { useTranslation } from "react-i18next"; import NumberFE from "../../../../../../../common/fieldEditors/NumberFE"; -import { CorrelationFormFields } from "./utils"; +import type { CorrelationFormFields } from "./utils"; import { useFormContextPlus } from "../../../../../../../common/Form"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getCurrentArea } from "../../../../../../../../redux/selectors"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/Fields.tsx index 60a99464c7..c4132cf931 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/Fields.tsx @@ -14,17 +14,14 @@ import { useFieldArray } from "react-hook-form"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; -import { - getAreasById, - getCurrentArea, -} from "../../../../../../../../redux/selectors"; +import { getAreasById, getCurrentArea } from "../../../../../../../../redux/selectors"; import DynamicList from "../../../../../../../common/DynamicList"; import { useFormContextPlus } from "../../../../../../../common/Form"; import { useAreasOptions } from "../hooks/useAreasOptions"; import CorrelationField from "./CorrelationField"; -import { CorrelationFormFields } from "./utils"; +import type { CorrelationFormFields } from "./utils"; function Fields() { const { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/index.tsx index df566ba68d..85d66fc4e7 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/index.tsx @@ -16,14 +16,14 @@ import { Grid } from "@mui/material"; import { useOutletContext } from "react-router"; import { useState } from "react"; import Form from "../../../../../../../common/Form"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../../redux/selectors"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import { - CorrelationFormFields, getCorrelationFormFields, setCorrelationFormFields, + type CorrelationFormFields, } from "./utils"; import Fields from "./Fields"; import HydroMatrixDialog from "../HydroMatrixDialog"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/utils.ts index 253963b1c6..ec86504d3a 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/Correlation/utils.ts @@ -12,10 +12,10 @@ * This file is part of the Antares project. */ -import { StudyMetadata, Area } from "../../../../../../../../common/types"; +import type { StudyMetadata, Area } from "../../../../../../../../common/types"; import client from "../../../../../../../../services/api/client"; -import { MatrixDataDTO } from "../../../../../../../common/Matrix/shared/types"; -import { AreaCoefficientItem } from "../utils"; +import type { MatrixDataDTO } from "../../../../../../../common/Matrix/shared/types"; +import type { AreaCoefficientItem } from "../utils"; //////////////////////////////////////////////////////////////// // Types @@ -29,10 +29,7 @@ export interface CorrelationFormFields { // Utils //////////////////////////////////////////////////////////////// -function makeRequestURL( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string { +function makeRequestURL(studyId: StudyMetadata["id"], areaId: Area["name"]): string { return `v1/studies/${studyId}/areas/${areaId}/hydro/correlation/form`; } @@ -53,11 +50,7 @@ export async function setCorrelationFormFields( return res.data; } -export async function getCorrelationMatrix( - studyId: StudyMetadata["id"], -): Promise { - const res = await client.get( - `v1/studies/${studyId}/areas/hydro/correlation/matrix`, - ); +export async function getCorrelationMatrix(studyId: StudyMetadata["id"]): Promise { + const res = await client.get(`v1/studies/${studyId}/areas/hydro/correlation/matrix`); return res.data; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrix.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrix.tsx index 62751dae44..9423a4070a 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrix.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrix.tsx @@ -14,7 +14,7 @@ import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; -import { MATRICES, HydroMatrixType } from "./utils"; +import { MATRICES, type HydroMatrixType } from "./utils"; import Matrix from "../../../../../../common/Matrix"; import { Box } from "@mui/material"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrixDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrixDialog.tsx index 67a1cb5649..296f6e1c10 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrixDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/HydroMatrixDialog.tsx @@ -15,18 +15,16 @@ import { Button, Box, Skeleton } from "@mui/material"; import { useTranslation } from "react-i18next"; import { useState, useEffect } from "react"; -import BasicDialog, { - BasicDialogProps, -} from "../../../../../../common/dialogs/BasicDialog"; +import BasicDialog, { type BasicDialogProps } from "../../../../../../common/dialogs/BasicDialog"; import Matrix from "../../../../../../common/Matrix"; -import { HydroMatrixType } from "./utils"; +import type { HydroMatrixType } from "./utils"; import { getAllocationMatrix } from "./Allocation/utils"; import { getCorrelationMatrix } from "./Correlation/utils"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../common/types"; -import { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; +import type { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; import useEnqueueErrorSnackbar from "@/hooks/useEnqueueErrorSnackbar"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; interface AdaptedMatrixData { data: number[][]; @@ -73,9 +71,7 @@ function HydroMatrixDialog({ open, onClose, type }: Props) { const { study } = useOutletContext<{ study: StudyMetadata }>(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const fetchFn = MATRIX_FETCHERS[type as keyof typeof MATRIX_FETCHERS]; - const [matrix, setMatrix] = useState( - undefined, - ); + const [matrix, setMatrix] = useState(undefined); const matrixModelAdapter = (apiData: MatrixDataDTO): AdaptedMatrixData => ({ data: apiData.data, diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/InflowStructure/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/InflowStructure/index.tsx index d63487a116..767c2ea3e6 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/InflowStructure/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/InflowStructure/index.tsx @@ -13,7 +13,7 @@ */ import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../../redux/selectors"; import Form from "../../../../../../../common/Form"; @@ -23,7 +23,7 @@ import { updateInflowStructureFields, } from "./utils"; import NumberFE from "../../../../../../../common/fieldEditors/NumberFE"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import { useTranslation } from "react-i18next"; function InflowStructure() { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx index 91d3cdb6ee..52d06daaec 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ManagementOptions/Fields.tsx @@ -17,16 +17,16 @@ import SelectFE from "../../../../../../../common/fieldEditors/SelectFE"; import SwitchFE from "../../../../../../../common/fieldEditors/SwitchFE"; import Fieldset from "../../../../../../../common/Fieldset"; import { useFormContextPlus } from "../../../../../../../common/Form"; -import { INITIALIZE_RESERVOIR_DATE_OPTIONS, HydroFormFields } from "./utils"; +import { INITIALIZE_RESERVOIR_DATE_OPTIONS, type HydroFormFields } from "./utils"; function Fields() { const { control, watch } = useFormContextPlus(); - const [ - reservoirDisabled, - waterValuesDisabled, - heuristicDisabled, - leeWayDisabled, - ] = watch(["reservoir", "useWater", "useHeuristic", "useLeeway"]); + const [reservoirDisabled, waterValuesDisabled, heuristicDisabled, leeWayDisabled] = watch([ + "reservoir", + "useWater", + "useHeuristic", + "useLeeway", + ]); return ( <> @@ -37,23 +37,11 @@ function Fields() { control={control} sx={{ alignSelf: "center" }} /> - - + +
- + ({ label: options[0], @@ -73,10 +71,7 @@ export interface HydroFormFields { // Utils //////////////////////////////////////////////////////////////// -function makeRequestURL( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string { +function makeRequestURL(studyId: StudyMetadata["id"], areaId: Area["name"]): string { return `v1/studies/${studyId}/areas/${areaId}/hydro/form`; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/SplitHydroMatrix.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/SplitHydroMatrix.tsx index 1adbc4e2b9..367db7d6a0 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/SplitHydroMatrix.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/SplitHydroMatrix.tsx @@ -13,9 +13,9 @@ */ import { Box } from "@mui/material"; -import SplitView, { SplitViewProps } from "../../../../../../common/SplitView"; +import SplitView, { type SplitViewProps } from "../../../../../../common/SplitView"; import HydroMatrix from "./HydroMatrix"; -import { HydroMatrixType } from "./utils"; +import type { HydroMatrixType } from "./utils"; interface Props { types: [HydroMatrixType, HydroMatrixType]; @@ -32,11 +32,7 @@ function SplitHydroMatrix({ types, direction, sizes, form: Form }: Props) {
)} - + diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ViewMatrixButton.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ViewMatrixButton.tsx index e049eec4c2..dcc172f6ea 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ViewMatrixButton.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/ViewMatrixButton.tsx @@ -24,12 +24,7 @@ function ViewMatrixButton({ label, onClick }: Props) { const { t } = useTranslation(); return ( - ); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/hooks/useAreasOptions.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/hooks/useAreasOptions.ts index 611c671625..be85c6eb4c 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/hooks/useAreasOptions.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/hooks/useAreasOptions.ts @@ -14,15 +14,13 @@ import { useMemo } from "react"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getAreas } from "../../../../../../../../redux/selectors"; -import { DynamicListProps } from "../../../../../../../common/DynamicList"; -import { AreaCoefficientItem } from "../utils"; +import type { DynamicListProps } from "../../../../../../../common/DynamicList"; +import type { AreaCoefficientItem } from "../utils"; -export function useAreasOptions( - fields: AreaCoefficientItem[], -): DynamicListProps["options"] { +export function useAreasOptions(fields: AreaCoefficientItem[]): DynamicListProps["options"] { const { study: { id: studyId }, } = useOutletContext<{ study: StudyMetadata }>(); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx index 215b3b5954..ed05cde5e2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/index.tsx @@ -14,7 +14,7 @@ import { useMemo } from "react"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import TabWrapper from "../../../TabWrapper"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; @@ -25,9 +25,7 @@ function Hydro() { const studyVersion = parseInt(study.version, 10); const tabList = useMemo(() => { - const basePath = `/studies/${study?.id}/explore/modelization/area/${encodeURI( - areaId, - )}/hydro`; + const basePath = `/studies/${study?.id}/explore/modelization/area/${encodeURI(areaId)}/hydro`; return [ { label: "Management options", path: `${basePath}/management` }, @@ -50,9 +48,7 @@ function Hydro() { // JSX //////////////////////////////////////////////////////////////// - return ( - - ); + return ; } export default Hydro; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/style.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/style.ts index b329679cc6..3fdc1864f8 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/style.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/style.ts @@ -22,6 +22,5 @@ export const FormBox = styled(Box)(({ theme }) => ({ })); export const FormPaper = styled(Paper)(() => ({ - backgroundImage: - "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", + backgroundImage: "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", })); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts index 174fb7cd76..bf8091cdd7 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Hydro/utils.ts @@ -12,11 +12,8 @@ * This file is part of the Antares project. */ -import { - MatrixDataDTO, - AggregateConfig, -} from "../../../../../../common/Matrix/shared/types"; -import { SplitViewProps } from "../../../../../../common/SplitView"; +import type { MatrixDataDTO, AggregateConfig } from "../../../../../../common/Matrix/shared/types"; +import type { SplitViewProps } from "../../../../../../common/SplitView"; import { getAllocationMatrix } from "./Allocation/utils"; import { getCorrelationMatrix } from "./Correlation/utils"; import InflowStructure from "./InflowStructure"; @@ -175,13 +172,7 @@ export const MATRICES: Matrices = { [HydroMatrix.OverallMonthlyHydro]: { title: "Overall Monthly Hydro", url: "input/hydro/prepro/{areaId}/energy", - columns: [ - "Expectation (MWh)", - "Std Deviation (MWh)", - "Min. (MWh)", - "Max. (MWh)", - "ROR Share", - ], + columns: ["Expectation (MWh)", "Std Deviation (MWh)", "Min. (MWh)", "Max. (MWh)", "ROR Share"], rowHeaders: [ "January", "February", diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx index 8cdf4946af..4a821d7d39 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/MiscGen.tsx @@ -34,9 +34,7 @@ function MiscGen() { // JSX //////////////////////////////////////////////////////////////// - return ( - - ); + return ; } export default MiscGen; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/Fields.tsx index 7055f2e792..dc12de19f7 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/Fields.tsx @@ -20,8 +20,8 @@ import Fieldset from "../../../../../../common/Fieldset"; import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; import NumberFE from "../../../../../../common/fieldEditors/NumberFE"; import { useFormContextPlus } from "../../../../../../common/Form"; -import { ADEQUACY_PATCH_OPTIONS, PropertiesFormFields } from "./utils"; -import { StudyMetadata } from "../../../../../../../common/types"; +import { ADEQUACY_PATCH_OPTIONS, type PropertiesFormFields } from "./utils"; +import type { StudyMetadata } from "../../../../../../../common/types"; function Fields() { const { t } = useTranslation(); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/index.tsx index d654ba80c7..d2feafe93b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/index.tsx @@ -14,17 +14,17 @@ import { Paper } from "@mui/material"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; import Form from "../../../../../../common/Form"; import { - PropertiesFormFields, getPropertiesFormFields, setPropertiesFormFields, + type PropertiesFormFields, } from "./utils"; import Fields from "./Fields"; -import { SubmitHandlerPlus } from "../../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../../common/Form/types"; function Properties() { const { study } = useOutletContext<{ study: StudyMetadata }>(); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts index 5eef82d3f7..635588badf 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Properties/utils.ts @@ -16,8 +16,8 @@ // Enums //////////////////////////////////////////////////////////////// -import { DeepPartial } from "redux"; -import { Area, StudyMetadata } from "../../../../../../../common/types"; +import type { DeepPartial } from "redux"; +import type { Area, StudyMetadata } from "../../../../../../../common/types"; import client from "../../../../../../../services/api/client"; enum AdequacyPatchMode { @@ -55,10 +55,7 @@ export const ADEQUACY_PATCH_OPTIONS = Object.values(AdequacyPatchMode); // Functions //////////////////////////////////////////////////////////////// -function makeRequestURL( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string { +function makeRequestURL(studyId: StudyMetadata["id"], areaId: Area["name"]): string { return `/v1/studies/${studyId}/areas/${areaId}/properties/form`; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx index 0ee371d7fa..fae54b8e93 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Fields.tsx @@ -19,11 +19,7 @@ import StringFE from "../../../../../../common/fieldEditors/StringFE"; import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; import Fieldset from "../../../../../../common/Fieldset"; import { useFormContextPlus } from "../../../../../../common/Form"; -import { - RENEWABLE_GROUPS, - RenewableCluster, - TS_INTERPRETATION_OPTIONS, -} from "./utils"; +import { RENEWABLE_GROUPS, TS_INTERPRETATION_OPTIONS, type RenewableCluster } from "./utils"; function Fields() { const [t] = useTranslation(); @@ -36,12 +32,7 @@ function Fields() { return ( <>
- + ) => { + const handleSubmit = ({ dirtyValues }: SubmitHandlerPlus) => { return updateRenewableCluster(study.id, areaId, clusterId, dirtyValues); }; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Matrix.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Matrix.tsx index 47ff9dcf82..7007da07bd 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Matrix.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/Matrix.tsx @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { Cluster } from "../../../../../../../common/types"; +import type { Cluster } from "../../../../../../../common/types"; import Matrix from "../../../../../../common/Matrix"; interface Props { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx index 873774c391..87b8ec5032 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/index.tsx @@ -17,15 +17,15 @@ import { createMRTColumnHelper } from "material-react-table"; import { Box } from "@mui/material"; import { useLocation, useNavigate, useOutletContext } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import { RENEWABLE_GROUPS, - RenewableGroup, createRenewableCluster, deleteRenewableClusters, duplicateRenewableCluster, getRenewableClusters, type RenewableClusterWithCapacity, + type RenewableGroup, } from "./utils"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; @@ -36,7 +36,7 @@ import { getClustersWithCapacityTotals, toCapacityString, } from "../common/clustersUtils"; -import { TRow } from "../../../../../../common/GroupedDataTable/types"; +import type { TRow } from "../../../../../../common/GroupedDataTable/types"; import BooleanCell from "../../../../../../common/GroupedDataTable/cellRenderers/BooleanCell"; import usePromiseWithSnackbarError from "../../../../../../../hooks/usePromiseWithSnackbarError"; @@ -49,26 +49,24 @@ function Renewables() { const location = useLocation(); const areaId = useAppSelector(getCurrentAreaId); - const { data: clustersWithCapacity = [], isLoading } = - usePromiseWithSnackbarError( - async () => { - const clusters = await getRenewableClusters(study.id, areaId); - return clusters?.map(addClusterCapacity); - }, - { - resetDataOnReload: true, - errorMessage: t("studies.error.retrieveData"), - deps: [study.id, areaId], - }, - ); - - const [totals, setTotals] = useState( - getClustersWithCapacityTotals(clustersWithCapacity), + const { data: clustersWithCapacity = [], isLoading } = usePromiseWithSnackbarError< + RenewableClusterWithCapacity[] + >( + async () => { + const clusters = await getRenewableClusters(study.id, areaId); + return clusters?.map(addClusterCapacity); + }, + { + resetDataOnReload: true, + errorMessage: t("studies.error.retrieveData"), + deps: [study.id, areaId], + }, ); + const [totals, setTotals] = useState(getClustersWithCapacityTotals(clustersWithCapacity)); + const columns = useMemo(() => { - const { totalUnitCount, totalEnabledCapacity, totalInstalledCapacity } = - totals; + const { totalUnitCount, totalEnabledCapacity, totalInstalledCapacity } = totals; return [ columnHelper.accessor("enabled", { @@ -86,9 +84,7 @@ function Renewables() { size: 50, aggregationFn: "sum", AggregatedCell: ({ cell }) => ( - - {cell.getValue()} - + {cell.getValue()} ), Footer: () => {totalUnitCount}, }), @@ -97,24 +93,19 @@ function Renewables() { size: 220, Cell: ({ cell }) => cell.getValue().toFixed(1), }), - columnHelper.accessor( - (row) => toCapacityString(row.enabledCapacity, row.installedCapacity), - { - header: "Enabled / Installed (MW)", - size: 220, - aggregationFn: capacityAggregationFn(), - AggregatedCell: ({ cell }) => ( - - {cell.getValue()} - - ), - Footer: () => ( - - {toCapacityString(totalEnabledCapacity, totalInstalledCapacity)} - - ), - }, - ), + columnHelper.accessor((row) => toCapacityString(row.enabledCapacity, row.installedCapacity), { + header: "Enabled / Installed (MW)", + size: 220, + aggregationFn: capacityAggregationFn(), + AggregatedCell: ({ cell }) => ( + {cell.getValue()} + ), + Footer: () => ( + + {toCapacityString(totalEnabledCapacity, totalInstalledCapacity)} + + ), + }), ]; }, [totals]); @@ -127,16 +118,8 @@ function Renewables() { return addClusterCapacity(cluster); }; - const handleDuplicate = async ( - row: RenewableClusterWithCapacity, - newName: string, - ) => { - const cluster = await duplicateRenewableCluster( - study.id, - areaId, - row.id, - newName, - ); + const handleDuplicate = async (row: RenewableClusterWithCapacity, newName: string) => { + const cluster = await duplicateRenewableCluster(study.id, areaId, row.id, newName); return { ...row, ...cluster }; }; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts index f3e2520aa2..68686f3487 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Renewables/utils.ts @@ -12,11 +12,7 @@ * This file is part of the Antares project. */ -import { - Area, - Cluster, - StudyMetadata, -} from "../../../../../../../common/types"; +import type { Area, Cluster, StudyMetadata } from "../../../../../../../common/types"; import client from "../../../../../../../services/api/client"; import type { PartialExceptFor } from "../../../../../../../utils/tsUtils"; import type { ClusterWithCapacity } from "../common/clustersUtils"; @@ -37,10 +33,7 @@ export const RENEWABLE_GROUPS = [ "Other RES 4", ] as const; -export const TS_INTERPRETATION_OPTIONS = [ - "power-generation", - "production-factor", -] as const; +export const TS_INTERPRETATION_OPTIONS = ["power-generation", "production-factor"] as const; //////////////////////////////////////////////////////////////// // Types @@ -69,17 +62,14 @@ export interface RenewableCluster { nominalCapacity: number; } -export type RenewableClusterWithCapacity = - ClusterWithCapacity; +export type RenewableClusterWithCapacity = ClusterWithCapacity; //////////////////////////////////////////////////////////////// // Functions //////////////////////////////////////////////////////////////// -const getClustersUrl = ( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string => `/v1/studies/${studyId}/areas/${areaId}/clusters/renewable`; +const getClustersUrl = (studyId: StudyMetadata["id"], areaId: Area["name"]): string => + `/v1/studies/${studyId}/areas/${areaId}/clusters/renewable`; const getClusterUrl = ( studyId: StudyMetadata["id"], @@ -91,13 +81,8 @@ const getClusterUrl = ( // API //////////////////////////////////////////////////////////////// -export async function getRenewableClusters( - studyId: StudyMetadata["id"], - areaId: Area["name"], -) { - const res = await client.get( - getClustersUrl(studyId, areaId), - ); +export async function getRenewableClusters(studyId: StudyMetadata["id"], areaId: Area["name"]) { + const res = await client.get(getClustersUrl(studyId, areaId)); return res.data; } @@ -106,9 +91,7 @@ export async function getRenewableCluster( areaId: Area["name"], clusterId: Cluster["id"], ) { - const res = await client.get( - getClusterUrl(studyId, areaId, clusterId), - ); + const res = await client.get(getClusterUrl(studyId, areaId, clusterId)); return res.data; } @@ -118,10 +101,7 @@ export async function updateRenewableCluster( clusterId: Cluster["id"], data: Partial, ) { - const res = await client.patch( - getClusterUrl(studyId, areaId, clusterId), - data, - ); + const res = await client.patch(getClusterUrl(studyId, areaId, clusterId), data); return res.data; } @@ -130,10 +110,7 @@ export async function createRenewableCluster( areaId: Area["name"], data: PartialExceptFor, ) { - const res = await client.post( - getClustersUrl(studyId, areaId), - data, - ); + const res = await client.post(getClustersUrl(studyId, areaId), data); return res.data; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Reserve.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Reserve.tsx index 926286613e..504651c991 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Reserve.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Reserve.tsx @@ -19,20 +19,13 @@ import Matrix from "../../../../../common/Matrix"; function Reserve() { const currentArea = useAppSelector(getCurrentAreaId); const url = `input/reserves/${currentArea}`; - const columns = [ - "Primary Res. (draft)", - "Strategic Res. (draft)", - "DSM", - "Day Ahead", - ]; + const columns = ["Primary Res. (draft)", "Strategic Res. (draft)", "DSM", "Day Ahead"]; //////////////////////////////////////////////////////////////// // JSX //////////////////////////////////////////////////////////////// - return ( - - ); + return ; } export default Reserve; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Fields.tsx index 62f351772a..ed45c66907 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Fields.tsx @@ -20,9 +20,9 @@ import StringFE from "../../../../../../common/fieldEditors/StringFE"; import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; import Fieldset from "../../../../../../common/Fieldset"; import { useFormContextPlus } from "../../../../../../common/Form"; -import { STORAGE_GROUPS, Storage } from "./utils"; +import { STORAGE_GROUPS, type Storage } from "./utils"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import { validateNumber } from "@/utils/validation/number"; function Fields() { @@ -38,12 +38,7 @@ function Fields() { return ( <>
- + diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Form.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Form.tsx index 22899502df..576bf3e439 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Form.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Form.tsx @@ -18,13 +18,13 @@ import { useParams, useOutletContext, useNavigate } from "react-router-dom"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { useTranslation } from "react-i18next"; import * as RA from "ramda-adjunct"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import Form from "../../../../../../common/Form"; import Fields from "./Fields"; -import { SubmitHandlerPlus } from "../../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../../common/Form/types"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; -import { Storage, getStorage, updateStorage } from "./utils"; +import { getStorage, updateStorage, type Storage } from "./utils"; import Matrix from "./Matrix"; import useNavigateOnCondition from "../../../../../../../hooks/useNavigateOnCondition"; import { nameToId } from "../../../../../../../services/utils"; @@ -104,11 +104,7 @@ function Storages() { height: "70vh", }} > - + diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Matrix.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Matrix.tsx index 424d482b57..c4dc9d7efe 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Matrix.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/Matrix.tsx @@ -17,11 +17,8 @@ import Tabs from "@mui/material/Tabs"; import Tab from "@mui/material/Tab"; import Box from "@mui/material/Box"; import { useTranslation } from "react-i18next"; -import { - type MatrixItem, - type StudyMetadata, -} from "../../../../../../../common/types"; -import { Storage } from "./utils"; +import { type MatrixItem, type StudyMetadata } from "../../../../../../../common/types"; +import type { Storage } from "./utils"; import SplitView from "../../../../../../common/SplitView"; import Matrix from "../../../../../../common/Matrix"; @@ -114,10 +111,7 @@ function StorageMatrices({ areaId, storageId }: Props) { > {content.matrices.map(({ url, titleKey }) => ( - + ))} @@ -125,9 +119,7 @@ function StorageMatrices({ areaId, storageId }: Props) { )} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/index.tsx index 9ffc3c4b27..2b378d2936 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/index.tsx @@ -17,19 +17,19 @@ import { useTranslation } from "react-i18next"; import { createMRTColumnHelper } from "material-react-table"; import { Box, Tooltip } from "@mui/material"; import { useLocation, useNavigate, useOutletContext } from "react-router-dom"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; import GroupedDataTable from "../../../../../../common/GroupedDataTable"; import { - Storage, getStorages, deleteStorages, createStorage, STORAGE_GROUPS, - StorageGroup, duplicateStorage, getStoragesTotals, + type Storage, + type StorageGroup, } from "./utils"; import usePromiseWithSnackbarError from "../../../../../../../hooks/usePromiseWithSnackbarError"; import type { TRow } from "../../../../../../common/GroupedDataTable/types"; @@ -57,8 +57,7 @@ function Storages() { const [totals, setTotals] = useState(getStoragesTotals(storages)); const columns = useMemo(() => { - const { totalInjectionNominalCapacity, totalWithdrawalNominalCapacity } = - totals; + const { totalInjectionNominalCapacity, totalWithdrawalNominalCapacity } = totals; return [ studyVersion >= 880 && @@ -70,9 +69,7 @@ function Storages() { header: t("study.modelization.storages.injectionNominalCapacity"), Header: ({ column }) => ( @@ -82,24 +79,16 @@ function Storages() { size: 100, aggregationFn: "sum", AggregatedCell: ({ cell }) => ( - - {Math.round(cell.getValue())} - + {Math.round(cell.getValue())} ), Cell: ({ cell }) => Math.round(cell.getValue()), - Footer: () => ( - - {Math.round(totalInjectionNominalCapacity)} - - ), + Footer: () => {Math.round(totalInjectionNominalCapacity)}, }), columnHelper.accessor("withdrawalNominalCapacity", { header: t("study.modelization.storages.withdrawalNominalCapacity"), Header: ({ column }) => ( @@ -109,16 +98,10 @@ function Storages() { size: 100, aggregationFn: "sum", AggregatedCell: ({ cell }) => ( - - {Math.round(cell.getValue())} - + {Math.round(cell.getValue())} ), Cell: ({ cell }) => Math.round(cell.getValue()), - Footer: () => ( - - {Math.round(totalWithdrawalNominalCapacity)} - - ), + Footer: () => {Math.round(totalWithdrawalNominalCapacity)}, }), columnHelper.accessor("reservoirCapacity", { header: t("study.modelization.storages.reservoirCapacity"), diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/utils.ts index 83bd3c60f7..4958d70822 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Storages/utils.ts @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { StudyMetadata, Area } from "../../../../../../../common/types"; +import type { StudyMetadata, Area } from "../../../../../../../common/types"; import client from "../../../../../../../services/api/client"; import type { PartialExceptFor } from "../../../../../../../utils/tsUtils"; @@ -70,10 +70,8 @@ export function getStoragesTotals(storages: Storage[]) { ); } -const getStoragesUrl = ( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string => `/v1/studies/${studyId}/areas/${areaId}/storages`; +const getStoragesUrl = (studyId: StudyMetadata["id"], areaId: Area["name"]): string => + `/v1/studies/${studyId}/areas/${areaId}/storages`; const getStorageUrl = ( studyId: StudyMetadata["id"], @@ -85,10 +83,7 @@ const getStorageUrl = ( // API //////////////////////////////////////////////////////////////// -export async function getStorages( - studyId: StudyMetadata["id"], - areaId: Area["name"], -) { +export async function getStorages(studyId: StudyMetadata["id"], areaId: Area["name"]) { const res = await client.get(getStoragesUrl(studyId, areaId)); return res.data; } @@ -98,9 +93,7 @@ export async function getStorage( areaId: Area["name"], storageId: Storage["id"], ) { - const res = await client.get( - getStorageUrl(studyId, areaId, storageId), - ); + const res = await client.get(getStorageUrl(studyId, areaId, storageId)); return res.data; } @@ -110,10 +103,7 @@ export async function updateStorage( storageId: Storage["id"], data: Partial, ) { - const res = await client.patch( - getStorageUrl(studyId, areaId, storageId), - data, - ); + const res = await client.patch(getStorageUrl(studyId, areaId, storageId), data); return res.data; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx index 3aaf182b48..93588fc2f5 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Fields.tsx @@ -14,7 +14,7 @@ import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import Box from "@mui/material/Box"; import NumberFE from "../../../../../../common/fieldEditors/NumberFE"; import SelectFE from "../../../../../../common/fieldEditors/SelectFE"; @@ -26,9 +26,9 @@ import { COST_GENERATION_OPTIONS, THERMAL_GROUPS, THERMAL_POLLUTANTS, - ThermalCluster, TS_GENERATION_OPTIONS, TS_LAW_OPTIONS, + type ThermalCluster, } from "./utils"; import { validateNumber } from "@/utils/validation/number"; @@ -37,8 +37,7 @@ function Fields() { const { control, watch } = useFormContextPlus(); const { study } = useOutletContext<{ study: StudyMetadata }>(); const studyVersion = Number(study.version); - const isCostGenerationEnabled = - watch("costGeneration") === "useCostTimeseries"; + const isCostGenerationEnabled = watch("costGeneration") === "useCostTimeseries"; //////////////////////////////////////////////////////////////// // JSX @@ -47,12 +46,7 @@ function Fields() { return (
- + - + diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Matrix.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Matrix.tsx index 8d46249fac..78847079d6 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Matrix.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/Matrix.tsx @@ -17,7 +17,7 @@ import Tabs from "@mui/material/Tabs"; import Tab from "@mui/material/Tab"; import Box from "@mui/material/Box"; import { useTranslation } from "react-i18next"; -import { Cluster, StudyMetadata } from "../../../../../../../common/types"; +import type { Cluster, StudyMetadata } from "../../../../../../../common/types"; import { COMMON_MATRIX_COLS, TS_GEN_MATRIX_COLS } from "./utils"; import Matrix from "../../../../../../common/Matrix"; @@ -74,10 +74,7 @@ function ThermalMatrices({ study, areaId, clusterId }: Props) { // Filter matrix data based on the study version. const filteredMatrices = useMemo( - () => - MATRICES.filter(({ minVersion }) => - minVersion ? studyVersion >= minVersion : true, - ), + () => MATRICES.filter(({ minVersion }) => (minVersion ? studyVersion >= minVersion : true)), // eslint-disable-next-line react-hooks/exhaustive-deps [studyVersion], ); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx index 1b71f18651..ef02bb52e2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/index.tsx @@ -17,15 +17,15 @@ import { createMRTColumnHelper } from "material-react-table"; import { Box } from "@mui/material"; import { useLocation, useNavigate, useOutletContext } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import { getThermalClusters, createThermalCluster, deleteThermalClusters, THERMAL_GROUPS, - ThermalGroup, duplicateThermalCluster, type ThermalClusterWithCapacity, + type ThermalGroup, } from "./utils"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaId } from "../../../../../../../redux/selectors"; @@ -36,7 +36,7 @@ import { getClustersWithCapacityTotals, toCapacityString, } from "../common/clustersUtils"; -import { TRow } from "../../../../../../common/GroupedDataTable/types"; +import type { TRow } from "../../../../../../common/GroupedDataTable/types"; import BooleanCell from "../../../../../../common/GroupedDataTable/cellRenderers/BooleanCell"; import usePromiseWithSnackbarError from "../../../../../../../hooks/usePromiseWithSnackbarError"; @@ -49,26 +49,24 @@ function Thermal() { const location = useLocation(); const areaId = useAppSelector(getCurrentAreaId); - const { data: clustersWithCapacity = [], isLoading } = - usePromiseWithSnackbarError( - async () => { - const clusters = await getThermalClusters(study.id, areaId); - return clusters?.map(addClusterCapacity); - }, - { - resetDataOnReload: true, - errorMessage: t("studies.error.retrieveData"), - deps: [study.id, areaId], - }, - ); - - const [totals, setTotals] = useState( - getClustersWithCapacityTotals(clustersWithCapacity), + const { data: clustersWithCapacity = [], isLoading } = usePromiseWithSnackbarError< + ThermalClusterWithCapacity[] + >( + async () => { + const clusters = await getThermalClusters(study.id, areaId); + return clusters?.map(addClusterCapacity); + }, + { + resetDataOnReload: true, + errorMessage: t("studies.error.retrieveData"), + deps: [study.id, areaId], + }, ); + const [totals, setTotals] = useState(getClustersWithCapacityTotals(clustersWithCapacity)); + const columns = useMemo(() => { - const { totalUnitCount, totalEnabledCapacity, totalInstalledCapacity } = - totals; + const { totalUnitCount, totalEnabledCapacity, totalInstalledCapacity } = totals; return [ columnHelper.accessor("enabled", { @@ -88,9 +86,7 @@ function Thermal() { size: 50, aggregationFn: "sum", AggregatedCell: ({ cell }) => ( - - {cell.getValue()} - + {cell.getValue()} ), Footer: () => {totalUnitCount}, }), @@ -99,24 +95,19 @@ function Thermal() { size: 220, Cell: ({ cell }) => cell.getValue().toFixed(1), }), - columnHelper.accessor( - (row) => toCapacityString(row.enabledCapacity, row.installedCapacity), - { - header: "Enabled / Installed (MW)", - size: 220, - aggregationFn: capacityAggregationFn(), - AggregatedCell: ({ cell }) => ( - - {cell.getValue()} - - ), - Footer: () => ( - - {toCapacityString(totalEnabledCapacity, totalInstalledCapacity)} - - ), - }, - ), + columnHelper.accessor((row) => toCapacityString(row.enabledCapacity, row.installedCapacity), { + header: "Enabled / Installed (MW)", + size: 220, + aggregationFn: capacityAggregationFn(), + AggregatedCell: ({ cell }) => ( + {cell.getValue()} + ), + Footer: () => ( + + {toCapacityString(totalEnabledCapacity, totalInstalledCapacity)} + + ), + }), columnHelper.accessor("marketBidCost", { header: "Market Bid (€/MWh)", size: 50, @@ -134,16 +125,8 @@ function Thermal() { return addClusterCapacity(cluster); }; - const handleDuplicate = async ( - row: ThermalClusterWithCapacity, - newName: string, - ) => { - const cluster = await duplicateThermalCluster( - study.id, - areaId, - row.id, - newName, - ); + const handleDuplicate = async (row: ThermalClusterWithCapacity, newName: string) => { + const cluster = await duplicateThermalCluster(study.id, areaId, row.id, newName); return { ...row, ...cluster }; }; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts index 3a5895c8f6..45767a59c8 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/Thermal/utils.ts @@ -12,11 +12,7 @@ * This file is part of the Antares project. */ -import { - Area, - Cluster, - StudyMetadata, -} from "../../../../../../../common/types"; +import type { Area, Cluster, StudyMetadata } from "../../../../../../../common/types"; import client from "../../../../../../../services/api/client"; import type { PartialExceptFor } from "../../../../../../../utils/tsUtils"; import type { ClusterWithCapacity } from "../common/clustersUtils"; @@ -79,10 +75,7 @@ export const TS_GENERATION_OPTIONS = [ export const TS_LAW_OPTIONS = ["geometric", "uniform"] as const; -export const COST_GENERATION_OPTIONS = [ - "SetManually", - "useCostTimeseries", -] as const; +export const COST_GENERATION_OPTIONS = ["SetManually", "useCostTimeseries"] as const; //////////////////////////////////////////////////////////////// // Types @@ -93,9 +86,7 @@ export type ThermalGroup = (typeof THERMAL_GROUPS)[number]; type LocalTSGenerationBehavior = (typeof TS_GENERATION_OPTIONS)[number]; type TimeSeriesLawOption = (typeof TS_LAW_OPTIONS)[number]; type CostGeneration = (typeof COST_GENERATION_OPTIONS)[number]; -type ThermalPollutants = { - [K in (typeof THERMAL_POLLUTANTS)[number]]: number; -}; +type ThermalPollutants = Record<(typeof THERMAL_POLLUTANTS)[number], number>; export interface ThermalCluster extends ThermalPollutants { id: string; @@ -131,10 +122,8 @@ export type ThermalClusterWithCapacity = ClusterWithCapacity; // Functions //////////////////////////////////////////////////////////////// -const getClustersUrl = ( - studyId: StudyMetadata["id"], - areaId: Area["name"], -): string => `/v1/studies/${studyId}/areas/${areaId}/clusters/thermal`; +const getClustersUrl = (studyId: StudyMetadata["id"], areaId: Area["name"]): string => + `/v1/studies/${studyId}/areas/${areaId}/clusters/thermal`; const getClusterUrl = ( studyId: StudyMetadata["id"], @@ -146,13 +135,8 @@ const getClusterUrl = ( // API //////////////////////////////////////////////////////////////// -export async function getThermalClusters( - studyId: StudyMetadata["id"], - areaId: Area["name"], -) { - const res = await client.get( - getClustersUrl(studyId, areaId), - ); +export async function getThermalClusters(studyId: StudyMetadata["id"], areaId: Area["name"]) { + const res = await client.get(getClustersUrl(studyId, areaId)); return res.data; } @@ -161,9 +145,7 @@ export async function getThermalCluster( areaId: Area["name"], clusterId: Cluster["id"], ) { - const res = await client.get( - getClusterUrl(studyId, areaId, clusterId), - ); + const res = await client.get(getClusterUrl(studyId, areaId, clusterId)); return res.data; } @@ -173,10 +155,7 @@ export async function updateThermalCluster( clusterId: Cluster["id"], data: Partial, ) { - const res = await client.patch( - getClusterUrl(studyId, areaId, clusterId), - data, - ); + const res = await client.patch(getClusterUrl(studyId, areaId, clusterId), data); return res.data; } @@ -185,10 +164,7 @@ export async function createThermalCluster( areaId: Area["name"], data: PartialExceptFor, ) { - const res = await client.post( - getClustersUrl(studyId, areaId), - data, - ); + const res = await client.post(getClustersUrl(studyId, areaId), data); return res.data; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/clustersUtils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/clustersUtils.ts index 56d94c7497..c01d12b339 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/clustersUtils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/common/clustersUtils.ts @@ -12,14 +12,11 @@ * This file is part of the Antares project. */ -import { MRT_AggregationFn } from "material-react-table"; -import { ThermalClusterWithCapacity } from "../Thermal/utils"; -import { RenewableClusterWithCapacity } from "../Renewables/utils"; +import type { MRT_AggregationFn } from "material-react-table"; +import type { ThermalClusterWithCapacity } from "../Thermal/utils"; +import type { RenewableClusterWithCapacity } from "../Renewables/utils"; -export function toCapacityString( - enabledCapacity: number, - installedCapacity: number, -) { +export function toCapacityString(enabledCapacity: number, installedCapacity: number) { return `${Math.round(enabledCapacity)} / ${Math.round(installedCapacity)}`; } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx index 199a543c27..6182a741b4 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Areas/index.tsx @@ -13,15 +13,12 @@ */ import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import EmptyView from "../../../../../common/page/EmptyView"; import AreaPropsView from "./AreaPropsView"; import AreasTab from "./AreasTab"; import useStudySynthesis from "../../../../../../redux/hooks/useStudySynthesis"; -import { - getStudySynthesis, - getCurrentArea, -} from "../../../../../../redux/selectors"; +import { getStudySynthesis, getCurrentArea } from "../../../../../../redux/selectors"; import useAppDispatch from "../../../../../../redux/hooks/useAppDispatch"; import { setCurrentArea } from "../../../../../../redux/ducks/studySyntheses"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; @@ -53,20 +50,14 @@ function Areas() { return ( {/* Left */} - + {/* Right */} currentArea ? ( - + ) : ( ) diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/AddDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/AddDialog.tsx index a9ac5833c6..c7acb34565 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/AddDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/AddDialog.tsx @@ -17,21 +17,14 @@ import { Box } from "@mui/material"; import { useTranslation } from "react-i18next"; import { useSnackbar } from "notistack"; import FormDialog from "../../../../../common/dialogs/FormDialog"; -import { - BindingConstraintOperator, - TimeStep, -} from "../../../Commands/Edition/commandTypes"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; -import { - BindingConstraint, - OPERATORS, - TIME_STEPS, -} from "./BindingConstView/utils"; +import { BindingConstraintOperator, TimeStep } from "../../../Commands/Edition/commandTypes"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import { OPERATORS, TIME_STEPS, type BindingConstraint } from "./BindingConstView/utils"; import { createBindingConstraint } from "../../../../../../services/api/studydata"; import SelectFE from "../../../../../common/fieldEditors/SelectFE"; import StringFE from "../../../../../common/fieldEditors/StringFE"; import SwitchFE from "../../../../../common/fieldEditors/SwitchFE"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import { setCurrentBindingConst } from "../../../../../../redux/ducks/studySyntheses"; import useAppDispatch from "../../../../../../redux/hooks/useAppDispatch"; import { useOutletContext } from "react-router"; @@ -45,12 +38,7 @@ interface Props { } // TODO rename AddConstraintDialog -function AddDialog({ - open, - onClose, - existingConstraints, - reloadConstraintsList, -}: Props) { +function AddDialog({ open, onClose, existingConstraints, reloadConstraintsList }: Props) { const { study } = useOutletContext<{ study: StudyMetadata }>(); const { enqueueSnackbar } = useSnackbar(); const dispatch = useAppDispatch(); @@ -88,9 +76,7 @@ function AddDialog({ // Event Handlers //////////////////////////////////////////////////////////////// - const handleSubmit = ({ - values, - }: SubmitHandlerPlus) => { + const handleSubmit = ({ values }: SubmitHandlerPlus) => { return createBindingConstraint(study.id, values); }; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstPropsView.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstPropsView.tsx index e750c0a1aa..9179e6bf01 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstPropsView.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstPropsView.tsx @@ -16,7 +16,7 @@ import { useEffect, useMemo, useState } from "react"; import PropertiesView from "../../../../../common/PropertiesView"; import ListElement from "../../common/ListElement"; import AddDialog from "./AddDialog"; -import { BindingConstraint } from "./BindingConstView/utils"; +import type { BindingConstraint } from "./BindingConstView/utils"; interface Props { list: BindingConstraint[]; @@ -26,12 +26,7 @@ interface Props { } // TODO rename ConstraintsList -function BindingConstPropsView({ - list, - onClick, - currentConstraint, - reloadConstraintsList, -}: Props) { +function BindingConstPropsView({ list, onClick, currentConstraint, reloadConstraintsList }: Props) { const [searchedConstraint, setSearchedConstraint] = useState(""); const [addBindingConst, setAddBindingConst] = useState(false); const [filteredConstraints, setFilteredConstraints] = useState(list); @@ -53,10 +48,7 @@ function BindingConstPropsView({ setFilteredConstraints(filtered); }, [list, searchedConstraint]); - const existingConstraints = useMemo( - () => list.map(({ name }) => name), - [list], - ); + const existingConstraints = useMemo(() => list.map(({ name }) => name), [list]); //////////////////////////////////////////////////////////////// // JSX diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/OptionsList.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/OptionsList.tsx index 63a33457a3..7bdb030b67 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/OptionsList.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/OptionsList.tsx @@ -16,8 +16,8 @@ import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useFormContext } from "react-hook-form"; import SelectFE from "../../../../../../../../common/fieldEditors/SelectFE"; -import { AllClustersAndLinks } from "../../../../../../../../../common/types"; -import { ConstraintTerm, isTermExist, generateTermId } from "../../utils"; +import type { AllClustersAndLinks } from "../../../../../../../../../common/types"; +import { isTermExist, generateTermId, type ConstraintTerm } from "../../utils"; interface Props { list: AllClustersAndLinks; @@ -28,8 +28,7 @@ interface Props { export default function OptionsList({ list, isLink, constraintTerms }: Props) { const [t] = useTranslation(); - const { control, setValue, watch, getValues } = - useFormContext(); + const { control, setValue, watch, getValues } = useFormContext(); // Determines the correct set of options based on whether the term is a link or a cluster. const options = isLink ? list.links : list.clusters; @@ -49,9 +48,7 @@ export default function OptionsList({ list, isLink, constraintTerms }: Props) { const getAreaOrClusterOptions = () => { const selectedArea = getValues(isLink ? "data.area1" : "data.area"); - const foundOption = options.find( - (option) => option.element.id === selectedArea, - ); + const foundOption = options.find((option) => option.element.id === selectedArea); if (!foundOption) { return []; @@ -63,9 +60,7 @@ export default function OptionsList({ list, isLink, constraintTerms }: Props) { !isTermExist( constraintTerms, generateTermId( - isLink - ? { area1: selectedArea, area2: id } - : { area: selectedArea, cluster: id }, + isLink ? { area1: selectedArea, area2: id } : { area: selectedArea, cluster: id }, ), ), ) diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/index.tsx index f70facc13a..40b500261b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/AddConstraintTermForm/index.tsx @@ -16,7 +16,7 @@ import { useState } from "react"; import { Box, Button, Typography } from "@mui/material"; import AddCircleOutlineRoundedIcon from "@mui/icons-material/AddCircleOutlineRounded"; import { useTranslation } from "react-i18next"; -import { AllClustersAndLinks } from "../../../../../../../../../common/types"; +import type { AllClustersAndLinks } from "../../../../../../../../../common/types"; import OptionsList from "./OptionsList"; import NumberFE from "../../../../../../../../common/fieldEditors/NumberFE"; import { useFormContextPlus } from "../../../../../../../../common/Form"; @@ -29,10 +29,7 @@ interface Props { constraintTerms: ConstraintTerm[]; } -export default function AddConstraintTermForm({ - options, - constraintTerms, -}: Props) { +export default function AddConstraintTermForm({ options, constraintTerms }: Props) { const { control, setValue } = useFormContextPlus(); const [t] = useTranslation(); @@ -77,11 +74,7 @@ export default function AddConstraintTermForm({ } right={ - + } /> diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/index.tsx index f0f893ec0f..9784b66ad3 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/AddConstraintTermDialog/index.tsx @@ -12,26 +12,19 @@ * This file is part of the Antares project. */ -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useTranslation } from "react-i18next"; import { useSnackbar } from "notistack"; -import { UseFieldArrayAppend } from "react-hook-form"; -import FormDialog, { - FormDialogProps, -} from "../../../../../../../common/dialogs/FormDialog"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { UseFieldArrayAppend } from "react-hook-form"; +import FormDialog, { type FormDialogProps } from "../../../../../../../common/dialogs/FormDialog"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import useEnqueueErrorSnackbar from "../../../../../../../../hooks/useEnqueueErrorSnackbar"; -import { - isLinkTerm, - type BindingConstraint, - type ConstraintTerm, -} from "../utils"; +import { isLinkTerm, type BindingConstraint, type ConstraintTerm } from "../utils"; import AddConstraintTermForm from "./AddConstraintTermForm"; import { createConstraintTerm } from "../../../../../../../../services/api/studydata"; -import { AllClustersAndLinks } from "../../../../../../../../common/types"; +import type { AllClustersAndLinks } from "../../../../../../../../common/types"; import useStudySynthesis from "../../../../../../../../redux/hooks/useStudySynthesis"; import { getLinksAndClusters } from "../../../../../../../../redux/selectors"; -import { BaseSyntheticEvent } from "react"; import UsePromiseCond from "../../../../../../../common/utils/UsePromiseCond"; interface Props extends Omit { @@ -123,7 +116,7 @@ function AddConstraintTermDialog({ */ const handleSubmit = async ( { values }: SubmitHandlerPlus, - _event?: BaseSyntheticEvent, + _event?: React.BaseSyntheticEvent, ) => { try { const newTerm = { @@ -141,10 +134,7 @@ function AddConstraintTermDialog({ variant: "success", }); } catch (e) { - enqueueErrorSnackbar( - t("study.error.createConstraintTerm"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("study.error.createConstraintTerm"), e as AxiosError); } finally { onCancel(); } @@ -165,10 +155,7 @@ function AddConstraintTermDialog({ ( - + )} /> diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx index d821dfe10d..3698f3c1b1 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/BindingConstForm.tsx @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Box, Button } from "@mui/material"; @@ -21,15 +21,8 @@ import DeleteIcon from "@mui/icons-material/Delete"; import { useFieldArray } from "react-hook-form"; import { useSnackbar } from "notistack"; import useEnqueueErrorSnackbar from "../../../../../../../hooks/useEnqueueErrorSnackbar"; -import { - type ConstraintTerm, - generateTermId, - BindingConstraint, -} from "./utils"; -import { - AllClustersAndLinks, - StudyMetadata, -} from "../../../../../../../common/types"; +import { generateTermId, type ConstraintTerm, type BindingConstraint } from "./utils"; +import type { AllClustersAndLinks, StudyMetadata } from "../../../../../../../common/types"; import ConstraintTermItem from "./ConstraintTerm"; import { useFormContextPlus } from "../../../../../../common/Form"; import { @@ -54,8 +47,7 @@ function BindingConstForm({ study, options, constraintId }: Props) { const { enqueueSnackbar } = useSnackbar(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const [termToDelete, setTermToDelete] = useState(); - const [openConstraintTermDialog, setOpenConstraintTermDialog] = - useState(false); + const [openConstraintTermDialog, setOpenConstraintTermDialog] = useState(false); const { control } = useFormContextPlus(); @@ -74,11 +66,7 @@ function BindingConstForm({ study, options, constraintId }: Props) { //////////////////////////////////////////////////////////////// const handleUpdateTerm = useDebounce( - async ( - index: number, - prevTerm: ConstraintTerm, - newTerm: ConstraintTerm, - ) => { + async (index: number, prevTerm: ConstraintTerm, newTerm: ConstraintTerm) => { try { const updatedTerm = { ...prevTerm, @@ -95,10 +83,7 @@ function BindingConstForm({ study, options, constraintId }: Props) { variant: "success", }); } catch (error) { - enqueueErrorSnackbar( - t("study.error.updateConstraintTerm"), - error as AxiosError, - ); + enqueueErrorSnackbar(t("study.error.updateConstraintTerm"), error as AxiosError); } }, 500, @@ -110,10 +95,7 @@ function BindingConstForm({ study, options, constraintId }: Props) { await deleteConstraintTerm(study.id, constraintId, termId); remove(termToDelete); } catch (error) { - enqueueErrorSnackbar( - t("study.error.deleteConstraintTerm"), - error as AxiosError, - ); + enqueueErrorSnackbar(t("study.error.deleteConstraintTerm"), error as AxiosError); } finally { setTermToDelete(undefined); } @@ -125,10 +107,7 @@ function BindingConstForm({ study, options, constraintId }: Props) { return ( <> -
+
{constraintTerms.map((term: ConstraintTerm, index: number) => ( - {index > 0 && ( - - )} + {index > 0 && } handleUpdateTerm(index, term, newTerm)} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintFields.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintFields.tsx index 285c3fd11e..0b48ac15e5 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintFields.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintFields.tsx @@ -12,23 +12,18 @@ * This file is part of the Antares project. */ -import { - BindingConstraint, - OPERATORS, - OUTPUT_FILTERS, - TIME_STEPS, -} from "./utils"; +import { type BindingConstraint, OPERATORS, OUTPUT_FILTERS, TIME_STEPS } from "./utils"; import Fieldset from "../../../../../../common/Fieldset"; import SelectFE from "../../../../../../common/fieldEditors/SelectFE"; import StringFE from "../../../../../../common/fieldEditors/StringFE"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; import { useFormContextPlus } from "../../../../../../common/Form"; import { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Box, Button } from "@mui/material"; -import { Dataset } from "@mui/icons-material"; +import DatasetIcon from "@mui/icons-material/Dataset"; import { validateString } from "@/utils/validation/string"; import ConstraintMatrix from "./Matrix"; @@ -76,11 +71,7 @@ function Fields({ study, constraintId }: Props) { return ( <> -
+
} + startIcon={} onClick={() => setMatrixDialogOpen(true)} sx={{ mt: 2 }} > diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/OptionsList.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/OptionsList.tsx index f6777e5f66..85569765b6 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/OptionsList.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/OptionsList.tsx @@ -14,9 +14,9 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; -import { AllClustersAndLinks } from "../../../../../../../../common/types"; +import type { AllClustersAndLinks } from "../../../../../../../../common/types"; import SelectSingle from "../../../../../../../common/SelectSingle"; -import { ConstraintTerm, generateTermId, isTermExist } from "../utils"; +import { generateTermId, isTermExist, type ConstraintTerm } from "../utils"; import { Box } from "@mui/material"; interface Option { @@ -66,9 +66,7 @@ export default function OptionsList({ const relatedOptions = isLink ? list.links : list.clusters; // Attempt to find the option that matches the selected area - const foundOption = relatedOptions.find( - ({ element }) => element.id === selectedArea, - ); + const foundOption = relatedOptions.find(({ element }) => element.id === selectedArea); if (!foundOption) { return []; @@ -76,29 +74,17 @@ export default function OptionsList({ return foundOption.item_list.reduce((acc, { id, name }) => { const termId = generateTermId( - isLink - ? { area1: selectedArea, area2: id } - : { area: selectedArea, cluster: id }, + isLink ? { area1: selectedArea, area2: id } : { area: selectedArea, cluster: id }, ); // Check if the id is valid - if ( - id === selectedClusterOrArea || - !isTermExist(constraintTerms, termId) - ) { + if (id === selectedClusterOrArea || !isTermExist(constraintTerms, termId)) { acc.push({ name, id: id.toLowerCase() }); } return acc; }, []); - }, [ - selectedArea, - isLink, - list.links, - list.clusters, - selectedClusterOrArea, - constraintTerms, - ]); + }, [selectedArea, isLink, list.links, list.clusters, selectedClusterOrArea, constraintTerms]); //////////////////////////////////////////////////////////////// // Event Handlers @@ -112,9 +98,7 @@ export default function OptionsList({ setSelectedClusterOrArea(value); saveValue({ ...term, - data: isLink - ? { area1: selectedArea, area2: value } - : { area: selectedArea, cluster: value }, + data: isLink ? { area1: selectedArea, area2: value } : { area: selectedArea, cluster: value }, }); }; @@ -144,9 +128,7 @@ export default function OptionsList({ label={t(`study.${isLink ? "area2" : "cluster"}`)} data={selectedClusterOrArea.toLowerCase()} list={clusterOrAreaOptions} - handleChange={(key, value) => - handleClusterOrAreaChange(value as string) - } + handleChange={(key, value) => handleClusterOrAreaChange(value as string)} sx={{ minWidth: 300, }} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/index.tsx index 04bb4e22b9..184b383db7 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/ConstraintTerm/index.tsx @@ -12,13 +12,13 @@ * This file is part of the Antares project. */ -import { ChangeEvent, useMemo, useState } from "react"; +import { useMemo, useState } from "react"; import { Box, Button, TextField, Typography } from "@mui/material"; import AddCircleOutlineRoundedIcon from "@mui/icons-material/AddCircleOutlineRounded"; import DeleteRoundedIcon from "@mui/icons-material/DeleteRounded"; import { useTranslation } from "react-i18next"; -import { ConstraintTerm, isLinkTerm } from "../utils"; -import { AllClustersAndLinks } from "../../../../../../../../common/types"; +import { isLinkTerm, type ConstraintTerm } from "../utils"; +import type { AllClustersAndLinks } from "../../../../../../../../common/types"; import OptionsList from "./OptionsList"; import ConstraintElement from "../constraintviews/ConstraintElement"; import OffsetInput from "../constraintviews/OffsetInput"; @@ -63,13 +63,7 @@ interface Props { * * @returns Constraint Term component of type link or cluster */ -function ConstraintTermItem({ - options, - term, - constraintTerms, - saveValue, - deleteTerm, -}: Props) { +function ConstraintTermItem({ options, term, constraintTerms, saveValue, deleteTerm }: Props) { const [t] = useTranslation(); const [weight, setWeight] = useState(term.weight); const [offset, setOffset] = useState(term.offset); @@ -108,24 +102,19 @@ function ConstraintTermItem({ */ const [selectedArea, setSelectedArea] = useState(area); - const [selectedClusterOrArea, setSelectedClusterOrArea] = - useState(areaOrCluster); + const [selectedClusterOrArea, setSelectedClusterOrArea] = useState(areaOrCluster); //////////////////////////////////////////////////////////////// // Event Handlers //////////////////////////////////////////////////////////////// - const handleWeightChange = ( - event: ChangeEvent, - ) => { + const handleWeightChange = (event: React.ChangeEvent) => { const newWeight = parseFloat(event.target.value) || 0; setWeight(newWeight); saveValue({ ...term, weight: newWeight }); }; - const handleOffsetChange = ( - event: ChangeEvent, - ) => { + const handleOffsetChange = (event: React.ChangeEvent) => { const value = event.target.value; const newOffset = value === "" ? undefined : parseInt(value, 10); setOffset(newOffset); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/Matrix.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/Matrix.tsx index 03f7bfddf3..964ae25732 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/Matrix.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/Matrix.tsx @@ -13,13 +13,11 @@ */ import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../../common/types"; -import { Operator } from "./utils"; +import type { StudyMetadata } from "../../../../../../../common/types"; +import type { Operator } from "./utils"; import SplitView from "../../../../../../common/SplitView"; import { Box, Button } from "@mui/material"; -import BasicDialog, { - BasicDialogProps, -} from "../../../../../../common/dialogs/BasicDialog"; +import BasicDialog, { type BasicDialogProps } from "../../../../../../common/dialogs/BasicDialog"; import Matrix from "../../../../../../common/Matrix"; interface Props { @@ -30,13 +28,7 @@ interface Props { onClose: () => void; } -function ConstraintMatrix({ - study, - operator, - constraintId, - open, - onClose, -}: Props) { +function ConstraintMatrix({ study, operator, constraintId, open, onClose }: Props) { const { t } = useTranslation(); const dialogProps: BasicDialogProps = { open, @@ -91,9 +83,7 @@ function ConstraintMatrix({ diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/ConstraintElement.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/ConstraintElement.tsx index 757c2eb019..2137e2b0f5 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/ConstraintElement.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/ConstraintElement.tsx @@ -13,25 +13,18 @@ */ import { FormControlLabel, Switch, Typography } from "@mui/material"; -import { ReactNode } from "react"; import { ConstraintElementData, ConstraintElementRoot } from "./style"; import { useTranslation } from "react-i18next"; interface ElementProps { - left: ReactNode; - right: ReactNode; + left: React.ReactNode; + right: React.ReactNode; operator?: string; isLink?: boolean; onToggleType?: () => void; } -function ConstraintElement({ - isLink, - left, - right, - operator = "x", - onToggleType, -}: ElementProps) { +function ConstraintElement({ isLink, left, right, operator = "x", onToggleType }: ElementProps) { const { t } = useTranslation(); return ( diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/OffsetInput.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/OffsetInput.tsx index f63a7288c1..ea27cbc663 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/OffsetInput.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/constraintviews/OffsetInput.tsx @@ -14,13 +14,12 @@ import HighlightOffIcon from "@mui/icons-material/HighlightOff"; import { Box } from "@mui/material"; -import { PropsWithChildren } from "react"; interface Props { onRemove: () => void; } -export default function OffsetInput(props: PropsWithChildren) { +export default function OffsetInput(props: React.PropsWithChildren) { const { onRemove, children } = props; return ( ({ flexDirection: "column", padding: theme.spacing(1), borderRadius: 5, - backgroundImage: - "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", + backgroundImage: "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", })); export const ConstraintElementData = styled(Box)(({ theme }) => ({ diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx index 6360007bef..1816d77e1e 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/index.tsx @@ -12,12 +12,10 @@ * This file is part of the Antares project. */ -import { BindingConstraint } from "./utils"; +import type { BindingConstraint } from "./utils"; import { Box, Button, Skeleton } from "@mui/material"; import Form from "../../../../../../common/Form"; -import UsePromiseCond, { - mergeResponses, -} from "../../../../../../common/utils/UsePromiseCond"; +import UsePromiseCond, { mergeResponses } from "../../../../../../common/utils/UsePromiseCond"; import { getBindingConstraint, getBindingConstraintList, @@ -25,14 +23,14 @@ import { } from "../../../../../../../services/api/studydata"; import { useOutletContext } from "react-router"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import BindingConstForm from "./BindingConstForm"; import { CommandEnum } from "../../../../Commands/Edition/commandTypes"; import ConfirmationDialog from "../../../../../../common/dialogs/ConfirmationDialog"; import ConstraintFields from "./ConstraintFields"; import Delete from "@mui/icons-material/Delete"; -import { StudyMetadata } from "../../../../../../../common/types"; -import { SubmitHandlerPlus } from "../../../../../../common/Form/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; +import type { SubmitHandlerPlus } from "../../../../../../common/Form/types"; import { appendCommands } from "../../../../../../../services/api/variant"; import { getLinksAndClusters } from "../../../../../../../redux/selectors"; import { setCurrentBindingConst } from "../../../../../../../redux/ducks/studySyntheses"; @@ -54,8 +52,7 @@ function BindingConstView({ constraintId }: Props) { const dispatch = useAppDispatch(); const { enqueueSnackbar } = useSnackbar(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); - const [deleteConstraintDialogOpen, setDeleteConstraintDialogOpen] = - useState(false); + const [deleteConstraintDialogOpen, setDeleteConstraintDialogOpen] = useState(false); const constraint = usePromise( () => getBindingConstraint(study.id, constraintId), @@ -71,9 +68,7 @@ function BindingConstView({ constraintId }: Props) { // Event handlers //////////////////////////////////////////////////////////////// - const handleSubmitConstraint = ({ - values, - }: SubmitHandlerPlus) => { + const handleSubmitConstraint = ({ values }: SubmitHandlerPlus) => { const { id, name, ...updatedConstraint } = values; return updateBindingConstraint(study.id, constraintId, updatedConstraint); @@ -170,9 +165,7 @@ function BindingConstView({ constraintId }: Props) { alert="warning" open > - {t( - "study.modelization.bindingConst.question.deleteBindingConstraint", - )} + {t("study.modelization.bindingConst.question.deleteBindingConstraint")} )} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts index 30b7dbc06e..836f2c6c09 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/BindingConstView/utils.ts @@ -21,13 +21,7 @@ export const ACTIVE_WINDOWS_DOC_PATH = export const OPERATORS = ["less", "equal", "greater", "both"] as const; export const TIME_STEPS = ["hourly", "daily", "weekly"] as const; -export const OUTPUT_FILTERS = [ - "hourly", - "daily", - "weekly", - "monthly", - "annual", -] as const; +export const OUTPUT_FILTERS = ["hourly", "daily", "weekly", "monthly", "annual"] as const; //////////////////////////////////////////////////////////////// // Types @@ -126,10 +120,8 @@ export function generateTermId( * @param termId - The unique identifier of the term, either a LinkTermId or a ClusterTermId. * @returns True if a term with the specified ID exists; otherwise, false. */ -export const isTermExist = ( - terms: ConstraintTerm[], - termId: LinkTermId | ClusterTermId, -): boolean => terms.some(({ id }) => id === termId); +export const isTermExist = (terms: ConstraintTerm[], termId: LinkTermId | ClusterTermId): boolean => + terms.some(({ id }) => id === termId); /** * !WARNING: Temporary Workaround (Model adapter) @@ -202,9 +194,7 @@ function adaptOutputFilterFormat( } } - throw new Error( - "Invalid input: Expected a string or an array of OutputFilter values", - ); + throw new Error("Invalid input: Expected a string or an array of OutputFilter values"); } /** @@ -214,9 +204,7 @@ function adaptOutputFilterFormat( * @param data - The BindingConstraint object to transform. * @returns The transformed BindingConstraint object. */ -export function bindingConstraintModelAdapter( - data: BindingConstraint, -): BindingConstraint { +export function bindingConstraintModelAdapter(data: BindingConstraint): BindingConstraint { const filterSynthesis = adaptOutputFilterFormat(data.filterSynthesis); const filterYearByYear = adaptOutputFilterFormat(data.filterYearByYear); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx index fa48b6aa15..6d1449c344 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/BindingConstraints/index.tsx @@ -13,13 +13,10 @@ */ import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import EmptyView from "../../../../../common/page/EmptyView"; import BindingConstPropsView from "./BindingConstPropsView"; -import { - getBindingConst, - getCurrentBindingConstId, -} from "../../../../../../redux/selectors"; +import { getBindingConst, getCurrentBindingConstId } from "../../../../../../redux/selectors"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; import useAppDispatch from "../../../../../../redux/hooks/useAppDispatch"; import { setCurrentBindingConst } from "../../../../../../redux/ducks/studySyntheses"; @@ -39,9 +36,7 @@ function BindingConstraints() { const currentConstraintId = useAppSelector(getCurrentBindingConstId); - const bindingConstraints = useAppSelector((state) => - getBindingConst(state, study.id), - ); + const bindingConstraints = useAppSelector((state) => getBindingConst(state, study.id)); const constraintsRes = usePromise( () => getBindingConstraintList(study.id), diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkPropsView.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkPropsView.tsx index 610dff4c74..d3cb6262da 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkPropsView.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkPropsView.tsx @@ -17,7 +17,7 @@ import PropertiesView from "../../../../../common/PropertiesView"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; import { getCurrentLinkId, getLinks } from "../../../../../../redux/selectors"; import ListElement from "../../common/ListElement"; -import { LinkElement } from "../../../../../../common/types"; +import type { LinkElement } from "../../../../../../common/types"; interface PropsType { studyId: string; @@ -28,17 +28,13 @@ function LinkPropsView(props: PropsType) { const currentLinkId = useAppSelector(getCurrentLinkId); const links = useAppSelector((state) => getLinks(state, studyId)); const [linkNameFilter, setLinkNameFilter] = useState(); - const [filteredLinks, setFilteredLinks] = useState( - links || [], - ); + const [filteredLinks, setFilteredLinks] = useState(links || []); useEffect(() => { const filter = (): LinkElement[] => { if (links) { return links.filter( - (s) => - !linkNameFilter || - s.name.search(new RegExp(linkNameFilter, "i")) !== -1, + (s) => !linkNameFilter || s.name.search(new RegExp(linkNameFilter, "i")) !== -1, ); } return []; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx index dbfccc9e82..099e282bd0 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/LinkForm.tsx @@ -13,16 +13,16 @@ */ import { Box } from "@mui/material"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { editStudy } from "../../../../../../../services/api/study"; import useEnqueueErrorSnackbar from "../../../../../../../hooks/useEnqueueErrorSnackbar"; import Fieldset from "../../../../../../common/Fieldset"; -import { AutoSubmitHandler } from "../../../../../../common/Form/types"; -import { getLinkPath, LinkFields } from "./utils"; +import type { AutoSubmitHandler } from "../../../../../../common/Form/types"; +import { getLinkPath, type LinkFields } from "./utils"; import SwitchFE from "../../../../../../common/fieldEditors/SwitchFE"; -import { LinkElement, StudyMetadata } from "../../../../../../../common/types"; +import type { LinkElement, StudyMetadata } from "../../../../../../../common/types"; import SelectFE from "../../../../../../common/fieldEditors/SelectFE"; import LinkMatrixView from "./LinkMatrixView"; import OutputFilters from "../../../common/OutputFilters"; @@ -41,7 +41,7 @@ function LinkForm(props: Props) { let version = 0; try { version = parseInt(study.version, 10); - } catch (e) { + } catch { version = 0; } return version >= 820; @@ -72,12 +72,8 @@ function LinkForm(props: Props) { const columnsNames = [ t("study.modelization.links.matrix.columns.transCapaDirect"), t("study.modelization.links.matrix.columns.transCapaIndirect"), - `${t( - "study.modelization.links.matrix.columns.hurdleCostsDirect", - )} (${area1}->${area2})`, - `${t( - "study.modelization.links.matrix.columns.hurdleCostsIndirect", - )} (${area2}->${area1})`, + `${t("study.modelization.links.matrix.columns.hurdleCostsDirect")} (${area1}->${area2})`, + `${t("study.modelization.links.matrix.columns.hurdleCostsIndirect")} (${area2}->${area1})`, t("study.modelization.links.matrix.columns.impedances"), t("study.modelization.links.matrix.columns.loopFlow"), t("study.modelization.links.matrix.columns.pShiftMin"), @@ -232,9 +228,7 @@ function LinkForm(props: Props) {
- handleAutoSubmit(path[filterName], value) - } + onAutoSubmit={(filterName, value) => handleAutoSubmit(path[filterName], value)} /> { + const handleTabChange = (event: React.SyntheticEvent, newValue: string) => { setActiveTab(newValue); }; @@ -104,10 +104,10 @@ function LinkMatrixView({ area1, area2 }: Props) { ))} @@ -116,9 +116,7 @@ function LinkMatrixView({ area1, area2 }: Props) { )} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/index.tsx index 43b44852ea..2d03484bd9 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/index.tsx @@ -13,7 +13,7 @@ */ import { useOutletContext } from "react-router"; -import { LinkElement, StudyMetadata } from "../../../../../../../common/types"; +import type { LinkElement, StudyMetadata } from "../../../../../../../common/types"; import usePromise from "../../../../../../../hooks/usePromise"; import Form from "../../../../../../common/Form"; import LinkForm from "./LinkForm"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/utils.ts index d2cc46d077..7c7c6dd2ef 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/LinkView/utils.ts @@ -12,9 +12,9 @@ * This file is part of the Antares project. */ -import { FieldValues } from "react-hook-form"; +import type { FieldValues } from "react-hook-form"; import { getStudyData } from "../../../../../../../services/api/study"; -import { FilteringType } from "../../../common/types"; +import type { FilteringType } from "../../../common/types"; type TransCapacitiesType = "infinite" | "ignore" | "enabled"; type AssetType = "ac" | "dc" | "gaz" | "virt"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx index 29ab7632ba..c0f0854d6d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Links/index.tsx @@ -13,7 +13,7 @@ */ import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../common/types"; import EmptyView from "../../../../../common/page/EmptyView"; import LinkPropsView from "./LinkPropsView"; import { getCurrentLink } from "../../../../../../redux/selectors"; @@ -34,14 +34,9 @@ function Links() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const [t] = useTranslation(); const dispatch = useAppDispatch(); - const currentLink = useAppSelector((state) => - getCurrentLink(state, study.id), - ); + const currentLink = useAppSelector((state) => getCurrentLink(state, study.id)); - const linksRes = usePromise( - () => getLinks({ studyId: study.id }), - [study.id], - ); + const linksRes = usePromise(() => getLinks({ studyId: study.id }), [study.id]); // Handle automatic selection of the first link useEffect(() => { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaConfig.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaConfig.tsx index db30224399..b04ad7935b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaConfig.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaConfig.tsx @@ -13,17 +13,17 @@ */ import { useEffect, useState } from "react"; -import { ColorResult, MaterialPicker } from "react-color"; +import { MaterialPicker, type ColorResult } from "react-color"; import { Box, TextField, Divider } from "@mui/material"; import { useTranslation } from "react-i18next"; -import { LinkElement, UpdateAreaUi } from "../../../../../../../common/types"; +import type { LinkElement, UpdateAreaUi } from "../../../../../../../common/types"; import AreaLinks from "./AreaLinks"; import AreaLink from "./AreaLink"; import { AreaColorPicker, AreaHuePicker } from "./style"; import DeleteAreaDialog from "./DeleteAreaDialog"; -import { StudyMapNode } from "../../../../../../../redux/ducks/studyMaps"; +import type { StudyMapNode } from "../../../../../../../redux/ducks/studyMaps"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentLayer } from "../../../../../../../redux/selectors"; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLink.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLink.tsx index 87f38baf9f..5e46241a4c 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLink.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLink.tsx @@ -13,11 +13,8 @@ */ import { useTranslation } from "react-i18next"; -import { LinkElement } from "../../../../../../../common/types"; -import { - setCurrentArea, - setCurrentLink, -} from "../../../../../../../redux/ducks/studySyntheses"; +import type { LinkElement } from "../../../../../../../common/types"; +import { setCurrentArea, setCurrentLink } from "../../../../../../../redux/ducks/studySyntheses"; import useAppDispatch from "../../../../../../../redux/hooks/useAppDispatch"; import { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLinks.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLinks.tsx index 8f4f5dba3f..0c06af4289 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLinks.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/AreaLinks.tsx @@ -14,28 +14,18 @@ import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router-dom"; -import { StudyMetadata } from "../../../../../../../common/types"; -import { - setCurrentArea, - setCurrentLink, -} from "../../../../../../../redux/ducks/studySyntheses"; +import type { StudyMetadata } from "../../../../../../../common/types"; +import { setCurrentArea, setCurrentLink } from "../../../../../../../redux/ducks/studySyntheses"; import useAppDispatch from "../../../../../../../redux/hooks/useAppDispatch"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; import { getCurrentAreaLinks } from "../../../../../../../redux/selectors"; -import { - AreaLinkContainer, - AreaLinkContent, - AreaLinkRoot, - AreaLinkTitle, -} from "./style"; +import { AreaLinkContainer, AreaLinkContent, AreaLinkRoot, AreaLinkTitle } from "./style"; function AreaLinks() { const [t] = useTranslation(); const dispatch = useAppDispatch(); const { study } = useOutletContext<{ study: StudyMetadata }>(); - const areaLinks = useAppSelector((state) => - getCurrentAreaLinks(state, study.id), - ); + const areaLinks = useAppSelector((state) => getCurrentAreaLinks(state, study.id)); //////////////////////////////////////////////////////////////// // JSX @@ -43,9 +33,7 @@ function AreaLinks() { return ( - {areaLinks.length > 0 && ( - {t("study.links")} - )} + {areaLinks.length > 0 && {t("study.links")}} {areaLinks.length > 0 && areaLinks.map(({ label, id }) => ( diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/DeleteAreaDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/DeleteAreaDialog.tsx index fd7f4350ad..84c0237acd 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/DeleteAreaDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/DeleteAreaDialog.tsx @@ -13,22 +13,19 @@ */ import { Box, Button, Typography } from "@mui/material"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router"; -import { StudyMetadata } from "../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../common/types"; import useEnqueueErrorSnackbar from "../../../../../../../hooks/useEnqueueErrorSnackbar"; import { deleteStudyMapLink, deleteStudyMapNode, - StudyMapLink, - StudyMapNode, + type StudyMapLink, + type StudyMapNode, } from "../../../../../../../redux/ducks/studyMaps"; -import { - setCurrentArea, - setCurrentLink, -} from "../../../../../../../redux/ducks/studySyntheses"; +import { setCurrentArea, setCurrentLink } from "../../../../../../../redux/ducks/studySyntheses"; import useAppDispatch from "../../../../../../../redux/hooks/useAppDispatch"; import ConfirmationDialog from "../../../../../../common/dialogs/ConfirmationDialog"; import { AreaDeleteIcon } from "./style"; @@ -56,29 +53,19 @@ function DeleteAreaDialog(props: Props) { // Delete node if (currentArea && !currentLink) { try { - await dispatch( - deleteStudyMapNode({ studyId: study.id, nodeId: currentArea.id }), - ).unwrap(); + await dispatch(deleteStudyMapNode({ studyId: study.id, nodeId: currentArea.id })).unwrap(); dispatch(setCurrentArea("")); } catch (e) { - enqueueErrorSnackbar( - t("study.error.deleteAreaOrLink"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("study.error.deleteAreaOrLink"), e as AxiosError); } } // Delete link if (currentLink && !currentArea) { try { - await dispatch( - deleteStudyMapLink({ studyId: study.id, linkId: currentLink.id }), - ).unwrap(); + await dispatch(deleteStudyMapLink({ studyId: study.id, linkId: currentLink.id })).unwrap(); dispatch(setCurrentLink("")); } catch (e) { - enqueueErrorSnackbar( - t("study.error.deleteAreaOrLink"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("study.error.deleteAreaOrLink"), e as AxiosError); } } }; diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/index.tsx index b92d5a2c96..62204a5d77 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Areas/index.tsx @@ -14,20 +14,17 @@ import { useEffect, useState } from "react"; import { useOutletContext } from "react-router-dom"; -import { StudyMetadata, UpdateAreaUi } from "../../../../../../../common/types"; +import type { StudyMetadata, UpdateAreaUi } from "../../../../../../../common/types"; import PropertiesView from "../../../../../../common/PropertiesView"; import ListElement from "../../../common/ListElement"; import { AreasContainer } from "./style"; import useAppSelector from "../../../../../../../redux/hooks/useAppSelector"; -import { - getCurrentLink, - getCurrentStudyMapNode, -} from "../../../../../../../redux/selectors"; +import { getCurrentLink, getCurrentStudyMapNode } from "../../../../../../../redux/selectors"; import useAppDispatch from "../../../../../../../redux/hooks/useAppDispatch"; import AreaConfig from "./AreaConfig"; import { isSearchMatching } from "../../../../../../../utils/stringUtils"; import { setCurrentArea } from "../../../../../../../redux/ducks/studySyntheses"; -import { StudyMapNode } from "../../../../../../../redux/ducks/studyMaps"; +import type { StudyMapNode } from "../../../../../../../redux/ducks/studyMaps"; interface Props { onAdd: () => void; @@ -42,14 +39,10 @@ function Areas({ onAdd, updateUI, nodes }: Props) { const [searchValue, setSearchValue] = useState(""); const [showAreaConfig, setShowAreaConfig] = useState(false); const currentArea = useAppSelector(getCurrentStudyMapNode); - const currentLink = useAppSelector((state) => - getCurrentLink(state, study.id), - ); + const currentLink = useAppSelector((state) => getCurrentLink(state, study.id)); useEffect(() => { - setFilteredNodes( - nodes.filter(({ id }) => isSearchMatching(searchValue, id)), - ); + setFilteredNodes(nodes.filter(({ id }) => isSearchMatching(searchValue, id))); }, [nodes, searchValue]); useEffect(() => { @@ -65,11 +58,7 @@ function Areas({ onAdd, updateUI, nodes }: Props) { mainContent={ showAreaConfig && ( - + ) } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/CreateAreaDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/CreateAreaDialog.tsx index 0bc219aedb..b8abc007a0 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/CreateAreaDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/CreateAreaDialog.tsx @@ -16,7 +16,7 @@ import { useTranslation } from "react-i18next"; import AddCircleIcon from "@mui/icons-material/AddCircle"; import FormDialog from "../../../../../common/dialogs/FormDialog"; import StringFE from "../../../../../common/fieldEditors/StringFE"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; import { getAreas } from "../../../../../../redux/selectors"; import Fieldset from "../../../../../common/Fieldset"; @@ -72,8 +72,7 @@ function CreateAreaDialog(props: Props) { control={control} fullWidth rules={{ - validate: (v) => - validateString(v, { existingValues: existingAreas }), + validate: (v) => validateString(v, { existingValues: existingAreas }), }} />
diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx index 6424457700..4a7381c881 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/CreateDistrictDialog.tsx @@ -18,8 +18,8 @@ import { useOutletContext } from "react-router"; import { useMemo } from "react"; import FormDialog from "../../../../../../../common/dialogs/FormDialog"; import StringFE from "../../../../../../../common/fieldEditors/StringFE"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import SwitchFE from "../../../../../../../common/fieldEditors/SwitchFE"; import Fieldset from "../../../../../../../common/Fieldset"; import useAppDispatch from "../../../../../../../../redux/hooks/useAppDispatch"; @@ -93,8 +93,7 @@ function CreateDistrictDialog(props: Props) { control={control} fullWidth rules={{ - validate: (v) => - validateString(v, { existingValues: existingDistricts }), + validate: (v) => validateString(v, { existingValues: existingDistricts }), }} sx={{ m: 0 }} /> diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/UpdateDistrictDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/UpdateDistrictDialog.tsx index b930986b51..95f18a8b8e 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/UpdateDistrictDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/UpdateDistrictDialog.tsx @@ -14,13 +14,14 @@ import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router"; -import { Delete, Edit } from "@mui/icons-material"; +import DeleteIcon from "@mui/icons-material/Delete"; +import EditIcon from "@mui/icons-material/Edit"; import { Button, Typography } from "@mui/material"; import { useState } from "react"; import FormDialog from "../../../../../../../common/dialogs/FormDialog"; import StringFE from "../../../../../../../common/fieldEditors/StringFE"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getStudyMapDistrictsById } from "../../../../../../../../redux/selectors"; import SelectFE from "../../../../../../../common/fieldEditors/SelectFE"; @@ -62,9 +63,7 @@ function UpdateDistrictDialog(props: Props) { // Event Handlers //////////////////////////////////////////////////////////////// - const handleSubmit = async ( - data: SubmitHandlerPlus, - ) => { + const handleSubmit = async (data: SubmitHandlerPlus) => { const { districtId, output, comments } = data.values; dispatch( updateStudyMapDistrict({ @@ -92,7 +91,7 @@ function UpdateDistrictDialog(props: Props) { return ( { setValue("name", districtsById[e.target.value as string].name); - setValue( - "output", - districtsById[e.target.value as string].output, - ); - setValue( - "comments", - districtsById[e.target.value as string].comments, - ); + setValue("output", districtsById[e.target.value as string].output); + setValue("comments", districtsById[e.target.value as string].comments); }} /> } + startIcon={} onClick={() => setOpenConfirmationModal(true)} sx={{ mr: 1 }} > diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx index dae45e1dda..9bbef532df 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Districts/index.tsx @@ -15,15 +15,13 @@ import { Box, Button } from "@mui/material"; import { useMemo, useState } from "react"; import { useOutletContext } from "react-router"; -import { Add, Edit } from "@mui/icons-material"; +import AddIcon from "@mui/icons-material/Add"; +import EditIcon from "@mui/icons-material/Edit"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; -import { - getAreas, - getStudyMapDistrictsById, -} from "../../../../../../../../redux/selectors"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import { getAreas, getStudyMapDistrictsById } from "../../../../../../../../redux/selectors"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import TableForm from "../../../../../../../common/TableForm"; import CreateDistrictDialog from "./CreateDistrictDialog"; import useAppDispatch from "../../../../../../../../redux/hooks/useAppDispatch"; @@ -36,15 +34,10 @@ function Districts() { const [t] = useTranslation(); const areas = useAppSelector((state) => getAreas(state, study.id)); const districtsById = useAppSelector(getStudyMapDistrictsById); - const [createDistrictDialogOpen, setCreateDistrictDialogOpen] = - useState(false); - const [updateDistrictDialogOpen, setUpdateDistrictDialogOpen] = - useState(false); - - const columns = useMemo( - () => Object.keys(districtsById).map((id) => id), - [districtsById], - ); + const [createDistrictDialogOpen, setCreateDistrictDialogOpen] = useState(false); + const [updateDistrictDialogOpen, setUpdateDistrictDialogOpen] = useState(false); + + const columns = useMemo(() => Object.keys(districtsById).map((id) => id), [districtsById]); const defaultValues = useMemo(() => { const districts = Object.values(districtsById); @@ -79,9 +72,7 @@ function Districts() { if (data.dirtyValues[areaId]?.[districtId]) { areasByDistrict[districtId].push(areaId); } else { - areasByDistrict[districtId] = areasByDistrict[districtId].filter( - (id) => id !== areaId, - ); + areasByDistrict[districtId] = areasByDistrict[districtId].filter((id) => id !== areaId); } }); }); @@ -119,7 +110,7 @@ function Districts() { color="primary" variant="outlined" size="small" - startIcon={} + startIcon={} onClick={() => setCreateDistrictDialogOpen(true)} sx={{ mr: 1 }} > @@ -129,7 +120,7 @@ function Districts() { color="primary" variant="outlined" size="small" - startIcon={} + startIcon={} onClick={() => setUpdateDistrictDialogOpen(true)} > {t("study.modelization.map.districts.edit")} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx index 0fb956b319..38674c4aa5 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/CreateLayerDialog.tsx @@ -15,12 +15,12 @@ import { useTranslation } from "react-i18next"; import AddCircleIcon from "@mui/icons-material/AddCircle"; import { useOutletContext } from "react-router"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useMemo } from "react"; import FormDialog from "../../../../../../../common/dialogs/FormDialog"; import StringFE from "../../../../../../../common/fieldEditors/StringFE"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import { createStudyMapLayer } from "../../../../../../../../redux/ducks/studyMaps"; import useAppDispatch from "../../../../../../../../redux/hooks/useAppDispatch"; import useEnqueueErrorSnackbar from "../../../../../../../../hooks/useEnqueueErrorSnackbar"; @@ -56,9 +56,7 @@ function CreateLayerDialog(props: Props) { const handleSubmit = (data: SubmitHandlerPlus) => { try { - dispatch( - createStudyMapLayer({ studyId: study.id, name: data.values.name }), - ); + dispatch(createStudyMapLayer({ studyId: study.id, name: data.values.name })); } catch (e) { enqueueErrorSnackbar(t("study.error.createLayer"), e as AxiosError); } @@ -88,8 +86,7 @@ function CreateLayerDialog(props: Props) { control={control} fullWidth rules={{ - validate: (v) => - validateString(v, { existingValues: existingLayers }), + validate: (v) => validateString(v, { existingValues: existingLayers }), }} /> )} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/UpdateLayerDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/UpdateLayerDialog.tsx index f2a6db5817..c3c9ff5f4a 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/UpdateLayerDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/UpdateLayerDialog.tsx @@ -14,13 +14,14 @@ import { useTranslation } from "react-i18next"; import { useOutletContext } from "react-router"; -import { Delete, Edit } from "@mui/icons-material"; +import DeleteIcon from "@mui/icons-material/Delete"; +import EditIcon from "@mui/icons-material/Edit"; import { Button, Typography } from "@mui/material"; import { useMemo, useState } from "react"; import FormDialog from "../../../../../../../common/dialogs/FormDialog"; import StringFE from "../../../../../../../common/fieldEditors/StringFE"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; import { getStudyMapLayersById } from "../../../../../../../../redux/selectors"; import SelectFE from "../../../../../../../common/fieldEditors/SelectFE"; @@ -67,9 +68,7 @@ function UpdateLayerDialog(props: Props) { // Event Handlers //////////////////////////////////////////////////////////////// - const handleSubmit = async ( - data: SubmitHandlerPlus, - ) => { + const handleSubmit = async (data: SubmitHandlerPlus) => { const { layerId, name } = data.values; if (layerId && name) { @@ -95,7 +94,7 @@ function UpdateLayerDialog(props: Props) { return ( } + startIcon={} disabled={getValues("layerId") === ""} onClick={() => setOpenConfirmationModal(true)} sx={{ mr: 1 }} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx index aff05df5c4..4e7885712d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/Layers/index.tsx @@ -15,15 +15,13 @@ import { Box, Button } from "@mui/material"; import { useMemo, useState } from "react"; import { useOutletContext } from "react-router"; -import { Add, Edit } from "@mui/icons-material"; +import AddIcon from "@mui/icons-material/Add"; +import EditIcon from "@mui/icons-material/Edit"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../../../../common/types"; +import type { StudyMetadata } from "../../../../../../../../common/types"; import useAppSelector from "../../../../../../../../redux/hooks/useAppSelector"; -import { - getAreas, - getStudyMapLayersById, -} from "../../../../../../../../redux/selectors"; -import { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; +import { getAreas, getStudyMapLayersById } from "../../../../../../../../redux/selectors"; +import type { SubmitHandlerPlus } from "../../../../../../../common/Form/types"; import TableForm from "../../../../../../../common/TableForm"; import CreateLayerDialog from "./CreateLayerDialog"; import { updateStudyMapLayer } from "../../../../../../../../redux/ducks/studyMaps"; @@ -81,9 +79,7 @@ function Layers() { if (data.dirtyValues[areaId]?.[layerId]) { areasByLayer[layerId].push(areaId); } else { - areasByLayer[layerId] = areasByLayer[layerId].filter( - (id) => id !== areaId, - ); + areasByLayer[layerId] = areasByLayer[layerId].filter((id) => id !== areaId); } }); }); @@ -120,7 +116,7 @@ function Layers() { color="primary" variant="outlined" size="small" - startIcon={} + startIcon={} onClick={() => setCreateLayerDialogOpen(true)} sx={{ mr: 1 }} > @@ -130,7 +126,7 @@ function Layers() { color="primary" variant="outlined" size="small" - startIcon={} + startIcon={} onClick={() => setUpdateLayerDialogOpen(true)} > {t("study.modelization.map.layers.edit")} diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/index.tsx index e52842abc5..194b6ebced 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapConfig/index.tsx @@ -74,16 +74,10 @@ function MapConfig({ onClose }: Props) {
- + - + diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapControlButtons.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapControlButtons.tsx index 973245da0f..7bdd0967f5 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapControlButtons.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapControlButtons.tsx @@ -27,12 +27,7 @@ interface Props { zoomLevel: number; } -function MapControlButtons({ - onZoomIn, - onZoomOut, - onOpenConfig, - zoomLevel, -}: Props) { +function MapControlButtons({ onZoomIn, onZoomOut, onOpenConfig, zoomLevel }: Props) { return ( >; + graph: React.RefObject>; onNodePositionChange: (id: string, x: number, y: number) => void; zoomLevel: number; setZoomLevel: DebouncedFunc<(zoom: number) => void>; @@ -123,8 +117,7 @@ function MapGraph({ const handleOnClickLink = (source: string, target: string) => { const isTempLink = - links.find((link) => link.source === source && link.target === target) - ?.temp || false; + links.find((link) => link.source === source && link.target === target)?.temp || false; if (!isTempLink) { dispatch(setCurrentArea("")); @@ -141,11 +134,7 @@ function MapGraph({ }; const handleNodePositionChange = (id: string, x: number, y: number) => { - return onNodePositionChange( - id, - x - width / INITIAL_ZOOM / 2 - 0, - -y + height / 2 + 0, - ); + return onNodePositionChange(id, x - width / INITIAL_ZOOM / 2 - 0, -y + height / 2 + 0); }; const onZoomChange = (previousZoom: number, newZoom: number) => { @@ -175,9 +164,7 @@ function MapGraph({ }, node: { renderLabel: false, - viewGenerator: (node) => ( - - ), + viewGenerator: (node) => , }, link: { color: "#a3a3a3", diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapHeader.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapHeader.tsx index e0d965f0cd..c25a32bd18 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapHeader.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/MapHeader.tsx @@ -14,17 +14,11 @@ import { Box, Chip, Typography } from "@mui/material"; import { useTranslation } from "react-i18next"; -import { LinkProperties } from "../../../../../../common/types"; -import { - StudyMapNode, - setCurrentLayer, -} from "../../../../../../redux/ducks/studyMaps"; +import type { LinkProperties } from "../../../../../../common/types"; +import { setCurrentLayer, type StudyMapNode } from "../../../../../../redux/ducks/studyMaps"; import useAppDispatch from "../../../../../../redux/hooks/useAppDispatch"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; -import { - getCurrentLayer, - getStudyMapLayersById, -} from "../../../../../../redux/selectors"; +import { getCurrentLayer, getStudyMapLayersById } from "../../../../../../redux/selectors"; interface Props { links: LinkProperties[]; @@ -86,12 +80,8 @@ function MapHeader(props: Props) { display: "flex", }} > - {`${nodes.length} ${t( - "study.areas", - )}`} - {`${links.length} ${t( - "study.links", - )}`} + {`${nodes.length} ${t("study.areas")}`} + {`${links.length} ${t("study.links")}`}
); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Node.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Node.tsx index 2b55de00c4..6f5cfbce81 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Node.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/Node.tsx @@ -13,7 +13,7 @@ */ import AddLinkIcon from "@mui/icons-material/AddLink"; -import { StudyMapNode } from "../../../../../../redux/ducks/studyMaps"; +import type { StudyMapNode } from "../../../../../../redux/ducks/studyMaps"; import { NodeContainer, NodeDefault, NodeHighlighted } from "./style"; interface PropType { diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx index c9c53ab10f..688c3dee84 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/index.tsx @@ -16,15 +16,11 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useOutletContext } from "react-router-dom"; import AutoSizer from "react-virtualized-auto-sizer"; import { useTranslation } from "react-i18next"; -import { Graph, GraphLink, GraphNode } from "react-d3-graph"; -import { AxiosError } from "axios"; +import type { Graph, GraphLink, GraphNode } from "react-d3-graph"; +import type { AxiosError } from "axios"; import * as R from "ramda"; import * as RA from "ramda-adjunct"; -import { - LinkProperties, - StudyMetadata, - UpdateAreaUi, -} from "../../../../../../common/types"; +import type { LinkProperties, StudyMetadata, UpdateAreaUi } from "../../../../../../common/types"; import MapGraph from "./MapGraph"; import Areas from "./Areas"; import CreateAreaDialog from "./CreateAreaDialog"; @@ -42,9 +38,9 @@ import useAppDispatch from "../../../../../../redux/hooks/useAppDispatch"; import MapConfig from "./MapConfig"; import useStudyMaps from "../../../../../../redux/hooks/useStudyMaps"; import { - StudyMapNode, createStudyMapNode, updateStudyMapNode, + type StudyMapNode, } from "../../../../../../redux/ducks/studyMaps"; import UsePromiseCond from "../../../../../common/utils/UsePromiseCond"; import MapHeader from "./MapHeader"; @@ -62,13 +58,10 @@ function Map() { const [openConfig, setOpenConfig] = useState(false); const [zoomLevel, setZoomLevel] = useDebouncedState(INITIAL_ZOOM, 250); const previousNode = useRef(); - const graphRef = - useRef>(null); + const graphRef = useRef>(null); const currentLayerId = useAppSelector(getCurrentLayer); const currentArea = useAppSelector(getCurrentStudyMapNode); - const studyLinks = useAppSelector((state) => - getStudyMapLinks(state, study.id), - ); + const studyLinks = useAppSelector((state) => getStudyMapLinks(state, study.id)); const mapLinks = useMemo( () => R.map( @@ -182,11 +175,7 @@ function Map() { <> - setOpenDialog(true)} - nodes={mapNodes} - updateUI={updateUI} - /> + setOpenDialog(true)} nodes={mapNodes} updateUI={updateUI} /> {openConfig ? ( diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/style.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/style.ts index e3ebde2a05..731775e41d 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/style.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/style.ts @@ -14,7 +14,7 @@ import { styled, Box, Chip } from "@mui/material"; import mapbackground from "../../../../../../assets/img/mapbackground.png"; -import { getTextColor, RGB } from "./utils"; +import { getTextColor, type RGB } from "./utils"; //////////////////////////////////////////////////////////////// // Map(index.tsx) @@ -57,35 +57,31 @@ export interface NodeProps { rgbcolor: number[]; } -export const NodeDefault = styled(Chip)( - ({ theme, nodecolor, rgbcolor }) => ({ - backgroundColor: nodecolor, - "&:hover": { - color: "white", - "& .MuiChip-deleteIcon": { - color: "white", - display: "block", - }, - }, +export const NodeDefault = styled(Chip)(({ theme, nodecolor, rgbcolor }) => ({ + backgroundColor: nodecolor, + "&:hover": { + color: "white", "& .MuiChip-deleteIcon": { - display: "none", - fontSize: 20, - marginLeft: 5, - "&:hover": { - color: theme.palette.primary.main, - }, + color: "white", + display: "block", }, - "& .MuiChip-label": { - textOverflow: "unset", + }, + "& .MuiChip-deleteIcon": { + display: "none", + fontSize: 20, + marginLeft: 5, + "&:hover": { + color: theme.palette.primary.main, }, - color: getTextColor(rgbcolor as RGB), - }), -); + }, + "& .MuiChip-label": { + textOverflow: "unset", + }, + color: getTextColor(rgbcolor as RGB), +})); -export const NodeHighlighted = styled(Chip)( - ({ nodecolor, rgbcolor }) => ({ - color: getTextColor(rgbcolor as RGB), - backgroundColor: `rgba(${rgbcolor[0]}, ${rgbcolor[1]}, ${rgbcolor[2]}, 0.6) !important`, - outline: `2px dashed ${nodecolor}`, - }), -); +export const NodeHighlighted = styled(Chip)(({ nodecolor, rgbcolor }) => ({ + color: getTextColor(rgbcolor as RGB), + backgroundColor: `rgba(${rgbcolor[0]}, ${rgbcolor[1]}, ${rgbcolor[2]}, 0.6) !important`, + outline: `2px dashed ${nodecolor}`, +})); diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/utils.ts b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/utils.ts index 2025d4a71d..c487955831 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/Map/utils.ts +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/Map/utils.ts @@ -13,8 +13,8 @@ */ import { useMemo } from "react"; -import { StudyLayer } from "../../../../../../common/types"; -import { StudyMapNode } from "../../../../../../redux/ducks/studyMaps"; +import type { StudyLayer } from "../../../../../../common/types"; +import type { StudyMapNode } from "../../../../../../redux/ducks/studyMaps"; //////////////////////////////////////////////////////////////// // Types @@ -61,10 +61,7 @@ export const getNodeWidth = (nodeText: string): number => { return fontSize * TEXT_SIZE * 6.5; }; -export function getUpdatedNode( - id: string, - nodeData: StudyMapNode[], -): StudyMapNode | undefined { +export function getUpdatedNode(id: string, nodeData: StudyMapNode[]): StudyMapNode | undefined { return nodeData.find((node) => node.id === id); } @@ -73,9 +70,7 @@ const getLuminanace = (values: RGB): number => { const val = v / 255; return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4; }); - return Number( - (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3), - ); + return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3)); }; const getContrastRatio = (colorA: RGB, colorB: RGB): number => { @@ -144,13 +139,6 @@ export function useRenderNodes( rgbColor, }; }), - [ - currentLayerId, - nodes, - centerVector.x, - realCenter.x, - realCenter.y, - centerVector.y, - ], + [currentLayerId, nodes, centerVector.x, realCenter.x, realCenter.y, centerVector.y], ); } diff --git a/webapp/src/components/App/Singlestudy/explore/Modelization/index.tsx b/webapp/src/components/App/Singlestudy/explore/Modelization/index.tsx index 0099e90986..265352b0e8 100644 --- a/webapp/src/components/App/Singlestudy/explore/Modelization/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Modelization/index.tsx @@ -16,14 +16,10 @@ import { useEffect, useMemo } from "react"; import { useNavigate, useOutletContext, useParams } from "react-router-dom"; import { Box } from "@mui/material"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../common/types"; +import type { StudyMetadata } from "../../../../../common/types"; import TabWrapper from "../TabWrapper"; import useAppSelector from "../../../../../redux/hooks/useAppSelector"; -import { - getAreas, - getCurrentAreaId, - getLinks, -} from "../../../../../redux/selectors"; +import { getAreas, getCurrentAreaId, getLinks } from "../../../../../redux/selectors"; import useAppDispatch from "../../../../../redux/hooks/useAppDispatch"; import { setCurrentArea } from "../../../../../redux/ducks/studySyntheses"; diff --git a/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/ResultFilters.tsx b/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/ResultFilters.tsx index 5e460b5d3e..fbfed8a882 100644 --- a/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/ResultFilters.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/ResultFilters.tsx @@ -21,9 +21,9 @@ import NumberFE from "../../../../../common/fieldEditors/NumberFE"; import DownloadMatrixButton from "../../../../../common/buttons/DownloadMatrixButton"; import CheckBoxFE from "@/components/common/fieldEditors/CheckBoxFE"; import SearchFE from "@/components/common/fieldEditors/SearchFE"; -import { clamp, equals } from "ramda"; -import { useState, useMemo, useEffect, ChangeEvent } from "react"; -import { FilterListOff } from "@mui/icons-material"; +import * as R from "ramda"; +import { useState, useMemo, useEffect } from "react"; +import FilterListOffIcon from "@mui/icons-material/FilterListOff"; import { useDebouncedField } from "@/hooks/useDebouncedField"; interface ColumnHeader { @@ -81,16 +81,15 @@ function ResultFilters({ const { t } = useTranslation(); const [filters, setFilters] = useState(defaultFilters); - const { localValue: localYear, handleChange: debouncedYearChange } = - useDebouncedField({ - value: year, - onChange: setYear, - delay: 500, - transformValue: (value: number) => clamp(1, maxYear, value), - }); + const { localValue: localYear, handleChange: debouncedYearChange } = useDebouncedField({ + value: year, + onChange: setYear, + delay: 500, + transformValue: (value: number) => R.clamp(1, maxYear, value), + }); const filtersApplied = useMemo(() => { - return !equals(filters, defaultFilters); + return !R.equals(filters, defaultFilters); }, [filters]); const parsedHeaders = useMemo(() => { @@ -114,10 +113,7 @@ function ResultFilters({ .filter((header) => { // Apply search filter if (filters.search) { - const matchesVariable = matchesSearchTerm( - header.variable, - filters.search, - ); + const matchesVariable = matchesSearchTerm(header.variable, filters.search); const matchesUnit = matchesSearchTerm(header.unit, filters.search); @@ -164,7 +160,7 @@ function ResultFilters({ // Event handlers //////////////////////////////////////////////////////////////// - const handleYearChange = (event: ChangeEvent) => { + const handleYearChange = (event: React.ChangeEvent) => { const value = Number(event.target.value); debouncedYearChange(value); }; @@ -266,7 +262,7 @@ function ResultFilters({ disabled={!filtersApplied} sx={{ ml: 1 }} > - + ), }, diff --git a/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx b/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx index 8df3507b76..073ed57a9e 100644 --- a/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Results/ResultDetails/index.tsx @@ -17,39 +17,22 @@ import { Skeleton, ToggleButton, ToggleButtonGroup, - ToggleButtonGroupProps, + type ToggleButtonGroupProps, } from "@mui/material"; import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate, useOutletContext, useParams } from "react-router"; import GridOffIcon from "@mui/icons-material/GridOff"; -import { - Area, - LinkElement, - StudyMetadata, -} from "../../../../../../common/types"; +import type { Area, LinkElement, StudyMetadata } from "../../../../../../common/types"; import usePromise from "../../../../../../hooks/usePromise"; import useAppSelector from "../../../../../../redux/hooks/useAppSelector"; -import { - getAreas, - getLinks, - getStudyOutput, -} from "../../../../../../redux/selectors"; +import { getAreas, getLinks, getStudyOutput } from "../../../../../../redux/selectors"; import { getStudyData } from "../../../../../../services/api/study"; import { isSearchMatching } from "../../../../../../utils/stringUtils"; import PropertiesView from "../../../../../common/PropertiesView"; import ListElement from "../../common/ListElement"; -import { - createPath, - DataType, - MAX_YEAR, - OutputItemType, - SYNTHESIS_ITEMS, - Timestep, -} from "./utils"; -import UsePromiseCond, { - mergeResponses, -} from "../../../../../common/utils/UsePromiseCond"; +import { createPath, DataType, MAX_YEAR, OutputItemType, SYNTHESIS_ITEMS, Timestep } from "./utils"; +import UsePromiseCond, { mergeResponses } from "../../../../../common/utils/UsePromiseCond"; import useStudySynthesis from "../../../../../../redux/hooks/useStudySynthesis"; import ButtonBack from "../../../../../common/ButtonBack"; import MatrixGrid from "../../../../../common/Matrix/components/MatrixGrid/index.tsx"; @@ -66,7 +49,7 @@ import { toError } from "../../../../../../utils/fnUtils.ts"; import EmptyView from "../../../../../common/page/EmptyView.tsx"; import { getStudyMatrixIndex } from "../../../../../../services/api/matrix.ts"; import { MatrixGridSynthesis } from "@/components/common/Matrix/components/MatrixGridSynthesis"; -import { ResultMatrixDTO } from "@/components/common/Matrix/shared/types.ts"; +import type { ResultMatrixDTO } from "@/components/common/Matrix/shared/types.ts"; type SetResultColHeaders = (headers: string[][], indices: number[]) => void; @@ -96,30 +79,26 @@ function ResultDetails() { const navigate = useNavigate(); const items = useAppSelector((state) => - itemType === OutputItemType.Areas - ? getAreas(state, study.id) - : getLinks(state, study.id), + itemType === OutputItemType.Areas ? getAreas(state, study.id) : getLinks(state, study.id), ) as Array<{ id: string; name: string; label?: string }>; const filteredItems = useMemo(() => { return isSynthesis ? SYNTHESIS_ITEMS - : items.filter((item) => - isSearchMatching(searchValue, item.label || item.name), - ); + : items.filter((item) => isSearchMatching(searchValue, item.label || item.name)); }, [isSynthesis, items, searchValue]); - const selectedItem = filteredItems.find( - (item) => item.id === selectedItemId, - ) as (Area & { id: string }) | LinkElement | undefined; + const selectedItem = filteredItems.find((item) => item.id === selectedItemId) as + | (Area & { id: string }) + | LinkElement + | undefined; const maxYear = output?.nbyears ?? MAX_YEAR; useEffect( () => { const isValidSelectedItem = - !!selectedItemId && - filteredItems.find((item) => item.id === selectedItemId); + !!selectedItemId && filteredItems.find((item) => item.id === selectedItemId); if (!isValidSelectedItem) { setSelectedItemId(filteredItems.length > 0 ? filteredItems[0].id : ""); @@ -151,9 +130,7 @@ function ResultDetails() { const res = await getStudyData(study.id, path); if (typeof res === "string") { - const fixed = res - .replace(/NaN/g, '"NaN"') - .replace(/Infinity/g, '"Infinity"'); + const fixed = res.replace(/NaN/g, '"NaN"').replace(/Infinity/g, '"Infinity"'); const parsed = JSON.parse(fixed); @@ -202,12 +179,9 @@ function ResultDetails() { }, ); - const { data: dateTimeMetadata } = usePromise( - () => getStudyMatrixIndex(study.id, path), - { - deps: [study.id, path], - }, - ); + const { data: dateTimeMetadata } = usePromise(() => getStudyMatrixIndex(study.id, path), { + deps: [study.id, path], + }); const dateTime = dateTimeMetadata && generateDateTime(dateTimeMetadata); @@ -270,15 +244,9 @@ function ResultDetails() { fullWidth onChange={handleItemTypeChange} > - - {t("study.areas")} - - - {t("study.links")} - - - {t("study.synthesis")} - + {t("study.areas")} + {t("study.links")} + {t("study.synthesis")} ( - - )} + ifPending={() => } ifFulfilled={([, matrix]) => matrix && ( <> {resultColHeaders.length === 0 ? ( - + ) : ( term.trim().toLowerCase()); + const searchTerms = searchTerm.split("|").map((term) => term.trim().toLowerCase()); return searchTerms.some((term) => text.toLowerCase().includes(term)); } diff --git a/webapp/src/components/App/Singlestudy/explore/Results/index.tsx b/webapp/src/components/App/Singlestudy/explore/Results/index.tsx index ea3c94a351..3d46cac5ea 100644 --- a/webapp/src/components/App/Singlestudy/explore/Results/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Results/index.tsx @@ -39,7 +39,7 @@ import * as R from "ramda"; import { useNavigate, useOutletContext } from "react-router-dom"; import { grey } from "@mui/material/colors"; import moment from "moment"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import usePromiseWithSnackbarError from "../../../../../hooks/usePromiseWithSnackbarError"; import { archiveOutput, @@ -49,11 +49,7 @@ import { getStudyOutputs, unarchiveOutput, } from "../../../../../services/api/study"; -import { - LaunchJob, - StudyMetadata, - StudyOutput, -} from "../../../../../common/types"; +import type { LaunchJob, StudyMetadata, StudyOutput } from "../../../../../common/types"; import { convertUTCToLocalTime } from "../../../../../services/utils"; import LaunchJobLogView from "../../../Tasks/LaunchJobLogView"; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; @@ -81,10 +77,7 @@ type DialogState = } | EmptyObject; -const combineJobsAndOutputs = ( - jobs: LaunchJob[], - outputs: StudyOutput[], -): OutputDetail[] => { +const combineJobsAndOutputs = (jobs: LaunchJob[], outputs: StudyOutput[]): OutputDetail[] => { const runningJobs: OutputDetail[] = jobs .filter((job) => !job.completionDate) .map((job) => { @@ -106,9 +99,7 @@ const combineJobsAndOutputs = ( outputDetail.creationDate = relatedJob.creationDate; outputDetail.job = relatedJob; } else { - const dateComponents = output.name.match( - "(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2}).*", - ); + const dateComponents = output.name.match("(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2}).*"); if (dateComponents) { outputDetail.completionDate = `${dateComponents[1]}-${dateComponents[2]}-${dateComponents[3]} ${dateComponents[4]}:${dateComponents[5]}`; } @@ -132,11 +123,13 @@ function Results() { const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const [dialogState, setDialogState] = useState({}); - const { data: studyJobs, isLoading: studyJobsLoading } = - usePromiseWithSnackbarError(() => getStudyJobs(study.id), { + const { data: studyJobs, isLoading: studyJobsLoading } = usePromiseWithSnackbarError( + () => getStudyJobs(study.id), + { errorMessage: t("results.error.jobs"), deps: [study.id], - }); + }, + ); const { data: studyOutputs, @@ -152,18 +145,14 @@ function Results() { return combineJobsAndOutputs(studyJobs, studyOutputs).sort((a, b) => { if (!a.completionDate || !b.completionDate) { if (!a.completionDate && !b.completionDate) { - return moment(a.creationDate).isAfter(moment(b.creationDate)) - ? -1 - : 1; + return moment(a.creationDate).isAfter(moment(b.creationDate)) ? -1 : 1; } if (!a.completionDate) { return -1; } return 1; } - return moment(a.completionDate).isAfter(moment(b.completionDate)) - ? -1 - : 1; + return moment(a.completionDate).isAfter(moment(b.completionDate)) ? -1 : 1; }); } return []; @@ -188,10 +177,7 @@ function Results() { sx={iconStyle} onClick={async () => { handler().catch((e) => { - enqueueErrorSnackbar( - t(errorMessage, { outputname: output.name }), - e as AxiosError, - ); + enqueueErrorSnackbar(t(errorMessage, { outputname: output.name }), e as AxiosError); }); }} /> @@ -249,11 +235,7 @@ function Results() { > {t("global.name")} - + {t("global.date")} @@ -374,11 +356,7 @@ function Results() { - + {renderArchiveTool(row)} {row.completionDate && row.job && ( @@ -395,13 +373,7 @@ function Results() { )} - {row.job && ( - - )} + {row.job && } {row.job?.status === "success" && ( prop !== "border" && prop !== "tabStyle", -})<{ border?: boolean; tabStyle?: "normal" | "withoutBorder" }>( - ({ theme, border, tabStyle }) => ({ - width: "98%", - height: "50px", - ...(border === true && { - borderBottom: 1, - borderColor: "divider", - }), - ...(tabStyle && - tabStyle === "withoutBorder" && { - "& .MuiTabs-indicator": { - display: "none", - }, - }), +})<{ border?: boolean; tabStyle?: "normal" | "withoutBorder" }>(({ theme, border, tabStyle }) => ({ + width: "98%", + height: "50px", + ...(border === true && { + borderBottom: 1, + borderColor: "divider", }), -); + ...(tabStyle && + tabStyle === "withoutBorder" && { + "& .MuiTabs-indicator": { + display: "none", + }, + }), +})); interface TabItem { label: string; @@ -106,12 +103,7 @@ function TabWrapper({ study, tabList, border, tabStyle, sx }: Props) { variant="scrollable" > {tabList.map((tab) => ( - + ))} diff --git a/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/CreateTemplateTableDialog.tsx b/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/CreateTemplateTableDialog.tsx index 34da75ba1a..069c26de05 100644 --- a/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/CreateTemplateTableDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/CreateTemplateTableDialog.tsx @@ -16,12 +16,11 @@ import { useTranslation } from "react-i18next"; import AddCircleIcon from "@mui/icons-material/AddCircle"; import { createTableTemplate, type TableTemplate } from "../utils"; import TableTemplateFormDialog, { - TableTemplateFormDialogProps, + type TableTemplateFormDialogProps, } from "./TableTemplateFormDialog"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; -interface Props - extends Pick { +interface Props extends Pick { setTemplates: React.Dispatch>; templates: TableTemplate[]; } @@ -37,10 +36,7 @@ function CreateTemplateTableDialog(props: Props) { const handleSubmit = (data: SubmitHandlerPlus) => { const { name, type, columns } = data.values; - setTemplates((templates) => [ - ...templates, - createTableTemplate(name, type, columns), - ]); + setTemplates((templates) => [...templates, createTableTemplate(name, type, columns)]); onCancel(); }; diff --git a/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/TableTemplateFormDialog.tsx b/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/TableTemplateFormDialog.tsx index 89cea8497c..4f07287f20 100644 --- a/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/TableTemplateFormDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/TableTemplateFormDialog.tsx @@ -13,11 +13,9 @@ */ import { Box } from "@mui/material"; -import { startCase } from "lodash"; +import startCase from "lodash/startCase"; import { useTranslation } from "react-i18next"; -import FormDialog, { - FormDialogProps, -} from "../../../../../common/dialogs/FormDialog"; +import FormDialog, { type FormDialogProps } from "../../../../../common/dialogs/FormDialog"; import ListFE from "../../../../../common/fieldEditors/ListFE"; import SelectFE from "../../../../../common/fieldEditors/SelectFE"; import StringFE from "../../../../../common/fieldEditors/StringFE"; @@ -36,14 +34,10 @@ export interface TableTemplateFormDialogProps } function TableTemplateFormDialog(props: TableTemplateFormDialogProps) { - const { open, title, titleIcon, config, onSubmit, onCancel, templates } = - props; + const { open, title, titleIcon, config, onSubmit, onCancel, templates } = props; const { t } = useTranslation(); - const existingTables = useMemo( - () => templates.map(({ name }) => name), - [templates], - ); + const existingTables = useMemo(() => templates.map(({ name }) => name), [templates]); const typeOptions = useMemo( () => diff --git a/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/UpdateTemplateTableDialog.tsx b/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/UpdateTemplateTableDialog.tsx index bf602db8dd..76cab292d1 100644 --- a/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/UpdateTemplateTableDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/TableModeList/dialogs/UpdateTemplateTableDialog.tsx @@ -15,13 +15,12 @@ import { useTranslation } from "react-i18next"; import EditIcon from "@mui/icons-material/Edit"; import TableTemplateFormDialog, { - TableTemplateFormDialogProps, + type TableTemplateFormDialogProps, } from "./TableTemplateFormDialog"; -import { TableTemplate } from "../utils"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import type { TableTemplate } from "../utils"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; -interface Props - extends Pick { +interface Props extends Pick { defaultValues: TableTemplate; setTemplates: React.Dispatch>; templates: TableTemplate[]; @@ -36,9 +35,7 @@ function UpdateTemplateTableDialog(props: Props) { //////////////////////////////////////////////////////////////// const handleSubmit = (data: SubmitHandlerPlus) => { - setTemplates((templates) => - templates.map((t) => (t.id === data.values.id ? data.values : t)), - ); + setTemplates((templates) => templates.map((t) => (t.id === data.values.id ? data.values : t))); onCancel(); }; diff --git a/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx b/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx index c281d9c774..c5e51e595a 100644 --- a/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/TableModeList/index.tsx @@ -23,10 +23,8 @@ import { v4 as uuidv4 } from "uuid"; import PropertiesView from "../../../../common/PropertiesView"; import ListElement from "../common/ListElement"; import type { TableTemplate } from "./utils"; -import storage, { - StorageKey, -} from "../../../../../services/utils/localStorage"; -import { StudyMetadata } from "../../../../../common/types"; +import storage, { StorageKey } from "../../../../../services/utils/localStorage"; +import type { StudyMetadata } from "../../../../../common/types"; import CreateTemplateTableDialog from "./dialogs/CreateTemplateTableDialog"; import UpdateTemplateTableDialog from "./dialogs/UpdateTemplateTableDialog"; import ConfirmationDialog from "../../../../common/dialogs/ConfirmationDialog"; @@ -39,14 +37,13 @@ function TableModeList() { const { t } = useTranslation(); const [templates, setTemplates] = useState(() => { - const list = - storage.getItem(StorageKey.StudiesModelTableModeTemplates) || []; + const list = storage.getItem(StorageKey.StudiesModelTableModeTemplates) || []; return list.map((tp) => ({ ...tp, id: uuidv4() })); }); - const [selectedTemplateId, setSelectedTemplateId] = useState< - TableTemplate["id"] | undefined - >(templates[0]?.id); + const [selectedTemplateId, setSelectedTemplateId] = useState( + templates[0]?.id, + ); const [dialog, setDialog] = useState<{ type: "add" | "edit" | "delete"; @@ -55,8 +52,7 @@ function TableModeList() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const selectedTemplate = templates.find((tp) => tp.id === selectedTemplateId); - const dialogTemplate = - dialog && templates.find((tp) => tp.id === dialog.templateId); + const dialogTemplate = dialog && templates.find((tp) => tp.id === dialog.templateId); // Handle automatic selection of the first element useEffect(() => { @@ -104,9 +100,7 @@ function TableModeList() { }; const handleDelete = () => { - setTemplates((templates) => - templates.filter((tp) => tp.id !== dialog?.templateId), - ); + setTemplates((templates) => templates.filter((tp) => tp.id !== dialog?.templateId)); closeDialog(); }; @@ -131,9 +125,7 @@ function TableModeList() { /> {/* Right */} - {!templates.length && ( - - )} + {!templates.length && } {selectedTemplate && ( (false); + const [currentCandidate, setCurrentCandidate] = useState( candidate, - links, - capacities, - deleteCandidate, - updateCandidate, - onRead, - } = props; - const [openConfirmationModal, setOpenConfirmationModal] = - useState(false); - const [currentCandidate, setCurrentCandidate] = useState< - XpansionCandidate | undefined - >(candidate); + ); const [saveAllowed, setSaveAllowed] = useState(false); const [toggleView, setToggleView] = useState(true); const [useV8LinkProfile, setUseV8LinkProfile] = useState(true); @@ -101,17 +86,9 @@ function CandidateForm(props: PropType) { return ( - + {t("global.general")} - + setOpenConfirmationModal(true)} /> @@ -169,29 +144,18 @@ function CandidateForm(props: PropType) { label={t("xpansion.annualCost")} variant="filled" value={currentCandidate?.["annual-cost-per-mw"] || ""} - onChange={(e) => - handleChange("annual-cost-per-mw", parseFloat(e.target.value)) - } + onChange={(e) => handleChange("annual-cost-per-mw", parseFloat(e.target.value))} /> - handleChange( - "already-installed-capacity", - parseFloat(e.target.value), - ) - } + onChange={(e) => handleChange("already-installed-capacity", parseFloat(e.target.value))} /> - + {toggleView ? ( @@ -221,18 +185,14 @@ function CandidateForm(props: PropType) { label={t("xpansion.unitSize")} variant="filled" value={currentCandidate?.["unit-size"] || ""} - onChange={(e) => - handleChange("unit-size", parseFloat(e.target.value)) - } + onChange={(e) => handleChange("unit-size", parseFloat(e.target.value))} /> - handleChange("max-units", parseFloat(e.target.value)) - } + onChange={(e) => handleChange("max-units", parseFloat(e.target.value))} /> )} @@ -242,9 +202,7 @@ function CandidateForm(props: PropType) { label={t("xpansion.maxInvestments")} variant="filled" value={currentCandidate?.["max-investment"] || ""} - onChange={(e) => - handleChange("max-investment", parseFloat(e.target.value)) - } + onChange={(e) => handleChange("max-investment", parseFloat(e.target.value))} /> )} @@ -324,11 +282,7 @@ function CandidateForm(props: PropType) { list={capacities.map((item) => { return { id: item, name: item }; })} - data={ - currentCandidate?.[ - "direct-already-installed-link-profile" - ] || "" - } + data={currentCandidate?.["direct-already-installed-link-profile"] || ""} handleChange={handleChange} sx={{ minWidth: "100%", @@ -337,14 +291,8 @@ function CandidateForm(props: PropType) { /> - currentCandidate?.[ - "direct-already-installed-link-profile" - ] && - onRead( - currentCandidate?.[ - "direct-already-installed-link-profile" - ] || "", - ) + currentCandidate?.["direct-already-installed-link-profile"] && + onRead(currentCandidate?.["direct-already-installed-link-profile"] || "") } /> @@ -355,11 +303,7 @@ function CandidateForm(props: PropType) { list={capacities.map((item) => { return { id: item, name: item }; })} - data={ - currentCandidate?.[ - "indirect-already-installed-link-profile" - ] || "" - } + data={currentCandidate?.["indirect-already-installed-link-profile"] || ""} handleChange={handleChange} sx={{ minWidth: "100%", @@ -368,14 +312,8 @@ function CandidateForm(props: PropType) { /> - currentCandidate?.[ - "indirect-already-installed-link-profile" - ] && - onRead( - currentCandidate?.[ - "indirect-already-installed-link-profile" - ] || "", - ) + currentCandidate?.["indirect-already-installed-link-profile"] && + onRead(currentCandidate?.["indirect-already-installed-link-profile"] || "") } /> @@ -411,9 +349,7 @@ function CandidateForm(props: PropType) { list={capacities.map((item) => { return { id: item, name: item }; })} - data={ - currentCandidate?.["already-installed-link-profile"] || "" - } + data={currentCandidate?.["already-installed-link-profile"] || ""} handleChange={handleChange} sx={{ minWidth: "100%", @@ -423,10 +359,7 @@ function CandidateForm(props: PropType) { currentCandidate?.["already-installed-link-profile"] && - onRead( - currentCandidate?.["already-installed-link-profile"] || - "", - ) + onRead(currentCandidate?.["already-installed-link-profile"] || "") } /> diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx index 8e03d0c70d..7a5d5ec2a4 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/CreateCandidateDialog.tsx @@ -17,13 +17,13 @@ import { Button, ButtonGroup } from "@mui/material"; import { useTranslation } from "react-i18next"; import AddCircleIcon from "@mui/icons-material/AddCircle"; import * as R from "ramda"; -import { XpansionCandidate } from "../types"; +import type { XpansionCandidate } from "../types"; import FormDialog from "../../../../../common/dialogs/FormDialog"; import StringFE from "../../../../../common/fieldEditors/StringFE"; import Fieldset from "../../../../../common/Fieldset"; import SelectFE from "../../../../../common/fieldEditors/SelectFE"; import NumberFE from "../../../../../common/fieldEditors/NumberFE"; -import { SubmitHandlerPlus } from "../../../../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../../../../common/Form/types"; import { validateString } from "@/utils/validation/string"; import type { LinkDTO } from "@/services/api/studies/links/types"; @@ -40,10 +40,7 @@ function CreateCandidateDialog(props: PropType) { const [t] = useTranslation(); const [isToggled, setIsToggled] = useState(true); - const existingCandidates = useMemo( - () => candidates.map(({ name }) => name), - [candidates], - ); + const existingCandidates = useMemo(() => candidates.map(({ name }) => name), [candidates]); //////////////////////////////////////////////////////////////// // Event Handlers @@ -54,10 +51,7 @@ function CreateCandidateDialog(props: PropType) { }; const handleSubmit = (data: SubmitHandlerPlus) => { - const values = R.omit( - isToggled ? ["max-investment"] : ["unit-size", "max-units"], - data.values, - ); + const values = R.omit(isToggled ? ["max-investment"] : ["unit-size", "max-units"], data.values); onSave(values); }; @@ -131,22 +125,11 @@ function CreateCandidateDialog(props: PropType) { : t("xpansion.maxInvestments") } > - - - diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/XpansionPropsView.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/XpansionPropsView.tsx index 6da12c7a73..ace585bcfb 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/XpansionPropsView.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/XpansionPropsView.tsx @@ -17,7 +17,7 @@ import { Box, Button } from "@mui/material"; import { useTranslation } from "react-i18next"; import DeleteIcon from "@mui/icons-material/Delete"; import PropertiesView from "../../../../../common/PropertiesView"; -import { XpansionCandidate } from "../types"; +import type { XpansionCandidate } from "../types"; import ConfirmationDialog from "../../../../../common/dialogs/ConfirmationDialog"; import ListElement from "../../common/ListElement"; @@ -31,26 +31,16 @@ interface PropsType { function XpansionPropsView(props: PropsType) { const [t] = useTranslation(); - const { - candidateList, - selectedItem, - setSelectedItem, - onAdd, - deleteXpansion, - } = props; - const [filteredCandidates, setFilteredCandidates] = - useState(candidateList); + const { candidateList, selectedItem, setSelectedItem, onAdd, deleteXpansion } = props; + const [filteredCandidates, setFilteredCandidates] = useState(candidateList); const [searchFilter, setSearchFilter] = useState(""); - const [openConfirmationModal, setOpenConfirmationModal] = - useState(false); + const [openConfirmationModal, setOpenConfirmationModal] = useState(false); const filter = useCallback( (currentName: string): XpansionCandidate[] => { if (candidateList) { return candidateList.filter( - (item) => - !currentName || - item.name.search(new RegExp(currentName, "i")) !== -1, + (item) => !currentName || item.name.search(new RegExp(currentName, "i")) !== -1, ); } return []; diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx index 298dc08e01..d4ed2af97a 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Candidates/index.tsx @@ -14,13 +14,13 @@ import { useEffect, useState } from "react"; import { useOutletContext, useNavigate } from "react-router-dom"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useTranslation } from "react-i18next"; import { Backdrop, Box, CircularProgress } from "@mui/material"; import { usePromise as usePromiseWrapper } from "react-use"; import { useSnackbar } from "notistack"; -import { StudyMetadata } from "../../../../../../common/types"; -import { XpansionCandidate } from "../types"; +import type { StudyMetadata } from "../../../../../../common/types"; +import type { XpansionCandidate } from "../types"; import { getAllCandidates, getAllCapacities, @@ -31,10 +31,7 @@ import { getCapacity, xpansionConfigurationExist, } from "../../../../../../services/api/xpansion"; -import { - transformNameToId, - removeEmptyFields, -} from "../../../../../../services/utils/index"; +import { transformNameToId, removeEmptyFields } from "../../../../../../services/utils/index"; import useEnqueueErrorSnackbar from "../../../../../../hooks/useEnqueueErrorSnackbar"; import XpansionPropsView from "./XpansionPropsView"; import CreateCandidateDialog from "./CreateCandidateDialog"; @@ -44,7 +41,7 @@ import DataViewerDialog from "../../../../../common/dialogs/DataViewerDialog"; import EmptyView from "../../../../../common/page/EmptyView"; import SplitView from "../../../../../common/SplitView"; import { getLinks } from "@/services/api/studies/links"; -import { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; +import type { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; import ViewWrapper from "@/components/common/page/ViewWrapper"; import SimpleLoader from "@/components/common/loaders/SimpleLoader"; @@ -53,8 +50,7 @@ function Candidates() { const { study } = useOutletContext<{ study?: StudyMetadata }>(); const navigate = useNavigate(); const mounted = usePromiseWrapper(); - const [candidateCreationDialog, setCandidateCreationDialog] = - useState(false); + const [candidateCreationDialog, setCandidateCreationDialog] = useState(false); const [selectedItem, setSelectedItem] = useState(); const [capacityViewDialog, setCapacityViewDialog] = useState<{ filename: string; @@ -78,13 +74,12 @@ function Candidates() { // Candidates const tempCandidates = await getAllCandidates(study.id); for (let i = 0; i < tempCandidates.length; i += 1) { - tempCandidates[i].link = tempCandidates.map( - (item: { link: string }) => - item.link - .split(" - ") - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map((index: any) => transformNameToId(index)) - .join(" - "), + tempCandidates[i].link = tempCandidates.map((item: { link: string }) => + item.link + .split(" - ") + // eslint-disable-next-line @typescript-eslint/no-explicit-any + .map((index: any) => transformNameToId(index)) + .join(" - "), )[i]; } return tempCandidates; @@ -98,23 +93,22 @@ function Candidates() { }, ); - const { data: capaLinks, isLoading: isLinksLoading } = - usePromiseWithSnackbarError( - async () => { - if (!study) { - return {}; - } - const exist = await xpansionConfigurationExist(study.id); - if (exist) { - return { - capacities: await getAllCapacities(study.id), - links: await getLinks({ studyId: study.id }), - }; - } + const { data: capaLinks, isLoading: isLinksLoading } = usePromiseWithSnackbarError( + async () => { + if (!study) { return {}; - }, - { errorMessage: t("xpansion.error.loadConfiguration"), deps: [study] }, - ); + } + const exist = await xpansionConfigurationExist(study.id); + if (exist) { + return { + capacities: await getAllCapacities(study.id), + links: await getLinks({ studyId: study.id }), + }; + } + return {}; + }, + { errorMessage: t("xpansion.error.loadConfiguration"), deps: [study] }, + ); // Handle automatic selection of the first element useEffect(() => { @@ -129,10 +123,7 @@ function Candidates() { await mounted(deleteXpansionConfiguration(study.id)); } } catch (e) { - enqueueErrorSnackbar( - t("xpansion.error.deleteConfiguration"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("xpansion.error.deleteConfiguration"), e as AxiosError); } finally { navigate("../../xpansion", { state: { exist: false } }); } @@ -145,10 +136,7 @@ function Candidates() { setCandidateCreationDialog(false); } } catch (e) { - enqueueErrorSnackbar( - t("xpansion.error.createCandidate"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("xpansion.error.createCandidate"), e as AxiosError); } finally { reload(); setSelectedItem(candidate.name); @@ -161,10 +149,7 @@ function Candidates() { await mounted(deleteCandidate(study.id, name)); } } catch (e) { - enqueueErrorSnackbar( - t("xpansion.error.deleteCandidate"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("xpansion.error.deleteCandidate"), e as AxiosError); } finally { reload(); setSelectedItem(undefined); @@ -196,10 +181,7 @@ function Candidates() { }); } } catch (e) { - enqueueErrorSnackbar( - t("xpansion.error.updateCandidate"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("xpansion.error.updateCandidate"), e as AxiosError); } finally { reload(); } diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/FileList.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/FileList.tsx index fcb2463ebf..8ba7b1a457 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/FileList.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/FileList.tsx @@ -14,25 +14,22 @@ import { useState } from "react"; import { useOutletContext } from "react-router-dom"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useTranslation } from "react-i18next"; import { Box, Paper } from "@mui/material"; -import { StudyMetadata } from "../../../../../common/types"; +import type { StudyMetadata } from "../../../../../common/types"; import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackbar"; import DataViewerDialog from "../../../../common/dialogs/DataViewerDialog"; import FileTable from "../../../../common/FileTable"; import { Title } from "./share/styles"; import usePromiseWithSnackbarError from "../../../../../hooks/usePromiseWithSnackbarError"; import UsePromiseCond from "../../../../common/utils/UsePromiseCond"; -import { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; +import type { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; interface PropTypes { addResource: (studyId: string, file: File) => Promise; deleteResource: (studyId: string, filename: string) => Promise; - fetchResourceContent: ( - studyId: string, - filename: string, - ) => Promise; + fetchResourceContent: (studyId: string, filename: string) => Promise; listResources: (studyId: string) => Promise; errorMessages?: { add?: string; @@ -69,9 +66,7 @@ function FileList(props: PropTypes) { } }, { - errorMessage: t( - errorMessages?.list || "xpansion.error.loadConfiguration", - ), + errorMessage: t(errorMessages?.list || "xpansion.error.loadConfiguration"), }, ); @@ -88,10 +83,7 @@ function FileList(props: PropTypes) { await addResource(study.id, file); } } catch (e) { - enqueueErrorSnackbar( - t(errorMessages?.add || "xpansion.error.addFile"), - e as AxiosError, - ); + enqueueErrorSnackbar(t(errorMessages?.add || "xpansion.error.addFile"), e as AxiosError); } finally { reload(); } @@ -105,10 +97,7 @@ function FileList(props: PropTypes) { setViewDialog({ filename, content }); } } catch (e) { - enqueueErrorSnackbar( - t(errorMessages?.fetchOne || "xpansion.error.getFile"), - e as AxiosError, - ); + enqueueErrorSnackbar(t(errorMessages?.fetchOne || "xpansion.error.getFile"), e as AxiosError); } }; diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx index 259845da99..9bec07e38b 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/SettingsForm.tsx @@ -16,13 +16,8 @@ import { useState, useEffect } from "react"; import { Box, Divider, Typography, Button, TextField } from "@mui/material"; import { useTranslation } from "react-i18next"; import SaveIcon from "@mui/icons-material/Save"; -import { XpansionResourceType, XpansionSettings } from "../types"; -import { - Fields, - SelectFields, - Title, - StyledVisibilityIcon, -} from "../share/styles"; +import { XpansionResourceType, type XpansionSettings } from "../types"; +import { Fields, SelectFields, Title, StyledVisibilityIcon } from "../share/styles"; import SelectSingle from "../../../../../common/SelectSingle"; import NumberFE from "../../../../../common/fieldEditors/NumberFE"; import SelectFE from "../../../../../common/fieldEditors/SelectFE"; @@ -39,10 +34,8 @@ interface PropType { function SettingsForm(props: PropType) { const [t] = useTranslation(); - const { settings, constraints, weights, candidates, updateSettings, onRead } = - props; - const [currentSettings, setCurrentSettings] = - useState(settings); + const { settings, constraints, weights, candidates, updateSettings, onRead } = props; + const [currentSettings, setCurrentSettings] = useState(settings); const [saveAllowed, setSaveAllowed] = useState(false); const ucType = ["expansion_fast", "expansion_accurate"]; @@ -80,11 +73,7 @@ function SettingsForm(props: PropType) { return ( - + {t("xpansion.optimization")} @@ -154,9 +141,7 @@ function SettingsForm(props: PropType) { label={t("xpansion.optimalityGap")} variant="filled" value={currentSettings.optimality_gap} - onChange={(e) => - handleChange("optimality_gap", parseFloat(e.target.value)) - } + onChange={(e) => handleChange("optimality_gap", parseFloat(e.target.value))} sx={{ mb: 1 }} inputProps={{ min: 0 }} /> @@ -165,9 +150,7 @@ function SettingsForm(props: PropType) { label={t("xpansion.relativeGap")} variant="filled" value={currentSettings.relative_gap} - onChange={(e) => - handleChange("relative_gap", parseFloat(e.target.value)) - } + onChange={(e) => handleChange("relative_gap", parseFloat(e.target.value))} sx={{ mb: 1 }} inputProps={{ min: 0 }} /> @@ -176,9 +159,7 @@ function SettingsForm(props: PropType) { label={t("xpansion.relaxedOptimalityGap")} variant="filled" value={currentSettings.relaxed_optimality_gap} - onChange={(e) => - handleChange("relaxed_optimality_gap", e.target.value) - } + onChange={(e) => handleChange("relaxed_optimality_gap", e.target.value)} sx={{ mb: 1 }} inputProps={{ min: 0 }} /> @@ -225,9 +206,7 @@ function SettingsForm(props: PropType) { label={t("xpansion.batchSize")} variant="filled" value={currentSettings.batch_size} - onChange={(e) => - handleChange("batch_size", parseInt(e.target.value, 10)) - } + onChange={(e) => handleChange("batch_size", parseInt(e.target.value, 10))} sx={{ mb: 1 }} inputProps={{ min: 0 }} /> @@ -236,9 +215,7 @@ function SettingsForm(props: PropType) { label={t("xpansion.logLevel")} variant="filled" value={currentSettings.log_level} - onChange={(e) => - handleChange("log_level", parseInt(e.target.value, 10)) - } + onChange={(e) => handleChange("log_level", parseInt(e.target.value, 10))} inputProps={{ min: 0, max: 3, step: 1 }} sx={{ mb: 1 }} /> @@ -277,10 +254,7 @@ function SettingsForm(props: PropType) { currentSettings["yearly-weights"] && - onRead( - XpansionResourceType.weights, - currentSettings["yearly-weights"] || "", - ) + onRead(XpansionResourceType.weights, currentSettings["yearly-weights"] || "") } /> @@ -330,20 +304,14 @@ function SettingsForm(props: PropType) { value={currentSettings.sensitivity_config?.epsilon} label={t("xpansion.epsilon")} onChange={(e) => - handleObjectChange( - "sensitivity_config", - "epsilon", - parseFloat(e.target.value), - ) + handleObjectChange("sensitivity_config", "epsilon", parseFloat(e.target.value)) } inputProps={{ min: 0 }} /> - handleObjectChange("sensitivity_config", "capex", checked) - } + onChange={(e, checked) => handleObjectChange("sensitivity_config", "capex", checked)} /> - handleObjectChange( - "sensitivity_config", - "projection", - e.target.value as string[], - ) + handleObjectChange("sensitivity_config", "projection", e.target.value as string[]) } variant="filled" options={candidates} diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/index.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/index.tsx index ea11bd06a0..7ea0fd62e2 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/Settings/index.tsx @@ -14,11 +14,11 @@ import { useState } from "react"; import { useOutletContext } from "react-router-dom"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useTranslation } from "react-i18next"; import { useSnackbar } from "notistack"; -import { StudyMetadata } from "../../../../../../common/types"; -import { XpansionResourceType, XpansionSettings } from "../types"; +import type { StudyMetadata } from "../../../../../../common/types"; +import { XpansionResourceType, type XpansionSettings } from "../types"; import { getXpansionSettings, getAllConstraints, @@ -135,10 +135,7 @@ function Settings() { const getResourceContent = async (resourceType: string, filename: string) => { try { if (study) { - const content = await resourceContentFetcher(resourceType)( - study.id, - filename, - ); + const content = await resourceContentFetcher(resourceType)(study.id, filename); setResourceViewDialog({ filename, content, diff --git a/webapp/src/components/App/Singlestudy/explore/Xpansion/index.tsx b/webapp/src/components/App/Singlestudy/explore/Xpansion/index.tsx index 6662c4b15c..799dab9bb9 100644 --- a/webapp/src/components/App/Singlestudy/explore/Xpansion/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Xpansion/index.tsx @@ -14,11 +14,11 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { useEffect, useMemo, useState } from "react"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useOutletContext } from "react-router-dom"; import { Box, Button } from "@mui/material"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../../../common/types"; +import type { StudyMetadata } from "../../../../../common/types"; import { createXpansionConfiguration, xpansionConfigurationExist, @@ -27,7 +27,7 @@ import useEnqueueErrorSnackbar from "../../../../../hooks/useEnqueueErrorSnackba import TabWrapper from "../TabWrapper"; import usePromiseWithSnackbarError from "../../../../../hooks/usePromiseWithSnackbarError"; import UsePromiseCond from "../../../../common/utils/UsePromiseCond"; -import { Add } from "@mui/icons-material"; +import AddIcon from "@mui/icons-material/Add"; function Xpansion() { const { study } = useOutletContext<{ study: StudyMetadata }>(); @@ -35,13 +35,10 @@ function Xpansion() { const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const [exist, setExist] = useState(false); - const res = usePromiseWithSnackbarError( - () => xpansionConfigurationExist(study.id), - { - errorMessage: t("xpansion.error.loadConfiguration"), - deps: [exist], - }, - ); + const res = usePromiseWithSnackbarError(() => xpansionConfigurationExist(study.id), { + errorMessage: t("xpansion.error.loadConfiguration"), + deps: [exist], + }); const tabList = useMemo( () => [ @@ -87,10 +84,7 @@ function Xpansion() { await createXpansionConfiguration(study.id); } } catch (e) { - enqueueErrorSnackbar( - t("xpansion.error.createConfiguration"), - e as AxiosError, - ); + enqueueErrorSnackbar(t("xpansion.error.createConfiguration"), e as AxiosError); } finally { setExist(true); } @@ -119,17 +113,13 @@ function Xpansion() { color="primary" variant="contained" size="small" - startIcon={} + startIcon={} onClick={createXpansion} > {t("xpansion.newXpansionConfig")} ) : ( - + ) } /> diff --git a/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx b/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx index 5e799e1928..0fbbbbb77e 100644 --- a/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx +++ b/webapp/src/components/App/Singlestudy/explore/common/ListElement.tsx @@ -17,12 +17,12 @@ import { ListItemButton, ListItemIcon, ListItemText, - SxProps, - Theme, Tooltip, + type SxProps, + type Theme, } from "@mui/material"; import ArrowRightOutlinedIcon from "@mui/icons-material/ArrowRightOutlined"; -import { IdType } from "../../../../../common/types"; +import type { IdType } from "../../../../../common/types"; import { mergeSxProp } from "../../../../../utils/muiUtils"; interface Props { @@ -41,17 +41,10 @@ function ListElement({ sx, }: Props) { return ( - + {list.map((element, index) => ( setSelectedItem(element, index)} key={element.id || element.name} sx={{ diff --git a/webapp/src/components/App/Singlestudy/explore/common/OutputFilters.tsx b/webapp/src/components/App/Singlestudy/explore/common/OutputFilters.tsx index 39cef64ff6..bea223f195 100644 --- a/webapp/src/components/App/Singlestudy/explore/common/OutputFilters.tsx +++ b/webapp/src/components/App/Singlestudy/explore/common/OutputFilters.tsx @@ -13,12 +13,12 @@ */ import { useMemo } from "react"; -import { FieldPath } from "react-hook-form"; +import type { FieldPath } from "react-hook-form"; import { useTranslation } from "react-i18next"; import SelectFE from "../../../../common/fieldEditors/SelectFE"; import Fieldset from "../../../../common/Fieldset"; -import { ControlPlus } from "../../../../common/Form/types"; -import { FilteringType } from "./types"; +import type { ControlPlus } from "../../../../common/Form/types"; +import type { FilteringType } from "./types"; interface FilterFieldValues { filterSynthesis: FilteringType[]; @@ -54,9 +54,7 @@ function OutputFilters(props: Props) { control={control} rules={{ onAutoSubmit: (value) => { - const selection = value - ? (value as string[]).filter((val) => val !== "") - : []; + const selection = value ? (value as string[]).filter((val) => val !== "") : []; onAutoSubmit(filterName, selection.join(", ")); }, }} diff --git a/webapp/src/components/App/Singlestudy/explore/common/types.ts b/webapp/src/components/App/Singlestudy/explore/common/types.ts index c9ae042882..e1236bdf00 100644 --- a/webapp/src/components/App/Singlestudy/explore/common/types.ts +++ b/webapp/src/components/App/Singlestudy/explore/common/types.ts @@ -12,9 +12,4 @@ * This file is part of the Antares project. */ -export type FilteringType = - | "hourly" - | "daily" - | "weekly" - | "monthly" - | "annual"; +export type FilteringType = "hourly" | "daily" | "weekly" | "monthly" | "annual"; diff --git a/webapp/src/components/App/Singlestudy/index.tsx b/webapp/src/components/App/Singlestudy/index.tsx index 6823d6db54..1f9e9d13ff 100644 --- a/webapp/src/components/App/Singlestudy/index.tsx +++ b/webapp/src/components/App/Singlestudy/index.tsx @@ -19,26 +19,20 @@ import { Box, Divider } from "@mui/material"; import debug from "debug"; import { useTranslation } from "react-i18next"; import { usePromise as usePromiseWrapper } from "react-use"; -import { StudyMetadata, VariantTree } from "../../../common/types"; +import type { StudyMetadata, VariantTree } from "../../../common/types"; import { getStudyMetadata } from "../../../services/api/study"; import NavHeader from "./NavHeader"; -import { - getVariantChildren, - getVariantParents, -} from "../../../services/api/variant"; +import { getVariantChildren, getVariantParents } from "../../../services/api/variant"; import TabWrapper from "./explore/TabWrapper"; import HomeView from "./HomeView"; -import { - fetchStudyVersions, - setCurrentStudy, -} from "../../../redux/ducks/studies"; +import { fetchStudyVersions, setCurrentStudy } from "../../../redux/ducks/studies"; import { findNodeInTree } from "../../../services/utils"; import CommandDrawer from "./Commands"; import { addWsEventListener } from "../../../services/webSocket/ws"; import useAppDispatch from "../../../redux/hooks/useAppDispatch"; import SimpleLoader from "../../common/loaders/SimpleLoader"; import FreezeStudy from "./FreezeStudy"; -import { WsEvent } from "@/services/webSocket/types"; +import type { WsEvent } from "@/services/webSocket/types"; import { WsEventType } from "@/services/webSocket/constants"; const logError = debug("antares:singlestudy:error"); @@ -172,9 +166,7 @@ function SingleStudy(props: Props) { isExplorer={isExplorer} openCommands={() => setOpenCommands(true)} childrenTree={ - study !== undefined && tree !== undefined - ? findNodeInTree(study.id, tree) - : undefined + study !== undefined && tree !== undefined ? findNodeInTree(study.id, tree) : undefined } /> {!isExplorer && } diff --git a/webapp/src/components/App/Studies/BatchModeMenu.tsx b/webapp/src/components/App/Studies/BatchModeMenu.tsx index a301b4e27f..6abac195ef 100644 --- a/webapp/src/components/App/Studies/BatchModeMenu.tsx +++ b/webapp/src/components/App/Studies/BatchModeMenu.tsx @@ -53,10 +53,7 @@ function BatchModeMenu(props: Props) { > {selectionMode && ( <> - - {openLaunchModal && ( - - )} + {openLaunchModal && } )} diff --git a/webapp/src/components/App/Studies/CreateStudyDialog.tsx b/webapp/src/components/App/Studies/CreateStudyDialog.tsx index c90a52cf5a..3a3446d02d 100644 --- a/webapp/src/components/App/Studies/CreateStudyDialog.tsx +++ b/webapp/src/components/App/Studies/CreateStudyDialog.tsx @@ -15,10 +15,10 @@ import debug from "debug"; import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { usePromise } from "react-use"; import * as R from "ramda"; -import { StudyPublicMode } from "../../../common/types"; +import type { StudyPublicMode } from "../../../common/types"; import useEnqueueErrorSnackbar from "../../../hooks/useEnqueueErrorSnackbar"; import { createStudy } from "../../../redux/ducks/studies"; import { getStudyVersionsFormatted, getGroups } from "../../../redux/selectors"; @@ -29,7 +29,7 @@ import StringFE from "../../common/fieldEditors/StringFE"; import SelectFE from "../../common/fieldEditors/SelectFE"; import Fieldset from "../../common/Fieldset"; import CheckboxesTagsFE from "../../common/fieldEditors/CheckboxesTagsFE"; -import { SubmitHandlerPlus } from "../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../common/Form/types"; import { PUBLIC_MODE_LIST } from "../../common/utils/constants"; const logErr = debug("antares:createstudyform:error"); @@ -80,10 +80,7 @@ function CreateStudyDialog(props: Props) { }); } catch (e) { logErr("Failed to create new study", name, e); - enqueueErrorSnackbar( - t("studies.error.createStudy", { studyname: name }), - e as AxiosError, - ); + enqueueErrorSnackbar(t("studies.error.createStudy", { studyname: name }), e as AxiosError); } onClose(); } else { diff --git a/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/MultipleLinkElement/index.tsx b/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/MultipleLinkElement/index.tsx index 91b0c285b6..e4784f5eff 100644 --- a/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/MultipleLinkElement/index.tsx +++ b/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/MultipleLinkElement/index.tsx @@ -37,10 +37,7 @@ export default function MultipleLinkElement(props: { const [link, setLink] = useState({ area1: "", area2: "" }); const onAddLink = (): void => { - if ( - values.findIndex((elm) => elm === currentLink) < 0 && - currentLink !== "" - ) { + if (values.findIndex((elm) => elm === currentLink) < 0 && currentLink !== "") { onChange(values.concat(currentLink)); } }; @@ -66,9 +63,7 @@ export default function MultipleLinkElement(props: { name={t("study.area1")} list={areas.map((elm) => ({ id: elm, name: elm }))} data={link.area1} - setValue={(elm: string[] | string) => - onSelectChange(0, elm as string) - } + setValue={(elm: string[] | string) => onSelectChange(0, elm as string)} sx={{ flexGrow: 1, px: 0.5 }} required /> @@ -76,9 +71,7 @@ export default function MultipleLinkElement(props: { name={t("study.area2")} list={areas.map((elm) => ({ id: elm, name: elm }))} data={link.area2} - setValue={(elm: string[] | string) => - onSelectChange(1, elm as string) - } + setValue={(elm: string[] | string) => onSelectChange(1, elm as string)} sx={{ flexGrow: 1, px: 0.1 }} required /> diff --git a/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/index.tsx b/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/index.tsx index d64fc9665d..683092a526 100644 --- a/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/index.tsx +++ b/webapp/src/components/App/Studies/ExportModal/ExportFilter/Filter/index.tsx @@ -15,11 +15,7 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { TextField } from "@mui/material"; -import { - Area, - Set, - StudyOutputDownloadType, -} from "../../../../../../common/types"; +import { StudyOutputDownloadType, type Area, type Set } from "../../../../../../common/types"; import SelectMulti from "../../../../../common/SelectMulti"; import { Root } from "./style"; import MultipleLinkElement from "./MultipleLinkElement"; @@ -50,9 +46,7 @@ function Filter(props: PropTypes) { setFilterInValue, setFilterOutValue, } = props; - const [areasOrDistrictsList, setAreasOrDistrictsList] = useState( - [], - ); + const [areasOrDistrictsList, setAreasOrDistrictsList] = useState([]); useEffect(() => { const getAreasOrDistrictsList = (): string[] => { @@ -107,14 +101,8 @@ function Filter(props: PropTypes) { values={filterValue} onChange={setFilterValue} /> - - + + ); } diff --git a/webapp/src/components/App/Studies/ExportModal/ExportFilter/index.tsx b/webapp/src/components/App/Studies/ExportModal/ExportFilter/index.tsx index a03d0f22fe..310e5ac17f 100644 --- a/webapp/src/components/App/Studies/ExportModal/ExportFilter/index.tsx +++ b/webapp/src/components/App/Studies/ExportModal/ExportFilter/index.tsx @@ -14,15 +14,15 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import _ from "lodash"; +import range from "lodash/range"; import { Box, Checkbox, FormControlLabel, styled } from "@mui/material"; import { - Area, - Set as District, - FileStudyTreeConfigDTO, - StudyOutputDownloadDTO, StudyOutputDownloadLevelDTO, StudyOutputDownloadType, + type Area, + type Set as District, + type FileStudyTreeConfigDTO, + type StudyOutputDownloadDTO, } from "../../../../../common/types"; import Filter from "./Filter"; import TagSelect from "./TagSelect"; @@ -55,9 +55,7 @@ function ExportFilterModal(props: PropTypes) { nbYear: -1, }); const [areaList, setAreaList] = useState>({}); - const [districtList, setDistrictList] = useState>( - {}, - ); + const [districtList, setDistrictList] = useState>({}); const typeList: string[] = [ StudyOutputDownloadType.AREAS, @@ -113,7 +111,7 @@ function ExportFilterModal(props: PropTypes) { {byYear.isByYear && byYear.nbYear > 0 && ( ({ + list={range(byYear.nbYear).map((elm) => ({ id: elm.toString(), name: elm.toString(), }))} @@ -145,25 +143,17 @@ function ExportFilterModal(props: PropTypes) { areas={areaList} sets={districtList} filterValue={filter.filter ? filter.filter : []} - setFilterValue={(elm: string[]) => - setFilter({ ...filter, filter: elm }) - } + setFilterValue={(elm: string[]) => setFilter({ ...filter, filter: elm })} filterInValue={filter.filterIn ? filter.filterIn : ""} - setFilterInValue={(elm: string) => - setFilter({ ...filter, filterIn: elm }) - } + setFilterInValue={(elm: string) => setFilter({ ...filter, filterIn: elm })} filterOutValue={filter.filterOut ? filter.filterOut : ""} - setFilterOutValue={(elm: string) => - setFilter({ ...filter, filterOut: elm }) - } + setFilterOutValue={(elm: string) => setFilter({ ...filter, filterOut: elm })} /> - setFilter({ ...filter, synthesis: checked }) - } + onChange={(e, checked) => setFilter({ ...filter, synthesis: checked })} name={t("study.synthesis")} /> } @@ -174,9 +164,7 @@ function ExportFilterModal(props: PropTypes) { control={ - setFilter({ ...filter, includeClusters: checked }) - } + onChange={(e, checked) => setFilter({ ...filter, includeClusters: checked })} name={t("study.includeClusters")} /> } diff --git a/webapp/src/components/App/Studies/ExportModal/index.tsx b/webapp/src/components/App/Studies/ExportModal/index.tsx index d9d24714cf..4a877f6b60 100644 --- a/webapp/src/components/App/Studies/ExportModal/index.tsx +++ b/webapp/src/components/App/Studies/ExportModal/index.tsx @@ -12,26 +12,24 @@ * This file is part of the Antares project. */ -import { ReactNode, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import * as R from "ramda"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { Box, Button } from "@mui/material"; import { useTranslation } from "react-i18next"; import { useSnackbar } from "notistack"; import debug from "debug"; -import _ from "lodash"; +import debounce from "lodash/debounce"; import { - FileStudyTreeConfigDTO, - GenericInfo, - StudyMetadata, - StudyOutput, - StudyOutputDownloadDTO, StudyOutputDownloadLevelDTO, StudyOutputDownloadType, + type FileStudyTreeConfigDTO, + type GenericInfo, + type StudyMetadata, + type StudyOutput, + type StudyOutputDownloadDTO, } from "../../../../common/types"; -import BasicDialog, { - BasicDialogProps, -} from "../../../common/dialogs/BasicDialog"; +import BasicDialog, { type BasicDialogProps } from "../../../common/dialogs/BasicDialog"; import useEnqueueErrorSnackbar from "../../../../hooks/useEnqueueErrorSnackbar"; import SelectSingle from "../../../common/SelectSingle"; import { @@ -76,8 +74,7 @@ export default function ExportModal(props: BasicDialogProps & Props) { const [optionSelection, setOptionSelection] = useState("exportWith"); const [outputList, setOutputList] = useState(); const [currentOutput, setCurrentOutput] = useState(); - const [studySynthesis, setStudySynthesis] = - useState(); + const [studySynthesis, setStudySynthesis] = useState(); const [filter, setFilter] = useState({ type: StudyOutputDownloadType.AREAS, level: StudyOutputDownloadLevelDTO.WEEKLY, @@ -85,7 +82,7 @@ export default function ExportModal(props: BasicDialogProps & Props) { includeClusters: false, }); - const exportOutput = _.debounce( + const exportOutput = debounce( async (output: string) => { if (study) { try { @@ -139,9 +136,7 @@ export default function ExportModal(props: BasicDialogProps & Props) { try { const res = await getStudyOutputs(study.id); const tmpSynth = await getStudySynthesis(study.id); - setOutputList( - res.map((o: StudyOutput) => ({ id: o.name, name: o.name })), - ); + setOutputList(res.map((o: StudyOutput) => ({ id: o.name, name: o.name }))); setCurrentOutput(res.length > 0 ? res[0].name : undefined); setStudySynthesis(tmpSynth); } catch (e) { @@ -169,9 +164,8 @@ export default function ExportModal(props: BasicDialogProps & Props) { color="success" variant="contained" disabled={ - ["exportOutputFilter", "exportOutput"].indexOf( - optionSelection, - ) !== -1 && currentOutput === undefined + ["exportOutputFilter", "exportOutput"].indexOf(optionSelection) !== -1 && + currentOutput === undefined } onClick={onExportClick} > @@ -196,8 +190,7 @@ export default function ExportModal(props: BasicDialogProps & Props) { {R.cond([ [ () => - (optionSelection === "exportOutput" || - optionSelection === "exportOutputFilter") && + (optionSelection === "exportOutput" || optionSelection === "exportOutputFilter") && outputList !== undefined, () => ( @@ -209,14 +202,12 @@ export default function ExportModal(props: BasicDialogProps & Props) { sx={{ width: "300px", my: 3 }} required /> - ) as ReactNode, + ) as React.ReactNode, ], ])()} {R.cond([ [ - () => - optionSelection === "exportOutputFilter" && - currentOutput !== undefined, + () => optionSelection === "exportOutputFilter" && currentOutput !== undefined, () => ( - ) as ReactNode, + ) as React.ReactNode, ], ])()} diff --git a/webapp/src/components/App/Studies/FilterDrawer.tsx b/webapp/src/components/App/Studies/FilterDrawer.tsx index 676fb27f91..6dc6881ce5 100644 --- a/webapp/src/components/App/Studies/FilterDrawer.tsx +++ b/webapp/src/components/App/Studies/FilterDrawer.tsx @@ -20,14 +20,9 @@ import { Button, Drawer, List, ListItem, Typography } from "@mui/material"; import { useEffect, useRef } from "react"; import { STUDIES_FILTER_WIDTH } from "../../../theme"; import useAppSelector from "../../../redux/hooks/useAppSelector"; -import { - getGroups, - getStudyFilters, - getStudyVersions, - getUsers, -} from "../../../redux/selectors"; +import { getGroups, getStudyFilters, getStudyVersions, getUsers } from "../../../redux/selectors"; import useAppDispatch from "../../../redux/hooks/useAppDispatch"; -import { StudyFilters, updateStudyFilters } from "../../../redux/ducks/studies"; +import { updateStudyFilters, type StudyFilters } from "../../../redux/ducks/studies"; import CheckboxesTagsFE from "../../common/fieldEditors/CheckboxesTagsFE"; import { displayVersionName } from "../../../services/utils"; import CheckBoxFE from "../../common/fieldEditors/CheckBoxFE"; @@ -154,13 +149,9 @@ function FilterDrawer(props: Props) { label={t("global.users")} options={users} getOptionLabel={(option) => option.name} - defaultValue={users.filter((user) => - filters.users.includes(user.id), - )} + defaultValue={users.filter((user) => filters.users.includes(user.id))} onChange={(event) => { - filterNewValuesRef.current.users = event.target.value.map( - (val) => val.id, - ); + filterNewValuesRef.current.users = event.target.value.map((val) => val.id); }} fullWidth /> @@ -170,13 +161,9 @@ function FilterDrawer(props: Props) { label={t("global.groups")} options={groups} getOptionLabel={(option) => option.name} - defaultValue={groups.filter((group) => - filters.groups.includes(group.id), - )} + defaultValue={groups.filter((group) => filters.groups.includes(group.id))} onChange={(event) => { - filterNewValuesRef.current.groups = event.target.value.map( - (val) => val.id, - ); + filterNewValuesRef.current.groups = event.target.value.map((val) => val.id); }} fullWidth /> diff --git a/webapp/src/components/App/Studies/HeaderBottom.tsx b/webapp/src/components/App/Studies/HeaderBottom.tsx index bfab7c6511..5732c8b1c8 100644 --- a/webapp/src/components/App/Studies/HeaderBottom.tsx +++ b/webapp/src/components/App/Studies/HeaderBottom.tsx @@ -19,8 +19,8 @@ import { useUnmount } from "react-use"; import useAppSelector from "../../../redux/hooks/useAppSelector"; import { getGroups, getStudyFilters, getUsers } from "../../../redux/selectors"; import useAppDispatch from "../../../redux/hooks/useAppDispatch"; -import { StudyFilters, updateStudyFilters } from "../../../redux/ducks/studies"; -import { GroupDTO, UserDTO } from "../../../common/types"; +import { updateStudyFilters, type StudyFilters } from "../../../redux/ducks/studies"; +import type { GroupDTO, UserDTO } from "../../../common/types"; import { displayVersionName } from "../../../services/utils"; import SearchFE from "../../common/fieldEditors/SearchFE"; @@ -55,10 +55,7 @@ function HeaderBottom(props: PropTypes) { // Utils //////////////////////////////////////////////////////////////// - const setFilterValue = ( - string: T, - newValue: StudyFilters[T], - ) => { + const setFilterValue = (string: T, newValue: StudyFilters[T]) => { dispatch(updateStudyFilters({ [string]: newValue })); }; diff --git a/webapp/src/components/App/Studies/HeaderTopRight.tsx b/webapp/src/components/App/Studies/HeaderTopRight.tsx index 24d30de6ea..54a02452e4 100644 --- a/webapp/src/components/App/Studies/HeaderTopRight.tsx +++ b/webapp/src/components/App/Studies/HeaderTopRight.tsx @@ -32,10 +32,7 @@ function HeaderRight() { // Event Handlers //////////////////////////////////////////////////////////////// - const handleImport = ( - file: File, - onUploadProgress: (progress: number) => void, - ) => { + const handleImport = (file: File, onUploadProgress: (progress: number) => void) => { return dispatch( createStudy({ file, @@ -68,10 +65,7 @@ function HeaderRight() { {t("global.create")} {openCreateDialog && ( - setOpenCreateDialog(false)} - /> + setOpenCreateDialog(false)} /> )} {openUploadDialog && ( { if (studyIds.length > 0) { setIsLaunching(true); - Promise.all( - studyIds.map((sid) => launchStudy(sid, options, solverVersion)), - ) + Promise.all(studyIds.map((sid) => launchStudy(sid, options, solverVersion))) .then(() => { enqueueSnackbar( t("studies.studylaunched", { @@ -151,20 +145,14 @@ function LauncherDialog(props: Props) { } }; - const handleChange = ( - field: T, - value: LaunchOptions[T], - ) => { + const handleChange = (field: T, value: LaunchOptions[T]) => { setOptions((prevOptions) => ({ ...prevOptions, [field]: value, })); }; - const handleObjectChange = ( - field: T, - value: object, - ) => { + const handleObjectChange = (field: T, value: object) => { setOptions((prevOptions: LaunchOptions) => { return { ...prevOptions, @@ -173,9 +161,7 @@ function LauncherDialog(props: Props) { }); }; - const handleOtherOptionsChange = ( - optionChanges: Array<{ option: string; active: boolean }>, - ) => { + const handleOtherOptionsChange = (optionChanges: Array<{ option: string; active: boolean }>) => { setOptions((prevOptions) => { const { other_options: prevOtherOptions = "" } = prevOptions; const { toAdd, toRemove } = optionChanges.reduce( @@ -215,11 +201,7 @@ function LauncherDialog(props: Props) { sx={{ mx: 2 }} color="primary" variant="contained" - disabled={ - isLaunching || - !launcherCores.isFulfilled || - !launcherTimeLimit.isFulfilled - } + disabled={isLaunching || !launcherCores.isFulfilled || !launcherTimeLimit.isFulfilled} onClick={handleLaunchClick} > {t("global.launch")} @@ -270,9 +252,7 @@ function LauncherDialog(props: Props) { type="text" variant="outlined" value={options.output_suffix} - onChange={(e) => - handleChange("output_suffix", e.target.value.trim()) - } + onChange={(e) => handleChange("output_suffix", e.target.value.trim())} InputLabelProps={{ shrink: true, }} @@ -290,17 +270,12 @@ function LauncherDialog(props: Props) { type="number" variant="outlined" required - value={ - options.time_limit - ? options.time_limit / 3600 - : timeLimit.defaultValue - } + value={options.time_limit ? options.time_limit / 3600 : timeLimit.defaultValue} onChange={(e) => { const newValue = parseInt(e.target.value, 10); handleChange( "time_limit", - Math.min(Math.max(newValue, timeLimit.min), timeLimit.max) * - 3600, + Math.min(Math.max(newValue, timeLimit.min), timeLimit.max) * 3600, ); }} InputLabelProps={{ @@ -332,10 +307,7 @@ function LauncherDialog(props: Props) { value={options.nb_cpu ? options.nb_cpu : cores.defaultValue} onChange={(e) => { const newValue = parseInt(e.target.value, 10); - handleChange( - "nb_cpu", - Math.min(Math.max(newValue, cores.min), cores.max), - ); + handleChange("nb_cpu", Math.min(Math.max(newValue, cores.min), cores.max)); }} inputProps={{ min: cores.min, @@ -423,13 +395,8 @@ function LauncherDialog(props: Props) { label="Adequacy patch R" value={!!options.adequacy_patch} onChange={(e, checked) => { - handleChange( - "adequacy_patch", - checked ? { legacy: true } : undefined, - ); - handleOtherOptionsChange([ - { option: "adq_patch_rc", active: checked }, - ]); + handleChange("adequacy_patch", checked ? { legacy: true } : undefined); + handleOtherOptionsChange([{ option: "adq_patch_rc", active: checked }]); }} /> { - handleChange( - "xpansion", - checked ? { enabled: true } : undefined, - ); + handleChange("xpansion", checked ? { enabled: true } : undefined); }} /> diff --git a/webapp/src/components/App/Studies/MoveStudyDialog.tsx b/webapp/src/components/App/Studies/MoveStudyDialog.tsx index ff9687f8af..a8004cd094 100644 --- a/webapp/src/components/App/Studies/MoveStudyDialog.tsx +++ b/webapp/src/components/App/Studies/MoveStudyDialog.tsx @@ -12,21 +12,18 @@ * This file is part of the Antares project. */ -import { DialogProps } from "@mui/material"; +import type { DialogProps } from "@mui/material"; import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; -import { StudyMetadata } from "../../../common/types"; +import type { StudyMetadata } from "../../../common/types"; import { moveStudy } from "../../../services/api/study"; import FormDialog from "../../common/dialogs/FormDialog"; -import { SubmitHandlerPlus } from "../../common/Form/types"; +import type { SubmitHandlerPlus } from "../../common/Form/types"; import StringFE from "@/components/common/fieldEditors/StringFE"; import * as R from "ramda"; import { validatePath } from "@/utils/validation/string"; -function formalizePath( - path: string | undefined, - studyId?: StudyMetadata["id"], -) { +function formalizePath(path: string | undefined, studyId?: StudyMetadata["id"]) { const trimmedPath = path?.trim(); if (!trimmedPath) { @@ -71,9 +68,7 @@ function MoveStudyDialog(props: Props) { return moveStudy(study.id, path); }; - const handleSubmitSuccessful = ( - data: SubmitHandlerPlus, - ) => { + const handleSubmitSuccessful = (data: SubmitHandlerPlus) => { onClose(); enqueueSnackbar( diff --git a/webapp/src/components/App/Studies/SideNav.tsx b/webapp/src/components/App/Studies/SideNav.tsx index b966f27fd6..085f6bc644 100644 --- a/webapp/src/components/App/Studies/SideNav.tsx +++ b/webapp/src/components/App/Studies/SideNav.tsx @@ -37,9 +37,7 @@ function SideNav() { p={2} sx={{ overflowX: "hidden", overflowY: "auto" }} > - - {t("studies.favorites")} - + {t("studies.favorites")} {favorites.map((fav) => ( void; @@ -77,8 +77,7 @@ const StudyCardCell = memo( const { isScrolling: prevIsScrolling, ...prevRest } = prevProps; const { isScrolling: nextIsScrolling, ...nextRest } = nextProps; return ( - !!(nextIsScrolling === prevIsScrolling || nextIsScrolling) && - areEqual(prevRest, nextRest) + !!(nextIsScrolling === prevIsScrolling || nextIsScrolling) && areEqual(prevRest, nextRest) ); }, ); diff --git a/webapp/src/components/App/Studies/StudiesList/index.tsx b/webapp/src/components/App/Studies/StudiesList/index.tsx index 89326dfff9..c58a775e30 100644 --- a/webapp/src/components/App/Studies/StudiesList/index.tsx +++ b/webapp/src/components/App/Studies/StudiesList/index.tsx @@ -20,12 +20,12 @@ import { Select, MenuItem, ListItemText, - SelectChangeEvent, ListItemIcon, Tooltip, FormControl, InputLabel, IconButton, + type SelectChangeEvent, } from "@mui/material"; import { useTranslation } from "react-i18next"; import NavigateNextIcon from "@mui/icons-material/NavigateNext"; @@ -36,16 +36,16 @@ import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward"; import FolderIcon from "@mui/icons-material/Folder"; import AccountTreeIcon from "@mui/icons-material/AccountTree"; import RadarIcon from "@mui/icons-material/Radar"; -import { FixedSizeGrid, GridOnScrollProps } from "react-window"; +import { FixedSizeGrid, type GridOnScrollProps } from "react-window"; import { v4 as uuidv4 } from "uuid"; -import { AxiosError } from "axios"; -import { StudyMetadata } from "../../../../common/types"; +import type { AxiosError } from "axios"; +import type { StudyMetadata } from "../../../../common/types"; import { STUDIES_LIST_HEADER_HEIGHT } from "../../../../theme"; import { setStudyScrollPosition, - StudiesSortConf, updateStudiesSortConf, updateStudyFilters, + type StudiesSortConf, } from "../../../../redux/ducks/studies"; import LauncherDialog from "../LauncherDialog"; import useDebounce from "../../../../hooks/useDebounce"; @@ -75,15 +75,11 @@ function StudiesList(props: StudiesListProps) { const { studyIds } = props; const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const [t] = useTranslation(); - const [studyToLaunch, setStudyToLaunch] = useState< - StudyMetadata["id"] | null - >(null); + const [studyToLaunch, setStudyToLaunch] = useState(null); const scrollPosition = useAppSelector(getStudiesScrollPosition); const sortConf = useAppSelector(getStudiesSortConf); const folder = useAppSelector((state) => getStudyFilters(state).folder); - const strictFolderFilter = useAppSelector( - (state) => getStudyFilters(state).strictFolder, - ); + const strictFolderFilter = useAppSelector((state) => getStudyFilters(state).strictFolder); const [folderList, setFolderList] = useState(folder.split("/")); const dispatch = useAppDispatch(); const sortLabelId = useRef(uuidv4()).current; @@ -215,10 +211,7 @@ function StudiesList(props: StudiesListProps) { alignItems="center" boxSizing="border-box" > - } - aria-label="breadcrumb" - > + } aria-label="breadcrumb"> {folderList.map((fol, index) => { const path = folderList.slice(0, index + 1).join("/"); if (index === 0) { @@ -363,11 +356,7 @@ function StudiesList(props: StudiesListProps) { }} > - {conf.order === "ascend" ? ( - - ) : ( - - )} + {conf.order === "ascend" ? : } @@ -382,8 +371,7 @@ function StudiesList(props: StudiesListProps) { {({ height, width }) => { const paddedWidth = width - 10; const columnWidth = - paddedWidth / - Math.max(Math.floor(paddedWidth / CARD_TARGET_WIDTH), 1); + paddedWidth / Math.max(Math.floor(paddedWidth / CARD_TARGET_WIDTH), 1); const columnCount = Math.floor(paddedWidth / columnWidth); const rowHeight = CARD_HEIGHT; @@ -417,11 +405,7 @@ function StudiesList(props: StudiesListProps) { {studyToLaunch && ( - setStudyToLaunch(null)} - /> + setStudyToLaunch(null)} /> )} ); diff --git a/webapp/src/components/App/Studies/StudyCard/ActionsMenu.tsx b/webapp/src/components/App/Studies/StudyCard/ActionsMenu.tsx index 8c1b1cee79..465e22dde8 100644 --- a/webapp/src/components/App/Studies/StudyCard/ActionsMenu.tsx +++ b/webapp/src/components/App/Studies/StudyCard/ActionsMenu.tsx @@ -14,13 +14,7 @@ import useEnqueueErrorSnackbar from "@/hooks/useEnqueueErrorSnackbar"; import { archiveStudy, copyStudy, unarchiveStudy } from "@/services/api/study"; -import { - ListItemIcon, - ListItemText, - Menu, - MenuItem, - type MenuProps, -} from "@mui/material"; +import { ListItemIcon, ListItemText, Menu, MenuItem, type MenuProps } from "@mui/material"; import ArchiveOutlinedIcon from "@mui/icons-material/ArchiveOutlined"; import UnarchiveOutlinedIcon from "@mui/icons-material/UnarchiveOutlined"; import DownloadOutlinedIcon from "@mui/icons-material/DownloadOutlined"; @@ -61,10 +55,7 @@ function ActionsMenu(props: Props) { const handleUnarchiveClick = () => { unarchiveStudy(study.id).catch((err) => { - enqueueErrorSnackbar( - t("studies.error.unarchive", { studyname: study.name }), - err, - ); + enqueueErrorSnackbar(t("studies.error.unarchive", { studyname: study.name }), err); logError("Failed to unarchive study", study, err); }); @@ -73,10 +64,7 @@ function ActionsMenu(props: Props) { const handleArchiveClick = () => { archiveStudy(study.id).catch((err) => { - enqueueErrorSnackbar( - t("studies.error.archive", { studyname: study.name }), - err, - ); + enqueueErrorSnackbar(t("studies.error.archive", { studyname: study.name }), err); logError("Failed to archive study", study, err); }); @@ -84,11 +72,7 @@ function ActionsMenu(props: Props) { }; const handleCopyClick = () => { - copyStudy( - study.id, - `${study.name} (${t("studies.copySuffix")})`, - false, - ).catch((err) => { + copyStudy(study.id, `${study.name} (${t("studies.copySuffix")})`, false).catch((err) => { enqueueErrorSnackbar(t("studies.error.copyStudy"), err); logError("Failed to copy study", study, err); }); @@ -139,36 +123,11 @@ function ActionsMenu(props: Props) { return ( {[ - menuItem( - !study.archived, - t("global.launch"), - BoltIcon, - handleLaunchClick, - ), - menuItem( - !study.archived, - t("study.properties"), - EditOutlinedIcon, - handlePropertiesClick, - ), - menuItem( - !study.archived, - t("global.copy"), - FileCopyOutlinedIcon, - handleCopyClick, - ), - menuItem( - study.managed, - t("studies.moveStudy"), - DriveFileMoveIcon, - handleMoveClick, - ), - menuItem( - !study.archived, - t("global.export"), - DownloadOutlinedIcon, - handleExportClick, - ), + menuItem(!study.archived, t("global.launch"), BoltIcon, handleLaunchClick), + menuItem(!study.archived, t("study.properties"), EditOutlinedIcon, handlePropertiesClick), + menuItem(!study.archived, t("global.copy"), FileCopyOutlinedIcon, handleCopyClick), + menuItem(study.managed, t("studies.moveStudy"), DriveFileMoveIcon, handleMoveClick), + menuItem(!study.archived, t("global.export"), DownloadOutlinedIcon, handleExportClick), menuItem( study.archived, t("global.unarchive"), diff --git a/webapp/src/components/App/Studies/StudyCard/index.tsx b/webapp/src/components/App/Studies/StudyCard/index.tsx index 89813e6271..2f30ad6572 100644 --- a/webapp/src/components/App/Studies/StudyCard/index.tsx +++ b/webapp/src/components/App/Studies/StudyCard/index.tsx @@ -14,7 +14,7 @@ import { memo, useState } from "react"; import { NavLink, useNavigate } from "react-router-dom"; -import { AxiosError } from "axios"; +import type { AxiosError } from "axios"; import { useSnackbar } from "notistack"; import { useTranslation } from "react-i18next"; import { @@ -40,7 +40,7 @@ import ContentCopyIcon from "@mui/icons-material/ContentCopy"; import AltRouteOutlinedIcon from "@mui/icons-material/AltRouteOutlined"; import debug from "debug"; import { areEqual } from "react-window"; -import { StudyMetadata, StudyType } from "../../../../common/types"; +import { StudyType, type StudyMetadata } from "../../../../common/types"; import { buildModificationDate, convertUTCToLocalTime, @@ -301,9 +301,7 @@ const StudyCard = memo((props: Props) => { }} > - - {convertUTCToLocalTime(study.creationDate)} - + {convertUTCToLocalTime(study.creationDate)} { }} > - - {buildModificationDate(study.modificationDate, t, i18n.language)} - + {buildModificationDate(study.modificationDate, t, i18n.language)} {`v${displayVersionName(study.version)}`} @@ -348,12 +344,7 @@ const StudyCard = memo((props: Props) => { }} > {study.archived && ( - } - label="archive" - color="warning" - size="small" - /> + } label="archive" color="warning" size="small" /> )} {study.type === StudyType.VARIANT && ( { }} /> {study.tags?.map((tag) => ( - + ))} @@ -406,9 +392,7 @@ const StudyCard = memo((props: Props) => { /> {/* Keep conditional rendering for dialogs and not use only `open` property, because API calls are made on mount */} - {openDialog === "properties" && ( - - )} + {openDialog === "properties" && } {openDialog === "delete" && ( { {t("studies.question.delete")} )} - {openDialog === "export" && ( - - )} - {openDialog === "move" && ( - - )} + {openDialog === "export" && } + {openDialog === "move" && } ); }, areEqual); diff --git a/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx b/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx index 9b2d6cdff6..e3e688a03c 100644 --- a/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx +++ b/webapp/src/components/App/Studies/StudyTree/StudyTreeNode.tsx @@ -13,7 +13,7 @@ */ import { memo } from "react"; -import { StudyTreeNodeProps } from "./types"; +import type { StudyTreeNodeProps } from "./types"; import TreeItemEnhanced from "@/components/common/TreeItemEnhanced"; import { t } from "i18next"; @@ -22,11 +22,8 @@ export default memo(function StudyTreeNode({ parentId, onNodeClick, }: StudyTreeNodeProps) { - const isLoadingFolder = - studyTreeNode.hasChildren && studyTreeNode.children.length === 0; - const id = parentId - ? `${parentId}/${studyTreeNode.name}` - : studyTreeNode.name; + const isLoadingFolder = studyTreeNode.hasChildren && studyTreeNode.children.length === 0; + const id = parentId ? `${parentId}/${studyTreeNode.name}` : studyTreeNode.name; if (isLoadingFolder) { return ( @@ -35,10 +32,7 @@ export default memo(function StudyTreeNode({ label={studyTreeNode.name} onClick={() => onNodeClick(id, studyTreeNode)} > - + ); } diff --git a/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts b/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts index 1fe3237182..11ac4c986e 100644 --- a/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts +++ b/webapp/src/components/App/Studies/StudyTree/__test__/fixtures.ts @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { StudyMetadata, StudyType } from "@/common/types"; +import { StudyType, type StudyMetadata } from "@/common/types"; function createStudyMetadata(folder: string, workspace: string): StudyMetadata { return { @@ -139,9 +139,7 @@ export const FIXTURES = { { name: "suba", path: "/a/suba", - children: [ - { name: "folder1", path: "/a/suba/folder1", children: [] }, - ], + children: [{ name: "folder1", path: "/a/suba/folder1", children: [] }], }, ], }, diff --git a/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts b/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts index 0578313bb1..5a5fa03fe2 100644 --- a/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts +++ b/webapp/src/components/App/Studies/StudyTree/__test__/utils.test.ts @@ -13,22 +13,15 @@ */ import { FIXTURES, FIXTURES_BUILD_STUDY_TREE } from "./fixtures"; -import { - buildStudyTree, - insertFoldersIfNotExist, - insertWorkspacesIfNotExist, -} from "../utils"; -import { NonStudyFolderDTO, StudyTreeNode } from "../types"; +import { buildStudyTree, insertFoldersIfNotExist, insertWorkspacesIfNotExist } from "../utils"; +import type { NonStudyFolderDTO, StudyTreeNode } from "../types"; describe("StudyTree Utils", () => { describe("mergeStudyTreeAndFolders", () => { - test.each(Object.values(FIXTURES))( - "$name", - ({ studyTree, folders, expected }) => { - const result = insertFoldersIfNotExist(studyTree, folders); - expect(result).toEqual(expected); - }, - ); + test.each(Object.values(FIXTURES))("$name", ({ studyTree, folders, expected }) => { + const result = insertFoldersIfNotExist(studyTree, folders); + expect(result).toEqual(expected); + }); test("should handle empty study tree", () => { const emptyTree: StudyTreeNode = { @@ -114,12 +107,9 @@ describe("StudyTree Utils", () => { expect(result).toEqual(expected); }); - test.each(Object.values(FIXTURES_BUILD_STUDY_TREE))( - "$name", - ({ studies, expected }) => { - const result = buildStudyTree(studies); - expect(result).toEqual(expected); - }, - ); + test.each(Object.values(FIXTURES_BUILD_STUDY_TREE))("$name", ({ studies, expected }) => { + const result = buildStudyTree(studies); + expect(result).toEqual(expected); + }); }); }); diff --git a/webapp/src/components/App/Studies/StudyTree/index.tsx b/webapp/src/components/App/Studies/StudyTree/index.tsx index 659b05d906..fef3e10442 100644 --- a/webapp/src/components/App/Studies/StudyTree/index.tsx +++ b/webapp/src/components/App/Studies/StudyTree/index.tsx @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { StudyTreeNode } from "./types"; +import type { StudyTreeNode } from "./types"; import useAppSelector from "../../../../redux/hooks/useAppSelector"; import { getStudiesTree, getStudyFilters } from "../../../../redux/selectors"; import useAppDispatch from "../../../../redux/hooks/useAppDispatch"; @@ -60,11 +60,7 @@ function StudyTree() { * @param rootNode - The root node of the tree * @param selectedNode - The node of the item clicked */ - async function updateTree( - itemId: string, - rootNode: StudyTreeNode, - selectedNode: StudyTreeNode, - ) { + async function updateTree(itemId: string, rootNode: StudyTreeNode, selectedNode: StudyTreeNode) { if (selectedNode.path.startsWith("/default")) { // we don't update the tree if the user clicks on the default workspace // api doesn't allow to fetch the subfolders of the default workspace @@ -86,10 +82,7 @@ function StudyTree() { try { treeAfterWorkspacesUpdate = await fetchAndInsertWorkspaces(rootNode); } catch (error) { - enqueueErrorSnackbar( - t("studies.tree.error.failToFetchWorkspace"), - toError(error), - ); + enqueueErrorSnackbar(t("studies.tree.error.failToFetchWorkspace"), toError(error)); } pathsToFetch = treeAfterWorkspacesUpdate.children .filter((t) => t.name !== "default") // We don't fetch the default workspace subfolders, api don't allow it @@ -99,8 +92,10 @@ function StudyTree() { pathsToFetch = [`root${selectedNode.path}`]; } - const [treeAfterSubfoldersUpdate, failedPath] = - await fetchAndInsertSubfolders(pathsToFetch, treeAfterWorkspacesUpdate); + const [treeAfterSubfoldersUpdate, failedPath] = await fetchAndInsertSubfolders( + pathsToFetch, + treeAfterWorkspacesUpdate, + ); if (failedPath.length > 0) { enqueueErrorSnackbar( t("studies.tree.error.failToFetchFolder", { @@ -117,10 +112,7 @@ function StudyTree() { // Event Handlers //////////////////////////////////////////////////////////////// - const handleTreeItemClick = async ( - itemId: string, - studyTreeNode: StudyTreeNode, - ) => { + const handleTreeItemClick = async (itemId: string, studyTreeNode: StudyTreeNode) => { dispatch(updateStudyFilters({ folder: itemId })); updateTree(itemId, studiesTree, studyTreeNode); }; diff --git a/webapp/src/components/App/Studies/StudyTree/utils.ts b/webapp/src/components/App/Studies/StudyTree/utils.ts index 4d1132d79b..f0ddcbeea8 100644 --- a/webapp/src/components/App/Studies/StudyTree/utils.ts +++ b/webapp/src/components/App/Studies/StudyTree/utils.ts @@ -13,8 +13,8 @@ */ import * as api from "../../../../services/api/study"; -import { StudyMetadata } from "../../../../common/types"; -import { StudyTreeNode, NonStudyFolderDTO } from "./types"; +import type { StudyMetadata } from "../../../../common/types"; +import type { StudyTreeNode, NonStudyFolderDTO } from "./types"; /** * Builds a tree structure from a list of study metadata. @@ -50,9 +50,7 @@ export function buildStudyTree(studies: StudyMetadata[]) { child = { name: folderName, children: [], - path: current.path - ? `${current.path}/${folderName}` - : `/${folderName}`, + path: current.path ? `${current.path}/${folderName}` : `/${folderName}`, }; current.children.push(child); @@ -72,8 +70,8 @@ export function buildStudyTree(studies: StudyMetadata[]) { * * If the folder is already in the tree, the tree returnred will be equal to the tree given to the function. * - * @param studiesTree study tree to insert the folder into - * @param folder folder to inert into the tree + * @param studiesTree - study tree to insert the folder into + * @param folder - folder to inert into the tree * @returns study tree with the folder inserted if it wasn't already there. * New branch is created if it contain the folder otherwise the branch is left unchanged. */ @@ -89,9 +87,7 @@ function insertFolderIfNotExist( // direct child case if (folder.parentPath == currentNodePath) { - const folderExists = studiesTree.children.find( - (child) => child.name === folder.name, - ); + const folderExists = studiesTree.children.find((child) => child.name === folder.name); if (folderExists) { return { ...studiesTree, @@ -122,9 +118,7 @@ function insertFolderIfNotExist( // not a direct child, but does belong to this branch so recursively walk though the tree return { ...studiesTree, - children: studiesTree.children.map((child) => - insertFolderIfNotExist(child, folder), - ), + children: studiesTree.children.map((child) => insertFolderIfNotExist(child, folder)), }; } @@ -135,10 +129,10 @@ function insertFolderIfNotExist( * * The folders are inserted in the order they are given. * - * @param studiesTree study tree to insert the folder into - * @param folders folders to inert into the tree - * @param studiesTree study tree to insert the folder into - * @param folder folder to inert into the tree + * @param studiesTree - study tree to insert the folder into + * @param folders - folders to inert into the tree + * @param studiesTree - study tree to insert the folder into + * @param folder - folder to inert into the tree * @returns study tree with the folder inserted if it wasn't already there. * New branch is created if it contain the folder otherwise the branch is left unchanged. */ @@ -154,7 +148,7 @@ export function insertFoldersIfNotExist( /** * Call the explorer api to fetch the subfolders under the given path. * - * @param path path of the subfolder to fetch, should sart with root, e.g. root/workspace/folder1 + * @param path - path of the subfolder to fetch, should sart with root, e.g. root/workspace/folder1 * @returns list of subfolders under the given path */ async function fetchSubfolders(path: string): Promise { @@ -191,8 +185,8 @@ async function fetchSubfolders(path: string): Promise { * * This function doesn't mutate the tree, it returns a new tree with the subfolders inserted * - * @param paths list of paths to fetch the subfolders for - * @param studiesTree study tree to insert the subfolders into + * @param paths - list of paths to fetch the subfolders for + * @param studiesTree - study tree to insert the subfolders into * @returns a tuple with study tree with the subfolders inserted if they weren't already there and path for which * the fetch failed. */ @@ -200,9 +194,7 @@ export async function fetchAndInsertSubfolders( paths: string[], studiesTree: StudyTreeNode, ): Promise<[StudyTreeNode, string[]]> { - const results = await Promise.allSettled( - paths.map((path) => fetchSubfolders(path)), - ); + const results = await Promise.allSettled(paths.map((path) => fetchSubfolders(path))); return results.reduce<[StudyTreeNode, string[]]>( ([tree, failed], result, index) => { if (result.status === "fulfilled") { @@ -220,14 +212,11 @@ export async function fetchAndInsertSubfolders( * * This function doesn't mutate the tree, it returns a new tree with the workspace inserted. * - * @param workspace key of the workspace - * @param stydyTree study tree to insert the workspace into + * @param workspace - key of the workspace + * @param stydyTree - study tree to insert the workspace into * @returns study tree with the empty workspace inserted if it wasn't already there. */ -function insertWorkspaceIfNotExist( - stydyTree: StudyTreeNode, - workspace: string, -): StudyTreeNode { +function insertWorkspaceIfNotExist(stydyTree: StudyTreeNode, workspace: string): StudyTreeNode { const emptyNode = { name: workspace, path: `/${workspace}`, @@ -249,8 +238,8 @@ function insertWorkspaceIfNotExist( * * The workspaces are inserted in the order they are given. * - * @param workspaces workspaces to insert into the tree - * @param stydyTree study tree to insert the workspaces into + * @param workspaces - workspaces to insert into the tree + * @param stydyTree - study tree to insert the workspaces into * @returns study tree with the empty workspaces inserted if they weren't already there. */ export function insertWorkspacesIfNotExist( @@ -270,12 +259,10 @@ export function insertWorkspacesIfNotExist( * * This function doesn't mutate the tree, it returns a new tree with the workspaces inserted. * - * @param studyTree study tree to insert the workspaces into + * @param studyTree - study tree to insert the workspaces into * @returns study tree with the workspaces inserted if they weren't already there. */ -export async function fetchAndInsertWorkspaces( - studyTree: StudyTreeNode, -): Promise { +export async function fetchAndInsertWorkspaces(studyTree: StudyTreeNode): Promise { const workspaces = await api.getWorkspaces(); return insertWorkspacesIfNotExist(studyTree, workspaces); } diff --git a/webapp/src/components/App/Studies/index.tsx b/webapp/src/components/App/Studies/index.tsx index f422ce3249..b51b479dbd 100644 --- a/webapp/src/components/App/Studies/index.tsx +++ b/webapp/src/components/App/Studies/index.tsx @@ -23,10 +23,7 @@ import RootPage from "../../common/page/RootPage"; import HeaderTopRight from "./HeaderTopRight"; import HeaderBottom from "./HeaderBottom"; import SimpleLoader from "../../common/loaders/SimpleLoader"; -import { - getStudiesState, - getStudyIdsFilteredAndSorted, -} from "../../../redux/selectors"; +import { getStudiesState, getStudyIdsFilteredAndSorted } from "../../../redux/selectors"; import useAsyncAppSelector from "../../../redux/hooks/useAsyncAppSelector"; import FilterDrawer from "./FilterDrawer"; import UseAsyncAppSelectorCond from "../../../redux/components/UseAsyncAppSelectorCond"; @@ -50,9 +47,7 @@ function Studies() { title={t("global.studies")} titleIcon={TravelExploreOutlinedIcon} headerTopRight={} - headerBottom={ - setOpenFilter(true)} /> - } + headerBottom={ setOpenFilter(true)} />} > (); const [filterType, setFilterType] = useState(""); - const [filterRunningStatus, setFilterRunningStatus] = - useState(false); + const [filterRunningStatus, setFilterRunningStatus] = useState(false); const [currentContent, setCurrentContent] = useState(content); const launcherMetrics = usePromiseWithSnackbarError(getLauncherMetrics, { @@ -178,18 +177,11 @@ function JobTableView(props: PropType) { - } + control={} label={t("tasks.runningTasks") as string} /> - - {t("tasks.typeFilter")} - + {t("tasks.typeFilter")} ) => - handleChange(name, e.target.value as string) + ? (e: SelectChangeEvent) => handleChange(name, e.target.value as string) : basicHandleChange } > diff --git a/webapp/src/components/common/SnackErrorMessage.tsx b/webapp/src/components/common/SnackErrorMessage.tsx index ddc0fc87b7..3acb98c8f6 100644 --- a/webapp/src/components/common/SnackErrorMessage.tsx +++ b/webapp/src/components/common/SnackErrorMessage.tsx @@ -13,7 +13,6 @@ */ import { useState, forwardRef, useCallback } from "react"; -import * as React from "react"; import { useSnackbar, SnackbarContent } from "notistack"; import axios from "axios"; import { @@ -59,91 +58,83 @@ interface Props { details: string | Error; } -const SnackErrorMessage = forwardRef( - (props: Props, ref) => { - const { closeSnackbar } = useSnackbar(); - const [expanded, setExpanded] = useState(false); - const { id, message, details } = props; +const SnackErrorMessage = forwardRef((props: Props, ref) => { + const { closeSnackbar } = useSnackbar(); + const [expanded, setExpanded] = useState(false); + const { id, message, details } = props; - const handleExpandClick = useCallback(() => { - setExpanded((oldExpanded) => !oldExpanded); - }, []); + const handleExpandClick = useCallback(() => { + setExpanded((oldExpanded) => !oldExpanded); + }, []); - const handleDismiss = useCallback(() => { - closeSnackbar(id); - }, [id, closeSnackbar]); + const handleDismiss = useCallback(() => { + closeSnackbar(id); + }, [id, closeSnackbar]); - return ( - - + + - + {message} + + + + + + + + + + + - - {message} - - - - - - - - - - - - {axios.isAxiosError(details) ? ( - - - - {details.response?.status} - - - - {details.response?.data.exception} - - - - - {details.response?.data.description} - - + {axios.isAxiosError(details) ? ( + + + + {details.response?.status} - ) : ( - details.toString() - )} - - - - - ); - }, -); + + + {details.response?.data.exception} + + + + {details.response?.data.description} + + + ) : ( + details.toString() + )} + + + + + ); +}); SnackErrorMessage.displayName = "SnackErrorMessage"; diff --git a/webapp/src/components/common/SplitLayoutView.tsx b/webapp/src/components/common/SplitLayoutView.tsx index 4145a9e13d..5161111f67 100644 --- a/webapp/src/components/common/SplitLayoutView.tsx +++ b/webapp/src/components/common/SplitLayoutView.tsx @@ -12,12 +12,11 @@ * This file is part of the Antares project. */ -import { ReactNode } from "react"; -import { Divider, Box, SxProps, Theme } from "@mui/material"; +import { Divider, Box, type SxProps, type Theme } from "@mui/material"; interface Props { - left: ReactNode; - right: ReactNode; + left: React.ReactNode; + right: React.ReactNode; sx?: SxProps; } @@ -54,11 +53,7 @@ function SplitLayoutView(props: Props) { > {left} - + - + ); } diff --git a/webapp/src/components/common/TableForm/Table.tsx b/webapp/src/components/common/TableForm/Table.tsx index 70bfdd5e75..714b689d9c 100644 --- a/webapp/src/components/common/TableForm/Table.tsx +++ b/webapp/src/components/common/TableForm/Table.tsx @@ -12,15 +12,12 @@ * This file is part of the Antares project. */ -import HT from "handsontable"; +import type HT from "handsontable"; import * as RA from "ramda-adjunct"; import { useMemo } from "react"; import type { IdType } from "../../../common/types"; import { useFormContextPlus } from "../Form"; -import Handsontable, { - HandsontableProps, - HotTableClass, -} from "../Handsontable"; +import Handsontable, { type HandsontableProps, type HotTableClass } from "../Handsontable"; type Row = { id: IdType } & HT.RowObject; @@ -32,12 +29,7 @@ export interface TableProps extends Omit { } function Table(props: TableProps) { - const { - data, - rowHeaders = (row: Row) => String(row.id), - tableRef, - ...restProps - } = props; + const { data, rowHeaders = (row: Row) => String(row.id), tableRef, ...restProps } = props; const { setValues } = useFormContextPlus(); @@ -49,9 +41,7 @@ function Table(props: TableProps) { (longestHeaderLength, row) => { const headerLength = rowHeaders(row).length; - return longestHeaderLength > headerLength - ? longestHeaderLength - : headerLength; + return longestHeaderLength > headerLength ? longestHeaderLength : headerLength; }, 10, // To force minimum size ) * 8, @@ -62,22 +52,25 @@ function Table(props: TableProps) { // Event Handlers //////////////////////////////////////////////////////////////// - const handleAfterChange: HandsontableProps["afterChange"] = - function afterChange(this: unknown, changes, ...rest): void { - const newValues = changes?.reduce( - (acc, [row, column, _, nextValue]) => { - acc[`${data[row].id}.${column}`] = nextValue; - return acc; - }, - {} as Record, - ); + const handleAfterChange: HandsontableProps["afterChange"] = function afterChange( + this: unknown, + changes, + ...rest + ): void { + const newValues = changes?.reduce( + (acc, [row, column, _, nextValue]) => { + acc[`${data[row].id}.${column}`] = nextValue; + return acc; + }, + {} as Record, + ); - if (newValues) { - setValues(newValues); - } + if (newValues) { + setValues(newValues); + } - restProps.afterChange?.call(this, changes, ...rest); - }; + restProps.afterChange?.call(this, changes, ...rest); + }; //////////////////////////////////////////////////////////////// // JSX @@ -93,11 +86,7 @@ function Table(props: TableProps) { manualRowResize {...restProps} data={data} - rowHeaders={ - RA.isFunction(rowHeaders) - ? (index) => rowHeaders(data[index]) - : rowHeaders - } + rowHeaders={RA.isFunction(rowHeaders) ? (index) => rowHeaders(data[index]) : rowHeaders} afterChange={handleAfterChange} ref={tableRef} /> diff --git a/webapp/src/components/common/TableForm/index.tsx b/webapp/src/components/common/TableForm/index.tsx index 58bbf4e10f..61f60785e5 100644 --- a/webapp/src/components/common/TableForm/index.tsx +++ b/webapp/src/components/common/TableForm/index.tsx @@ -13,24 +13,20 @@ */ import * as RA from "ramda-adjunct"; -import HT from "handsontable"; -import { startCase } from "lodash"; +import type HT from "handsontable"; +import startCase from "lodash/startCase"; import * as R from "ramda"; -import { Box, type SxProps } from "@mui/material"; -import type { Theme } from "@mui/material"; +import { Box, type SxProps, type Theme } from "@mui/material"; import { useMemo } from "react"; -import { DefaultValues } from "react-hook-form"; +import type { DefaultValues } from "react-hook-form"; import type { IdType } from "../../../common/types"; -import Form, { FormProps } from "../Form"; -import Table, { TableProps } from "./Table"; +import Form, { type FormProps } from "../Form"; +import Table, { type TableProps } from "./Table"; import { getCellType } from "./utils"; import { mergeSxProp } from "../../../utils/muiUtils"; import useMemoLocked from "../../../hooks/useMemoLocked"; -type TableFieldValuesByRow = Record< - IdType, - Record ->; +type TableFieldValuesByRow = Record>; export interface TableFormProps< TFieldValues extends TableFieldValuesByRow = TableFieldValuesByRow, @@ -43,9 +39,7 @@ export interface TableFormProps< formApiRef?: FormProps["apiRef"]; sx?: SxProps; tableProps?: Omit & { - columns?: - | Array - | ((index: number) => HT.ColumnSettings); + columns?: Array | ((index: number) => HT.ColumnSettings); colHeaders?: (index: number, colName: string) => string; }; } @@ -121,11 +115,7 @@ function TableForm( overflow: "auto", }} > - +
); diff --git a/webapp/src/components/common/TableMode.tsx b/webapp/src/components/common/TableMode.tsx index 1f5bdf2d8f..0f4254bba8 100644 --- a/webapp/src/components/common/TableMode.tsx +++ b/webapp/src/components/common/TableMode.tsx @@ -13,24 +13,21 @@ */ import { useEffect, useState } from "react"; -import { StudyMetadata } from "../../common/types"; +import type { StudyMetadata } from "../../common/types"; import usePromise from "../../hooks/usePromise"; -import { - getTableMode, - setTableMode, -} from "../../services/api/studies/tableMode"; -import { +import { getTableMode, setTableMode } from "../../services/api/studies/tableMode"; +import type { TableData, TableModeColumnsForType, TableModeType, } from "../../services/api/studies/tableMode/types"; -import { SubmitHandlerPlus } from "./Form/types"; +import type { SubmitHandlerPlus } from "./Form/types"; import UsePromiseCond from "./utils/UsePromiseCond"; import GridOffIcon from "@mui/icons-material/GridOff"; import EmptyView from "./page/EmptyView"; import { useTranslation } from "react-i18next"; import DataGridForm, { type DataGridFormProps } from "./DataGridForm"; -import { startCase } from "lodash"; +import startCase from "lodash/startCase"; import type { GridColumn } from "@glideapps/glide-data-grid"; export interface TableModeProps { @@ -47,9 +44,7 @@ function TableMode({ extraActions, }: TableModeProps) { const { t } = useTranslation(); - const [gridColumns, setGridColumns] = useState< - DataGridFormProps["columns"] - >([]); + const [gridColumns, setGridColumns] = useState["columns"]>([]); const columnsDep = columns.join(","); const res = usePromise( diff --git a/webapp/src/components/common/TabsView.tsx b/webapp/src/components/common/TabsView.tsx index cfee995bbf..f525bbf848 100644 --- a/webapp/src/components/common/TabsView.tsx +++ b/webapp/src/components/common/TabsView.tsx @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { TabContext, TabList, TabListProps, TabPanel } from "@mui/lab"; +import { TabContext, TabList, TabPanel, type TabListProps } from "@mui/lab"; import { Box, Tab } from "@mui/material"; import { useState } from "react"; @@ -60,11 +60,7 @@ function TabsView({ items, onChange, divider }: TabsViewProps) { {items.map(({ content }, index) => ( - + {content} ))} diff --git a/webapp/src/components/common/TextSeparator.tsx b/webapp/src/components/common/TextSeparator.tsx index 1348627465..043d10d4a5 100644 --- a/webapp/src/components/common/TextSeparator.tsx +++ b/webapp/src/components/common/TextSeparator.tsx @@ -12,7 +12,7 @@ * This file is part of the Antares project. */ -import { SxProps, Theme, Divider, Typography, Box } from "@mui/material"; +import { Divider, Typography, Box, type SxProps, type Theme } from "@mui/material"; interface Props { text: string; diff --git a/webapp/src/components/common/TreeItemEnhanced.tsx b/webapp/src/components/common/TreeItemEnhanced.tsx index 6b488de6e7..6b525df658 100644 --- a/webapp/src/components/common/TreeItemEnhanced.tsx +++ b/webapp/src/components/common/TreeItemEnhanced.tsx @@ -29,11 +29,7 @@ function TreeItemEnhanced({ onClick, sx, ...rest }: TreeItemEnhancedProps) { const { target } = event; // The item is not selected if the click is on the expand/collapse icon - if ( - canExpand && - target instanceof Element && - target.closest(".MuiTreeItem-iconContainer") - ) { + if (canExpand && target instanceof Element && target.closest(".MuiTreeItem-iconContainer")) { return; } diff --git a/webapp/src/components/common/buttons/DownloadButton.tsx b/webapp/src/components/common/buttons/DownloadButton.tsx index a67cd914e5..de267cb322 100644 --- a/webapp/src/components/common/buttons/DownloadButton.tsx +++ b/webapp/src/components/common/buttons/DownloadButton.tsx @@ -13,7 +13,7 @@ */ import FileUploadIcon from "@mui/icons-material/FileUpload"; -import SplitButton, { SplitButtonProps } from "./SplitButton"; +import SplitButton, { type SplitButtonProps } from "./SplitButton"; import { useState } from "react"; import useEnqueueErrorSnackbar from "../../../hooks/useEnqueueErrorSnackbar"; import { useTranslation } from "react-i18next"; @@ -35,16 +35,9 @@ export type DownloadButtonProps = { } ); -function DownloadButton( - props: DownloadButtonProps, -) { +function DownloadButton(props: DownloadButtonProps) { const { t } = useTranslation(); - const { - disabled, - formatOptions, - onClick, - children: label = t("global.export"), - } = props; + const { disabled, formatOptions, onClick, children: label = t("global.export") } = props; const [isDownloading, setIsDownloading] = useState(false); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); @@ -94,11 +87,7 @@ function DownloadButton( {label} ) : ( - handleDownload()} - > + handleDownload()}> {label} ); diff --git a/webapp/src/components/common/buttons/DownloadMatrixButton.tsx b/webapp/src/components/common/buttons/DownloadMatrixButton.tsx index b50e3e81da..6ce12f944c 100644 --- a/webapp/src/components/common/buttons/DownloadMatrixButton.tsx +++ b/webapp/src/components/common/buttons/DownloadMatrixButton.tsx @@ -14,7 +14,7 @@ import { getMatrixFile, getRawFile } from "../../../services/api/studies/raw"; import { downloadFile } from "../../../utils/fileUtils"; -import { StudyMetadata } from "../../../common/types"; +import type { StudyMetadata } from "../../../common/types"; import { useTranslation } from "react-i18next"; import DownloadButton from "./DownloadButton"; import type { TTableExportFormat } from "@/services/api/studies/raw/types"; @@ -69,10 +69,7 @@ function DownloadMatrixButton(props: DownloadMatrixButtonProps) { const extension = format === "csv (semicolon)" ? "csv" : format; - return downloadFile( - matrixFile, - `matrix_${studyId}_${path.replace("/", "_")}.${extension}`, - ); + return downloadFile(matrixFile, `matrix_${studyId}_${path.replace("/", "_")}.${extension}`); }; //////////////////////////////////////////////////////////////// @@ -80,11 +77,7 @@ function DownloadMatrixButton(props: DownloadMatrixButtonProps) { //////////////////////////////////////////////////////////////// return ( - + {label} ); diff --git a/webapp/src/components/common/buttons/SplitButton.tsx b/webapp/src/components/common/buttons/SplitButton.tsx index 52bca20142..faa216d3aa 100644 --- a/webapp/src/components/common/buttons/SplitButton.tsx +++ b/webapp/src/components/common/buttons/SplitButton.tsx @@ -13,7 +13,7 @@ */ import Button from "@mui/material/Button"; -import ButtonGroup, { ButtonGroupProps } from "@mui/material/ButtonGroup"; +import ButtonGroup, { type ButtonGroupProps } from "@mui/material/ButtonGroup"; import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown"; import ClickAwayListener from "@mui/material/ClickAwayListener"; import Grow from "@mui/material/Grow"; diff --git a/webapp/src/components/common/buttons/UploadFileButton.tsx b/webapp/src/components/common/buttons/UploadFileButton.tsx index 872b05b01a..bd457a2cea 100644 --- a/webapp/src/components/common/buttons/UploadFileButton.tsx +++ b/webapp/src/components/common/buttons/UploadFileButton.tsx @@ -18,8 +18,8 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import useEnqueueErrorSnackbar from "../../../hooks/useEnqueueErrorSnackbar"; import { toError } from "../../../utils/fnUtils"; -import { Accept, useDropzone } from "react-dropzone"; -import { StudyMetadata } from "../../../common/types"; +import { useDropzone, type Accept } from "react-dropzone"; +import type { StudyMetadata } from "../../../common/types"; import { useSnackbar } from "notistack"; import { uploadFile } from "../../../services/api/studies/raw"; diff --git a/webapp/src/components/common/dialogs/BasicDialog.tsx b/webapp/src/components/common/dialogs/BasicDialog.tsx index 467d970b06..be78561427 100644 --- a/webapp/src/components/common/dialogs/BasicDialog.tsx +++ b/webapp/src/components/common/dialogs/BasicDialog.tsx @@ -17,13 +17,13 @@ import { DialogActions, DialogContent, DialogContentText, - DialogProps, + type DialogProps, DialogTitle, styled, - DialogContentProps, + type DialogContentProps, } from "@mui/material"; import * as RA from "ramda-adjunct"; -import { SvgIconComponent } from "@mui/icons-material"; +import type { SvgIconComponent } from "@mui/icons-material"; import * as R from "ramda"; import { mergeSxProp } from "../../../utils/muiUtils"; @@ -60,15 +60,7 @@ const AlertBorder = styled("span", { })); function BasicDialog(props: BasicDialogProps) { - const { - title, - titleIcon, - children, - actions, - alert, - contentProps, - ...dialogProps - } = props; + const { title, titleIcon, children, actions, alert, contentProps, ...dialogProps } = props; const TitleIcon = titleIcon; return ( @@ -90,16 +82,9 @@ function BasicDialog(props: BasicDialogProps) { )} - {RA.isString(children) ? ( - {children} - ) : ( - children - )} + {RA.isString(children) ? {children} : children} {actions && {actions}} diff --git a/webapp/src/components/common/dialogs/ConfirmationDialog.tsx b/webapp/src/components/common/dialogs/ConfirmationDialog.tsx index df8141906f..57180974ee 100644 --- a/webapp/src/components/common/dialogs/ConfirmationDialog.tsx +++ b/webapp/src/components/common/dialogs/ConfirmationDialog.tsx @@ -14,10 +14,9 @@ import { Button } from "@mui/material"; import { useTranslation } from "react-i18next"; -import BasicDialog, { BasicDialogProps } from "./BasicDialog"; +import BasicDialog, { type BasicDialogProps } from "./BasicDialog"; -export interface ConfirmationDialogProps - extends Omit { +export interface ConfirmationDialogProps extends Omit { cancelButtonText?: string; confirmButtonText?: string; onConfirm: VoidFunction; @@ -25,14 +24,8 @@ export interface ConfirmationDialogProps } function ConfirmationDialog(props: ConfirmationDialogProps) { - const { - cancelButtonText, - confirmButtonText, - onConfirm, - onCancel, - onClose, - ...basicDialogProps - } = props; + const { cancelButtonText, confirmButtonText, onConfirm, onCancel, onClose, ...basicDialogProps } = + props; const { t } = useTranslation(); @@ -40,9 +33,7 @@ function ConfirmationDialog(props: ConfirmationDialogProps) { // Event Handlers //////////////////////////////////////////////////////////////// - const handleClose = ( - ...args: Parameters> - ) => { + const handleClose = (...args: Parameters>) => { onCancel(); onClose?.(...args); }; @@ -58,9 +49,7 @@ function ConfirmationDialog(props: ConfirmationDialogProps) { {...basicDialogProps} actions={ <> - + diff --git a/webapp/src/components/common/dialogs/DataViewerDialog/index.tsx b/webapp/src/components/common/dialogs/DataViewerDialog/index.tsx index 5999492f43..cd4b5948a6 100644 --- a/webapp/src/components/common/dialogs/DataViewerDialog/index.tsx +++ b/webapp/src/components/common/dialogs/DataViewerDialog/index.tsx @@ -19,7 +19,7 @@ import OkDialog from "../OkDialog"; import SimpleLoader from "../../loaders/SimpleLoader"; import MatrixGrid from "@/components/common/Matrix/components/MatrixGrid"; import { generateDataColumns } from "@/components/common/Matrix/shared/utils"; -import { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; +import type { MatrixDataDTO } from "@/components/common/Matrix/shared/types"; interface Props { filename: string; @@ -29,12 +29,8 @@ interface Props { isMatrix?: boolean; } -function isMatrixData( - content: string | MatrixDataDTO, -): content is MatrixDataDTO { - return ( - typeof content === "object" && "data" in content && "columns" in content - ); +function isMatrixData(content: string | MatrixDataDTO): content is MatrixDataDTO { + return typeof content === "object" && "data" in content && "columns" in content; } /** @@ -52,13 +48,7 @@ function isMatrixData( * @param [props.loading] - Flag indicating if the content is being loaded * @returns The rendered DataViewerDialog component */ -function DataViewerDialog({ - filename, - content, - onClose, - isMatrix, - loading, -}: Props) { +function DataViewerDialog({ filename, content, onClose, isMatrix, loading }: Props) { const [t] = useTranslation(); //////////////////////////////////////////////////////////////// diff --git a/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx b/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx index c1c17c27b0..e5fb295ba9 100644 --- a/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx +++ b/webapp/src/components/common/dialogs/DatabaseUploadDialog/components/MatrixContent.tsx @@ -15,14 +15,14 @@ import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { Box, Divider, Typography } from "@mui/material"; -import { MatrixInfoDTO, MatrixDTO } from "@/common/types"; +import type { MatrixInfoDTO, MatrixDTO } from "@/common/types"; import MatrixGrid from "@/components/common/Matrix/components/MatrixGrid"; import ButtonBack from "@/components/common/ButtonBack"; import { getMatrix } from "@/services/api/matrix"; import usePromiseWithSnackbarError from "@/hooks/usePromiseWithSnackbarError"; import { generateDataColumns } from "@/components/common/Matrix/shared/utils"; import EmptyView from "@/components/common/page/EmptyView"; -import { GridOff } from "@mui/icons-material"; +import GridOffIcon from "@mui/icons-material/GridOff"; interface MatrixContentProps { matrix: MatrixInfoDTO; @@ -32,12 +32,9 @@ interface MatrixContentProps { function MatrixContent({ matrix, onBack }: MatrixContentProps) { const { t } = useTranslation(); - const { data: matrixData } = usePromiseWithSnackbarError( - () => getMatrix(matrix.id), - { - errorMessage: t("data.error.matrix"), - }, - ); + const { data: matrixData } = usePromiseWithSnackbarError(() => getMatrix(matrix.id), { + errorMessage: t("data.error.matrix"), + }); const matrixColumns = useMemo( () => @@ -66,7 +63,7 @@ function MatrixContent({ matrix, onBack }: MatrixContentProps) { {!matrixData.data[0]?.length ? ( - + ) : ( void; } -function DatabaseUploadDialog({ - studyId, - path, - open, - onClose, -}: DatabaseUploadDialogProps) { +function DatabaseUploadDialog({ studyId, path, open, onClose }: DatabaseUploadDialogProps) { const { t } = useTranslation(); const { enqueueSnackbar } = useSnackbar(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); @@ -141,10 +136,7 @@ function DatabaseUploadDialog({ {selectedItem && (matrix ? ( - setMatrixId(undefined)} - /> + setMatrixId(undefined)} /> ) : ( { +export interface DigestDialogProps extends Pick { studyId: LaunchJob["studyId"]; outputId: LaunchJob["outputId"]; } -function DigestDialog({ - studyId, - outputId, - ...dialogProps -}: DigestDialogProps) { +function DigestDialog({ studyId, outputId, ...dialogProps }: DigestDialogProps) { const { t } = useTranslation(); const synthesisRes = usePromise( - () => - getStudyData(studyId, `output/${outputId}/economy/mc-all/grid/digest`), + () => getStudyData(studyId, `output/${outputId}/economy/mc-all/grid/digest`), { deps: [studyId, outputId], }, @@ -59,12 +53,7 @@ function DigestDialog({ ifPending={() => } ifRejected={(error) => { if (error instanceof AxiosError && error.response?.status === 404) { - return ( - - ); + return ; } return ; }} diff --git a/webapp/src/components/common/dialogs/FormDialog.tsx b/webapp/src/components/common/dialogs/FormDialog.tsx index 4980244f5d..227b29f823 100644 --- a/webapp/src/components/common/dialogs/FormDialog.tsx +++ b/webapp/src/components/common/dialogs/FormDialog.tsx @@ -15,23 +15,19 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Button } from "@mui/material"; import { useId, useState } from "react"; -import { FieldValues, FormState } from "react-hook-form"; +import type { FieldValues, FormState } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { LoadingButton } from "@mui/lab"; import * as RA from "ramda-adjunct"; import SaveIcon from "@mui/icons-material/Save"; -import BasicDialog, { BasicDialogProps } from "./BasicDialog"; -import Form, { FormProps } from "../Form"; +import BasicDialog, { type BasicDialogProps } from "./BasicDialog"; +import Form, { type FormProps } from "../Form"; -type SuperType< - TFieldValues extends FieldValues, - TContext, - SubmitReturnValue, -> = Omit & - Omit< - FormProps, - "hideSubmitButton" - >; +type SuperType = Omit< + BasicDialogProps, + "onSubmit" | "onInvalid" | "children" +> & + Omit, "hideSubmitButton">; export interface FormDialogProps< TFieldValues extends FieldValues = FieldValues, @@ -45,11 +41,9 @@ export interface FormDialogProps< // TODO: `formState.isSubmitting` doesn't update when auto submit enabled -function FormDialog< - TFieldValues extends FieldValues, - TContext, - SubmitReturnValue, ->(props: FormDialogProps) { +function FormDialog( + props: FormDialogProps, +) { const { config, onSubmit, @@ -126,13 +120,7 @@ function FormDialog< disabled={!isSubmitAllowed} loading={isSubmitting} loadingPosition="start" - startIcon={ - RA.isNotUndefined(submitButtonIcon) ? ( - submitButtonIcon - ) : ( - - ) - } + startIcon={RA.isNotUndefined(submitButtonIcon) ? submitButtonIcon : } > {submitButtonText || t("global.save")} diff --git a/webapp/src/components/common/dialogs/OkDialog.tsx b/webapp/src/components/common/dialogs/OkDialog.tsx index c8245eb533..5285232223 100644 --- a/webapp/src/components/common/dialogs/OkDialog.tsx +++ b/webapp/src/components/common/dialogs/OkDialog.tsx @@ -12,9 +12,9 @@ * This file is part of the Antares project. */ -import { Button, ButtonProps } from "@mui/material"; +import { Button, type ButtonProps } from "@mui/material"; import { useTranslation } from "react-i18next"; -import BasicDialog, { BasicDialogProps } from "./BasicDialog"; +import BasicDialog, { type BasicDialogProps } from "./BasicDialog"; export interface OkDialogProps extends Omit { okButtonText?: string; @@ -23,17 +23,14 @@ export interface OkDialogProps extends Omit { } function OkDialog(props: OkDialogProps) { - const { okButtonText, okButtonProps, onOk, onClose, ...basicDialogProps } = - props; + const { okButtonText, okButtonProps, onOk, onClose, ...basicDialogProps } = props; const { t } = useTranslation(); //////////////////////////////////////////////////////////////// // Event Handlers //////////////////////////////////////////////////////////////// - const handleClose = ( - ...args: Parameters> - ) => { + const handleClose = (...args: Parameters>) => { onOk(); onClose?.(...args); }; diff --git a/webapp/src/components/common/dialogs/UploadDialog.tsx b/webapp/src/components/common/dialogs/UploadDialog.tsx index c0dbf3d59c..5f198918ff 100644 --- a/webapp/src/components/common/dialogs/UploadDialog.tsx +++ b/webapp/src/components/common/dialogs/UploadDialog.tsx @@ -14,36 +14,25 @@ import { useEffect, useState } from "react"; import { Box, Button, LinearProgress, Paper, Typography } from "@mui/material"; -import { FileRejection, useDropzone, type Accept } from "react-dropzone"; +import { useDropzone, type Accept, type FileRejection } from "react-dropzone"; import { useTranslation } from "react-i18next"; -import BasicDialog, { BasicDialogProps } from "./BasicDialog"; +import BasicDialog, { type BasicDialogProps } from "./BasicDialog"; import { blue, grey } from "@mui/material/colors"; import useEnqueueErrorSnackbar from "../../../hooks/useEnqueueErrorSnackbar"; import { toError } from "../../../utils/fnUtils"; import { enqueueSnackbar } from "notistack"; -import { PromiseAny } from "../../../utils/tsUtils"; +import type { PromiseAny } from "../../../utils/tsUtils"; import FileDownloadIcon from "@mui/icons-material/FileDownload"; interface UploadDialogProps extends Omit { dropzoneText?: string; accept?: Accept; onCancel: VoidFunction; - onImport: ( - file: File, - setUploadProgress: (progress: number) => void, - ) => PromiseAny; + onImport: (file: File, setUploadProgress: (progress: number) => void) => PromiseAny; } function UploadDialog(props: UploadDialogProps) { - const { - dropzoneText, - accept, - onImport, - onCancel, - onClose, - title, - ...dialogProps - } = props; + const { dropzoneText, accept, onImport, onCancel, onClose, title, ...dialogProps } = props; const [t] = useTranslation(); const enqueueErrorSnackbar = useEnqueueErrorSnackbar(); const [isUploading, setIsUploading] = useState(false); @@ -129,11 +118,7 @@ function UploadDialog(props: UploadDialogProps) { {isUploading ? ( 2 && uploadProgress < 98 - ? "determinate" - : "indeterminate" - } + variant={uploadProgress > 2 && uploadProgress < 98 ? "determinate" : "indeterminate"} value={Math.max(0, Math.min(100, uploadProgress))} /> ) : ( diff --git a/webapp/src/components/common/fieldEditors/BooleanFE.tsx b/webapp/src/components/common/fieldEditors/BooleanFE.tsx index 56846ead2a..184a27bf65 100644 --- a/webapp/src/components/common/fieldEditors/BooleanFE.tsx +++ b/webapp/src/components/common/fieldEditors/BooleanFE.tsx @@ -12,13 +12,12 @@ * This file is part of the Antares project. */ -import { SelectProps } from "@mui/material"; +import type { SelectProps } from "@mui/material"; import * as RA from "ramda-adjunct"; import reactHookFormSupport from "../../../hoc/reactHookFormSupport"; -import SelectFE, { SelectFEProps } from "./SelectFE"; +import SelectFE, { type SelectFEProps } from "./SelectFE"; -export interface BooleanFEProps - extends Omit { +export interface BooleanFEProps extends Omit { defaultValue?: boolean; value?: boolean; trueText?: string; @@ -44,16 +43,7 @@ function toValidEvent(event: T) { } function BooleanFE(props: BooleanFEProps) { - const { - defaultValue, - value, - trueText, - falseText, - onChange, - onBlur, - inputRef, - ...rest - } = props; + const { defaultValue, value, trueText, falseText, onChange, onBlur, inputRef, ...rest } = props; return ( - ); + const fieldEditor = ; return ( {label ? ( - + ) : ( fieldEditor )} diff --git a/webapp/src/components/common/fieldEditors/CheckboxesTagsFE.tsx b/webapp/src/components/common/fieldEditors/CheckboxesTagsFE.tsx index 1b2b8f9326..bc19460b0b 100644 --- a/webapp/src/components/common/fieldEditors/CheckboxesTagsFE.tsx +++ b/webapp/src/components/common/fieldEditors/CheckboxesTagsFE.tsx @@ -14,16 +14,16 @@ import { Autocomplete, - AutocompleteProps, - AutocompleteValue, Checkbox, TextField, + type AutocompleteProps, + type AutocompleteValue, } from "@mui/material"; import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank"; import CheckBoxIcon from "@mui/icons-material/CheckBox"; -import { FieldPath, FieldValues } from "react-hook-form"; +import type { FieldPath, FieldValues } from "react-hook-form"; import reactHookFormSupport, { - ReactHookFormSupportProps, + type ReactHookFormSupportProps, } from "../../../hoc/reactHookFormSupport"; interface CheckboxesTagsFEProps< @@ -32,12 +32,7 @@ interface CheckboxesTagsFEProps< FreeSolo extends boolean | undefined = undefined, > extends Omit< AutocompleteProps, - | "multiple" - | "disableCloseOnSelect" - | "renderOption" - | "renderInput" - | "renderTags" - | "onChange" + "multiple" | "disableCloseOnSelect" | "renderOption" | "renderInput" | "renderTags" | "onChange" > { label?: string; error?: boolean; diff --git a/webapp/src/components/common/fieldEditors/ColorPickerFE/index.tsx b/webapp/src/components/common/fieldEditors/ColorPickerFE/index.tsx index 54bc1bc754..f0c1aad129 100644 --- a/webapp/src/components/common/fieldEditors/ColorPickerFE/index.tsx +++ b/webapp/src/components/common/fieldEditors/ColorPickerFE/index.tsx @@ -12,9 +12,9 @@ * This file is part of the Antares project. */ -import { Box, TextField, TextFieldProps, InputAdornment } from "@mui/material"; -import { ChangeEvent, useRef, useState } from "react"; -import { ColorResult, SketchPicker } from "react-color"; +import { Box, TextField, InputAdornment, type TextFieldProps } from "@mui/material"; +import { useRef, useState } from "react"; +import { SketchPicker, type ColorResult } from "react-color"; import SquareRoundedIcon from "@mui/icons-material/SquareRounded"; import { useClickAway, useKey, useUpdateEffect } from "react-use"; import { rgbToString, stringToRGB } from "./utils"; @@ -22,17 +22,13 @@ import { mergeSxProp } from "../../../../utils/muiUtils"; import { composeRefs } from "../../../../utils/reactUtils"; import reactHookFormSupport from "../../../../hoc/reactHookFormSupport"; -export type ColorPickerFEProps = Omit< - TextFieldProps, - "type" | "defaultChecked" -> & { +export type ColorPickerFEProps = Omit & { value?: string; // Format: R,G,B - ex: "255,255,255" defaultValue?: string; }; function ColorPickerFE(props: ColorPickerFEProps) { - const { value, defaultValue, onChange, sx, inputRef, ...textFieldProps } = - props; + const { value, defaultValue, onChange, sx, inputRef, ...textFieldProps } = props; const [currentColor, setCurrentColor] = useState(defaultValue || value || ""); const [isPickerOpen, setIsPickerOpen] = useState(false); const internalRef = useRef(); @@ -53,16 +49,14 @@ function ColorPickerFE(props: ColorPickerFEProps) { //////////////////////////////////////////////////////////////// const handleChange = ({ hex, rgb }: ColorResult) => { - setCurrentColor( - ["transparent", "#0000"].includes(hex) ? "" : rgbToString(rgb), - ); + setCurrentColor(["transparent", "#0000"].includes(hex) ? "" : rgbToString(rgb)); }; const handleChangeComplete = () => { onChange?.({ target: internalRef.current, type: "change", - } as ChangeEvent); + } as React.ChangeEvent); }; //////////////////////////////////////////////////////////////// diff --git a/webapp/src/components/common/fieldEditors/ColorPickerFE/utils.ts b/webapp/src/components/common/fieldEditors/ColorPickerFE/utils.ts index 8508a629cd..e9da3aa8be 100644 --- a/webapp/src/components/common/fieldEditors/ColorPickerFE/utils.ts +++ b/webapp/src/components/common/fieldEditors/ColorPickerFE/utils.ts @@ -12,15 +12,13 @@ * This file is part of the Antares project. */ -import { ColorResult } from "react-color"; +import type { ColorResult } from "react-color"; export function stringToRGB(color: string): ColorResult["rgb"] | undefined { let sColor; try { - sColor = color - .split(",") - .map((elm) => parseInt(elm.replace(/\s+/g, ""), 10)); - } catch (e) { + sColor = color.split(",").map((elm) => parseInt(elm.replace(/\s+/g, ""), 10)); + } catch { sColor = undefined; } diff --git a/webapp/src/components/common/fieldEditors/ListFE/index.tsx b/webapp/src/components/common/fieldEditors/ListFE/index.tsx index 94082376a5..023c58a283 100644 --- a/webapp/src/components/common/fieldEditors/ListFE/index.tsx +++ b/webapp/src/components/common/fieldEditors/ListFE/index.tsx @@ -31,27 +31,22 @@ import { import { useTranslation } from "react-i18next"; import RemoveCircleIcon from "@mui/icons-material/RemoveCircle"; import { useEffect, useId, useState } from "react"; -import { - DragDropContext, - Droppable, - Draggable, - DropResult, -} from "react-beautiful-dnd"; +import { DragDropContext, Droppable, Draggable, type DropResult } from "react-beautiful-dnd"; import DragHandleIcon from "@mui/icons-material/DragHandle"; import * as RA from "ramda-adjunct"; import { useUpdateEffect } from "react-use"; -import { FieldPath, FieldValues } from "react-hook-form"; +import type { FieldPath, FieldValues } from "react-hook-form"; import StringFE from "../StringFE"; import reactHookFormSupport, { - ReactHookFormSupportProps, + type ReactHookFormSupportProps, } from "../../../../hoc/reactHookFormSupport"; import { createFakeBlurEventHandler, createFakeChangeEventHandler, createFakeInputElement, - FakeBlurEventHandler, - FakeChangeEventHandler, - InputObject, + type FakeBlurEventHandler, + type FakeChangeEventHandler, + type InputObject, } from "../../../../utils/feUtils"; import { makeLabel, makeListItems } from "./utils"; @@ -91,9 +86,7 @@ function ListFE(props: ListFEProps) { } = props; const { t } = useTranslation(); - const [listItems, setListItems] = useState(() => - makeListItems(value || defaultValue || []), - ); + const [listItems, setListItems] = useState(() => makeListItems(value || defaultValue || [])); const [selectedOption, setSelectedOption] = useState(null); const droppableId = useId(); @@ -152,8 +145,7 @@ function ListFE(props: ListFEProps) { sx={[ { p: 2, - backgroundImage: - "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", + backgroundImage: "linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))", }, !!error && { border: "1px solid", @@ -175,12 +167,7 @@ function ListFE(props: ListFEProps) { }} autoHighlight renderInput={(params) => ( - + )} />
diff --git a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx index 778a3d0a44..3d0c0bf299 100644 --- a/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx +++ b/webapp/src/components/App/Singlestudy/explore/Configuration/TimeSeriesManagement/index.tsx @@ -17,18 +17,18 @@ import type { StudyMetadata } from "../../../../../../common/types"; import Form from "../../../../../common/Form"; import type { SubmitHandlerPlus, UseFormReturnPlus } from "../../../../../common/Form/types"; import Fields from "./Fields"; -import { DEFAULT_VALUES, setTimeSeriesFormFields, type TSFormFields } from "./utils"; import { useTranslation } from "react-i18next"; import usePromiseHandler from "../../../../../../hooks/usePromiseHandler"; -import { generateTimeSeries } from "../../../../../../services/api/studies/timeseries"; import BuildIcon from "@mui/icons-material/Build"; import { useRef, useState } from "react"; +import { setTimeSeriesConfig, generateTimeSeries } from "@/services/api/studies/timeseries"; +import { defaultValues, type TimeSeriesConfigValues } from "./utils"; function TimeSeriesManagement() { const { study } = useOutletContext<{ study: StudyMetadata }>(); const { t } = useTranslation(); - const [launchTaskInProgress, setLaunchTaskInProgress] = useState(false); - const apiRef = useRef>(null); + const [isLaunchTaskInProgress, setIsLaunchTaskInProgress] = useState(false); + const apiRef = useRef>(null); const handleGenerateTs = usePromiseHandler({ fn: generateTimeSeries, @@ -40,19 +40,19 @@ function TimeSeriesManagement() { // Event Handlers //////////////////////////////////////////////////////////////// - const handleSubmit = (data: SubmitHandlerPlus) => { - return setTimeSeriesFormFields(study.id, data.values); + const handleSubmit = ({ values }: SubmitHandlerPlus) => { + return setTimeSeriesConfig({ studyId: study.id, values }); }; const handleSubmitSuccessful = async () => { - setLaunchTaskInProgress(true); + setIsLaunchTaskInProgress(true); // The WebSocket will trigger an event after the fulfillment of the promise (see `FreezeStudy`) await handleGenerateTs({ studyId: study.id }); - setLaunchTaskInProgress(false); + setIsLaunchTaskInProgress(false); - apiRef.current?.reset(DEFAULT_VALUES); + apiRef.current?.reset(defaultValues); }; //////////////////////////////////////////////////////////////// @@ -63,8 +63,8 @@ function TimeSeriesManagement() {
, - TSFormFieldsForType - > { - [TSType.Thermal]: Omit; - [TSType.Renewables]: Pick< - TSFormFieldsForType, - "stochasticTsStatus" | "intraModal" | "interModal" - >; - [TSType.NTC]: Pick; -} - -//////////////////////////////////////////////////////////////// -// Constants -//////////////////////////////////////////////////////////////// - -export const DEFAULT_VALUES: DeepPartial = { - thermal: { - stochasticTsStatus: false, - number: 1, - }, -}; - -//////////////////////////////////////////////////////////////// -// Functions -//////////////////////////////////////////////////////////////// - -export function setTimeSeriesFormFields( - studyId: StudyMetadata["id"], - values: DeepPartial, -): Promise { - return client.put(`v1/studies/${studyId}/config/timeseries/form`, values); -} +import { TimeSeriesType } from "@/services/api/studies/timeseries/constants"; +import type { + TimeSeriesTypeConfig, + TimeSeriesTypeValue, +} from "@/services/api/studies/timeseries/types"; + +export type TimeSeriesConfigValues = Record< + TimeSeriesTypeValue, + TimeSeriesTypeConfig & { enabled: boolean } +>; + +export const defaultValues = Object.values(TimeSeriesType).reduce((acc, type) => { + acc[type] = { number: 1, enabled: false }; + return acc; +}, {} as TimeSeriesConfigValues); diff --git a/webapp/src/components/common/buttons/DownloadMatrixButton.tsx b/webapp/src/components/common/buttons/DownloadMatrixButton.tsx index 8022ae0b23..944c0fb14a 100644 --- a/webapp/src/components/common/buttons/DownloadMatrixButton.tsx +++ b/webapp/src/components/common/buttons/DownloadMatrixButton.tsx @@ -12,14 +12,14 @@ * This file is part of the Antares project. */ -import { getMatrixFile, getRawFile } from "../../../services/api/studies/raw"; -import { downloadFile } from "../../../utils/fileUtils"; -import type { StudyMetadata } from "../../../common/types"; +import { getMatrixFile, getRawFile } from "@/services/api/studies/raw"; +import { downloadFile } from "@/utils/fileUtils.ts"; +import type { StudyMetadata } from "@/common/types.ts"; import { useTranslation } from "react-i18next"; import DownloadButton from "./DownloadButton"; -import type { TTableExportFormat } from "@/services/api/studies/raw/types"; +import type { TableExportFormatValue } from "@/services/api/studies/raw/types"; -type ExportFormat = TTableExportFormat | "raw"; +type ExportFormat = TableExportFormatValue | "raw"; export interface DownloadMatrixButtonProps { studyId: StudyMetadata["id"]; diff --git a/webapp/src/redux/ducks/studyMaps.ts b/webapp/src/redux/ducks/studyMaps.ts index d50f814142..827ba18d9e 100644 --- a/webapp/src/redux/ducks/studyMaps.ts +++ b/webapp/src/redux/ducks/studyMaps.ts @@ -49,7 +49,7 @@ import { import * as studyDataApi from "../../services/api/studydata"; import * as linksApi from "../../services/api/studies/links"; import { createStudyLink, deleteStudyLink, setCurrentArea } from "./studySyntheses"; -import type { TLinkStyle } from "@/services/api/studies/links/types"; +import type { LinkStyleValue } from "@/services/api/studies/links/types"; import tinycolor from "tinycolor2"; export interface StudyMapNode { @@ -164,9 +164,7 @@ export const setLayers = createAction([ +const makeLinkStyle = R.cond<[LinkStyleValue], [number[], string]>([ [(v) => v === "dot", () => [[1, 5], "round"]], [(v) => v === "dash", () => [[16, 8], "square"]], [(v) => v === "dotdash", () => [[10, 6, 1, 6], "square"]], diff --git a/webapp/src/services/api/studies/links/types.ts b/webapp/src/services/api/studies/links/types.ts index d3d78f8121..5e2610c370 100644 --- a/webapp/src/services/api/studies/links/types.ts +++ b/webapp/src/services/api/studies/links/types.ts @@ -17,24 +17,24 @@ import type { AssetType, LinkStyle, TransmissionCapacity } from "./constants"; import type { StudyMetadata } from "@/common/types"; import type { PartialExceptFor } from "@/utils/tsUtils"; -export type TTransmissionCapacity = O.UnionOf; +export type TransmissionCapacityValue = O.UnionOf; -export type TAssetType = O.UnionOf; +export type AssetTypeValue = O.UnionOf; -export type TLinkStyle = O.UnionOf; +export type LinkStyleValue = O.UnionOf; export interface LinkDTO { hurdlesCost: boolean; loopFlow: boolean; usePhaseShifter: boolean; - transmissionCapacities: TTransmissionCapacity; - assetType: TAssetType; + transmissionCapacities: TransmissionCapacityValue; + assetType: AssetTypeValue; displayComments: boolean; colorr: number; colorb: number; colorg: number; linkWidth: number; - linkStyle: TLinkStyle; + linkStyle: LinkStyleValue; area1: string; area2: string; // Since v8.2 diff --git a/webapp/src/services/api/studies/raw/types.ts b/webapp/src/services/api/studies/raw/types.ts index b9a4afb1b7..a66775e25c 100644 --- a/webapp/src/services/api/studies/raw/types.ts +++ b/webapp/src/services/api/studies/raw/types.ts @@ -13,17 +13,17 @@ */ import type { AxiosRequestConfig } from "axios"; -import type { StudyMetadata } from "../../../../common/types"; +import type { StudyMetadata } from "@/common/types.ts"; import type { O } from "ts-toolbelt"; import type { TableExportFormat } from "./constants"; // Available export formats for matrix tables -export type TTableExportFormat = O.UnionOf; +export type TableExportFormatValue = O.UnionOf; export interface GetMatrixFileParams { studyId: StudyMetadata["id"]; path: string; - format?: TTableExportFormat; + format?: TableExportFormatValue; header?: boolean; index?: boolean; } diff --git a/webapp/src/services/api/studies/timeseries/constants.ts b/webapp/src/services/api/studies/timeseries/constants.ts new file mode 100644 index 0000000000..273c5ab3af --- /dev/null +++ b/webapp/src/services/api/studies/timeseries/constants.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2025, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +export const TimeSeriesType = { + Thermal: "thermal", +} as const; diff --git a/webapp/src/services/api/studies/timeseries.ts b/webapp/src/services/api/studies/timeseries/index.ts similarity index 57% rename from webapp/src/services/api/studies/timeseries.ts rename to webapp/src/services/api/studies/timeseries/index.ts index 9b9b106353..245931b30a 100644 --- a/webapp/src/services/api/studies/timeseries.ts +++ b/webapp/src/services/api/studies/timeseries/index.ts @@ -12,8 +12,13 @@ * This file is part of the Antares project. */ -import type { StudyMetadata } from "../../../common/types"; -import client from "../client"; +import type { StudyMetadata } from "@/common/types.ts"; +import client from "../../client.ts"; +import type { + SetTimeSeriesConfigParams, + TimeSeriesTypeConfig, +} from "@/services/api/studies/timeseries/types.ts"; +import * as R from "ramda"; /** * Launches time series generation task for the specified study. @@ -26,3 +31,13 @@ export async function generateTimeSeries(params: { studyId: StudyMetadata["id"] const { data } = await client.put(`/v1/studies/${params.studyId}/timeseries/generate`); return data; } + +export async function setTimeSeriesConfig({ studyId, values }: SetTimeSeriesConfigParams) { + // Extra fields not allowed by the API + const validDTO = R.map( + (config = {}) => R.pick(["number"] as Array, config), + values, + ); + + await client.put(`/v1/studies/${studyId}/timeseries/config`, validDTO); +} diff --git a/webapp/src/services/api/studies/timeseries/types.ts b/webapp/src/services/api/studies/timeseries/types.ts new file mode 100644 index 0000000000..936161a93f --- /dev/null +++ b/webapp/src/services/api/studies/timeseries/types.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2025, RTE (https://www.rte-france.com) + * + * See AUTHORS.txt + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This file is part of the Antares project. + */ + +import type { StudyMetadata } from "@/common/types.ts"; +import type { DeepPartial } from "react-hook-form"; +import type { O } from "ts-toolbelt"; +import { type TimeSeriesType } from "./constants"; + +export type TimeSeriesTypeValue = O.UnionOf; + +export interface TimeSeriesTypeConfig { + number: number; +} + +export type TimeSeriesConfigDTO = Record; + +export interface SetTimeSeriesConfigParams { + studyId: StudyMetadata["id"]; + values: DeepPartial; +} diff --git a/webapp/src/services/api/tasks/index.ts b/webapp/src/services/api/tasks/index.ts index 77d11bedce..bb1583eaba 100644 --- a/webapp/src/services/api/tasks/index.ts +++ b/webapp/src/services/api/tasks/index.ts @@ -13,11 +13,18 @@ */ import client from "../client"; -import type { GetTaskParams, GetTasksParams, TaskDTO, TTaskStatus, TTaskType } from "./types"; +import type { + GetTaskParams, + GetTasksParams, + TaskDTO, + TaskStatusValue, + TaskTypeValue, +} from "./types"; -export async function getTasks( - params: GetTasksParams, -) { +export async function getTasks< + TStatus extends TaskStatusValue, + TType extends TaskTypeValue | undefined, +>(params: GetTasksParams) { const { data } = await client.post>>("/v1/tasks", { status: params.status, type: params.type, diff --git a/webapp/src/services/api/tasks/types.ts b/webapp/src/services/api/tasks/types.ts index c2b44c9bcb..d41a6b1349 100644 --- a/webapp/src/services/api/tasks/types.ts +++ b/webapp/src/services/api/tasks/types.ts @@ -13,17 +13,17 @@ */ import type { O } from "ts-toolbelt"; -import type { IdentityDTO, StudyMetadata } from "../../../common/types"; +import type { IdentityDTO, StudyMetadata } from "@/common/types.ts"; import type { TaskStatus, TaskType } from "./constants"; -export type TTaskStatus = O.UnionOf; +export type TaskStatusValue = O.UnionOf; -export type TTaskType = O.UnionOf; +export type TaskTypeValue = O.UnionOf; interface BaseTaskDTO< - TStatus extends TTaskStatus = TTaskStatus, - TType extends TTaskType = TTaskType, -> extends IdentityDTO { + TStatus extends TaskStatusValue = TaskStatusValue, + TType extends TaskTypeValue = TaskTypeValue, +> extends IdentityDTO { status: TStatus; type?: TType; owner?: number; @@ -43,13 +43,16 @@ interface BaseTaskDTO< } export type TaskDTO< - TStatus extends TTaskStatus = TTaskStatus, - TType extends TTaskType | undefined = undefined, -> = TType extends TTaskType + TStatus extends TaskStatusValue = TaskStatusValue, + TType extends TaskTypeValue | undefined = undefined, +> = TType extends TaskTypeValue ? O.Required, "type"> : BaseTaskDTO; -export interface GetTasksParams { +export interface GetTasksParams< + TStatus extends TaskStatusValue, + TType extends TaskTypeValue | undefined, +> { status?: TStatus[]; type?: TType[]; name?: string; diff --git a/webapp/src/services/webSocket/types.ts b/webapp/src/services/webSocket/types.ts index 9803344dea..6b760d5cbb 100644 --- a/webapp/src/services/webSocket/types.ts +++ b/webapp/src/services/webSocket/types.ts @@ -22,7 +22,7 @@ import type { import type { WsEventType } from "./constants"; import type { O } from "ts-toolbelt"; import type { FileDownloadDTO } from "../api/downloads"; -import type { TaskDTO, TTaskType } from "../api/tasks/types"; +import type { TaskDTO, TaskTypeValue } from "../api/tasks/types"; /** * Copyright (c) 2024, RTE (https://www.rte-france.com) @@ -38,7 +38,7 @@ import type { TaskDTO, TTaskType } from "../api/tasks/types"; * This file is part of the Antares project. */ -export type TWsEventType = O.UnionOf; +export type WsEventTypeValue = O.UnionOf; //////////////////////////////////////////////////////////////// // Payloads @@ -59,7 +59,7 @@ export interface StudyJobLogUpdateEventPayload { export interface TaskEventPayload { id: string; message: string; - type: TTaskType; + type: TaskTypeValue; study_id?: StudyMetadata["id"]; } From b939a7ea3784e60d95f4a36bdbabd69ddaa7d9fe Mon Sep 17 00:00:00 2001 From: Sylvain Leclerc Date: Wed, 5 Feb 2025 09:27:11 +0100 Subject: [PATCH 35/38] chore(commands): remove obsolete variant-related features (#2326) Removal of unused command-related features: - the possibility to build a diff between variants - the possibility to build a list of commands to build a study from scratch - the possibility to revert commands Reasons: - Those features are not used, and probably full of bugs. - their future usage in this shape is very unlikely. For example, for the diff feature: if we want a diff between studies, we should make it a separate feature from commands with its own diff model. Having a diff as commands does not seem very useful: we already have the target study, what will we use the output commands for ? If we want to apply commands on another study, we don't need a diff for this, the user just needs to structure its studies for this and copy/paste the commands he wants to copy. - it hurts our capacity to maintain, refactor, and make evolutions in commands implementation Signed-off-by: Sylvain Leclerc --- AntaresWebLinux.spec | 35 -- AntaresWebWin.spec | 36 -- .../business/command_extractor.py | 499 ------------------ .../variantstudy/business/command_reverter.py | 407 -------------- .../variantstudy/model/command/create_area.py | 14 - .../command/create_binding_constraint.py | 48 -- .../model/command/create_cluster.py | 62 --- .../model/command/create_district.py | 43 -- .../variantstudy/model/command/create_link.py | 62 --- .../command/create_renewables_cluster.py | 36 -- .../model/command/create_st_storage.py | 70 --- .../model/command/create_user_resource.py | 20 - .../generate_thermal_cluster_timeseries.py | 16 - .../variantstudy/model/command/icommand.py | 69 --- .../variantstudy/model/command/remove_area.py | 12 - .../command/remove_binding_constraint.py | 14 - .../model/command/remove_cluster.py | 20 - .../model/command/remove_district.py | 14 - .../variantstudy/model/command/remove_link.py | 15 - .../remove_multiple_binding_constraints.py | 14 - .../command/remove_renewables_cluster.py | 20 - .../model/command/remove_st_storage.py | 21 - .../model/command/remove_user_resource.py | 14 - .../model/command/replace_matrix.py | 16 - .../command/update_binding_constraint.py | 16 - .../model/command/update_comments.py | 14 - .../model/command/update_config.py | 17 - .../model/command/update_district.py | 23 - .../variantstudy/model/command/update_link.py | 8 - .../model/command/update_playlist.py | 21 - .../model/command/update_raw_file.py | 17 - .../model/command/update_scenario_builder.py | 16 - .../variantstudy/variant_command_extractor.py | 211 -------- antarest/tools/cli.py | 195 ------- antarest/tools/lib.py | 378 ------------- .../architecture/0-introduction.md | 1 - docs/user-guide/3-variant_manager.md | 13 - pyproject.toml | 2 +- resources/antares-desktop-fs/README.md | 17 - scripts/package_antares_web.sh | 4 +- tests/integration/assets/base_study.zip | Bin 305876 -> 0 bytes tests/integration/assets/commands1.json | 146 ----- tests/integration/assets/test_study.zip | Bin 170517 -> 0 bytes tests/integration/assets/variant_study.zip | Bin 311282 -> 0 bytes .../test_integration_variantmanager_tool.py | 244 --------- .../model/command/test_create_area.py | 28 - .../model/command/test_create_cluster.py | 114 ---- .../model/command/test_create_link.py | 72 --- .../command/test_create_renewables_cluster.py | 82 --- .../model/command/test_create_st_storage.py | 97 ---- .../test_manage_binding_constraints.py | 281 ---------- .../model/command/test_manage_district.py | 87 --- .../model/command/test_remove_area.py | 19 - .../model/command/test_remove_cluster.py | 30 -- .../model/command/test_remove_link.py | 23 - .../command/test_remove_renewables_cluster.py | 30 -- .../model/command/test_remove_st_storage.py | 37 -- .../model/command/test_replace_matrix.py | 54 -- .../model/command/test_update_comments.py | 62 --- .../model/command/test_update_config.py | 41 -- .../model/command/test_update_rawfile.py | 16 - 61 files changed, 2 insertions(+), 3991 deletions(-) delete mode 100644 antarest/study/storage/variantstudy/business/command_extractor.py delete mode 100644 antarest/study/storage/variantstudy/business/command_reverter.py delete mode 100644 antarest/study/storage/variantstudy/variant_command_extractor.py delete mode 100644 antarest/tools/cli.py delete mode 100644 antarest/tools/lib.py delete mode 100644 tests/integration/assets/base_study.zip delete mode 100644 tests/integration/assets/commands1.json delete mode 100644 tests/integration/assets/test_study.zip delete mode 100644 tests/integration/assets/variant_study.zip delete mode 100644 tests/integration/test_integration_variantmanager_tool.py diff --git a/AntaresWebLinux.spec b/AntaresWebLinux.spec index 8671f11bfa..92a531504c 100644 --- a/AntaresWebLinux.spec +++ b/AntaresWebLinux.spec @@ -54,45 +54,10 @@ antares_web_server_exe = EXE(antares_web_server_pyz, entitlements_file=None , icon='resources/webapp/favicon.ico') -antares_tool_a = Analysis(['antarest/tools/cli.py'], - pathex=[], - binaries=[], - datas=[('./resources', './resources')], - hiddenimports=['cmath', 'sqlalchemy.sql.default_comparator', 'sqlalchemy.ext.baked'], - hookspath=['extra-hooks'], - hooksconfig={}, - runtime_hooks=[], - excludes=[], - win_no_prefer_redirects=False, - win_private_assemblies=False, - cipher=block_cipher, - noarchive=False) -antares_tool_pyz = PYZ(antares_tool_a.pure, antares_tool_a.zipped_data, - cipher=block_cipher) -antares_tool_exe = EXE(antares_tool_pyz, - antares_tool_a.scripts, - [], - exclude_binaries=True, - name='AntaresTool', - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, - console=True, - disable_windowed_traceback=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None ) - - coll = COLLECT(antares_web_server_exe, antares_web_server_a.binaries, antares_web_server_a.zipfiles, antares_web_server_a.datas, - antares_tool_exe, - antares_tool_a.binaries, - antares_tool_a.zipfiles, - antares_tool_a.datas, strip=False, upx=True, upx_exclude=[], diff --git a/AntaresWebWin.spec b/AntaresWebWin.spec index 8afcb62dae..c26c0257ed 100644 --- a/AntaresWebWin.spec +++ b/AntaresWebWin.spec @@ -53,46 +53,10 @@ antares_web_server_exe = EXE(antares_web_server_pyz, codesign_identity=None, entitlements_file=None , icon='resources/webapp/favicon.ico') - -antares_tool_a = Analysis(['antarest/tools/cli.py'], - pathex=[], - binaries=[], - datas=[('./resources', './resources')], - hiddenimports=['cmath', 'sqlalchemy.sql.default_comparator', 'sqlalchemy.ext.baked'], - hookspath=['extra-hooks'], - hooksconfig={}, - runtime_hooks=[], - excludes=[], - win_no_prefer_redirects=False, - win_private_assemblies=False, - cipher=block_cipher, - noarchive=False) -antares_tool_pyz = PYZ(antares_tool_a.pure, antares_tool_a.zipped_data, - cipher=block_cipher) -antares_tool_exe = EXE(antares_tool_pyz, - antares_tool_a.scripts, - [], - exclude_binaries=True, - name='AntaresTool', - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, - console=True, - disable_windowed_traceback=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None ) - - coll = COLLECT(antares_web_server_exe, antares_web_server_a.binaries, antares_web_server_a.zipfiles, antares_web_server_a.datas, - antares_tool_exe, - antares_tool_a.binaries, - antares_tool_a.zipfiles, - antares_tool_a.datas, strip=False, upx=True, upx_exclude=[], diff --git a/antarest/study/storage/variantstudy/business/command_extractor.py b/antarest/study/storage/variantstudy/business/command_extractor.py deleted file mode 100644 index 95b51fe9ea..0000000000 --- a/antarest/study/storage/variantstudy/business/command_extractor.py +++ /dev/null @@ -1,499 +0,0 @@ -# Copyright (c) 2025, RTE (https://www.rte-france.com) -# -# See AUTHORS.txt -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# SPDX-License-Identifier: MPL-2.0 -# -# This file is part of the Antares project. - -import base64 -import logging -import typing as t - -import numpy as np -from typing_extensions import override - -from antarest.core.model import JSON -from antarest.core.utils.utils import StopWatch -from antarest.matrixstore.model import MatrixData -from antarest.matrixstore.service import ISimpleMatrixService -from antarest.study.model import STUDY_VERSION_6_5, STUDY_VERSION_8_2, STUDY_VERSION_8_7 -from antarest.study.storage.patch_service import PatchService -from antarest.study.storage.rawstudy.model.filesystem.config.files import get_playlist -from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.rawstudy.model.filesystem.root.filestudytree import FileStudyTree -from antarest.study.storage.variantstudy.business.matrix_constants_generator import GeneratorMatrixConstants -from antarest.study.storage.variantstudy.business.utils import strip_matrix_protocol -from antarest.study.storage.variantstudy.model.command.create_area import CreateArea -from antarest.study.storage.variantstudy.model.command.create_binding_constraint import CreateBindingConstraint -from antarest.study.storage.variantstudy.model.command.create_cluster import CreateCluster -from antarest.study.storage.variantstudy.model.command.create_district import CreateDistrict, DistrictBaseFilter -from antarest.study.storage.variantstudy.model.command.create_link import CreateLink -from antarest.study.storage.variantstudy.model.command.create_renewables_cluster import CreateRenewablesCluster -from antarest.study.storage.variantstudy.model.command.icommand import ICommand -from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix -from antarest.study.storage.variantstudy.model.command.update_comments import UpdateComments -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig -from antarest.study.storage.variantstudy.model.command.update_district import UpdateDistrict -from antarest.study.storage.variantstudy.model.command.update_playlist import UpdatePlaylist -from antarest.study.storage.variantstudy.model.command.update_raw_file import UpdateRawFile -from antarest.study.storage.variantstudy.model.command_context import CommandContext -from antarest.study.storage.variantstudy.model.interfaces import ICommandExtractor - -logger = logging.getLogger(__name__) - - -def _find_binding_config(binding_id: str, study_tree: FileStudyTree) -> JSON: - # noinspection SpellCheckingInspection - url = ["input", "bindingconstraints", "bindingconstraints"] - for binding_config in study_tree.get(url).values(): - if binding_config["id"] == binding_id: - return t.cast(JSON, binding_config) - raise ValueError(f"Binding constraint '{binding_id}' not found in '{''.join(url)}'") - - -class CommandExtractor(ICommandExtractor): - def __init__(self, matrix_service: ISimpleMatrixService, patch_service: PatchService): - self.matrix_service = matrix_service - self.generator_matrix_constants = GeneratorMatrixConstants(self.matrix_service) - self.generator_matrix_constants.init_constant_matrices() - self.patch_service = patch_service - self.command_context = CommandContext( - generator_matrix_constants=self.generator_matrix_constants, - matrix_service=self.matrix_service, - patch_service=self.patch_service, - ) - - @override - def extract_area(self, study: FileStudy, area_id: str) -> t.Tuple[t.List[ICommand], t.List[ICommand]]: - stopwatch = StopWatch() - study_tree = study.tree - study_config = study.config - area = study_config.areas[area_id] - optimization_data = study_tree.get(["input", "areas", area_id, "optimization"]) - ui_data = study_tree.get(["input", "areas", area_id, "ui"]) - - study_commands: t.List[ICommand] = [ - CreateArea(area_name=area.name, command_context=self.command_context, study_version=study_config.version), - UpdateConfig( - target=f"input/areas/{area_id}/optimization", - data=optimization_data, - command_context=self.command_context, - study_version=study_config.version, - ), - UpdateConfig( - target=f"input/areas/{area_id}/ui", - data=ui_data, - command_context=self.command_context, - study_version=study_config.version, - ), - ] - stopwatch.log_elapsed(lambda x: logger.info(f"Area command extraction done in {x}s")) - - links_data = study_tree.get(["input", "links", area_id, "properties"]) - links_commands: t.List[ICommand] = [] - for link in area.links: - links_commands += self.extract_link(study, area_id, link, links_data) - - stopwatch.log_elapsed(lambda x: logger.info(f"Link command extraction done in {x}s")) - - for thermal in area.thermals: - study_commands += self.extract_cluster(study, area_id, thermal.id) - stopwatch.log_elapsed(lambda x: logger.info(f"Thermal command extraction done in {x}s")) - - for renewable in area.renewables: - study_commands += self.extract_renewables_cluster(study, area_id, renewable.id) - stopwatch.log_elapsed(lambda x: logger.info(f"Renewables command extraction done in {x}s")) - - # load, wind, solar - null_matrix_id = strip_matrix_protocol(self.generator_matrix_constants.get_null_matrix()) - for gen_type in ["load", "wind", "solar"]: - for matrix in ["conversion", "data", "k", "translation"]: - study_commands.append( - self.generate_replace_matrix( - study_tree, - ["input", gen_type, "prepro", area_id, matrix], - ) - ) - study_commands.append( - self.generate_update_config( - study_tree, - ["input", gen_type, "prepro", area_id, "settings"], - ) - ) - study_commands.append( - self.generate_replace_matrix( - study_tree, - ["input", gen_type, "series", f"{gen_type}_{area_id}"], - null_matrix_id, - ) - ) - stopwatch.log_elapsed(lambda x: logger.info(f"Prepro command extraction done in {x}s")) - - # misc gen / reserves - study_commands.append(self.generate_replace_matrix(study_tree, ["input", "reserves", area_id])) - study_commands.append( - self.generate_replace_matrix( - study_tree, - ["input", "misc-gen", f"miscgen-{area_id}"], - ) - ) - - stopwatch.log_elapsed(lambda x: logger.info(f"Misc command extraction done in {x}s")) - # hydro - study_commands += self.extract_hydro(study, area_id) - stopwatch.log_elapsed(lambda x: logger.info(f"Hydro command extraction done in {x}s")) - return study_commands, links_commands - - @override - def extract_link( - self, - study: FileStudy, - area1: str, - area2: str, - links_data: t.Optional[JSON] = None, - ) -> t.List[ICommand]: - study_tree = study.tree - study_version = study.config.version - link_command = CreateLink( - area1=area1, area2=area2, parameters={}, command_context=self.command_context, study_version=study_version - ) - link_data = ( - links_data.get(area2) - if links_data is not None - else study_tree.get(["input", "links", area1, "properties", area2]) - ) - link_config_command = UpdateConfig( - target=f"input/links/{area1}/properties/{area2}", - data=link_data, - command_context=self.command_context, - study_version=study_version, - ) - null_matrix_id = strip_matrix_protocol(self.generator_matrix_constants.get_null_matrix()) - commands: t.List[ICommand] = [link_command, link_config_command] - if study_version < STUDY_VERSION_8_2: - commands.append( - self.generate_replace_matrix( - study_tree, - ["input", "links", area1, area2], - null_matrix_id, - ) - ) - else: - commands.extend( - [ - self.generate_replace_matrix( - study_tree, - ["input", "links", area1, f"{area2}_parameters"], - null_matrix_id, - ), - self.generate_replace_matrix( - study_tree, - ["input", "links", area1, "capacities", f"{area2}_direct"], - null_matrix_id, - ), - self.generate_replace_matrix( - study_tree, - ["input", "links", area1, "capacities", f"{area2}_indirect"], - null_matrix_id, - ), - ] - ) - return commands - - def _extract_cluster(self, study: FileStudy, area_id: str, cluster_id: str, renewables: bool) -> t.List[ICommand]: - study_tree = study.tree - if renewables: - cluster_type = "renewables" # with a final "s" - cluster_list = study.config.areas[area_id].renewables - create_cluster_command = CreateRenewablesCluster - else: - cluster_type = "thermal" # w/o a final "s" - cluster_list = study.config.areas[area_id].thermals # type: ignore - create_cluster_command = CreateCluster # type: ignore - - cluster = next(iter(c for c in cluster_list if c.id == cluster_id)) - - null_matrix_id = strip_matrix_protocol(self.generator_matrix_constants.get_null_matrix()) - # Note that cluster IDs are case-insensitive, but series IDs are in lower case. - series_id = cluster_id.lower() - study_commands: t.List[ICommand] = [ - create_cluster_command( - area_id=area_id, - cluster_name=cluster.id, - parameters=cluster.model_dump(by_alias=True, exclude_defaults=True, exclude={"id"}), - command_context=self.command_context, - study_version=study_tree.config.version, - ), - self.generate_replace_matrix( - study_tree, - ["input", cluster_type, "series", area_id, series_id, "series"], - null_matrix_id, - ), - ] - if not renewables: - study_commands.extend( - [ - self.generate_replace_matrix( - study_tree, - ["input", cluster_type, "prepro", area_id, series_id, "data"], - null_matrix_id, - ), - self.generate_replace_matrix( - study_tree, - ["input", cluster_type, "prepro", area_id, series_id, "modulation"], - null_matrix_id, - ), - ] - ) - return study_commands - - @override - def extract_cluster(self, study: FileStudy, area_id: str, thermal_id: str) -> t.List[ICommand]: - return self._extract_cluster(study, area_id, thermal_id, False) - - @override - def extract_renewables_cluster(self, study: FileStudy, area_id: str, renewables_id: str) -> t.List[ICommand]: - return self._extract_cluster(study, area_id, renewables_id, True) - - @override - def extract_hydro(self, study: FileStudy, area_id: str) -> t.List[ICommand]: - study_tree = study.tree - commands = [ - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "common", "capacity", f"maxpower_{area_id}"], - ), - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "common", "capacity", f"reservoir_{area_id}"], - ), - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "prepro", area_id, "energy"], - ), - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "series", area_id, "mod"], - ), - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "series", area_id, "ror"], - ), - self.generate_update_config( - study_tree, - ["input", "hydro", "prepro", area_id, "prepro"], - ), - self.generate_update_config( - study_tree, - ["input", "hydro", "allocation", area_id], - ), - ] - - if study_tree.config.version > STUDY_VERSION_6_5: - commands += [ - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "common", "capacity", f"creditmodulations_{area_id}"], - ), - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "common", "capacity", f"inflowPattern_{area_id}"], - ), - self.generate_replace_matrix( - study_tree, - ["input", "hydro", "common", "capacity", f"waterValues_{area_id}"], - ), - ] - - hydro_config = study_tree.get(["input", "hydro", "hydro"]) - for key in hydro_config: - if area_id in hydro_config[key]: - commands.append( - self.generate_update_config( - study_tree, - ["input", "hydro", "hydro", key, area_id], - ) - ) - - return commands - - @override - def extract_district(self, study: FileStudy, district_id: str) -> t.List[ICommand]: - study_commands: t.List[ICommand] = [] - study_config = study.config - study_tree = study.tree - district_config = study_config.sets[district_id] - base_filter = DistrictBaseFilter.add_all if district_config.inverted_set else DistrictBaseFilter.remove_all - district_fetched_config = study_tree.get(["input", "areas", "sets", district_id]) - assert district_config.name is not None - study_commands.append( - CreateDistrict( - name=district_config.name, - base_filter=base_filter, - filter_items=district_config.areas or [], - output=district_config.output, - comments=district_fetched_config.get("comments", None), - command_context=self.command_context, - study_version=study_config.version, - ) - ) - return study_commands - - @override - def extract_comments(self, study: FileStudy) -> t.List[ICommand]: - study_tree = study.tree - content = t.cast(bytes, study_tree.get(["settings", "comments"])) - comments = content.decode("utf-8") - return [ - UpdateComments( - comments=comments, command_context=self.command_context, study_version=study_tree.config.version - ) - ] - - @override - def extract_binding_constraint( - self, - study: FileStudy, - binding_id: str, - bindings_data: t.Optional[JSON] = None, - ) -> t.List[ICommand]: - study_tree = study.tree - study_version = study.config.version - - # Retrieve binding constraint properties from the study tree, - # so, field names follow the same convention as the INI file. - binding: JSON = _find_binding_config(binding_id, study_tree) if bindings_data is None else bindings_data - - # Extract the binding constraint ID, which is recalculated from the name in the command - bc_id = binding.pop("id") - - # Extract binding constraint terms, which keys contain "%" or "." - terms = {} - for term_id, value in sorted(binding.items()): - if "%" in term_id or "." in term_id: - weight, _, offset = str(value).partition("%") - term_value = [float(weight), int(offset)] if offset else [float(weight)] - terms[term_id] = term_value - del binding[term_id] - - # Extract the matrices associated with the binding constraint - if study_version < STUDY_VERSION_8_7: - urls = {"values": ["input", "bindingconstraints", bc_id]} - else: - urls = { - "less_term_matrix": ["input", "bindingconstraints", f"{bc_id}_lt"], - "greater_term_matrix": ["input", "bindingconstraints", f"{bc_id}_gt"], - "equal_term_matrix": ["input", "bindingconstraints", f"{bc_id}_eq"], - } - - matrices: t.Dict[str, t.List[t.List[float]]] = {} - for name, url in urls.items(): - matrix = study_tree.get(url) - if matrix is not None: - matrices[name] = matrix["data"] - - # Create the command to create the binding constraint - kwargs = { - **binding, - **matrices, - "coeffs": terms, - "command_context": self.command_context, - "study_version": study_version, - } - create_cmd = CreateBindingConstraint.model_validate(kwargs) - - return [create_cmd] - - @override - def generate_update_config(self, study_tree: FileStudyTree, url: t.List[str]) -> ICommand: - data = study_tree.get(url) - return UpdateConfig( - target="/".join(url), - data=data, - command_context=self.command_context, - study_version=study_tree.config.version, - ) - - @override - def generate_update_raw_file(self, study_tree: FileStudyTree, url: t.List[str]) -> ICommand: - data = study_tree.get(url) - return UpdateRawFile( - target="/".join(url), - b64Data=base64.b64encode(t.cast(bytes, data)).decode("utf-8"), - command_context=self.command_context, - study_version=study_tree.config.version, - ) - - @override - def generate_update_comments( - self, - study_tree: FileStudyTree, - ) -> ICommand: - content = t.cast(bytes, study_tree.get(["settings", "comments"])) - comments = content.decode("utf-8") - return UpdateComments( - comments=comments, command_context=self.command_context, study_version=study_tree.config.version - ) - - def generate_update_playlist( - self, - study_tree: FileStudyTree, - ) -> ICommand: - config = study_tree.get(["settings", "generaldata"]) - playlist = get_playlist(config) - return UpdatePlaylist( - items=list(playlist.keys()) if playlist else None, - weights=({year: weight for year, weight in playlist.items() if weight != 1} if playlist else None), - active=bool(playlist and len(playlist) > 0), - reverse=False, - command_context=self.command_context, - study_version=study_tree.config.version, - ) - - @override - def generate_replace_matrix( - self, - study_tree: FileStudyTree, - url: t.List[str], - default_value: t.Optional[str] = None, - ) -> ICommand: - data = study_tree.get(url) - if isinstance(data, str): - matrix = data - elif isinstance(data, dict): - matrix = data["data"] if "data" in data else [[]] - else: - matrix = [[]] if default_value is None else default_value - if isinstance(matrix, np.ndarray): - matrix = t.cast(t.List[t.List[MatrixData]], matrix.tolist()) - return ReplaceMatrix( - target="/".join(url), - matrix=matrix, - command_context=self.command_context, - study_version=study_tree.config.version, - ) - - def generate_update_district( - self, - study: FileStudy, - district_id: str, - ) -> ICommand: - study_config = study.config - study_tree = study.tree - district_config = study_config.sets[district_id] - district_fetched_config = study_tree.get(["input", "areas", "sets", district_id]) - assert district_config.name is not None - return UpdateDistrict( - id=district_config.name, - base_filter=DistrictBaseFilter.add_all if district_config.inverted_set else DistrictBaseFilter.remove_all, - filter_items=district_config.areas or [], - output=district_config.output, - comments=district_fetched_config.get("comments", None), - command_context=self.command_context, - study_version=study_tree.config.version, - ) diff --git a/antarest/study/storage/variantstudy/business/command_reverter.py b/antarest/study/storage/variantstudy/business/command_reverter.py deleted file mode 100644 index 4b74d2a0ba..0000000000 --- a/antarest/study/storage/variantstudy/business/command_reverter.py +++ /dev/null @@ -1,407 +0,0 @@ -# Copyright (c) 2025, RTE (https://www.rte-france.com) -# -# See AUTHORS.txt -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# SPDX-License-Identifier: MPL-2.0 -# -# This file is part of the Antares project. - -import logging -import typing as t -from pathlib import Path - -from antarest.core.exceptions import ChildNotFoundError -from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id -from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.model.command.common import CommandName -from antarest.study.storage.variantstudy.model.command.create_area import CreateArea -from antarest.study.storage.variantstudy.model.command.create_binding_constraint import ( - CreateBindingConstraint, - TermMatrices, -) -from antarest.study.storage.variantstudy.model.command.create_cluster import CreateCluster -from antarest.study.storage.variantstudy.model.command.create_district import CreateDistrict -from antarest.study.storage.variantstudy.model.command.create_link import CreateLink -from antarest.study.storage.variantstudy.model.command.create_renewables_cluster import CreateRenewablesCluster -from antarest.study.storage.variantstudy.model.command.create_st_storage import CreateSTStorage -from antarest.study.storage.variantstudy.model.command.create_user_resource import CreateUserResource -from antarest.study.storage.variantstudy.model.command.generate_thermal_cluster_timeseries import ( - GenerateThermalClusterTimeSeries, -) -from antarest.study.storage.variantstudy.model.command.icommand import ICommand -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea -from antarest.study.storage.variantstudy.model.command.remove_binding_constraint import RemoveBindingConstraint -from antarest.study.storage.variantstudy.model.command.remove_cluster import RemoveCluster -from antarest.study.storage.variantstudy.model.command.remove_district import RemoveDistrict -from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink -from antarest.study.storage.variantstudy.model.command.remove_multiple_binding_constraints import ( - RemoveMultipleBindingConstraints, -) -from antarest.study.storage.variantstudy.model.command.remove_renewables_cluster import RemoveRenewablesCluster -from antarest.study.storage.variantstudy.model.command.remove_st_storage import RemoveSTStorage -from antarest.study.storage.variantstudy.model.command.remove_user_resource import RemoveUserResource -from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix -from antarest.study.storage.variantstudy.model.command.update_binding_constraint import UpdateBindingConstraint -from antarest.study.storage.variantstudy.model.command.update_comments import UpdateComments -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig -from antarest.study.storage.variantstudy.model.command.update_district import UpdateDistrict -from antarest.study.storage.variantstudy.model.command.update_playlist import UpdatePlaylist -from antarest.study.storage.variantstudy.model.command.update_raw_file import UpdateRawFile -from antarest.study.storage.variantstudy.model.command.update_scenario_builder import UpdateScenarioBuilder - -logger = logging.getLogger(__name__) - - -class CommandReverter: - def __init__(self) -> None: - self.method_dict: t.Dict[ - CommandName, - t.Callable[[ICommand, t.List[ICommand], FileStudy], t.List[ICommand]], - ] = {command_name: getattr(self, f"_revert_{command_name.value}") for command_name in CommandName} - - @staticmethod - def _revert_create_area(base_command: CreateArea, history: t.List["ICommand"], base: FileStudy) -> t.List[ICommand]: - area_id = transform_name_to_id(base_command.area_name) - return [RemoveArea(id=area_id, command_context=base_command.command_context, study_version=base.config.version)] - - @staticmethod - def _revert_remove_area(base_command: RemoveArea, history: t.List["ICommand"], base: FileStudy) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveArea is not available") - - @staticmethod - def _revert_create_district( - base_command: CreateDistrict, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - district_id = transform_name_to_id(base_command.name) - return [ - RemoveDistrict( - id=district_id, command_context=base_command.command_context, study_version=base.config.version - ) - ] - - @staticmethod - def _revert_remove_district( - base_command: RemoveDistrict, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveDistrict is not available") - - @staticmethod - def _revert_create_link(base_command: CreateLink, history: t.List["ICommand"], base: FileStudy) -> t.List[ICommand]: - return [ - RemoveLink( - area1=base_command.area1, - area2=base_command.area2, - command_context=base_command.command_context, - study_version=base.config.version, - ) - ] - - @staticmethod - def _revert_update_link(base_command: CreateLink, history: t.List["ICommand"], base: FileStudy) -> t.List[ICommand]: - raise NotImplementedError("The revert function for UpdateLink is not available") - - @staticmethod - def _revert_remove_link(base_command: RemoveLink, history: t.List["ICommand"], base: FileStudy) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveLink is not available") - - @staticmethod - def _revert_create_binding_constraint( - base_command: CreateBindingConstraint, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - bind_id = transform_name_to_id(base_command.name) - return [ - RemoveBindingConstraint( - id=bind_id, command_context=base_command.command_context, study_version=base.config.version - ) - ] - - @staticmethod - def _revert_update_binding_constraint( - base_command: UpdateBindingConstraint, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - for command in reversed(history): - if isinstance(command, UpdateBindingConstraint) and command.id == base_command.id: - return [command] - elif isinstance(command, CreateBindingConstraint) and transform_name_to_id(command.name) == base_command.id: - args = { - "id": base_command.id, - "enabled": command.enabled, - "time_step": command.time_step, - "operator": command.operator, - "coeffs": command.coeffs, - "filter_year_by_year": command.filter_year_by_year, - "filter_synthesis": command.filter_synthesis, - "comments": command.comments, - "command_context": command.command_context, - "study_version": base.config.version, - } - - matrix_service = command.command_context.matrix_service - for matrix_name in ["values"] + [m.value for m in TermMatrices]: - matrix = getattr(command, matrix_name) - if matrix is not None: - args[matrix_name] = matrix_service.get_matrix_id(matrix) - - return [UpdateBindingConstraint.model_validate(args)] - - return base_command.get_command_extractor().extract_binding_constraint(base, base_command.id) - - @staticmethod - def _revert_remove_binding_constraint( - base_command: RemoveBindingConstraint, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveBindingConstraint is not available") - - @staticmethod - def _revert_remove_multiple_binding_constraints( - base_command: RemoveMultipleBindingConstraints, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveMultipleBindingConstraints is not available") - - @staticmethod - def _revert_update_scenario_builder( - base_command: UpdateScenarioBuilder, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - # todo make the diff between base study scenariobuilder data and base_command - raise NotImplementedError("The revert function for UpdateScenarioBuilder is not available") - - @staticmethod - def _revert_create_cluster( - base_command: CreateCluster, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - cluster_id = transform_name_to_id(base_command.cluster_name) - return [ - RemoveCluster( - area_id=base_command.area_id, - cluster_id=cluster_id, - command_context=base_command.command_context, - study_version=base.config.version, - ) - ] - - @staticmethod - def _revert_remove_cluster( - base_command: RemoveCluster, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveCluster is not available") - - @staticmethod - def _revert_create_renewables_cluster( - base_command: CreateRenewablesCluster, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - cluster_id = transform_name_to_id(base_command.cluster_name) - return [ - RemoveRenewablesCluster( - area_id=base_command.area_id, - cluster_id=cluster_id, - command_context=base_command.command_context, - study_version=base.config.version, - ) - ] - - @staticmethod - def _revert_remove_renewables_cluster( - base_command: RemoveRenewablesCluster, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveRenewablesCluster is not available") - - @staticmethod - def _revert_create_st_storage( - base_command: CreateSTStorage, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - storage_id = base_command.parameters.id - return [ - RemoveSTStorage( - area_id=base_command.area_id, - storage_id=storage_id, - command_context=base_command.command_context, - study_version=base.config.version, - ) - ] - - @staticmethod - def _revert_remove_st_storage( - base_command: RemoveSTStorage, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveSTStorage is not available") - - @staticmethod - def _revert_replace_matrix( - base_command: ReplaceMatrix, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - for command in reversed(history): - if isinstance(command, ReplaceMatrix) and command.target == base_command.target: - return [command] - - try: - return [ - base_command.get_command_extractor().generate_replace_matrix(base.tree, base_command.target.split("/")) - ] - except ChildNotFoundError: - return [] # if the matrix does not exist, there is nothing to revert - - @staticmethod - def _revert_update_config( - base_command: UpdateConfig, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - update_config_list: t.List[UpdateConfig] = [] - self_target_path = Path(base_command.target) - parent_path: Path = Path("../model/command") - for command in reversed(history): - if isinstance(command, UpdateConfig): - # adding all the UpdateConfig commands until we find one containing self (or the end) - update_config_list.append(command) - if command.target == base_command.target: - return [command] - elif Path(command.target) in self_target_path.parents: - # found the last parent command. - parent_path = Path(command.target) - break - - output_list: t.List[ICommand] = [ - command - for command in update_config_list[::-1] - if parent_path in Path(command.target).parents or str(parent_path) == command.target - ] - - if output_list: - return output_list - - try: - return [ - base_command.get_command_extractor().generate_update_config(base.tree, base_command.target.split("/")) - ] - except ChildNotFoundError as e: - logger.warning( - f"Failed to extract revert command for update_config {base_command.target}", - exc_info=e, - ) - return [] - - @staticmethod - def _revert_update_comments( - base_command: UpdateComments, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - for command in reversed(history): - if isinstance(command, UpdateComments): - return [command] - - try: - return [base_command.get_command_extractor().generate_update_comments(base.tree)] - except ChildNotFoundError: - return [] # if the file does not exist, there is nothing to revert - - @staticmethod - def _revert_update_playlist( - base_command: UpdatePlaylist, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - for command in reversed(history): - if isinstance(command, UpdatePlaylist): - return [command] - - try: - return [base_command.get_command_extractor().generate_update_playlist(base.tree)] - except ChildNotFoundError: - return [] # if the file does not exist, there is nothing to revert - - @staticmethod - def _revert_update_file( - base_command: UpdateRawFile, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - for command in reversed(history): - if isinstance(command, UpdateRawFile) and command.target == base_command.target: - return [command] - - extractor = base_command.get_command_extractor() - return [extractor.generate_update_raw_file(base.tree, base_command.target.split("/"))] - - @staticmethod - def _revert_update_district( - base_command: UpdateDistrict, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - for command in reversed(history): - # fmt: off - if ( - (isinstance(command, UpdateDistrict) and command.id == base_command.id) or - (isinstance(command, CreateDistrict) and transform_name_to_id(command.name) == base_command.id) - ): - return [command] - - extractor = base_command.get_command_extractor() - return [extractor.generate_update_district(base, base_command.id)] - - @staticmethod - def _revert_generate_thermal_cluster_timeseries( - base_command: GenerateThermalClusterTimeSeries, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for GenerateThermalClusterTimeSeries is not available") - - @staticmethod - def _revert_create_user_resource( - base_command: CreateUserResource, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - return [ - RemoveUserResource( - data=base_command.data, - command_context=base_command.command_context, - study_version=base_command.study_version, - ) - ] - - @staticmethod - def _revert_remove_user_resource( - base_command: RemoveUserResource, history: t.List["ICommand"], base: FileStudy - ) -> t.List[ICommand]: - raise NotImplementedError("The revert function for RemoveUserResource is not available") - - def revert( - self, - base_command: ICommand, - history: t.List["ICommand"], - base: FileStudy, - ) -> t.List[ICommand]: - """ - Generate a list of commands to revert the given command. - - Args: - base_command: The command to revert. - history: The history of commands. - base: The base study. - - Returns: - A list of commands to revert the given command. - """ - - return self.method_dict[base_command.command_name](base_command, history, base) diff --git a/antarest/study/storage/variantstudy/model/command/create_area.py b/antarest/study/storage/variantstudy/model/command/create_area.py index 65c78399b9..eba7ac8567 100644 --- a/antarest/study/storage/variantstudy/model/command/create_area.py +++ b/antarest/study/storage/variantstudy/model/command/create_area.py @@ -300,20 +300,6 @@ def to_dto(self) -> CommandDTO: action=CommandName.CREATE_AREA.value, args={"area_name": self.area_name}, study_version=self.study_version ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.area_name) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, CreateArea): - return False - return self.area_name == other.area_name - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py index 766934c8ee..1a94a256be 100644 --- a/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/create_binding_constraint.py @@ -456,51 +456,3 @@ def to_dto(self) -> CommandDTO: dto = super().to_dto() dto.args["name"] = self.name # type: ignore return dto - - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.name) - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - from antarest.study.storage.variantstudy.model.command.update_binding_constraint import UpdateBindingConstraint - - other = t.cast(CreateBindingConstraint, other) - bd_id = transform_name_to_id(self.name) - args = {"id": bd_id, "command_context": other.command_context, "study_version": other.study_version} - - excluded_fields = set(ICommand.model_fields) - self_command = self.model_dump(mode="json", exclude=excluded_fields) - other_command = other.model_dump(mode="json", exclude=excluded_fields) - properties = [ - "enabled", - "coeffs", - "comments", - "filter_year_by_year", - "filter_synthesis", - "group", - "time_step", - "operator", - ] - for prop in properties: - if self_command[prop] != other_command[prop]: - args[prop] = other_command[prop] - - matrix_service = self.command_context.matrix_service - for matrix_name in ["values"] + [m.value for m in TermMatrices]: - self_matrix = getattr(self, matrix_name) # matrix, ID or `None` - other_matrix = getattr(other, matrix_name) # matrix, ID or `None` - self_matrix_id = None if self_matrix is None else matrix_service.get_matrix_id(self_matrix) - other_matrix_id = None if other_matrix is None else matrix_service.get_matrix_id(other_matrix) - if self_matrix_id != other_matrix_id: - args[matrix_name] = other_matrix_id - - return [UpdateBindingConstraint.model_validate(args)] - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - if not isinstance(other, self.__class__): - return False - if not equal: - return self.name == other.name - return super().match(other, equal) diff --git a/antarest/study/storage/variantstudy/model/command/create_cluster.py b/antarest/study/storage/variantstudy/model/command/create_cluster.py index c8f42fb60a..e02cb944fc 100644 --- a/antarest/study/storage/variantstudy/model/command/create_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/create_cluster.py @@ -175,68 +175,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.area_id - + MATCH_SIGNATURE_SEPARATOR - + self.cluster_name - ) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, CreateCluster): - return False - simple_match = self.area_id == other.area_id and self.cluster_name == other.cluster_name - if not equal: - return simple_match - return ( - simple_match - and self.parameters == other.parameters - and self.prepro == other.prepro - and self.modulation == other.modulation - ) - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - other = t.cast(CreateCluster, other) - from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix - from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig - - # Series identifiers are in lower case. - series_id = transform_name_to_id(self.cluster_name, lower=True) - commands: t.List[ICommand] = [] - if self.prepro != other.prepro: - commands.append( - ReplaceMatrix( - target=f"input/thermal/prepro/{self.area_id}/{series_id}/data", - matrix=strip_matrix_protocol(other.prepro), - command_context=self.command_context, - study_version=self.study_version, - ) - ) - if self.modulation != other.modulation: - commands.append( - ReplaceMatrix( - target=f"input/thermal/prepro/{self.area_id}/{series_id}/modulation", - matrix=strip_matrix_protocol(other.modulation), - command_context=self.command_context, - study_version=self.study_version, - ) - ) - if self.parameters != other.parameters: - commands.append( - UpdateConfig( - target=f"input/thermal/clusters/{self.area_id}/list/{self.cluster_name}", - data=other.parameters, - command_context=self.command_context, - study_version=self.study_version, - ) - ) - return commands - @override def get_inner_matrices(self) -> t.List[str]: matrices: t.List[str] = [] diff --git a/antarest/study/storage/variantstudy/model/command/create_district.py b/antarest/study/storage/variantstudy/model/command/create_district.py index 8edb484700..ac28b32d92 100644 --- a/antarest/study/storage/variantstudy/model/command/create_district.py +++ b/antarest/study/storage/variantstudy/model/command/create_district.py @@ -120,49 +120,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.name) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, CreateDistrict): - return False - simple_match = self.name == other.name - if not equal: - return simple_match - return ( - simple_match - and self.base_filter == other.base_filter - and self.filter_items == other.filter_items - and self.output == other.output - and self.comments == other.comments - ) - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - other = cast(CreateDistrict, other) - district_id = transform_name_to_id(self.name) - from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig - - base_filter = other.base_filter or DistrictBaseFilter.remove_all - inverted_set = base_filter == DistrictBaseFilter.add_all - item_key = "-" if inverted_set else "+" - return [ - UpdateConfig( - target=f"input/areas/sets/{district_id}", - data={ - "caption": other.name, - "apply-filter": (other.base_filter or DistrictBaseFilter.remove_all).value, - item_key: other.filter_items or [], - "output": other.output, - "comments": other.comments, - }, - command_context=self.command_context, - study_version=self.study_version, - ) - ] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/create_link.py b/antarest/study/storage/variantstudy/model/command/create_link.py index 1158c32a63..c553ab7be7 100644 --- a/antarest/study/storage/variantstudy/model/command/create_link.py +++ b/antarest/study/storage/variantstudy/model/command/create_link.py @@ -78,56 +78,6 @@ def to_dto(self) -> CommandDTO: args[attr] = strip_matrix_protocol(value) return CommandDTO(action=self.command_name.value, args=args, study_version=self.study_version) - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, self.__class__): - return False - simple_match = self.area1 == other.area1 and self.area2 == other.area2 - if not equal: - return simple_match - return ( - simple_match - and self.parameters == other.parameters - and self.series == other.series - and self.direct == other.direct - and self.indirect == other.indirect - ) - - @override - def match_signature(self) -> str: - return str( - self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.area1 + MATCH_SIGNATURE_SEPARATOR + self.area2 - ) - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - other = cast(AbstractLinkCommand, other) - - commands: List[ICommand] = [] - area_from, area_to = sorted([self.area1, self.area2]) - if self.parameters != other.parameters: - properties = LinkInternal.model_validate(other.parameters or {}).model_dump( - mode="json", by_alias=True, exclude_none=True, exclude={"area1", "area2"} - ) - commands.append( - UpdateConfig( - target=f"input/links/{area_from}/properties/{area_to}", - data=properties, - command_context=self.command_context, - study_version=self.study_version, - ) - ) - if self.series != other.series: - commands.append( - ReplaceMatrix( - target=f"@links_series/{area_from}/{area_to}", - matrix=strip_matrix_protocol(other.series), - command_context=self.command_context, - study_version=self.study_version, - ) - ) - return commands - @override def get_inner_matrices(self) -> List[str]: list_matrices = [] @@ -295,18 +245,6 @@ def _apply(self, study_data: FileStudy, listener: Optional[ICommandListener] = N def to_dto(self) -> CommandDTO: return super().to_dto() - @override - def match_signature(self) -> str: - return super().match_signature() - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - return super().match(other, equal) - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return super()._create_diff(other) - @override def get_inner_matrices(self) -> List[str]: return super().get_inner_matrices() diff --git a/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py b/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py index 2b4d93a085..951060e74c 100644 --- a/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/create_renewables_cluster.py @@ -148,42 +148,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.area_id - + MATCH_SIGNATURE_SEPARATOR - + self.cluster_name - ) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, CreateRenewablesCluster): - return False - simple_match = self.area_id == other.area_id and self.cluster_name == other.cluster_name - if not equal: - return simple_match - return simple_match and self.parameters == other.parameters - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - other = t.cast(CreateRenewablesCluster, other) - from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig - - commands: t.List[ICommand] = [] - if self.parameters != other.parameters: - commands.append( - UpdateConfig( - target=f"input/renewables/clusters/{self.area_id}/list/{self.cluster_name}", - data=other.parameters, - command_context=self.command_context, - study_version=self.study_version, - ) - ) - return commands - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/create_st_storage.py b/antarest/study/storage/variantstudy/model/command/create_st_storage.py index a3c16195ad..6bd07f5c50 100644 --- a/antarest/study/storage/variantstudy/model/command/create_st_storage.py +++ b/antarest/study/storage/variantstudy/model/command/create_st_storage.py @@ -271,76 +271,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - """Returns the command signature.""" - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.area_id - + MATCH_SIGNATURE_SEPARATOR - + self.storage_id - ) - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - """ - Checks if the current instance matches another `ICommand` object. - - Args: - other: Another `ICommand` object to compare against. - equal: Flag indicating whether to perform a deep comparison. - - Returns: - bool: `True` if the current instance matches the other object, `False` otherwise. - """ - if not isinstance(other, CreateSTStorage): - return False - if equal: - # Deep comparison - return self.__eq__(other) - else: - return self.area_id == other.area_id and self.storage_id == other.storage_id - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - """ - Creates a list of commands representing the differences between - the current instance and another `ICommand` object. - - Args: - other: Another ICommand object to compare against. - - Returns: - A list of commands representing the differences between - the two `ICommand` objects. - """ - from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix - from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig - - other = t.cast(CreateSTStorage, other) - commands: t.List[ICommand] = [ - ReplaceMatrix( - target=f"input/st-storage/series/{self.area_id}/{self.storage_id}/{attr}", - matrix=strip_matrix_protocol(getattr(other, attr)), - command_context=self.command_context, - study_version=self.study_version, - ) - for attr in _MATRIX_NAMES - if getattr(self, attr) != getattr(other, attr) - ] - if self.parameters != other.parameters: - data: t.Dict[str, t.Any] = other.parameters.model_dump(mode="json", by_alias=True, exclude={"id"}) - commands.append( - UpdateConfig( - target=f"input/st-storage/clusters/{self.area_id}/list/{self.storage_id}", - data=data, - command_context=self.command_context, - study_version=self.study_version, - ) - ) - return commands - @override def get_inner_matrices(self) -> t.List[str]: """ diff --git a/antarest/study/storage/variantstudy/model/command/create_user_resource.py b/antarest/study/storage/variantstudy/model/command/create_user_resource.py index 869b896f2b..7274df3e13 100644 --- a/antarest/study/storage/variantstudy/model/command/create_user_resource.py +++ b/antarest/study/storage/variantstudy/model/command/create_user_resource.py @@ -86,26 +86,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.data.path - + MATCH_SIGNATURE_SEPARATOR - + self.data.resource_type.value - ) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, CreateUserResource): - return False - return self.data.path == other.data.path and self.data.resource_type == other.data.resource_type - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py b/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py index b799940916..977e5d21b2 100644 --- a/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py +++ b/antarest/study/storage/variantstudy/model/command/generate_thermal_cluster_timeseries.py @@ -148,22 +148,6 @@ def _build_timeseries( def to_dto(self) -> CommandDTO: return CommandDTO(action=self.command_name.value, args={}, study_version=self.study_version) - @override - def match_signature(self) -> str: - return str(self.command_name.value) - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - # Only used inside the cli app that no one uses I believe. - if not isinstance(other, GenerateThermalClusterTimeSeries): - return False - return True - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - # Only used inside the cli app that no one uses I believe. - raise NotImplementedError() - @override def get_inner_matrices(self) -> t.List[str]: # This is used to get used matrices and not remove them inside the garbage collector loop. diff --git a/antarest/study/storage/variantstudy/model/command/icommand.py b/antarest/study/storage/variantstudy/model/command/icommand.py index a12fd6cf2b..018729799b 100644 --- a/antarest/study/storage/variantstudy/model/command/icommand.py +++ b/antarest/study/storage/variantstudy/model/command/icommand.py @@ -27,9 +27,6 @@ from antarest.study.storage.variantstudy.model.command_listener.command_listener import ICommandListener from antarest.study.storage.variantstudy.model.model import CommandDTO -if t.TYPE_CHECKING: # False at runtime, for mypy - from antarest.study.storage.variantstudy.business.command_extractor import CommandExtractor - MATCH_SIGNATURE_SEPARATOR = "%" logger = logging.getLogger(__name__) @@ -125,75 +122,9 @@ def to_dto(self) -> CommandDTO: """ raise NotImplementedError() - @abstractmethod - def match_signature(self) -> str: - """Returns the command signature.""" - raise NotImplementedError() - - def match(self, other: "ICommand", equal: bool = False) -> bool: - """ - Indicate if the other command is the same type and targets the same element. - - Args: - other: other command to match against - equal: indicate if the match must check for param equality - - Returns: True if the command match with the other else False - """ - if not isinstance(other, self.__class__): - return False - excluded_fields = set(ICommand.model_fields) - this_values = self.model_dump(mode="json", exclude=excluded_fields) - that_values = other.model_dump(mode="json", exclude=excluded_fields) - return this_values == that_values - - @abstractmethod - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - """ - Creates a list of commands representing the differences between - the current instance and another `ICommand` object. - - Args: - other: Another ICommand object to compare against. - - Returns: - A list of commands representing the differences between - the two `ICommand` objects. - """ - raise NotImplementedError() - - def create_diff(self, other: "ICommand") -> t.List["ICommand"]: - """ - Creates a list of commands representing the differences between - the current instance and another `ICommand` object. - - Args: - other: Another ICommand object to compare against. - - Returns: - A list of commands representing the differences between - the two `ICommand` objects. - """ - assert_this(self.match(other)) - return self._create_diff(other) - @abstractmethod def get_inner_matrices(self) -> t.List[str]: """ Retrieves the list of matrix IDs. """ raise NotImplementedError() - - def get_command_extractor(self) -> "CommandExtractor": - """ - Create a new `CommandExtractor` used to revert the command changes. - - Returns: - An instance of `CommandExtractor`. - """ - from antarest.study.storage.variantstudy.business.command_extractor import CommandExtractor - - return CommandExtractor( - self.command_context.matrix_service, - self.command_context.patch_service, - ) diff --git a/antarest/study/storage/variantstudy/model/command/remove_area.py b/antarest/study/storage/variantstudy/model/command/remove_area.py index ec4e491ead..2d52e98cae 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_area.py +++ b/antarest/study/storage/variantstudy/model/command/remove_area.py @@ -295,18 +295,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.id) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - return isinstance(other, RemoveArea) and self.id == other.id - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py index 482ffc5a1b..6d63fb5828 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/remove_binding_constraint.py @@ -90,20 +90,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.id) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveBindingConstraint): - return False - return self.id == other.id - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_cluster.py b/antarest/study/storage/variantstudy/model/command/remove_cluster.py index 3fe682ead9..0aa6d915a6 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/remove_cluster.py @@ -151,26 +151,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.cluster_id - + MATCH_SIGNATURE_SEPARATOR - + self.area_id - ) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveCluster): - return False - return self.cluster_id == other.cluster_id and self.area_id == other.area_id - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_district.py b/antarest/study/storage/variantstudy/model/command/remove_district.py index 421d1deca3..ddf5730712 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_district.py +++ b/antarest/study/storage/variantstudy/model/command/remove_district.py @@ -59,20 +59,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.id) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveDistrict): - return False - return self.id == other.id - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_link.py b/antarest/study/storage/variantstudy/model/command/remove_link.py index 2f9b2fa7ef..1357cc9974 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_link.py +++ b/antarest/study/storage/variantstudy/model/command/remove_link.py @@ -162,21 +162,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - sep = MATCH_SIGNATURE_SEPARATOR - return f"{self.command_name.value}{sep}{self.area1}{sep}{self.area2}" - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveLink): - return False - return self.area1 == other.area1 and self.area2 == other.area2 - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py b/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py index 0415276eb9..f8dfacadc5 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py +++ b/antarest/study/storage/variantstudy/model/command/remove_multiple_binding_constraints.py @@ -95,20 +95,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + ",".join(self.ids)) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveMultipleBindingConstraints): - return False - return self.ids == other.ids - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py b/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py index 5947889bbe..0741bb47e4 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py +++ b/antarest/study/storage/variantstudy/model/command/remove_renewables_cluster.py @@ -143,26 +143,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.cluster_id - + MATCH_SIGNATURE_SEPARATOR - + self.area_id - ) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveRenewablesCluster): - return False - return self.cluster_id == other.cluster_id and self.area_id == other.area_id - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_st_storage.py b/antarest/study/storage/variantstudy/model/command/remove_st_storage.py index a5a420a362..c387e3adde 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_st_storage.py +++ b/antarest/study/storage/variantstudy/model/command/remove_st_storage.py @@ -147,27 +147,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - """Returns the command signature.""" - return str( - self.command_name.value - + MATCH_SIGNATURE_SEPARATOR - + self.area_id - + MATCH_SIGNATURE_SEPARATOR - + self.storage_id - ) - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - # always perform a deep comparison, as there are no parameters - # or matrices, so that shallow and deep comparisons are identical. - return self.__eq__(other) - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/remove_user_resource.py b/antarest/study/storage/variantstudy/model/command/remove_user_resource.py index 7081163625..d626c031fe 100644 --- a/antarest/study/storage/variantstudy/model/command/remove_user_resource.py +++ b/antarest/study/storage/variantstudy/model/command/remove_user_resource.py @@ -74,20 +74,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.data.path) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, RemoveUserResource): - return False - return self.data.path == other.data.path - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/replace_matrix.py b/antarest/study/storage/variantstudy/model/command/replace_matrix.py index aaceb7c3f7..1f2a28dd4e 100644 --- a/antarest/study/storage/variantstudy/model/command/replace_matrix.py +++ b/antarest/study/storage/variantstudy/model/command/replace_matrix.py @@ -103,22 +103,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.target) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, ReplaceMatrix): - return False - if equal: - return self.target == other.target and self.matrix == other.matrix - return self.target == other.target - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> t.List[str]: assert_this(isinstance(self.matrix, str)) diff --git a/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py b/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py index 35715ed293..d55d4721d3 100644 --- a/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py +++ b/antarest/study/storage/variantstudy/model/command/update_binding_constraint.py @@ -218,19 +218,3 @@ def to_dto(self) -> CommandDTO: return CommandDTO( action=self.command_name.value, args=json_command, version=self.version, study_version=self.study_version ) - - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.id) - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [other] - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - if not isinstance(other, self.__class__): - return False - if not equal: - return self.id == other.id - return super().match(other, equal) diff --git a/antarest/study/storage/variantstudy/model/command/update_comments.py b/antarest/study/storage/variantstudy/model/command/update_comments.py index 2288414463..a73e3c36a6 100644 --- a/antarest/study/storage/variantstudy/model/command/update_comments.py +++ b/antarest/study/storage/variantstudy/model/command/update_comments.py @@ -68,20 +68,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, UpdateComments): - return False - return not equal or (self.comments == other.comments and equal) - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/update_config.py b/antarest/study/storage/variantstudy/model/command/update_config.py index e53ed7edfe..605c215871 100644 --- a/antarest/study/storage/variantstudy/model/command/update_config.py +++ b/antarest/study/storage/variantstudy/model/command/update_config.py @@ -92,23 +92,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.target) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, UpdateConfig): - return False - simple_match = self.target == other.target - if not equal: - return simple_match - return simple_match and self.data == other.data - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/update_district.py b/antarest/study/storage/variantstudy/model/command/update_district.py index d6a65bd16b..d41bbc6f31 100644 --- a/antarest/study/storage/variantstudy/model/command/update_district.py +++ b/antarest/study/storage/variantstudy/model/command/update_district.py @@ -108,29 +108,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.id) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, UpdateDistrict): - return False - simple_match = self.id == other.id - if not equal: - return simple_match - return ( - simple_match - and self.base_filter == other.base_filter - and self.filter_items == other.filter_items - and self.output == other.output - and self.comments == other.comments - ) - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/update_link.py b/antarest/study/storage/variantstudy/model/command/update_link.py index 1aaa2d5327..17d52f91ef 100644 --- a/antarest/study/storage/variantstudy/model/command/update_link.py +++ b/antarest/study/storage/variantstudy/model/command/update_link.py @@ -73,14 +73,6 @@ def _apply(self, study_data: FileStudy, listener: t.Optional[ICommandListener] = def to_dto(self) -> CommandDTO: return super().to_dto() - @override - def match_signature(self) -> str: - return super().match_signature() - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return super()._create_diff(other) - @override def get_inner_matrices(self) -> t.List[str]: return super().get_inner_matrices() diff --git a/antarest/study/storage/variantstudy/model/command/update_playlist.py b/antarest/study/storage/variantstudy/model/command/update_playlist.py index 39fcf3d1dd..89fcd985c7 100644 --- a/antarest/study/storage/variantstudy/model/command/update_playlist.py +++ b/antarest/study/storage/variantstudy/model/command/update_playlist.py @@ -70,27 +70,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return CommandName.UPDATE_PLAYLIST.name - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - if not isinstance(other, UpdatePlaylist): - return False - if equal: - return ( - self.active == other.active - and self.reverse == other.reverse - and self.items == other.items - and self.weights == other.weights - ) - return True - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/update_raw_file.py b/antarest/study/storage/variantstudy/model/command/update_raw_file.py index 0e8efb2392..c085e6753b 100644 --- a/antarest/study/storage/variantstudy/model/command/update_raw_file.py +++ b/antarest/study/storage/variantstudy/model/command/update_raw_file.py @@ -76,23 +76,6 @@ def to_dto(self) -> CommandDTO: study_version=self.study_version, ) - @override - def match_signature(self) -> str: - return str(self.command_name.value + MATCH_SIGNATURE_SEPARATOR + self.target) - - @override - def match(self, other: ICommand, equal: bool = False) -> bool: - if not isinstance(other, UpdateRawFile): - return False - simple_match = self.target == other.target - if not equal: - return simple_match - return simple_match and self.b64Data == other.b64Data - - @override - def _create_diff(self, other: "ICommand") -> List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> List[str]: return [] diff --git a/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py b/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py index 6ae373e238..871a2f3995 100644 --- a/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py +++ b/antarest/study/storage/variantstudy/model/command/update_scenario_builder.py @@ -107,22 +107,6 @@ def to_dto(self) -> CommandDTO: action=CommandName.UPDATE_SCENARIO_BUILDER.value, args={"data": self.data}, study_version=self.study_version ) - @override - def match_signature(self) -> str: - return CommandName.UPDATE_SCENARIO_BUILDER.value - - @override - def match(self, other: "ICommand", equal: bool = False) -> bool: - if not isinstance(other, UpdateScenarioBuilder): - return False - if equal: - return self.data == other.data - return True - - @override - def _create_diff(self, other: "ICommand") -> t.List["ICommand"]: - return [other] - @override def get_inner_matrices(self) -> t.List[str]: return [] diff --git a/antarest/study/storage/variantstudy/variant_command_extractor.py b/antarest/study/storage/variantstudy/variant_command_extractor.py deleted file mode 100644 index 7515e0147e..0000000000 --- a/antarest/study/storage/variantstudy/variant_command_extractor.py +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright (c) 2025, RTE (https://www.rte-france.com) -# -# See AUTHORS.txt -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# SPDX-License-Identifier: MPL-2.0 -# -# This file is part of the Antares project. - -import logging -from typing import List, Tuple - -from antarest.core.utils.utils import StopWatch -from antarest.matrixstore.service import ISimpleMatrixService -from antarest.study.storage.patch_service import PatchService -from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_extractor import CommandExtractor -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter -from antarest.study.storage.variantstudy.business.matrix_constants_generator import GeneratorMatrixConstants -from antarest.study.storage.variantstudy.command_factory import CommandFactory -from antarest.study.storage.variantstudy.model.command.common import CommandName -from antarest.study.storage.variantstudy.model.command.icommand import ICommand -from antarest.study.storage.variantstudy.model.model import CommandDTO - -logger = logging.getLogger(__name__) - - -class VariantCommandsExtractor: - def __init__(self, matrix_service: ISimpleMatrixService, patch_service: PatchService): - self.matrix_service = matrix_service - self.generator_matrix_constants = GeneratorMatrixConstants(self.matrix_service) - self.generator_matrix_constants.init_constant_matrices() - self.command_extractor = CommandExtractor(self.matrix_service, patch_service=patch_service) - - def extract(self, study: FileStudy) -> List[CommandDTO]: - stopwatch = StopWatch() - study_tree = study.tree - study_config = study.config - # noinspection SpellCheckingInspection - study_commands: List[ICommand] = [ - self.command_extractor.generate_update_config(study_tree, ["settings", "generaldata"]), - self.command_extractor.generate_update_config( - study_tree, - ["settings", "scenariobuilder"], - ), - self.command_extractor.generate_update_config(study_tree, ["layers", "layers"]), - ] - - stopwatch.log_elapsed(lambda x: logger.info(f"General command extraction done in {x}s")) - - all_links_commands: List[ICommand] = [] - for area_id in study_config.areas: - ( - area_commands, - links_commands, - ) = self.command_extractor.extract_area(study, area_id) - study_commands += area_commands - all_links_commands += links_commands - study_commands += all_links_commands - - # correlations - for cat in ["load", "wind", "solar", "hydro"]: - study_commands.append( - self.command_extractor.generate_update_config( - study_tree, - ["input", cat, "prepro", "correlation"], - ) - ) - - # sets and all area config (weird it is found in thermal..) - study_commands.append( - self.command_extractor.generate_update_config( - study_tree, - ["input", "thermal", "areas"], - ) - ) - for set_id in study_config.sets: - study_commands += self.command_extractor.extract_district(study, set_id) - - # binding constraints - # noinspection SpellCheckingInspection - binding_config = study_tree.get(["input", "bindingconstraints", "bindingconstraints"]) - for binding_id, binding_data in binding_config.items(): - study_commands += self.command_extractor.extract_binding_constraint(study, binding_id, binding_data) - - stopwatch.log_elapsed(lambda x: logger.info(f"Binding command extraction done in {x}s")) - - stopwatch.log_elapsed(lambda x: logger.info(f"Command extraction done in {x}s"), True) - - study_commands += self.command_extractor.extract_comments(study=study) - return [command.to_dto() for command in study_commands] - - def diff( - self, - base: List[CommandDTO], - variant: List[CommandDTO], - empty_study: FileStudy, - ) -> List[ICommand]: - stopwatch = StopWatch() - command_factory = CommandFactory( - generator_matrix_constants=self.generator_matrix_constants, - matrix_service=self.matrix_service, - patch_service=self.command_extractor.patch_service, - ) - - logger.info("Parsing commands") - base_commands = command_factory.to_commands(base) - stopwatch.log_elapsed(lambda x: logger.info(f"Base commands parsed in {x}s")) - variant_commands = command_factory.to_commands(variant) - stopwatch.log_elapsed(lambda x: logger.info(f"Variant commands parsed in {x}s")) - - logger.info("Computing commands diff") - added_commands: List[Tuple[int, ICommand]] = [] - missing_commands: List[Tuple[ICommand, int]] = [] - modified_commands: List[Tuple[int, ICommand, ICommand]] = [] - for order, variant_command in enumerate(variant_commands, start=11): - for base_command in base_commands: - if variant_command.match(base_command): - if not variant_command.match(base_command, True): - modified_commands.append((order, variant_command, base_command)) - break - else: - # not found - added_commands.append((order, variant_command)) - stopwatch.log_elapsed(lambda x: logger.info(f"First diff pass done in {x}s")) - logger.info(f"Found {len(added_commands)} added commands") - logger.info(f"Found {len(modified_commands)} modified commands") - for index, base_command in enumerate(base_commands): - found = any(base_command.match(variant_command) for variant_command in variant_commands) - if not found: - missing_commands.append((base_command, index)) - stopwatch.log_elapsed(lambda x: logger.info(f"Second diff pass done in {x}s")) - logger.info(f"Found {len(missing_commands)} missing commands") - - first_commands: List[Tuple[int, ICommand]] = [] - last_commands: List[Tuple[int, ICommand]] = [] - logger.info("Computing new diff commands") - for command_obj, index in missing_commands: - logger.info(f"Reverting {command_obj.match_signature()}") - if command_obj.command_name == CommandName.REMOVE_AREA: - command_list = first_commands - priority = 0 - elif command_obj.command_name in [ - CommandName.REMOVE_LINK, - CommandName.REMOVE_THERMAL_CLUSTER, - CommandName.REMOVE_RENEWABLES_CLUSTER, - CommandName.REMOVE_ST_STORAGE, - ]: - command_list = first_commands - priority = 1 - elif command_obj.command_name in [ - CommandName.UPDATE_CONFIG, - CommandName.REPLACE_MATRIX, - CommandName.UPDATE_COMMENTS, - ]: - command_list = first_commands - priority = 2 - elif command_obj.command_name == CommandName.CREATE_AREA: - command_list = last_commands - priority = 3 - elif command_obj.command_name in [ - CommandName.CREATE_ST_STORAGE, - CommandName.CREATE_RENEWABLES_CLUSTER, - CommandName.CREATE_THERMAL_CLUSTER, - CommandName.CREATE_LINK, - ]: - command_list = last_commands - priority = 2 - elif command_obj.command_name in [ - CommandName.CREATE_BINDING_CONSTRAINT, - CommandName.CREATE_DISTRICT, - ]: - command_list = last_commands - priority = 1 - else: - command_list = first_commands - priority = 3 - - # noinspection SpellCheckingInspection - command_reverter = CommandReverter() - command_list.extend( - [ - (priority, command) - for command in command_reverter.revert( - command_obj, - history=base_commands[:index], - base=empty_study, - ) - ] - ) - for order, variant_command, base_command in modified_commands: - logger.info(f"Generating diff command for {variant_command.match_signature()}") - first_commands += [(order, command) for command in base_command.create_diff(variant_command)] - for ordered_command in added_commands: - first_commands.append(ordered_command) - - first_commands.sort(key=lambda x: x[0]) - last_commands.sort(key=lambda x: x[0]) - - diff_commands = [ordered_command[1] for ordered_command in first_commands] + [ - ordered_command[1] for ordered_command in last_commands - ] - stopwatch.log_elapsed( - lambda x: logger.info(f"Diff commands generation done in {x}s"), - since_start=True, - ) - logger.info(f"Diff commands total : {len(diff_commands)}") - return diff_commands diff --git a/antarest/tools/cli.py b/antarest/tools/cli.py deleted file mode 100644 index aa6b733bde..0000000000 --- a/antarest/tools/cli.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright (c) 2025, RTE (https://www.rte-france.com) -# -# See AUTHORS.txt -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# SPDX-License-Identifier: MPL-2.0 -# -# This file is part of the Antares project. - -import logging -from pathlib import Path -from typing import Optional - -import click -from antares.study.version import StudyVersion - -from antarest.study.model import NEW_DEFAULT_STUDY_VERSION -from antarest.study.storage.study_upgrader import StudyUpgrader -from antarest.tools.lib import create_http_client, extract_commands, generate_diff, generate_study - - -@click.group(context_settings={"max_content_width": 120}) -def commands() -> None: - logging.basicConfig(level=logging.INFO) - - -@commands.command("apply-script") -@click.option( - "--host", - "-h", - nargs=1, - required=False, - type=str, - help="Host URL of the antares web instance", -) -@click.option( - "--auth_token", - nargs=1, - required=False, - default=None, - type=str, - help="Authentication token if server needs one", -) -@click.option( - "--no-verify", - is_flag=True, - default=False, - help="Disables SSL certificate verification", -) -@click.option( - "--output", - "-o", - nargs=1, - required=False, - type=str, - help="Output study path", -) -@click.option( - "--input", - "-i", - nargs=1, - required=True, - type=click.Path(exists=True), - help="Variant script source path", -) -@click.option( - "--study_id", - "-s", - nargs=1, - required=False, - type=str, - help="ID of the variant to apply the script onto", -) -@click.option( - "--version", - "-v", - nargs=1, - required=False, - type=str, - help=f"Study version. Default:{NEW_DEFAULT_STUDY_VERSION}", - default=f"{NEW_DEFAULT_STUDY_VERSION:ddd}", -) -def cli_apply_script( - input: str, - study_id: Optional[str], - output: Optional[str], - host: Optional[str], - auth_token: Optional[str], - no_verify: bool, - version: str, -) -> None: - """Apply a variant script onto an AntaresWeb study variant""" - if output is None and host is None: - print("--output or --host must be set") - exit(1) - if output is not None and host is not None: - print("only --output or --host must be set") - exit(1) - if host is not None and study_id is None: - print("--study_id must be set") - exit(1) - study_version = StudyVersion.parse(version) - client = None - if host: - client = create_http_client(verify=not no_verify, auth_token=auth_token) - res = generate_study(Path(input), study_id, output, host, client, study_version) - print(res) - - -@commands.command("generate-script") -@click.option( - "--input", - "-i", - nargs=1, - required=True, - type=click.Path(exists=True), - help="Study path", -) -@click.option( - "--output", - "-o", - nargs=1, - required=True, - type=click.Path(exists=False), - help="Script output path", -) -def cli_generate_script(input: str, output: str) -> None: - """Generate variant script commands from a study""" - extract_commands(Path(input), Path(output)) - - -@commands.command("generate-script-diff") -@click.option( - "--base", - nargs=1, - required=True, - type=click.Path(exists=True), - help="Base study path", -) -@click.option( - "--variant", - nargs=1, - required=True, - type=click.Path(exists=True), - help="Variant study path", -) -@click.option( - "--output", - "-o", - nargs=1, - required=True, - type=click.Path(exists=False), - help="Script output path", -) -@click.option( - "--version", - "-v", - nargs=1, - required=False, - type=str, - help=f"Study version. Default:{NEW_DEFAULT_STUDY_VERSION}", - default=f"{NEW_DEFAULT_STUDY_VERSION:ddd}", -) -def cli_generate_script_diff(base: str, variant: str, output: str, version: str) -> None: - """Generate variant script commands from two variant script directories""" - generate_diff(Path(base), Path(variant), Path(output), StudyVersion.parse(version)) - - -@commands.command("upgrade-study") -@click.argument( - "study-path", - nargs=1, - type=click.Path(exists=True, dir_okay=True, readable=True, writable=True), -) -@click.argument( - "target-version", - nargs=1, - type=click.STRING, -) -def cli_upgrade_study(study_path: Path, target_version: str) -> None: - """Upgrades study version - - STUDY_PATH is the path of the study you want to update - - TARGET_VERSION is the version you want your study to be at (example 8.4.0 or 840) - """ - study_upgrader = StudyUpgrader(study_path, target_version.replace(".", "")) - study_upgrader.upgrade() - - -if __name__ == "__main__": - commands() diff --git a/antarest/tools/lib.py b/antarest/tools/lib.py deleted file mode 100644 index 85b1c6c19c..0000000000 --- a/antarest/tools/lib.py +++ /dev/null @@ -1,378 +0,0 @@ -# Copyright (c) 2025, RTE (https://www.rte-france.com) -# -# See AUTHORS.txt -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# SPDX-License-Identifier: MPL-2.0 -# -# This file is part of the Antares project. - -import json -import logging -import os -import shutil -from abc import ABC, abstractmethod -from pathlib import Path -from typing import List, Optional, Set, Union -from zipfile import ZipFile - -import numpy as np -from antares.study.version import StudyVersion -from httpx import Client -from typing_extensions import override - -from antarest.core.cache.business.local_chache import LocalCache -from antarest.core.config import CacheConfig -from antarest.core.serialization import from_json, to_json_string -from antarest.core.tasks.model import TaskDTO -from antarest.core.utils.utils import StopWatch, get_local_path -from antarest.matrixstore.repository import MatrixContentRepository -from antarest.matrixstore.service import SimpleMatrixService -from antarest.matrixstore.uri_resolver_service import UriResolverService -from antarest.study.model import NEW_DEFAULT_STUDY_VERSION, STUDY_REFERENCE_TEMPLATES -from antarest.study.storage.patch_service import PatchService -from antarest.study.storage.rawstudy.model.filesystem.factory import StudyFactory -from antarest.study.storage.utils import create_new_empty_study -from antarest.study.storage.variantstudy.business.matrix_constants_generator import GeneratorMatrixConstants -from antarest.study.storage.variantstudy.command_factory import CommandFactory -from antarest.study.storage.variantstudy.model.command.icommand import ICommand -from antarest.study.storage.variantstudy.model.model import CommandDTO, CommandDTOAPI, GenerationResultInfoDTO -from antarest.study.storage.variantstudy.variant_command_extractor import VariantCommandsExtractor -from antarest.study.storage.variantstudy.variant_command_generator import VariantCommandGenerator - -logger = logging.getLogger(__name__) -COMMAND_FILE = "commands.json" -MATRIX_STORE_DIR = "matrices" - - -class IVariantGenerator(ABC): - @abstractmethod - def apply_commands(self, commands: List[CommandDTO], matrices_dir: Path) -> GenerationResultInfoDTO: - raise NotImplementedError() - - -def set_auth_token(client: Client, auth_token: Optional[str] = None) -> Client: - if auth_token is not None: - client.headers.update({"Authorization": f"Bearer {auth_token}"}) - return client - - -def create_http_client(verify: bool, auth_token: Optional[str] = None) -> Client: - client = Client(verify=verify) - set_auth_token(client, auth_token) - return client - - -class RemoteVariantGenerator(IVariantGenerator): - def __init__( - self, - study_id: str, - host: str, - session: Client, - ): - self.study_id = study_id - self.session = session - self.host = host - - @override - def apply_commands( - self, - commands: List[CommandDTO], - matrices_dir: Path, - ) -> GenerationResultInfoDTO: - stopwatch = StopWatch() - - logger.info("Uploading matrices") - matrix_dataset: List[str] = [] - for matrix_file in matrices_dir.iterdir(): - matrix = np.loadtxt(matrix_file, delimiter="\t", dtype=np.float64, ndmin=2) - matrix = matrix.reshape((1, 0)) if matrix.size == 0 else matrix - matrix_data = matrix.tolist() - res = self.session.post(self.build_url("/v1/matrix"), json=matrix_data) - res.raise_for_status() - matrix_id = res.json() - matrix_dataset.append(matrix_id) - - # TODO could create a dataset from theses matrices using "variant_" as name - # also the matrix could be named after the command name where they are used - stopwatch.log_elapsed(lambda x: logger.info(f"Matrix upload done in {x}s")) - - res = self.session.post( - self.build_url(f"/v1/studies/{self.study_id}/commands"), - json=[command.model_dump() for command in commands], - ) - res.raise_for_status() - stopwatch.log_elapsed(lambda x: logger.info(f"Command upload done in {x}s")) - - res = self.session.put(self.build_url(f"/v1/studies/{self.study_id}/generate?denormalize=true")) - res.raise_for_status() - - task_id = res.json() - res = self.session.get(self.build_url(f"/v1/tasks/{task_id}?wait_for_completion=true")) - res.raise_for_status() - - stopwatch.log_elapsed(lambda x: logger.info(f"Generation done in {x}s")) - task_result = TaskDTO(**res.json()) - - if task_result.result is None or task_result.result.return_value is None: # pragma: no cover - # This should not happen, but if it does, we return a failed result - return GenerationResultInfoDTO(success=False, details=[]) - - info = from_json(task_result.result.return_value) - return GenerationResultInfoDTO(**info) - - def build_url(self, url: str) -> str: - return url if self.host is None else f"{self.host.strip('/')}/{url.strip('/')}" - - -class LocalVariantGenerator(IVariantGenerator): - def __init__(self, output_path: Path): - self.output_path = output_path - - def render_template(self, study_version: StudyVersion = NEW_DEFAULT_STUDY_VERSION) -> None: - version_template = STUDY_REFERENCE_TEMPLATES[study_version] - empty_study_zip = get_local_path() / "resources" / version_template - with ZipFile(empty_study_zip) as zip_output: - zip_output.extractall(path=self.output_path) - # remove preexisting sets - sets_ini = self.output_path.joinpath("input/areas/sets.ini") - sets_ini.write_bytes(b"") - - @override - def apply_commands(self, commands: List[CommandDTO], matrices_dir: Path) -> GenerationResultInfoDTO: - stopwatch = StopWatch() - matrix_content_repository = MatrixContentRepository( - bucket_dir=matrices_dir, - ) - matrix_service = SimpleMatrixService( - matrix_content_repository=matrix_content_repository, - ) - matrix_resolver = UriResolverService(matrix_service) - local_cache = LocalCache(CacheConfig()) - study_factory = StudyFactory( - matrix=matrix_service, - resolver=matrix_resolver, - cache=local_cache, - ) - generator = VariantCommandGenerator(study_factory) - generator_matrix_constants = GeneratorMatrixConstants(matrix_service) - generator_matrix_constants.init_constant_matrices() - command_factory = CommandFactory( - generator_matrix_constants=generator_matrix_constants, - matrix_service=matrix_service, - patch_service=PatchService(), - ) - - command_objs: List[List[ICommand]] = [] - logger.info("Parsing command objects...") - command_objs.extend(command_factory.to_command(command_block) for command_block in commands) - stopwatch.log_elapsed(lambda x: logger.info(f"Command objects parsed in {x}s")) - result = generator.generate(command_objs, self.output_path, delete_on_failure=False) - if result.success: - # sourcery skip: extract-method - logger.info("Building new study tree...") - study = study_factory.create_from_fs(self.output_path, study_id="", use_cache=False) - logger.info("Denormalize study...") - stopwatch.reset_current() - study.tree.denormalize() - stopwatch.log_elapsed(lambda x: logger.info(f"Denormalized done in {x}s")) - return result - - -def extract_commands(study_path: Path, commands_output_dir: Path) -> None: - if not commands_output_dir.exists(): - commands_output_dir.mkdir(parents=True) - matrices_dir = commands_output_dir / MATRIX_STORE_DIR - matrices_dir.mkdir() - matrix_content_repository = MatrixContentRepository( - bucket_dir=matrices_dir, - ) - matrix_service = SimpleMatrixService( - matrix_content_repository=matrix_content_repository, - ) - matrix_resolver = UriResolverService(matrix_service) - cache = LocalCache(CacheConfig()) - study_factory = StudyFactory( - matrix=matrix_service, - resolver=matrix_resolver, - cache=cache, - ) - - study = study_factory.create_from_fs(study_path, str(study_path), use_cache=False) - matrix_content_repository = MatrixContentRepository( - bucket_dir=matrices_dir, - ) - local_matrix_service = SimpleMatrixService( - matrix_content_repository=matrix_content_repository, - ) - extractor = VariantCommandsExtractor(local_matrix_service, patch_service=PatchService()) - command_list = extractor.extract(study) - - (commands_output_dir / COMMAND_FILE).write_text( - to_json_string([command.model_dump(exclude={"id"}) for command in command_list], indent=2) - ) - - -def generate_diff( - base: Path, - variant: Path, - output_dir: Path, - study_version: StudyVersion = NEW_DEFAULT_STUDY_VERSION, -) -> None: - """ - Generate variant script commands from two variant script directories. - - This function generates a set of commands that can be used to transform - the base study into the variant study, based on the differences between the two. - It does this by comparing the command files in each study directory - and extracting the differences between them. - - Args: - base: The directory of the base study. - variant: The directory of the variant study. - output_dir: The output directory where the generated commands will be saved. - study_version: The version of the generated study. - - Raises: - FileNotFoundError: If the base or variant study's command file is missing. - - Returns: - None. The generated commands are written to a JSON file in the specified output directory. - """ - if not output_dir.exists(): - output_dir.mkdir(parents=True) - matrices_dir = output_dir / MATRIX_STORE_DIR - matrices_dir.mkdir(exist_ok=True) - - study_id = "empty_base" - path_study = output_dir / study_id - - matrix_content_repository = MatrixContentRepository( - bucket_dir=matrices_dir, - ) - local_matrix_service = SimpleMatrixService( - matrix_content_repository=matrix_content_repository, - ) - resolver = UriResolverService(matrix_service=local_matrix_service) - - cache = LocalCache() - study_factory = StudyFactory(matrix=local_matrix_service, resolver=resolver, cache=cache) - - create_new_empty_study( - version=study_version, - path_study=path_study, - path_resources=get_local_path() / "resources", - ) - - empty_study = study_factory.create_from_fs(path_study, study_id) - - base_command_file = base / COMMAND_FILE - if not base_command_file.exists(): - raise FileNotFoundError(f"Missing {COMMAND_FILE}") - variant_command_file = variant / COMMAND_FILE - if not variant_command_file.exists(): - raise FileNotFoundError(f"Missing {COMMAND_FILE}") - - stopwatch = StopWatch() - logger.info("Copying input matrices") - if (base / MATRIX_STORE_DIR).exists(): - for matrix_file in os.listdir(base / MATRIX_STORE_DIR): - shutil.copyfile( - base / MATRIX_STORE_DIR / matrix_file, - matrices_dir / matrix_file, - ) - stopwatch.log_elapsed(lambda x: logger.info(f"Base input matrix copied in {x}s")) - if (variant / MATRIX_STORE_DIR).exists(): - for matrix_file in os.listdir(variant / MATRIX_STORE_DIR): - shutil.copyfile( - variant / MATRIX_STORE_DIR / matrix_file, - matrices_dir / matrix_file, - ) - stopwatch.log_elapsed(lambda x: logger.info(f"Variant input matrix copied in {x}s")) - - study_version = empty_study.config.version - extractor = VariantCommandsExtractor(local_matrix_service, patch_service=PatchService()) - diff_commands = extractor.diff( - base=parse_commands(base_command_file, study_version), - variant=parse_commands(variant_command_file, study_version), - empty_study=empty_study, - ) - - (output_dir / COMMAND_FILE).write_text( - to_json_string([command.to_dto().model_dump(exclude={"id"}) for command in diff_commands], indent=2) - ) - - needed_matrices: Set[str] = set() - for command in diff_commands: - for matrix in command.get_inner_matrices(): - needed_matrices.add(f"{matrix}.tsv") - for matrix_file in os.listdir(matrices_dir): - if matrix_file not in needed_matrices: - os.unlink(matrices_dir / matrix_file) - - -def parse_commands(file: Path, study_version: StudyVersion) -> List[CommandDTO]: - stopwatch = StopWatch() - logger.info("Parsing commands script") - with open(file, "r") as fh: - json_commands = json.load(fh) - stopwatch.log_elapsed(lambda x: logger.info(f"Script file read in {x}s")) - - commands: List[CommandDTO] = [ - CommandDTO.model_validate({"study_version": study_version, **command}) for command in json_commands - ] - stopwatch.log_elapsed(lambda x: logger.info(f"Script commands parsed in {x}s")) - - return commands - - -def generate_study( - commands_dir: Path, - study_id: Optional[str], - output: Optional[str] = None, - host: Optional[str] = None, - session: Optional[Client] = None, - study_version: StudyVersion = NEW_DEFAULT_STUDY_VERSION, -) -> GenerationResultInfoDTO: - """ - Generate a new study or update an existing study by applying commands. - - Args: - commands_dir: The directory containing the command file and input matrices. - study_id: The ID of the base study to use for generating the new study. - If `host` is provided, this is ignored. - output: The output directory where the new study will be generated. - If `study_id` and `host` are not provided, this must be specified. - host: The URL of the Antares server to use for generating the new study. - If `study_id` is not provided, this is ignored. - session: The session to use when connecting to the Antares server. - If `host` is not provided, this is ignored. - study_version: The target version of the generated study. - - Returns: - GenerationResultInfoDTO: A data transfer object containing information about the generation result. - """ - generator: Union[RemoteVariantGenerator, LocalVariantGenerator] - - if study_id is not None and host is not None and session is not None: - generator = RemoteVariantGenerator(study_id, host, session) - elif output is None: - raise TypeError("'output' must be set") - else: - output_dir = Path(output) - generator = LocalVariantGenerator(output_dir) - if not output_dir.exists(): - output_dir.mkdir(parents=True) - generator.render_template(study_version) - # Apply commands from the commands dir - matrix_dir: Path = commands_dir / MATRIX_STORE_DIR - command_file = commands_dir / COMMAND_FILE - if matrix_dir and not matrix_dir.exists(): - matrix_dir.mkdir() - if not command_file.exists(): - raise FileNotFoundError(f"Missing {COMMAND_FILE}") - commands = parse_commands(command_file, study_version) - return generator.apply_commands(commands, matrix_dir) diff --git a/docs/developer-guide/architecture/0-introduction.md b/docs/developer-guide/architecture/0-introduction.md index a8a280741c..00805f01a5 100644 --- a/docs/developer-guide/architecture/0-introduction.md +++ b/docs/developer-guide/architecture/0-introduction.md @@ -15,7 +15,6 @@ method of launching the main application : - gui.py : define the application run as a desktop application - archive_worker_service.py : define a worker that unzip study results on remote windows nodes (see the deployment diagram) - admin.py : define a cli app to run administrative tasks (used on production deployments) -- cli.py : define a cli app with various utilities ## Main packages and services diff --git a/docs/user-guide/3-variant_manager.md b/docs/user-guide/3-variant_manager.md index 8b8ceb4ed7..43f55ab448 100644 --- a/docs/user-guide/3-variant_manager.md +++ b/docs/user-guide/3-variant_manager.md @@ -403,16 +403,3 @@ Coming soon ### Composite commands Coming soon - -## CLI Tool - -The CLI tool (`AntaresTool`) is bundled -within [AntaresWeb releases](https://github.com/AntaresSimulatorTeam/AntaREST/releases). - -It provides 3 commands : - -- `apply-script` will modify a study using commands found in a directory that contain a file `commands.json` and an - optional folder named `matrices` which contains matrices used in the commands. -- `generate-script` will transform a study into a commands file and matrices directory -- `generate-script-diff` will take two commands file (and associated matrices directory) and will output a new one - consisting of the differences between the two variants \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 3b3b9a3849..1490a75793 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,7 +75,7 @@ line-length = 120 exclude = "(antares-?launcher/*|alembic/*)" [tool.coverage.run] -omit = ["antarest/tools/cli.py", "antarest/tools/admin.py", "antarest/fastapi_jwt_auth/*.py"] +omit = ["antarest/tools/admin.py", "antarest/fastapi_jwt_auth/*.py"] relative_files = true # avoids absolute path issues in CI [tool.isort] diff --git a/resources/antares-desktop-fs/README.md b/resources/antares-desktop-fs/README.md index 1562196e02..9800c85ef7 100644 --- a/resources/antares-desktop-fs/README.md +++ b/resources/antares-desktop-fs/README.md @@ -41,20 +41,3 @@ http://127.0.0.1:8080 ``` This will connect you to the Antares Web server. - -## Using the Variant Manager Tool - -To use the variant manager tool, run the command: - -``` -./AntaresWeb/AntaresTool -``` - -The tool has the following subcommands: - -- `apply-script`: Apply a variant script onto an AntaresWeb study variant -- `generate-script`: Generate variant script commands from a study -- `generate-script-diff`: Generate variant script commands from two variant script directories -- `upgrade-study`: Upgrades study version - -Further instructions can be found in the online help. Use the `--help` option. diff --git a/scripts/package_antares_web.sh b/scripts/package_antares_web.sh index c51f217f95..9c1f8c3035 100755 --- a/scripts/package_antares_web.sh +++ b/scripts/package_antares_web.sh @@ -86,9 +86,7 @@ if [[ "$OSTYPE" == "msys"* ]]; then cp "${RESOURCES_DIR}/AntaresWebServerShortcut.lnk" "${DIST_DIR}" else echo "INFO: Updating executable permissions..." - for excutable in "${DIST_DIR}/AntaresWeb/AntaresWebServer" "${DIST_DIR}/AntaresWeb/AntaresTool"; do - chmod +x "${excutable}" - done + chmod +x "${DIST_DIR}/AntaresWeb/AntaresWebServer" fi echo "INFO: Unzipping example study..." diff --git a/tests/integration/assets/base_study.zip b/tests/integration/assets/base_study.zip deleted file mode 100644 index 3b282beb1693044a666fc204fee083eb453c18ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305876 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≶yk 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 diff --git a/tests/integration/assets/commands1.json b/tests/integration/assets/commands1.json deleted file mode 100644 index 8ce312b453..0000000000 --- a/tests/integration/assets/commands1.json +++ /dev/null @@ -1,146 +0,0 @@ -[ - { - "action": "create_area", - "args": [ - { - "area_name": "Area 1" - }, - { - "area_name": "Area2" - } - ] - }, - { - "action": "create_area", - "args": { - "area_name": "WEIRD" - } - }, - { - "action": "create_cluster", - "args": { - "area_id": "area 1", - "cluster_name": "gas cluster", - "parameters": { - "group": "Gas" - } - } - }, - { - "action": "create_cluster", - "args": { - "area_id": "area 1", - "cluster_name": "gas cluster 2", - "parameters": { - "group": "Gas", - "unitcount": 1, - "nominalcapacity": 500 - } - } - }, - { - "action": "create_cluster", - "args": { - "area_id": "area 1", - "cluster_name": "other", - "parameters": { - "group": "Other" - } - } - }, - { - "action": "create_cluster", - "args": { - "area_id": "area2", - "cluster_name": "TEST", - "parameters": { - "group": "Nuclear", - "unitcount": 1, - "nominalcapacity": 500 - } - } - }, - { - "action": "create_link", - "args": { - "area1": "area 1", - "area2": "area2", - "parameters": {} - } - }, - { - "action": "create_link", - "args": { - "area1": "area2", - "area2": "weird", - "parameters": {} - } - }, - { - "action": "create_binding_constraint", - "args": { - "name": "BD less hourly disabled", - "enabled": false, - "time_step": "hourly", - "operator": "less", - "coeffs": {} - } - }, - { - "action": "create_binding_constraint", - "args": { - "name": "BD less hourly no values", - "time_step": "hourly", - "operator": "less", - "coeffs": { - "area 1%area2": [500, 30] - } - } - }, - { - "action": "create_binding_constraint", - "args": { - "name": "BD less hourly", - "time_step": "hourly", - "operator": "less", - "coeffs": { - "area2%weird": [400] - } - } - }, - { - "action": "create_binding_constraint", - "args": { - "name": "BD less weekly", - "time_step": "weekly", - "operator": "less", - "coeffs": { - "area 1.gas cluster 2": [80] - } - } - }, - { - "action": "create_binding_constraint", - "args": { - "name": "BD both daily", - "time_step": "daily", - "operator": "both", - "coeffs": { - "area 1.other": [70], - "area2.test": [90] - } - } - }, - { - "action": "create_binding_constraint", - "args": { - "name": "BD equal hourly", - "time_step": "hourly", - "operator": "equal", - "coeffs": { - "area 1.other": [60], - "area2.test": [100] - } - } - } -] \ No newline at end of file diff --git a/tests/integration/assets/test_study.zip b/tests/integration/assets/test_study.zip deleted file mode 100644 index 8539204e2dfb2e7bb7488110f426d1cac8f51683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170517 zcmeEv1zeWd_AUa_0!lZc0us{QDxi`|2m-=KO1CtKNJ%P4hm@prcOxwz-3@{upoG+Y zzd-R^#+Y;F{Qtjub>?$)oNw>_uKnz_p7pG?-;tF-KtzKB|LA?d?MQaCFe zODlCtD{E~#CIxv^ID~?S*FoTqwJkc_Da30Vb^4H>WPw3&fv=%J2HD6iZ?gk_=LdZ7 zzaQkfj-{cMso52M6aBB_75(4ik+rg5)-q!VcL^kaJblAWL-+;;hOZ>q*=xbY4bPY4 zbLicNgL3yL_e1-!SZVyzF3Q>Q-4dnNd_qDS@vMzk{#|bG6W$c#ou#rJzURKL>n1k) zAAE2k@ENTuZuP;si;~R7p9=C2S4p77b4Bo#$Uw48!jNcwV`e1;evp%`arXNM(Kj)( zw)&|}P9BQjq@h3-Iv~rxIUvzr4+#3{kl*%=W@@D;7T7bvQ*dyXe>9}2nU%h=zCFlF z-_+!1Tj}Q~f>z6nExN@cilvcQyoJAVi=ao>2&pHW`6lh!r@~tVr_bI!taAw%&*4V# ztCwUGI3HwYsx-iR>+Jdh2<1TnLrQx=iN1)XlA|?UlUlC${$z3rN(a95rAFZe2G;lT zA80RU$vT)Y@dZ=4fAnL1RVMc)rC!cdu=iEVl1+R*>;0!5_6DSH@zJNWT9p;G>8n*K zmvu#D`QF(aFhvr4kKBhBItbMO3p@ip6hE?nwf@hZ+viHV?`)cEw!&Kuc8-ZOL>6Dk zlII(i>poLHkN7WK(4u7`d&9=g>9+p-5x?by%&7X7ck!B(!;gIEiQBxrW?3H*A>%!L zf_CbR$5U>%wntv@jIwV}5n)_(MY1>r_t!A}0TeX<^H9)a`hOM*ArBs7s{$|x_%ReT znf?U|CwRxNP+(?fo=-#UE){#F+PuTFBf2Ik9P{iMOK>RW9W5iI*-NMF=EPKaykDe> zHV7A*_G`r%|%6NM7#6KTy?FJc03+Ojhk zktLznZ8D$EzfGPpnp9@+mwxEZ2ZqaBDMDL(L4X^=W3KbNDt76<*hVU+f=R#k9j$WQ zGoRn_yksQz+G4z`|3>jqiSR)C)0Yp^R`=97nZEZzRTH#l?*T>t$IpvDHNx-UFP|NZ zzi;rP^oOEP^GE2zfS`{U9nTCY91f42RT1z*=oeiZ&7pn>7Xcji-_z=J3 zFn;RUqYgqEHQCnJ9vnvMiRmwDdp(-eKtzIf-bZQhKi1mIm+H~Syr9i2q7ZXQmt}?A zeB4JR9^%taj=VpBsR2VP7;onX~Xq@>)H1o1ahXzqBmm)|Jro}xin%p@o5HCyz46=z@$x;fky5%5XD zncm~W*&4PyL)1|n7wjyBjFO$K)Wd^$>}hX%guf;uoWJa#(i|L;HBiAlo)J8cWopN7|yK~Hs(v7iHjjEqdR zAng7(#?GzWypIn+9{i#CrLjRj!?%jcx0R@=p@Ap`C|S_ZzTbbQL~_&Ln^yBTr`0@Z zTH^z}I1=DV!5@ZSdRi#Re{*iw$vEM;Uj=4t{@wzhNc_zOz~Fnr0)Pkq`s2j73dNF^ zsj;!C$#3B3>!83det;v`xLP1Hke0sH@5mEyD3?sYmLo<6Qr*Aax__NO%R)z6-^$oj z+u8_nG%VFY-+7M{WDK@fc%y>^S_V)^)h|Rv1irdolhZ;(vD>zQR`DMAyjFMiyjcrDI|8b3}b; z6hQ^(Hez-asD4RZI@>+FA|yucEaZn>*y-={i2ulveu}8Sy(FPuN7eUM`ZYxT_t*7n zi2AK{eJbgDAqAl73MU*K$FJMV7-VZ^YNKQE3xI0LL4~8lMyyftd3J5NigU7NfrL5C z$6qJ+4#{qLXo#*1uITMw`TL#Bd-(6+_wTO#=g9l-to=m(e)4JlYWH7+=>Oga_(d%L za}QwM`dp0{K)wq#9NdXq`{W(4(6Q99cxbBsE6{JwIRi(Dflx#2;VoHnkbeI3Jx=bs zOzLzM&xW}A9CWd-qMU#7fBzJRMfN?;|Lv9j9O(bRO8I`>n|!nBFT(nN%W{7a#Q)ZE zPfo75f8Dw^ARzQBf{d(n{*_VwR_^;ZXZ#*}zcr)4-+RUrF!bM;_5>{a#kAj49EZ^H z!6?87l>#ab zfWId7NKMf8Bk8CK68;J%K*ke(}mxkq;ZjTBTvs;{4|`vrFoiO7bGo zTT2G+%)76TPO^912y6NvfA9kZ=Lde`k#$UTEcCwDnNG^y*qNE%f)h9@LRF81_u{=5Qj!0q4APtkXK@*r82tH_iJ>d_ z8B|oD|Ct&ZAUf(;0NJzE10y>|EmI5N=s;3WK#*X*!u+pF2(X5)KYniC->C-vo_#f$ z{)gDU$s_+j&ipzuATWNX;r#_k`TG-Cm|Fb(34U&ypU0KIyL3&a zf7mvfO#hZ`esKI@yZejY_GAP7pvv(5@c)*TetDLE*i^shDgUmiV8j2zrh?7#Z<*@E zx}TB0iQ(UMZzpz$K?nS~U;9P`I-lEWvIAN)wlNyqiJtgq$nP`E6L|KAw(liKksxFQ zk}yBch!@&3?-X}-BoBJhg%i3SuoL@<{rSfq6Z}EJpM&tn7yNODe*9tmqGE= z*V575B_h=`mS#bf2azB8ub=b5N_Qp=Q;7L&qiMLHqb)_tZbw(KW~)N=HW+73@H6eE z_LV?OWM^vRs~f}HUHx?{Bw*{DoEiLp{Qf*~{YHMLtorUY0|rk61m_gCh9 z*94^4kF}ns-(BK&0#TME1jQ%0DiW~H^NMFIZHzkZu@8rOCtet9T4{3Cw475hUU)c_ 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

JT`>b1Vq1X$0{l5j8P8cr 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 y3hZfJ`f+TeIEd1B!EL- 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 LB+vuz#e)0~TkdBx diff --git a/tests/integration/assets/variant_study.zip b/tests/integration/assets/variant_study.zip deleted file mode 100644 index 4526fc900f0abdfa80347895cd8880f9fe986eb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311282 zcmeEv1zeU%_cq-rodQaChk$fRhjcg6T?*2TfS`0EAV`S_A|)Y>w5X&sN{NE`-S>mR zt}Bba`|j)i`|<4FqV7I3XU<%6otQIoE1!df!-WDr&s2ESAiw$i3kDPgl)JIBwXwac zp^K}VnHQ^uIyw|0%z~V8lMs#hec*BPM1_KeI~USw4f#d+b6ZG|wqyt+!pwlSoPmev zyS60ET`ssfII>vVTYqgfq42`QTmPJi021wS`oK7ZWO4G8GM5sWFzQ&g1l^JptHq)7qqt;yubim>RjVqI=WX zkK%f~uYatn-if~a;fiJPMGbt`FQR|12HfvNx3+h5bN!}_=EIc%1vU34#S;IZMPp}k zW0(DQQ2{0YZM%P-u#<5_Fv}}?Cb~g8XYZ)(!z!%`G#K-(>&DQbUn%`z=0+h>AHE`W zyT}p~$BOz3I{GqYAA8m_SE+(GqS*@WsXZ)gRdWy?Dd<}D$hpm75E0^SLpp$uI&0dk zecp_*NsnU9LQ?t6u*XN%RDv&%*w=-toX(yupo?hWq5gYaxLF@X1CcDfQS-&hI)`%-omqQ&LjXh!DD+6Eha^6Ahlh@qhUW5u4-D3 zi@r0=pT$fb_J�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℞6=&5 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 str: - buffer = io.StringIO() - np.savetxt(buffer, array, delimiter="\t", fmt="%.6f") - return buffer.getvalue() - - -def generate_study_with_server( - client: TestClient, - name: str, - study_version: str, - commands: List[CommandDTO], - matrices_dir: Path, -) -> Tuple[GenerationResultInfoDTO, str]: - res = client.post("/v1/login", json={"username": "admin", "password": "admin"}) - admin_credentials = res.json() - base_study_res = client.post( - f"/v1/studies?name=foo&version={study_version}", - headers={"Authorization": f'Bearer {admin_credentials["access_token"]}'}, - ) - base_study_id = base_study_res.json() - res = client.post( - f"/v1/studies/{base_study_id}/variants?name={urllib.parse.quote_plus(name)}", - headers={"Authorization": f'Bearer {admin_credentials["access_token"]}'}, - ) - assert res.status_code == 200, res.json() - variant_id = res.json() - - set_auth_token(client, admin_credentials["access_token"]) - generator = RemoteVariantGenerator(variant_id, host="", session=client) - return generator.apply_commands(commands, matrices_dir), variant_id - - -def test_variant_manager(app: FastAPI, tmp_path: str) -> None: - client = TestClient(app, raise_server_exceptions=False) - study_version = STUDY_VERSION_7_2 - commands = parse_commands(ASSETS_DIR / "commands1.json", study_version) - matrix_dir = tmp_path / "empty_matrix_store" - matrix_dir.mkdir(parents=True, exist_ok=True) - res, study_id = generate_study_with_server(client, "test", f"{study_version:ddd}", commands, matrix_dir) - assert res is not None and res.success - - -def test_parse_commands(tmp_path: str, app: FastAPI) -> None: - export_path = tmp_path / "commands" - study = "base_study" - study_path = tmp_path / study - with ZipFile(ASSETS_DIR / "base_study.zip") as zip_output: - zip_output.extractall(path=tmp_path) - output_dir = Path(export_path) / study - study_info = IniReader().read(study_path / "study.antares") - version = study_info["antares"]["version"] - name = study_info["antares"]["caption"] - client = TestClient(app, raise_server_exceptions=False) - - extract_commands(study_path, output_dir) - study_version = StudyVersion.parse(version) - commands = [ - CommandDTO(action=CommandName.REMOVE_DISTRICT.value, args={"id": "all areas"}, study_version=study_version) - ] + parse_commands(output_dir / COMMAND_FILE, study_version) - res, study_id = generate_study_with_server(client, name, version, commands, output_dir / MATRIX_STORE_DIR) - assert res is not None and res.success - generated_study_path = tmp_path / "internal_workspace" / study_id / "snapshot" - assert generated_study_path.exists() and generated_study_path.is_dir() - - single_column_empty_items = [ - "input/load/series/load_hub w.txt", - "input/load/series/load_south.txt", - "input/load/series/load_hub n.txt", - "input/load/series/load_west.txt", - "input/load/series/load_north.txt", - "input/load/series/load_hub s.txt", - "input/load/series/load_hub e.txt", - "input/load/series/load_east.txt", - "input/wind/series/wind_east.txt", - "input/wind/series/wind_north.txt", - "input/wind/series/wind_hub n.txt", - "input/wind/series/wind_south.txt", - "input/wind/series/wind_hub w.txt", - "input/wind/series/wind_west.txt", - "input/wind/series/wind_hub e.txt", - "input/wind/series/wind_hub s.txt", - "input/solar/series/solar_east.txt", - "input/solar/series/solar_hub n.txt", - "input/solar/series/solar_south.txt", - "input/solar/series/solar_hub s.txt", - "input/solar/series/solar_north.txt", - "input/solar/series/solar_hub w.txt", - "input/solar/series/solar_hub e.txt", - "input/solar/series/solar_west.txt", - "input/thermal/series/west/semi base/series.txt", - "input/thermal/series/west/peak/series.txt", - "input/thermal/series/west/base/series.txt", - "input/thermal/series/north/semi base/series.txt", - "input/thermal/series/north/peak/series.txt", - "input/thermal/series/north/base/series.txt", - "input/thermal/series/east/semi base/series.txt", - "input/thermal/series/east/peak/series.txt", - "input/thermal/series/east/base/series.txt", - "input/thermal/series/south/semi base/series.txt", - "input/thermal/series/south/peak/series.txt", - "input/thermal/series/south/base/series.txt", - "input/hydro/series/hub e/ror.txt", - "input/hydro/series/south/ror.txt", - "input/hydro/series/hub w/ror.txt", - "input/hydro/series/hub s/ror.txt", - "input/hydro/series/west/ror.txt", - "input/hydro/series/hub n/ror.txt", - "input/hydro/series/north/ror.txt", - "input/hydro/series/east/ror.txt", - ] - single_column_daily_empty_items = [ - "input/hydro/series/hub e/mod.txt", - "input/hydro/series/south/mod.txt", - "input/hydro/series/hub w/mod.txt", - "input/hydro/series/hub s/mod.txt", - "input/hydro/series/west/mod.txt", - "input/hydro/series/hub n/mod.txt", - "input/hydro/series/north/mod.txt", - "input/hydro/series/east/mod.txt", - ] - fixed_3_cols_hourly_empty_items = [ - "input/bindingconstraints/northern mesh.txt", - "input/bindingconstraints/southern mesh.txt", - ] - fixed_4_cols_empty_items = [ - "input/reserves/hub s.txt", - "input/reserves/hub n.txt", - "input/reserves/hub w.txt", - "input/reserves/hub e.txt", - ] - fixed_8_cols_empty_items = [ - "input/misc-gen/miscgen-hub w.txt", - "input/misc-gen/miscgen-hub e.txt", - "input/misc-gen/miscgen-hub s.txt", - "input/misc-gen/miscgen-hub n.txt", - ] - single_column_empty_data = generate_csv_string(np.zeros((8760, 1), dtype=np.float64)) - single_column_daily_empty_data = generate_csv_string(np.zeros((365, 1), dtype=np.float64)) - fixed_3_cols_hourly_empty_data = generate_csv_string(np.zeros(shape=(8760, 3), dtype=np.float64)) - fixed_4_columns_empty_data = generate_csv_string(np.zeros((8760, 4), dtype=np.float64)) - fixed_8_columns_empty_data = generate_csv_string(np.zeros((8760, 8), dtype=np.float64)) - for file_path in study_path.rglob("*"): - if file_path.is_dir() or file_path.name in ["comments.txt", "study.antares", "Desktop.ini", "study.ico"]: - continue - item_relpath = file_path.relative_to(study_path).as_posix() - if item_relpath in single_column_empty_items: - assert (generated_study_path / item_relpath).read_text() == single_column_empty_data - elif item_relpath in single_column_daily_empty_items: - assert (generated_study_path / item_relpath).read_text() == single_column_daily_empty_data - elif item_relpath in fixed_3_cols_hourly_empty_items: - assert (generated_study_path / item_relpath).read_text() == fixed_3_cols_hourly_empty_data - elif item_relpath in fixed_4_cols_empty_items: - assert (generated_study_path / item_relpath).read_text() == fixed_4_columns_empty_data - elif item_relpath in fixed_8_cols_empty_items: - assert (generated_study_path / item_relpath).read_text() == fixed_8_columns_empty_data - elif file_path.suffix == ".ini": - actual = IniReader().read(study_path / item_relpath) - expected = IniReader().read(generated_study_path / item_relpath) - assert actual == expected, f"Invalid configuration: '{item_relpath}'" - else: - actual = (study_path / item_relpath).read_text() - expected = (generated_study_path / item_relpath).read_text() - assert actual.strip() == expected.strip() - - -def test_diff_local(tmp_path: Path) -> None: - export_path = tmp_path / "generation_result" - base_study = "base_study" - variant_study = "variant_study" - output_study_commands = export_path / "output_study_commands" - output_study_path = tmp_path / base_study - base_study_commands = export_path / base_study - variant_study_commands = export_path / variant_study - variant_study_path = tmp_path / variant_study - - for study in [base_study, variant_study]: - with ZipFile(ASSETS_DIR / f"{study}.zip") as zip_output: - zip_output.extractall(path=tmp_path) - extract_commands(tmp_path / study, export_path / study) - - generate_study(base_study_commands, None, str(export_path / "base_generated")) - generate_study( - variant_study_commands, - None, - str(export_path / "variant_generated"), - ) - generate_diff(base_study_commands, variant_study_commands, output_study_commands) - res = generate_study(output_study_commands, None, output=str(output_study_path)) - assert res.success - - assert output_study_path.exists() and output_study_path.is_dir() - for file_path in variant_study_path.rglob("*"): - if file_path.is_dir() or file_path.name in ["comments.txt", "study.antares", "Desktop.ini", "study.ico"]: - continue - item_relpath = file_path.relative_to(variant_study_path).as_posix() - if file_path.suffix == ".ini": - actual = IniReader().read(variant_study_path / item_relpath) - expected = IniReader().read(output_study_path / item_relpath) - assert actual == expected, f"Invalid configuration: '{item_relpath}'" - else: - actual = (variant_study_path / item_relpath).read_text() - expected = (output_study_path / item_relpath).read_text() - assert actual.strip() == expected.strip() diff --git a/tests/variantstudy/model/command/test_create_area.py b/tests/variantstudy/model/command/test_create_area.py index 8e6de24779..0e18ae209d 100644 --- a/tests/variantstudy/model/command/test_create_area.py +++ b/tests/variantstudy/model/command/test_create_area.py @@ -20,7 +20,6 @@ from antarest.study.storage.rawstudy.ini_reader import IniReader from antarest.study.storage.rawstudy.model.filesystem.config.model import EnrModelling, transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.icommand import ICommand from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea @@ -170,30 +169,3 @@ def test_apply( ) output = create_area_command.apply(study_data=empty_study) assert not output.status - - -def test_match(command_context: CommandContext) -> None: - base = CreateArea(area_name="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = CreateArea(area_name="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_not_match = CreateArea(area_name="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "create_area%foo" - assert base.get_inner_matrices() == [] - - -def test_revert(command_context: CommandContext) -> None: - base = CreateArea(area_name="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - file_study = Mock(spec=FileStudy) - file_study.config.version = STUDY_VERSION_8_8 - actual = CommandReverter().revert(base, [], file_study) - assert actual == [RemoveArea(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8)] - - -def test_create_diff(command_context: CommandContext) -> None: - base = CreateArea(area_name="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = CreateArea(area_name="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.create_diff(other_match) == [] diff --git a/tests/variantstudy/model/command/test_create_cluster.py b/tests/variantstudy/model/command/test_create_cluster.py index bdd4e9feea..9a05a29d89 100644 --- a/tests/variantstudy/model/command/test_create_cluster.py +++ b/tests/variantstudy/model/command/test_create_cluster.py @@ -21,13 +21,10 @@ from antarest.study.model import STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.common import CommandName from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_cluster import CreateCluster from antarest.study.storage.variantstudy.model.command.remove_cluster import RemoveCluster -from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command_context import CommandContext GEN = np.random.default_rng(1000) @@ -205,114 +202,3 @@ def test_to_dto(self, command_context: CommandContext): "user_id": None, "updated_at": None, } - - -def test_match(command_context: CommandContext): - prepro = GEN.random((365, 6)).tolist() - modulation = GEN.random((8760, 4)).tolist() - base = CreateCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - prepro=prepro, - modulation=modulation, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = CreateCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - prepro=prepro, - modulation=modulation, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_not_match = CreateCluster( - area_id="foo", - cluster_name="bar", - parameters={}, - prepro=prepro, - modulation=modulation, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_other = RemoveCluster( - area_id="id", cluster_id="id", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - - assert base.match(other_match, equal=True) - assert not base.match(other_not_match, equal=True) - assert not base.match(other_other, equal=True) - - assert base.match_signature() == "create_cluster%foo%foo" - - # check the matrices links - prepro_id = command_context.matrix_service.create(prepro) - modulation_id = command_context.matrix_service.create(modulation) - assert base.get_inner_matrices() == [prepro_id, modulation_id] - - -def test_revert(command_context: CommandContext): - base = CreateCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - file_study = Mock(spec=FileStudy) - file_study.config.version = STUDY_VERSION_8_8 - assert CommandReverter().revert(base, [], file_study) == [ - RemoveCluster(area_id="foo", cluster_id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - ] - - -def test_create_diff(command_context: CommandContext): - prepro_a = GEN.random((365, 6)).tolist() - modulation_a = GEN.random((8760, 4)).tolist() - base = CreateCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - prepro=prepro_a, - modulation=modulation_a, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - - prepro_b = GEN.random((365, 6)).tolist() - modulation_b = GEN.random((8760, 4)).tolist() - other_match = CreateCluster( - area_id="foo", - cluster_name="foo", - parameters={"nominalcapacity": "2400"}, - prepro=prepro_b, - modulation=modulation_b, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - - assert base.create_diff(other_match) == [ - ReplaceMatrix( - target="input/thermal/prepro/foo/foo/data", - matrix=prepro_b, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ReplaceMatrix( - target="input/thermal/prepro/foo/foo/modulation", - matrix=modulation_b, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - UpdateConfig( - target="input/thermal/clusters/foo/list/foo", - data={"nominalcapacity": "2400"}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ] diff --git a/tests/variantstudy/model/command/test_create_link.py b/tests/variantstudy/model/command/test_create_link.py index aa147e2df9..c21ee76197 100644 --- a/tests/variantstudy/model/command/test_create_link.py +++ b/tests/variantstudy/model/command/test_create_link.py @@ -10,27 +10,20 @@ # # This file is part of the Antares project. -import configparser from unittest.mock import Mock -import numpy as np import pytest from pydantic import ValidationError from antarest.core.exceptions import LinkValidationError -from antarest.study.business.link_management import LinkInternal from antarest.study.model import STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.ini_reader import IniReader from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_link import CreateLink from antarest.study.storage.variantstudy.model.command.icommand import ICommand -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink -from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -218,68 +211,3 @@ def test_apply(self, empty_study: FileStudy, command_context: CommandContext): study_version=study_version, ).apply(empty_study) assert not output.status - - -def test_match(command_context: CommandContext): - base = CreateLink( - area1="foo", area2="bar", series=[[0]], command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_match = CreateLink( - area1="foo", area2="bar", series=[[0]], command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_not_match = CreateLink( - area1="foo", area2="baz", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "create_link%foo%bar" - # check the matrices links - matrix_id = command_context.matrix_service.create([[0]]) - assert base.get_inner_matrices() == [matrix_id] - - -def test_revert(command_context: CommandContext): - base = CreateLink( - area1="foo", area2="bar", series=[[0]], command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - file_study = Mock(spec=FileStudy) - file_study.config.version = STUDY_VERSION_8_8 - assert CommandReverter().revert(base, [], file_study) == [ - RemoveLink(area1="foo", area2="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - ] - - -def test_create_diff(command_context: CommandContext): - series_a = np.random.rand(8760, 8).tolist() - base = CreateLink( - area1="foo", area2="bar", series=series_a, command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - - series_b = np.random.rand(8760, 8).tolist() - other_match = CreateLink( - area1="foo", - area2="bar", - parameters={"hurdles_cost": "true"}, - series=series_b, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - - assert base.create_diff(other_match) == [ - UpdateConfig( - target="input/links/bar/properties/foo", - data=LinkInternal.model_validate({"area1": "bar", "area2": "foo", "hurdles_cost": "true"}).model_dump( - by_alias=True, exclude_none=True, exclude={"area1", "area2"} - ), - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ReplaceMatrix( - target="@links_series/bar/foo", - matrix=series_b, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ] diff --git a/tests/variantstudy/model/command/test_create_renewables_cluster.py b/tests/variantstudy/model/command/test_create_renewables_cluster.py index 9919212a42..f551721d72 100644 --- a/tests/variantstudy/model/command/test_create_renewables_cluster.py +++ b/tests/variantstudy/model/command/test_create_renewables_cluster.py @@ -20,12 +20,10 @@ from antarest.study.model import STUDY_VERSION_8_1, STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.model.filesystem.config.model import EnrModelling, transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.common import CommandName from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_renewables_cluster import CreateRenewablesCluster from antarest.study.storage.variantstudy.model.command.remove_renewables_cluster import RemoveRenewablesCluster -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -158,83 +156,3 @@ def test_to_dto(self, command_context: CommandContext) -> None: "updated_at": None, "user_id": None, } - - -def test_match(command_context: CommandContext) -> None: - base = CreateRenewablesCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = CreateRenewablesCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_not_match = CreateRenewablesCluster( - area_id="foo", - cluster_name="bar", - parameters={}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_other = RemoveRenewablesCluster( - area_id="id", cluster_id="id", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - - assert base.match(other_match, equal=True) - assert not base.match(other_not_match, equal=True) - assert not base.match(other_other, equal=True) - - assert base.match_signature() == "create_renewables_cluster%foo%foo" - assert base.get_inner_matrices() == [] - - -def test_revert(command_context: CommandContext) -> None: - base = CreateRenewablesCluster( - area_id="area_foo", - cluster_name="cl1", - parameters={}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - file_study = mock.MagicMock(spec=FileStudy) - file_study.config.version = STUDY_VERSION_8_8 - revert_cmd = CommandReverter().revert(base, [], file_study) - assert revert_cmd == [ - RemoveRenewablesCluster( - area_id="area_foo", cluster_id="cl1", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - ] - - -def test_create_diff(command_context: CommandContext) -> None: - base = CreateRenewablesCluster( - area_id="foo", - cluster_name="foo", - parameters={}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = CreateRenewablesCluster( - area_id="foo", - cluster_name="foo", - parameters={"a": "b"}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - assert base.create_diff(other_match) == [ - UpdateConfig( - target="input/renewables/clusters/foo/list/foo", - data={"a": "b"}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ] diff --git a/tests/variantstudy/model/command/test_create_st_storage.py b/tests/variantstudy/model/command/test_create_st_storage.py index ba47d59da5..32ab04ec5a 100644 --- a/tests/variantstudy/model/command/test_create_st_storage.py +++ b/tests/variantstudy/model/command/test_create_st_storage.py @@ -25,8 +25,6 @@ from antarest.study.storage.variantstudy.model.command.common import CommandName from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_st_storage import REQUIRED_VERSION, CreateSTStorage -from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command_context import CommandContext from antarest.study.storage.variantstudy.model.model import CommandDTO @@ -397,101 +395,6 @@ def test_to_dto(self, command_context: CommandContext): study_version=STUDY_VERSION_8_8, ) - def test_match_signature(self, command_context: CommandContext): - cmd = CreateSTStorage( - command_context=command_context, - area_id="area_fr", - parameters=STStorageConfig(**PARAMETERS), - study_version=STUDY_VERSION_8_8, - ) - assert cmd.match_signature() == "create_st_storage%area_fr%storage1" - - @pytest.mark.parametrize("area_id", ["area_fr", "area_en"]) - @pytest.mark.parametrize("parameters", [PARAMETERS, OTHER_PARAMETERS]) - def test_match( - self, - command_context: CommandContext, - area_id, - parameters, - ): - cmd1 = CreateSTStorage( - command_context=command_context, - area_id="area_fr", - parameters=STStorageConfig(**PARAMETERS), - study_version=STUDY_VERSION_8_8, - ) - cmd2 = CreateSTStorage( - command_context=command_context, - area_id=area_id, - parameters=STStorageConfig(**parameters), - study_version=STUDY_VERSION_8_8, - ) - light_equal = area_id == cmd1.area_id and parameters["name"] == cmd1.storage_name - assert cmd1.match(cmd2, equal=False) == light_equal - deep_equal = area_id == cmd1.area_id and parameters == PARAMETERS - assert cmd1.match(cmd2, equal=True) == deep_equal - - def test_match__unknown_type(self, command_context: CommandContext): - cmd1 = CreateSTStorage( - command_context=command_context, - area_id="area_fr", - parameters=STStorageConfig(**PARAMETERS), - study_version=STUDY_VERSION_8_8, - ) - # Always `False` when compared to another object type - assert cmd1.match(..., equal=False) is False - assert cmd1.match(..., equal=True) is False - - def test_create_diff__not_equals(self, command_context: CommandContext): - cmd = CreateSTStorage( - command_context=command_context, - area_id="area_fr", - parameters=STStorageConfig(**PARAMETERS), - study_version=STUDY_VERSION_8_8, - ) - upper_rule_curve = GEN.random((8760, 1)) - inflows = GEN.uniform(0, 1000, size=(8760, 1)) - other = CreateSTStorage( - command_context=command_context, - area_id=cmd.area_id, - parameters=STStorageConfig(**OTHER_PARAMETERS), - upper_rule_curve=upper_rule_curve.tolist(), # type: ignore - inflows=inflows.tolist(), # type: ignore - study_version=STUDY_VERSION_8_8, - ) - actual = cmd.create_diff(other) - expected = [ - ReplaceMatrix( - command_context=command_context, - target="input/st-storage/series/area_fr/storage1/upper_rule_curve", - matrix=strip_matrix_protocol(other.upper_rule_curve), - study_version=STUDY_VERSION_8_8, - ), - ReplaceMatrix( - command_context=command_context, - target="input/st-storage/series/area_fr/storage1/inflows", - matrix=strip_matrix_protocol(other.inflows), - study_version=STUDY_VERSION_8_8, - ), - UpdateConfig( - command_context=command_context, - target="input/st-storage/clusters/area_fr/list/storage1", - data=OTHER_PARAMETERS, - study_version=STUDY_VERSION_8_8, - ), - ] - assert actual == expected - - def test_create_diff__equals(self, command_context: CommandContext): - cmd = CreateSTStorage( - command_context=command_context, - area_id="area_fr", - parameters=STStorageConfig(**PARAMETERS), - study_version=STUDY_VERSION_8_8, - ) - actual = cmd.create_diff(cmd) - assert not actual - def test_get_inner_matrices(self, command_context: CommandContext): cmd = CreateSTStorage( command_context=command_context, diff --git a/tests/variantstudy/model/command/test_manage_binding_constraints.py b/tests/variantstudy/model/command/test_manage_binding_constraints.py index 3751c9f865..aabfba93c4 100644 --- a/tests/variantstudy/model/command/test_manage_binding_constraints.py +++ b/tests/variantstudy/model/command/test_manage_binding_constraints.py @@ -12,7 +12,6 @@ from unittest.mock import Mock -import numpy as np import pytest from antarest.study.model import STUDY_VERSION_8_8 @@ -23,8 +22,6 @@ ) from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_extractor import CommandExtractor -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.business.matrix_constants.binding_constraint.series_after_v87 import ( default_bc_weekly_daily as default_bc_weekly_daily_870, ) @@ -36,9 +33,7 @@ from antarest.study.storage.variantstudy.model.command.create_binding_constraint import CreateBindingConstraint from antarest.study.storage.variantstudy.model.command.create_cluster import CreateCluster from antarest.study.storage.variantstudy.model.command.create_link import CreateLink -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_binding_constraint import RemoveBindingConstraint -from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink from antarest.study.storage.variantstudy.model.command.update_binding_constraint import ( UpdateBindingConstraint, update_matrices_names, @@ -288,282 +283,6 @@ def test_scenario_builder(empty_study: FileStudy, command_context: CommandContex assert rulesets == {"Default Ruleset": {}} -def test_match(command_context: CommandContext): - values = default_bc_weekly_daily.tolist() - base = CreateBindingConstraint( - name="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = CreateBindingConstraint( - name="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_not_match = CreateBindingConstraint( - name="bar", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "create_binding_constraint%foo" - # check the matrices links - matrix_id = command_context.matrix_service.create(values) - assert base.get_inner_matrices() == [matrix_id] - - base = UpdateBindingConstraint( - id="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = UpdateBindingConstraint( - id="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_not_match = UpdateBindingConstraint( - id="bar", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "update_binding_constraint%foo" - # check the matrices links - matrix_id = command_context.matrix_service.create(values) - assert base.get_inner_matrices() == [matrix_id] - - base = RemoveBindingConstraint(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveBindingConstraint(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_not_match = RemoveBindingConstraint( - id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveLink(area1="id", area2="id2", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "remove_binding_constraint%foo" - assert base.get_inner_matrices() == [] - - -def test_revert(command_context: CommandContext): - hourly_values = default_bc_hourly.tolist() - daily_values = default_bc_weekly_daily.tolist() - weekly_values = default_bc_weekly_daily.tolist() - file_study = Mock(spec=FileStudy) - file_study.config.version = STUDY_VERSION_8_8 - base = CreateBindingConstraint( - name="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=daily_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - assert CommandReverter().revert(base, [], file_study) == [ - RemoveBindingConstraint(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - ] - - base = UpdateBindingConstraint( - id="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=daily_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - mock_command_extractor = Mock(spec=CommandExtractor) - object.__setattr__( - base, - "get_command_extractor", - Mock(return_value=mock_command_extractor), - ) - assert CommandReverter().revert( - base, - [ - UpdateBindingConstraint( - id="foo", - enabled=True, - time_step=BindingConstraintFrequency.WEEKLY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=weekly_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - UpdateBindingConstraint( - id="foo", - enabled=True, - time_step=BindingConstraintFrequency.HOURLY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=hourly_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ], - file_study, - ) == [ - UpdateBindingConstraint( - id="foo", - enabled=True, - time_step=BindingConstraintFrequency.HOURLY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=hourly_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - ] - # check the matrices links - hourly_matrix_id = command_context.matrix_service.create(hourly_values) - assert CommandReverter().revert( - base, - [ - UpdateBindingConstraint( - id="foo", - enabled=True, - time_step=BindingConstraintFrequency.WEEKLY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=weekly_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - CreateBindingConstraint( - name="foo", - enabled=True, - time_step=BindingConstraintFrequency.HOURLY, - operator=BindingConstraintOperator.EQUAL, - coeffs={"a": [0.3]}, - values=hourly_values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ), - ], - file_study, - ) == [ - UpdateBindingConstraint( - id="foo", - enabled=True, - time_step=BindingConstraintFrequency.HOURLY, - operator=BindingConstraintOperator.EQUAL, - filter_year_by_year="", - filter_synthesis="", - coeffs={"a": [0.3]}, - values=hourly_matrix_id, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - ] - study = FileStudy(config=Mock(), tree=Mock()) - CommandReverter().revert(base, [], study) - mock_command_extractor.extract_binding_constraint.assert_called_with(study, "foo") - - -def test_create_diff(command_context: CommandContext): - values_a = np.random.rand(366, 3).tolist() - base = CreateBindingConstraint( - name="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values_a, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - - values_b = np.random.rand(8784, 3).tolist() - matrix_b_id = command_context.matrix_service.create(values_b) - other_match = CreateBindingConstraint( - name="foo", - enabled=True, - time_step=BindingConstraintFrequency.HOURLY, - operator=BindingConstraintOperator.EQUAL, - coeffs={"b": [0.3]}, - values=matrix_b_id, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - assert base.create_diff(other_match) == [ - UpdateBindingConstraint( - id="foo", - enabled=True, - time_step=BindingConstraintFrequency.HOURLY, - operator=BindingConstraintOperator.EQUAL, - coeffs={"b": [0.3]}, - values=matrix_b_id, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - ] - - values = default_bc_weekly_daily.tolist() - base = UpdateBindingConstraint( - id="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = UpdateBindingConstraint( - id="foo", - enabled=False, - time_step=BindingConstraintFrequency.DAILY, - operator=BindingConstraintOperator.BOTH, - coeffs={"a": [0.3]}, - values=values, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - assert base.create_diff(other_match) == [other_match] - - base = RemoveBindingConstraint(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveBindingConstraint(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.create_diff(other_match) == [] - - @pytest.mark.parametrize( "existing_operator, new_operator", [ diff --git a/tests/variantstudy/model/command/test_manage_district.py b/tests/variantstudy/model/command/test_manage_district.py index b99d2ac380..5aa642977a 100644 --- a/tests/variantstudy/model/command/test_manage_district.py +++ b/tests/variantstudy/model/command/test_manage_district.py @@ -16,13 +16,10 @@ from antarest.study.storage.rawstudy.model.filesystem.config.files import build from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_district import CreateDistrict, DistrictBaseFilter from antarest.study.storage.variantstudy.model.command.icommand import ICommand -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_district import RemoveDistrict -from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command.update_district import UpdateDistrict from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -129,87 +126,3 @@ def test_manage_district(empty_study: FileStudy, command_context: CommandContext assert remove_output_d3.status sets_config = IniReader(["+", "-"]).read(empty_study.config.study_path / "input/areas/sets.ini") assert len(sets_config.keys()) == 3 - - -def test_match(command_context: CommandContext): - base = CreateDistrict( - name="foo", - base_filter=DistrictBaseFilter.add_all, - filter_items=["a", "b"], - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = CreateDistrict( - name="foo", - base_filter=DistrictBaseFilter.add_all, - filter_items=["a", "b"], - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_not_match = CreateDistrict(name="foo2", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match, True) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "create_district%foo" - assert base.get_inner_matrices() == [] - - base = RemoveDistrict(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveDistrict(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_not_match = RemoveDistrict(id="id2", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match, True) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "remove_district%id" - assert base.get_inner_matrices() == [] - - -def test_revert(command_context: CommandContext): - base = CreateDistrict( - name="foo", - base_filter=DistrictBaseFilter.add_all, - filter_items=["a", "b"], - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - file_study = Mock(spec=FileStudy) - file_study.config.version = STUDY_VERSION_8_8 - assert CommandReverter().revert(base, [], file_study) == [ - RemoveDistrict(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - ] - - -def test_create_diff(command_context: CommandContext): - base = CreateDistrict( - name="foo", - base_filter=DistrictBaseFilter.add_all, - filter_items=["a", "b"], - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - other_match = CreateDistrict( - name="foo", - base_filter=DistrictBaseFilter.remove_all, - filter_items=["c"], - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - assert base.create_diff(other_match) == [ - UpdateConfig( - target="input/areas/sets/foo", - data={ - "caption": "foo", - "apply-filter": DistrictBaseFilter.remove_all.value, - "+": ["c"], - "output": True, - "comments": "", - }, - command_context=command_context, - study_version=STUDY_VERSION_8_8, - ) - ] - - base = RemoveDistrict(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveDistrict(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.create_diff(other_match) == [] diff --git a/tests/variantstudy/model/command/test_remove_area.py b/tests/variantstudy/model/command/test_remove_area.py index 468b468e69..a29cd693ec 100644 --- a/tests/variantstudy/model/command/test_remove_area.py +++ b/tests/variantstudy/model/command/test_remove_area.py @@ -29,7 +29,6 @@ from antarest.study.storage.variantstudy.model.command.icommand import ICommand from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_district import RemoveDistrict -from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command.update_scenario_builder import UpdateScenarioBuilder from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -242,21 +241,3 @@ def test_apply(self, empty_study: FileStudy, command_context: CommandContext): actual_cfg = empty_study.tree.get(depth=999) assert actual_cfg == empty_study_cfg - - -def test_match(command_context: CommandContext): - base = RemoveArea(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveArea(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_not_match = RemoveArea(id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_other = RemoveLink(area1="id", area2="id2", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "remove_area%foo" - assert base.get_inner_matrices() == [] - - -def test_create_diff(command_context: CommandContext): - base = RemoveArea(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveArea(id="foo", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.create_diff(other_match) == [] diff --git a/tests/variantstudy/model/command/test_remove_cluster.py b/tests/variantstudy/model/command/test_remove_cluster.py index 2b30616a0a..266cf63a86 100644 --- a/tests/variantstudy/model/command/test_remove_cluster.py +++ b/tests/variantstudy/model/command/test_remove_cluster.py @@ -14,7 +14,6 @@ import pytest from checksumdir import dirhash -from antarest.study.model import STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.model.filesystem.config.binding_constraint import ( BindingConstraintFrequency, BindingConstraintOperator, @@ -24,7 +23,6 @@ from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_binding_constraint import CreateBindingConstraint from antarest.study.storage.variantstudy.model.command.create_cluster import CreateCluster -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_cluster import RemoveCluster from antarest.study.storage.variantstudy.model.command.update_scenario_builder import UpdateScenarioBuilder from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -123,31 +121,3 @@ def test_apply(self, empty_study: FileStudy, command_context: CommandContext) -> study_version=study_version, ).apply(empty_study) assert not output.status - - -def test_match(command_context: CommandContext) -> None: - base = RemoveCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_match = RemoveCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_not_match = RemoveCluster( - area_id="foo", cluster_id="baz", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "remove_cluster%bar%foo" - assert base.get_inner_matrices() == [] - - -def test_create_diff(command_context: CommandContext) -> None: - base = RemoveCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_match = RemoveCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.create_diff(other_match) == [] diff --git a/tests/variantstudy/model/command/test_remove_link.py b/tests/variantstudy/model/command/test_remove_link.py index 832d8db20b..e65934738f 100644 --- a/tests/variantstudy/model/command/test_remove_link.py +++ b/tests/variantstudy/model/command/test_remove_link.py @@ -28,7 +28,6 @@ from antarest.study.storage.rawstudy.model.filesystem.root.filestudytree import FileStudyTree from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_link import CreateLink -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_link import RemoveLink from antarest.study.storage.variantstudy.model.command.update_scenario_builder import UpdateScenarioBuilder from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -145,25 +144,3 @@ def test_apply(self, tmpdir: Path, command_context: CommandContext, version: int assert output.status, output.message assert dirhash(empty_study.config.study_path, "md5") == hash_before_removal - - def test_match(self, command_context: CommandContext) -> None: - base = RemoveLink(area1="foo", area2="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveLink( - area1="foo", area2="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_not_match = RemoveLink( - area1="foo", area2="baz", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "remove_link%bar%foo" # alphabetical order - assert base.get_inner_matrices() == [] - - def test_create_diff(self, command_context: CommandContext) -> None: - base = RemoveLink(area1="foo", area2="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = RemoveLink( - area1="foo", area2="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.create_diff(other_match) == [] diff --git a/tests/variantstudy/model/command/test_remove_renewables_cluster.py b/tests/variantstudy/model/command/test_remove_renewables_cluster.py index c2152a08b3..c5bba2a4d7 100644 --- a/tests/variantstudy/model/command/test_remove_renewables_cluster.py +++ b/tests/variantstudy/model/command/test_remove_renewables_cluster.py @@ -12,12 +12,10 @@ from antares.study.version import StudyVersion from checksumdir import dirhash -from antarest.study.model import STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.model.filesystem.config.model import EnrModelling, transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy from antarest.study.storage.variantstudy.model.command.create_area import CreateArea from antarest.study.storage.variantstudy.model.command.create_renewables_cluster import CreateRenewablesCluster -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.remove_renewables_cluster import RemoveRenewablesCluster from antarest.study.storage.variantstudy.model.command.update_scenario_builder import UpdateScenarioBuilder from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -86,31 +84,3 @@ def test_apply(self, empty_study: FileStudy, command_context: CommandContext) -> study_version=study_version, ).apply(empty_study) assert not output.status - - -def test_match(command_context: CommandContext) -> None: - base = RemoveRenewablesCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_match = RemoveRenewablesCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_not_match = RemoveRenewablesCluster( - area_id="foo", cluster_id="baz", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "remove_renewables_cluster%bar%foo" - assert base.get_inner_matrices() == [] - - -def test_create_diff(command_context: CommandContext) -> None: - base = RemoveRenewablesCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_match = RemoveRenewablesCluster( - area_id="foo", cluster_id="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.create_diff(other_match) == [] diff --git a/tests/variantstudy/model/command/test_remove_st_storage.py b/tests/variantstudy/model/command/test_remove_st_storage.py index 01c74235dd..d416391464 100644 --- a/tests/variantstudy/model/command/test_remove_st_storage.py +++ b/tests/variantstudy/model/command/test_remove_st_storage.py @@ -197,43 +197,6 @@ def test_to_dto(self, command_context: CommandContext): study_version=STUDY_VERSION_8_8, ) - def test_match_signature(self, command_context: CommandContext): - cmd = RemoveSTStorage( - command_context=command_context, area_id="area_fr", storage_id="storage_1", study_version=STUDY_VERSION_8_8 - ) - assert cmd.match_signature() == "remove_st_storage%area_fr%storage_1" - - @pytest.mark.parametrize("area_id", ["area_fr", "area_en"]) - @pytest.mark.parametrize("storage_id", ["storage_1", "storage_2"]) - def test_match( - self, - command_context: CommandContext, - area_id, - storage_id, - ): - cmd1 = RemoveSTStorage( - command_context=command_context, area_id="area_fr", storage_id="storage_1", study_version=STUDY_VERSION_8_8 - ) - cmd2 = RemoveSTStorage( - command_context=command_context, area_id=area_id, storage_id=storage_id, study_version=STUDY_VERSION_8_8 - ) - is_equal = area_id == cmd1.area_id and storage_id == cmd1.storage_id - assert cmd1.match(cmd2, equal=False) == is_equal - assert cmd1.match(cmd2, equal=True) == is_equal - - def test_create_diff(self, command_context: CommandContext): - cmd = RemoveSTStorage( - command_context=command_context, area_id="area_fr", storage_id="storage_1", study_version=STUDY_VERSION_8_8 - ) - other = RemoveSTStorage( - command_context=command_context, - area_id=cmd.area_id, - storage_id=cmd.storage_id, - study_version=STUDY_VERSION_8_8, - ) - actual = cmd.create_diff(other) - assert not actual - def test_get_inner_matrices(self, command_context: CommandContext): cmd = RemoveSTStorage( command_context=command_context, area_id="area_fr", storage_id="storage_1", study_version=STUDY_VERSION_8_8 diff --git a/tests/variantstudy/model/command/test_replace_matrix.py b/tests/variantstudy/model/command/test_replace_matrix.py index 5f676ded29..d54ba755e2 100644 --- a/tests/variantstudy/model/command/test_replace_matrix.py +++ b/tests/variantstudy/model/command/test_replace_matrix.py @@ -17,9 +17,7 @@ from antarest.study.model import STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.create_area import CreateArea -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.replace_matrix import ReplaceMatrix from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -66,55 +64,3 @@ def test_apply(self, empty_study: FileStudy, command_context: CommandContext): ) output = replace_matrix.apply(empty_study) assert not output.status - - -def test_match(command_context: CommandContext): - base = ReplaceMatrix(target="foo", matrix=[[0]], command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = ReplaceMatrix( - target="foo", matrix=[[1]], command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_not_match = ReplaceMatrix( - target="bar", matrix=[[0]], command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "replace_matrix%foo" - # check the matrices links - matrix_id = command_context.matrix_service.create([[0]]) - assert base.get_inner_matrices() == [matrix_id] - - -@patch("antarest.study.storage.variantstudy.business.command_extractor.CommandExtractor.generate_replace_matrix") -def test_revert(mock_generate_replace_matrix, command_context: CommandContext): - matrix_a = np.random.rand(5, 2).tolist() - base = ReplaceMatrix( - target="foo", matrix=matrix_a, command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - study = FileStudy(config=Mock(), tree=Mock()) - CommandReverter().revert(base, [], study) - mock_generate_replace_matrix.assert_called_with(study.tree, ["foo"]) - assert CommandReverter().revert( - base, - [ - ReplaceMatrix( - target="foo", matrix=matrix_a, command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - ], - study, - ) == [ - ReplaceMatrix(target="foo", matrix=matrix_a, command_context=command_context, study_version=STUDY_VERSION_8_8) - ] - - -def test_create_diff(command_context: CommandContext): - matrix_a = np.random.rand(5, 2).tolist() - base = ReplaceMatrix( - target="foo", matrix=matrix_a, command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - matrix_b = np.random.rand(5, 2).tolist() - other_match = ReplaceMatrix( - target="foo", matrix=matrix_b, command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.create_diff(other_match) == [other_match] diff --git a/tests/variantstudy/model/command/test_update_comments.py b/tests/variantstudy/model/command/test_update_comments.py index 0bdb91e307..c5581284f3 100644 --- a/tests/variantstudy/model/command/test_update_comments.py +++ b/tests/variantstudy/model/command/test_update_comments.py @@ -14,11 +14,7 @@ import pytest -from antarest.study.model import STUDY_VERSION_8_8 from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_extractor import CommandExtractor -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.update_comments import UpdateComments from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -39,61 +35,3 @@ def test_update_comments(empty_study: FileStudy, command_context: CommandContext file_comments = file.read() assert comments == file_comments - - -def test_match(command_context: CommandContext): - base = UpdateComments(comments="comments", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = UpdateComments(comments="comments", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_not_match = UpdateComments( - comments="other_comments", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match, equal=True) - assert not base.match(other_other) - assert base.match_signature() == "update_comments" - - -def test_revert( - command_context: CommandContext, - empty_study: FileStudy, -): - mock_command_extractor = Mock(spec=CommandExtractor) - mock_command_extractor.command_context = command_context - mock_command_extractor.generate_update_comments.side_effect = lambda x: CommandExtractor.generate_update_comments( - mock_command_extractor, x - ) - study_version = empty_study.config.version - base_command = UpdateComments(comments="comments", command_context=command_context, study_version=study_version) - - object.__setattr__( - base_command, - "get_command_extractor", - Mock(return_value=mock_command_extractor), - ) - - CommandReverter().revert(base_command, [], empty_study) - mock_command_extractor.generate_update_comments.assert_called_with(empty_study.tree) - assert CommandReverter().revert( - base_command, - [UpdateComments(comments="comments", command_context=command_context, study_version=study_version)], - empty_study, - ) == [UpdateComments(comments="comments", command_context=command_context, study_version=study_version)] - assert CommandReverter().revert(base_command, [], base=empty_study) == [ - UpdateComments( - comments='\n\n \n \n ' - "\n \n \n\n", - command_context=command_context, - study_version=study_version, - ) - ] - - -def test_create_diff(command_context: CommandContext): - base = UpdateComments(comments="comments", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = UpdateComments(comments="comments", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.create_diff(other_match) == [other_match] diff --git a/tests/variantstudy/model/command/test_update_config.py b/tests/variantstudy/model/command/test_update_config.py index 1857602cb2..6e90bcf4c1 100644 --- a/tests/variantstudy/model/command/test_update_config.py +++ b/tests/variantstudy/model/command/test_update_config.py @@ -20,9 +20,7 @@ from antarest.study.storage.rawstudy.ini_reader import IniReader from antarest.study.storage.rawstudy.model.filesystem.config.model import transform_name_to_id from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.create_area import CreateArea -from antarest.study.storage.variantstudy.model.command.remove_area import RemoveArea from antarest.study.storage.variantstudy.model.command.update_config import UpdateConfig from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -76,42 +74,3 @@ def test_update_config(empty_study: FileStudy, command_context: CommandContext): command.apply(empty_study) layers = IniReader().read(study_path / "layers/layers.ini") assert layers == {"first_layer": {"1": False}} - - -def test_match(command_context: CommandContext): - base = UpdateConfig(target="foo", data="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = UpdateConfig( - target="foo", data="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_not_match = UpdateConfig( - target="hello", data="bar", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - other_other = RemoveArea(id="id", command_context=command_context, study_version=STUDY_VERSION_8_8) - assert base.match(other_match) - assert not base.match(other_not_match) - assert not base.match(other_other) - assert base.match_signature() == "update_config%foo" - - -@patch("antarest.study.storage.variantstudy.business.command_extractor.CommandExtractor.generate_update_config") -def test_revert(mock_generate_update_config, command_context: CommandContext): - base = UpdateConfig(target="foo", data="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - study = FileStudy(config=Mock(), tree=Mock()) - mock_generate_update_config.side_effect = ChildNotFoundError("") - res = CommandReverter().revert(base, [], study) - mock_generate_update_config.assert_called_with(study.tree, ["foo"]) - assert res == [] - - assert CommandReverter().revert( - base, - [UpdateConfig(target="foo", data="baz", command_context=command_context, study_version=STUDY_VERSION_8_8)], - study, - ) == [UpdateConfig(target="foo", data="baz", command_context=command_context, study_version=STUDY_VERSION_8_8)] - - -def test_create_diff(command_context: CommandContext): - base = UpdateConfig(target="foo", data="bar", command_context=command_context, study_version=STUDY_VERSION_8_8) - other_match = UpdateConfig( - target="foo", data="baz", command_context=command_context, study_version=STUDY_VERSION_8_8 - ) - assert base.create_diff(other_match) == [other_match] diff --git a/tests/variantstudy/model/command/test_update_rawfile.py b/tests/variantstudy/model/command/test_update_rawfile.py index 0aa3a4477a..3d0b699952 100644 --- a/tests/variantstudy/model/command/test_update_rawfile.py +++ b/tests/variantstudy/model/command/test_update_rawfile.py @@ -16,7 +16,6 @@ from typing import cast from antarest.study.storage.rawstudy.model.filesystem.factory import FileStudy -from antarest.study.storage.variantstudy.business.command_reverter import CommandReverter from antarest.study.storage.variantstudy.model.command.update_raw_file import UpdateRawFile from antarest.study.storage.variantstudy.model.command_context import CommandContext @@ -34,22 +33,7 @@ def test_update_rawfile(empty_study: FileStudy, command_context: CommandContext) study_version=empty_study.config.version, ) - reverted_commands = CommandReverter().revert(command, [], empty_study) - assert cast(UpdateRawFile, reverted_commands[0]).b64Data == base64.b64encode(original_data).decode("utf-8") - - alt_command = UpdateRawFile( - target="settings/resources/study", - b64Data="", - command_context=command_context, - study_version=empty_study.config.version, - ) - reverted_commands = CommandReverter().revert(command, [alt_command], empty_study) - assert cast(UpdateRawFile, reverted_commands[0]).b64Data == "" - - assert command.match(alt_command) - assert not command.match(alt_command, True) assert len(command.get_inner_matrices()) == 0 - assert [alt_command] == command.create_diff(alt_command) res = command.apply(empty_study) assert res.status From 09a786b23cb07780731210a69cfd4f03c5767ee1 Mon Sep 17 00:00:00 2001 From: Samir Kamal <1954121+skamril@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:30:24 +0100 Subject: [PATCH 36/38] feat(ui-commons): allow multiple cells to be pasted in DataGridForm (#2328) --- webapp/src/components/common/DataGridForm.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/src/components/common/DataGridForm.tsx b/webapp/src/components/common/DataGridForm.tsx index 6c4b9b9919..dd77ebaa88 100644 --- a/webapp/src/components/common/DataGridForm.tsx +++ b/webapp/src/components/common/DataGridForm.tsx @@ -296,6 +296,7 @@ function DataGridForm({ allowedFillDirections={allowedFillDirections} enableColumnResize={enableColumnResize} getCellsForSelection + onPaste /> Date: Wed, 5 Feb 2025 17:06:35 +0100 Subject: [PATCH 37/38] fix(ui-common): bump MUI to v6.4.3 to resolve Select list bug causing crashes (#2330) --- webapp/package-lock.json | 68 ++++++++++--------- webapp/package.json | 2 +- webapp/src/components/common/DynamicList.tsx | 1 + webapp/src/components/common/SelectMulti.tsx | 4 +- .../components/common/page/ViewWrapper.tsx | 2 +- 5 files changed, 41 insertions(+), 36 deletions(-) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 22d9671e83..31cbd08f6c 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -14,7 +14,7 @@ "@handsontable/react": "14.5.0", "@mui/icons-material": "6.1.1", "@mui/lab": "6.0.0-beta.10", - "@mui/material": "6.1.1", + "@mui/material": "6.4.3", "@mui/x-tree-view": "7.18.0", "@reduxjs/toolkit": "1.9.6", "axios": "1.7.7", @@ -1851,9 +1851,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.3.1.tgz", - "integrity": "sha512-2OmnEyoHpj5//dJJpMuxOeLItCCHdf99pjMFfUFdBteCunAK9jW+PwEo4mtdGcLs7P+IgZ+85ypd52eY4AigoQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.3.tgz", + "integrity": "sha512-hlyOzo2ObarllAOeT1ZSAusADE5NZNencUeIvXrdQ1Na+FL1lcznhbxfV5He1KqGiuR8Az3xtCUcYKwMVGFdzg==", "license": "MIT", "funding": { "type": "opencollective", @@ -1932,22 +1932,22 @@ } }, "node_modules/@mui/material": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.1.tgz", - "integrity": "sha512-b+eULldTqtqTCbN++2BtBWCir/1LwEYw+2mIlOt2GiEUh1EBBw4/wIukGKKNt3xrCZqRA80yLLkV6tF61Lq3cA==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.3.tgz", + "integrity": "sha512-ubtQjplbWneIEU8Y+4b2VA0CDBlyH5I3AmVFGmsLyDe/bf0ubxav5t11c8Afem6rkSFWPlZA2DilxmGka1xiKQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/core-downloads-tracker": "^6.1.1", - "@mui/system": "^6.1.1", - "@mui/types": "^7.2.17", - "@mui/utils": "^6.1.1", + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.4.3", + "@mui/system": "^6.4.3", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.3", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.11", + "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^18.3.1", + "react-is": "^19.0.0", "react-transition-group": "^4.4.5" }, "engines": { @@ -1960,7 +1960,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.1", + "@mui/material-pigment-css": "^6.4.3", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1980,14 +1980,20 @@ } } }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, "node_modules/@mui/private-theming": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.3.1.tgz", - "integrity": "sha512-g0u7hIUkmXmmrmmf5gdDYv9zdAig0KoxhIQn1JN8IVqApzf/AyRhH3uDGx5mSvs8+a1zb4+0W6LC260SyTTtdQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.3.tgz", + "integrity": "sha512-7x9HaNwDCeoERc4BoEWLieuzKzXu5ZrhRnEM6AUcRXUScQLvF1NFkTlP59+IJfTbEMgcGg1wWHApyoqcksrBpQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/utils": "^6.3.1", + "@mui/utils": "^6.4.3", "prop-types": "^15.8.1" }, "engines": { @@ -2008,9 +2014,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.3.1.tgz", - "integrity": "sha512-/7CC0d2fIeiUxN5kCCwYu4AWUDd9cCTxWCyo0v/Rnv6s8uk6hWgJC3VLZBoDENBHf/KjqDZuYJ2CR+7hD6QYww==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.3.tgz", + "integrity": "sha512-OC402VfK+ra2+f12Gef8maY7Y9n7B6CZcoQ9u7mIkh/7PKwW/xH81xwX+yW+Ak1zBT3HYcVjh2X82k5cKMFGoQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", @@ -2042,16 +2048,16 @@ } }, "node_modules/@mui/system": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.3.1.tgz", - "integrity": "sha512-AwqQ3EAIT2np85ki+N15fF0lFXX1iFPqenCzVOSl3QXKy2eifZeGd9dGtt7pGMoFw5dzW4dRGGzRpLAq9rkl7A==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.3.tgz", + "integrity": "sha512-Q0iDwnH3+xoxQ0pqVbt8hFdzhq1g2XzzR4Y5pVcICTNtoCLJmpJS3vI4y/OIM1FHFmpfmiEC2IRIq7YcZ8nsmg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/private-theming": "^6.3.1", - "@mui/styled-engine": "^6.3.1", + "@mui/private-theming": "^6.4.3", + "@mui/styled-engine": "^6.4.3", "@mui/types": "^7.2.21", - "@mui/utils": "^6.3.1", + "@mui/utils": "^6.4.3", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -2096,9 +2102,9 @@ } }, "node_modules/@mui/utils": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.3.1.tgz", - "integrity": "sha512-sjGjXAngoio6lniQZKJ5zGfjm+LD2wvLwco7FbKe1fu8A7VIFmz2SwkLb+MDPLNX1lE7IscvNNyh1pobtZg2tw==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.3.tgz", + "integrity": "sha512-jxHRHh3BqVXE9ABxDm+Tc3wlBooYz/4XPa0+4AI+iF38rV1/+btJmSUgG4shDtSWVs/I97aDn5jBCt6SF2Uq2A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", diff --git a/webapp/package.json b/webapp/package.json index e0c90e5d68..ee60932138 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -20,7 +20,7 @@ "@handsontable/react": "14.5.0", "@mui/icons-material": "6.1.1", "@mui/lab": "6.0.0-beta.10", - "@mui/material": "6.1.1", + "@mui/material": "6.4.3", "@mui/x-tree-view": "7.18.0", "@reduxjs/toolkit": "1.9.6", "axios": "1.7.7", diff --git a/webapp/src/components/common/DynamicList.tsx b/webapp/src/components/common/DynamicList.tsx index 8b5ebf6559..86850a698c 100644 --- a/webapp/src/components/common/DynamicList.tsx +++ b/webapp/src/components/common/DynamicList.tsx @@ -69,6 +69,7 @@ function DynamicList({ onAdd(e.target.value as string)} size="small" variant="outlined" diff --git a/webapp/src/components/common/SelectMulti.tsx b/webapp/src/components/common/SelectMulti.tsx index 6532bddf59..54e8f375eb 100644 --- a/webapp/src/components/common/SelectMulti.tsx +++ b/webapp/src/components/common/SelectMulti.tsx @@ -34,13 +34,12 @@ interface Props { data: string[]; setValue: (data: string[]) => void; sx?: SxProps | undefined; - placeholder?: string; tagsMode?: boolean; required?: boolean; } function SelectMulti(props: Props) { - const { name, list, data, setValue, placeholder, tagsMode, sx, required } = props; + const { name, list, data, setValue, tagsMode, sx, required } = props; const handleChange = (event: SelectChangeEvent) => { const { @@ -82,7 +81,6 @@ function SelectMulti(props: Props) { multiple value={data} variant="filled" - placeholder={placeholder} onChange={handleChange} renderValue={tagsMode === true ? chipRender : checkboxRender} > diff --git a/webapp/src/components/common/page/ViewWrapper.tsx b/webapp/src/components/common/page/ViewWrapper.tsx index f82446412c..6eb2bff6a3 100644 --- a/webapp/src/components/common/page/ViewWrapper.tsx +++ b/webapp/src/components/common/page/ViewWrapper.tsx @@ -26,7 +26,7 @@ function ViewWrapper({ children }: ViewWrapperProps) { width: 1, height: 1, p: 2, - ":has(.TabsView:first-child), :has(.TabWrapper:first-child)": { + ":has(.TabsView:first-of-type), :has(.TabWrapper:first-of-type)": { pt: 0, }, overflow: "auto", From 3efcfff6ab037f8d48c42e067a6d7e57beb171af Mon Sep 17 00:00:00 2001 From: Theo Pascoli <48944759+TheoPascoli@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:37:31 +0100 Subject: [PATCH 38/38] build(all): bump pydantic and linting packages (#2331) --- .github/workflows/main.yml | 2 +- antarest/core/filetransfer/service.py | 32 ++++++++++++------- antarest/service_creator.py | 12 +++++-- antarest/study/business/general_management.py | 8 +++-- requirements-dev.txt | 6 ++-- requirements.txt | 5 ++- .../studies_blueprint/test_get_studies.py | 8 +++-- .../model/command/test_remove_st_storage.py | 2 +- 8 files changed, 46 insertions(+), 29 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a5207a3d20..30db6c0d4f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,7 +26,7 @@ jobs: uses: psf/black@stable with: # Version of Black should match the versions set in `requirements-dev.txt` - version: "~=23.7.0" + version: "~=25.1.0" options: --check --diff - name: Check Typing (mypy) #continue-on-error: true diff --git a/antarest/core/filetransfer/service.py b/antarest/core/filetransfer/service.py index a82f7af814..92b43e16d9 100644 --- a/antarest/core/filetransfer/service.py +++ b/antarest/core/filetransfer/service.py @@ -79,9 +79,11 @@ def request_download( Event( type=EventType.DOWNLOAD_CREATED, payload=download.to_dto(), - permissions=PermissionInfo(owner=owner.impersonator) - if owner - else PermissionInfo(public_mode=PublicMode.READ), + permissions=( + PermissionInfo(owner=owner.impersonator) + if owner + else PermissionInfo(public_mode=PublicMode.READ) + ), ) ) return download @@ -98,9 +100,11 @@ def set_ready(self, download_id: str, use_notification: bool = True) -> None: Event( type=EventType.DOWNLOAD_READY, payload=download.to_dto(), - permissions=PermissionInfo(owner=download.owner) - if download.owner - else PermissionInfo(public_mode=PublicMode.READ), + permissions=( + PermissionInfo(owner=download.owner) + if download.owner + else PermissionInfo(public_mode=PublicMode.READ) + ), ) ) @@ -116,9 +120,11 @@ def fail(self, download_id: str, reason: str = "") -> None: Event( type=EventType.DOWNLOAD_FAILED, payload=download.to_dto(), - permissions=PermissionInfo(owner=download.owner) - if download.owner - else PermissionInfo(public_mode=PublicMode.READ), + permissions=( + PermissionInfo(owner=download.owner) + if download.owner + else PermissionInfo(public_mode=PublicMode.READ) + ), ) ) @@ -185,9 +191,11 @@ def _clean_up_expired_downloads(self, file_downloads: List[FileDownload]) -> Non Event( type=EventType.DOWNLOAD_EXPIRED, payload=download_id, - permissions=PermissionInfo(owner=download_owner) - if download_owner - else PermissionInfo(public_mode=PublicMode.READ), + permissions=( + PermissionInfo(owner=download_owner) + if download_owner + else PermissionInfo(public_mode=PublicMode.READ) + ), ) ) diff --git a/antarest/service_creator.py b/antarest/service_creator.py index a9b0351671..5a538beb69 100644 --- a/antarest/service_creator.py +++ b/antarest/service_creator.py @@ -127,9 +127,15 @@ def create_event_bus(app_ctxt: t.Optional[AppBuildContext], config: Config) -> t ) -def create_core_services( - app_ctxt: t.Optional[AppBuildContext], config: Config -) -> t.Tuple[ICache, IEventBus, ITaskService, FileTransferManager, LoginService, MatrixService, StudyService,]: +def create_core_services(app_ctxt: t.Optional[AppBuildContext], config: Config) -> t.Tuple[ + ICache, + IEventBus, + ITaskService, + FileTransferManager, + LoginService, + MatrixService, + StudyService, +]: event_bus, redis_client = create_event_bus(app_ctxt, config) cache = build_cache(config=config, redis_client=redis_client) filetransfer_service = build_filetransfer_service(app_ctxt, event_bus, config) diff --git a/antarest/study/business/general_management.py b/antarest/study/business/general_management.py index 7270c63dc2..e8e74822c1 100644 --- a/antarest/study/business/general_management.py +++ b/antarest/study/business/general_management.py @@ -307,9 +307,11 @@ def __get_building_mode_update_cmds( return [ UpdateConfig( - target=f"{GENERAL_PATH}/custom-scenario" - if study_version >= STUDY_VERSION_8 - else f"{GENERAL_PATH}/custom-ts-numbers", + target=( + f"{GENERAL_PATH}/custom-scenario" + if study_version >= STUDY_VERSION_8 + else f"{GENERAL_PATH}/custom-ts-numbers" + ), data=new_value == BuildingMode.CUSTOM, command_context=cmd_context, study_version=study_version, diff --git a/requirements-dev.txt b/requirements-dev.txt index 14c06c1ed6..f3ec4b5a88 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,9 +1,9 @@ -r requirements-test.txt -r requirements-desktop.txt # Version of Black should match the versions set in `.github/workflows/main.yml` -black~=23.7.0 -isort~=5.12.0 -mypy~=1.11.1 +black~=25.1.0 +isort~=6.0.0 +mypy~=1.15.0 pyinstaller==6.10.0 pyinstaller-hooks-contrib==2024.8 diff --git a/requirements.txt b/requirements.txt index 60c782d945..cf483d9d7e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ antares-timeseries-generation==0.1.7 # and **manage their versions** for better control and to avoid unnecessary dependencies. fastapi~=0.110.3 uvicorn[standard]~=0.30.6 -pydantic~=2.8.2 +pydantic~=2.10.0 httpx~=0.27.0 python-multipart~=0.0.9 @@ -28,8 +28,7 @@ click~=8.0.3 contextvars~=2.4 filelock~=3.4.2 gunicorn~=20.1.0 -humanize~=4.10.0; python_version <= '3.8' -humanize~=4.11.0; python_version > '3.8' +humanize~=4.11.0 jsonref~=0.2 PyJWT~=2.9.0 MarkupSafe~=2.0.1 diff --git a/tests/integration/studies_blueprint/test_get_studies.py b/tests/integration/studies_blueprint/test_get_studies.py index 7049f82369..e2432464d0 100644 --- a/tests/integration/studies_blueprint/test_get_studies.py +++ b/tests/integration/studies_blueprint/test_get_studies.py @@ -1404,9 +1404,11 @@ def test_get_studies__access_permissions(self, client: TestClient, admin_access_ res = client.get( STUDIES_URL, headers={"Authorization": f"Bearer {users_tokens['user_1']}"}, - params={"groups": ",".join(request_groups_ids), "pageNb": 1, "pageSize": 2} - if request_groups_ids - else {"pageNb": 1, "pageSize": 2}, + params=( + {"groups": ",".join(request_groups_ids), "pageNb": 1, "pageSize": 2} + if request_groups_ids + else {"pageNb": 1, "pageSize": 2} + ), ) assert res.status_code == LIST_STATUS_CODE, res.json() assert len(res.json()) == max(0, min(2, len(expected_studies) - 2)) diff --git a/tests/variantstudy/model/command/test_remove_st_storage.py b/tests/variantstudy/model/command/test_remove_st_storage.py index d416391464..62d911f2bb 100644 --- a/tests/variantstudy/model/command/test_remove_st_storage.py +++ b/tests/variantstudy/model/command/test_remove_st_storage.py @@ -88,7 +88,7 @@ def test_init__invalid_storage_id(self, recent_study: FileStudy, command_context "loc": ("storage_id",), "msg": "String should match pattern '[a-z0-9_(),& -]+'", "type": "string_pattern_mismatch", - "url": "https://errors.pydantic.dev/2.8/v/string_pattern_mismatch", + "url": "https://errors.pydantic.dev/2.10/v/string_pattern_mismatch", } ]