From 264c3080b85526f23cbea55e235c70e6342308d4 Mon Sep 17 00:00:00 2001 From: Brandon Kiser <51934408+brandonskiser@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:27:38 -0700 Subject: [PATCH 1/4] feat: update build scripts to build qchat (#2198) --- build-config/buildspec-linux.yml | 47 +++ build-config/buildspec-macos.yml | 41 +++ build-scripts/qchatbuild.py | 587 +++++++++++++++++++++++++++++++ build-scripts/qchatmain.py | 50 +++ build-scripts/util.py | 8 +- crates/chat-cli/.gitignore | 5 +- crates/chat-cli/build.rs | 44 +++ 7 files changed, 780 insertions(+), 2 deletions(-) create mode 100644 build-config/buildspec-linux.yml create mode 100644 build-config/buildspec-macos.yml create mode 100644 build-scripts/qchatbuild.py create mode 100644 build-scripts/qchatmain.py diff --git a/build-config/buildspec-linux.yml b/build-config/buildspec-linux.yml new file mode 100644 index 0000000000..0067def79d --- /dev/null +++ b/build-config/buildspec-linux.yml @@ -0,0 +1,47 @@ +version: 0.2 + +env: + shell: bash + +phases: + install: + run-as: root + commands: + - dnf update -y + - dnf install -y python cmake bash zsh unzip git jq + - dnf swap -y gnupg2-minimal gnupg2-full + pre_build: + commands: + - export HOME=/home/codebuild-user + - export PATH="$HOME/.local/bin:$PATH" + - mkdir -p "$HOME/.local/bin" + # Create fish config dir to prevent rustup from failing + - mkdir -p "$HOME/.config/fish/conf.d" + # Install cargo + - curl --retry 5 --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + - . "$HOME/.cargo/env" + - rustup toolchain install `cat rust-toolchain.toml | grep channel | cut -d '=' -f2 | tr -d ' "'` + # Install cross only if the musl env var is set and not null + - if [ ! -z "${AMAZON_Q_BUILD_MUSL:+x}" ]; then cargo install cross --git https://github.com/cross-rs/cross; fi + # Install python/node via mise (https://mise.jdx.dev/continuous-integration.html) + - curl --retry 5 --proto '=https' --tlsv1.2 -sSf https://mise.run | sh + - mise install + - eval "$(mise activate bash --shims)" + # Install python deps + - pip3 install -r build-scripts/requirements.txt + build: + commands: + - python3.11 build-scripts/qchatmain.py build + +artifacts: + discard-paths: "yes" + base-directory: "build" + files: + - ./*.tar.gz + - ./*.zip + # Hashes + - ./*.sha256 + # Signatures + - ./*.asc + - ./*.sig + diff --git a/build-config/buildspec-macos.yml b/build-config/buildspec-macos.yml new file mode 100644 index 0000000000..8f935870ac --- /dev/null +++ b/build-config/buildspec-macos.yml @@ -0,0 +1,41 @@ +version: 0.2 + +phases: + pre_build: + commands: + - whoami + - echo "$HOME" + - echo "$SHELL" + - pwd + - ls + - mkdir -p "$HOME/.local/bin" + - export PATH="$HOME/.local/bin:$PATH" + # Create fish config dir to prevent rustup from failing + - mkdir -p "$HOME/.config/fish/conf.d" + # Install cargo + - export CARGO_HOME="$HOME/.cargo" + - curl --retry 5 --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + - . "$HOME/.cargo/env" + - rustup toolchain install `cat rust-toolchain.toml | grep channel | cut -d '=' -f2 | tr -d ' "'` + # Install cross only if the musl env var is set and not null + - if [ ! -z "${AMAZON_Q_BUILD_MUSL:+x}" ]; then cargo install cross --git https://github.com/cross-rs/cross; fi + # Install python/node via mise (https://mise.jdx.dev/continuous-integration.html) + - curl --retry 5 --proto '=https' --tlsv1.2 -sSf https://mise.run | sh + - mise install + - eval "$(mise activate zsh --shims)" + # Install python deps + - python3 -m venv scripts/.env + - source build-scripts/.env/bin/activate + - pip3 install -r build-scripts/requirements.txt + build: + commands: + - python3 build-scripts/qchatmain.py build --skip-lints --skip-tests --not-release + +artifacts: + discard-paths: "yes" + base-directory: "build" + files: + - ./*.zip + # Hashes + - ./*.sha256 + diff --git a/build-scripts/qchatbuild.py b/build-scripts/qchatbuild.py new file mode 100644 index 0000000000..4a00ca900f --- /dev/null +++ b/build-scripts/qchatbuild.py @@ -0,0 +1,587 @@ +import base64 +from dataclasses import dataclass +import json +import pathlib +from functools import cache +import os +import shutil +import time +from typing import Any, Mapping, Sequence, List, Optional +from build import generate_sha +from const import APPLE_TEAM_ID, CHAT_BINARY_NAME, CHAT_PACKAGE_NAME +from util import debug, info, isDarwin, isLinux, run_cmd, run_cmd_output, warn +from rust import cargo_cmd_name, rust_env, rust_targets +from importlib import import_module + +Args = Sequence[str | os.PathLike] +Env = Mapping[str, str | os.PathLike] +Cwd = str | os.PathLike + +BUILD_DIR_RELATIVE = pathlib.Path(os.environ.get("BUILD_DIR") or "build") +BUILD_DIR = BUILD_DIR_RELATIVE.absolute() + +CD_SIGNER_REGION = "us-west-2" +SIGNING_API_BASE_URL = "https://api.signer.builder-tools.aws.dev" + + +@dataclass +class CdSigningData: + bucket_name: str + """The bucket hosting signing artifacts accessible by CD Signer.""" + apple_notarizing_secret_arn: str + """The ARN of the secret containing the Apple ID and password, used during notarization""" + signing_role_arn: str + """The ARN of the role used by CD Signer""" + + +@dataclass +class MacOSBuildOutput: + chat_path: pathlib.Path + """The path to the chat binary""" + chat_zip_path: pathlib.Path + """The path to the chat binary zipped""" + + +def run_cargo_tests(): + args = [cargo_cmd_name()] + args.extend(["test", "--locked", "--package", CHAT_PACKAGE_NAME]) + run_cmd( + args, + env={ + **os.environ, + **rust_env(release=False), + }, + ) + + +def run_clippy(): + args = [cargo_cmd_name(), "clippy", "--locked", "--package", CHAT_PACKAGE_NAME] + run_cmd( + args, + env={ + **os.environ, + **rust_env(release=False), + }, + ) + + +def build_chat_bin( + release: bool, + output_name: str | None = None, + targets: Sequence[str] = [], +): + package = CHAT_PACKAGE_NAME + + args = [cargo_cmd_name(), "build", "--locked", "--package", package] + + for target in targets: + args.extend(["--target", target]) + + if release: + args.append("--release") + target_subdir = "release" + else: + target_subdir = "debug" + + run_cmd( + args, + env={ + **os.environ, + **rust_env(release=release), + }, + ) + + # create "universal" binary for macos + if isDarwin(): + out_path = BUILD_DIR / f"{output_name or package}-universal-apple-darwin" + args = [ + "lipo", + "-create", + "-output", + out_path, + ] + for target in targets: + args.append(pathlib.Path("target") / target / target_subdir / package) + run_cmd(args) + return out_path + else: + # linux does not cross compile arch + target = targets[0] + target_path = pathlib.Path("target") / target / target_subdir / package + out_path = BUILD_DIR / "bin" / f"{(output_name or package)}-{target}" + out_path.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(target_path, out_path) + return out_path + + +@cache +def get_creds(): + boto3 = import_module("boto3") + session = boto3.Session() + credentials = session.get_credentials() + creds = credentials.get_frozen_credentials() + return creds + + +def cd_signer_request(method: str, path: str, data: str | None = None): + """ + Sends a request to the CD Signer API. + """ + SigV4Auth = import_module("botocore.auth").SigV4Auth + AWSRequest = import_module("botocore.awsrequest").AWSRequest + requests = import_module("requests") + + url = f"{SIGNING_API_BASE_URL}{path}" + headers = {"Content-Type": "application/json"} + request = AWSRequest(method=method, url=url, data=data, headers=headers) + SigV4Auth(get_creds(), "signer-builder-tools", CD_SIGNER_REGION).add_auth(request) + + for i in range(1, 8): + debug(f"Sending request {method} to {url} with data: {data}") + response = requests.request(method=method, url=url, headers=dict(request.headers), data=data) + info(f"CDSigner Request ({url}): {response.status_code}") + if response.status_code == 429: + warn(f"Too many requests, backing off for {2**i} seconds") + time.sleep(2**i) + continue + return response + + raise Exception(f"Failed to request {url}") + + +def cd_signer_create_request(manifest: Any) -> str: + """ + Sends a POST request to create a new signing request. After creation, we + need to send another request to start it. + """ + response = cd_signer_request( + method="POST", + path="/signing_requests", + data=json.dumps({"manifest": manifest}), + ) + response_json = response.json() + info(f"Signing request create: {response_json}") + request_id = response_json["signingRequestId"] + return request_id + + +def cd_signer_start_request(request_id: str, source_key: str, destination_key: str, signing_data: CdSigningData): + """ + Sends a POST request to start the signing process. + """ + response_text = cd_signer_request( + method="POST", + path=f"/signing_requests/{request_id}/start", + data=json.dumps( + { + "iamRole": f"{signing_data.signing_role_arn}", + "s3Location": { + "bucket": signing_data.bucket_name, + "sourceKey": source_key, + "destinationKey": destination_key, + }, + } + ), + ).text + info(f"Signing request start: {response_text}") + + +def cd_signer_status_request(request_id: str): + response_json = cd_signer_request( + method="GET", + path=f"/signing_requests/{request_id}", + ).json() + info(f"Signing request status: {response_json}") + return response_json["signingRequest"]["status"] + + +def cd_build_signed_package(exe_path: pathlib.Path): + """ + Creates a tarball `package.tar.gz` with the following structure: + ``` + package + ├─ EXECUTABLES_TO_SIGN + | ├─ qchat + ``` + """ + # Trying a different format without manifest.yaml and placing EXECUTABLES_TO_SIGN + # at the root. + # The docs contain conflicting information, idk what to even do here + working_dir = BUILD_DIR / "package" + shutil.rmtree(working_dir, ignore_errors=True) + (BUILD_DIR / "package" / "EXECUTABLES_TO_SIGN").mkdir(parents=True) + + shutil.copy2(exe_path, working_dir / "EXECUTABLES_TO_SIGN" / exe_path.name) + exe_path.unlink() + + run_cmd(["gtar", "-czf", "artifact.gz", "EXECUTABLES_TO_SIGN"], cwd=working_dir) + run_cmd( + ["gtar", "-czf", BUILD_DIR / "package.tar.gz", "artifact.gz"], + cwd=working_dir, + ) + + return BUILD_DIR / "package.tar.gz" + + +def manifest( + identifier: str, +): + """ + Returns the manifest arguments required when creating a new CD Signer request. + """ + return { + "type": "app", + "os": "osx", + "name": "EXECUTABLES_TO_SIGN", + "outputs": [{"label": "macos", "path": "EXECUTABLES_TO_SIGN"}], + "app": { + "identifier": identifier, + "signing_requirements": { + "certificate_type": "developerIDAppDistribution", + "app_id_prefix": APPLE_TEAM_ID, + }, + }, + } + + +def sign_executable(signing_data: CdSigningData, exe_path: pathlib.Path) -> pathlib.Path: + """ + Signs an executable with CD Signer. + + Returns: + The path to the signed executable + """ + name = exe_path.name + info(f"Signing {name}") + + info("Packaging...") + package_path = cd_build_signed_package(exe_path) + + info("Uploading...") + run_cmd(["aws", "s3", "rm", "--recursive", f"s3://{signing_data.bucket_name}/signed"]) + run_cmd(["aws", "s3", "rm", "--recursive", f"s3://{signing_data.bucket_name}/pre-signed"]) + run_cmd(["aws", "s3", "cp", package_path, f"s3://{signing_data.bucket_name}/pre-signed/package.tar.gz"]) + + info("Sending request...") + request_id = cd_signer_create_request(manifest("com.amazon.codewhisperer")) + cd_signer_start_request( + request_id=request_id, + source_key="pre-signed/package.tar.gz", + destination_key="signed/signed.zip", + signing_data=signing_data, + ) + + max_duration = 180 + end_time = time.time() + max_duration + i = 1 + while True: + info(f"Checking for signed package attempt #{i}") + status = cd_signer_status_request(request_id) + info(f"Package has status: {status}") + + match status: + case "success": + break + case "created" | "processing" | "inProgress": + pass + case "failure": + raise RuntimeError("Signing request failed") + case _: + warn(f"Unexpected status, ignoring: {status}") + + if time.time() >= end_time: + raise RuntimeError("Signed package did not appear, check signer logs") + time.sleep(2) + i += 1 + + info("Signed!") + + # CD Signer should return the signed executable in a zip file containing the structure: + # "Payload/EXECUTABLES_TO_SIGN/{executable name}". + info("Downloading...") + + # Create a new directory for unzipping the signed executable. + zip_dl_path = BUILD_DIR / pathlib.Path("signed.zip") + run_cmd(["aws", "s3", "cp", f"s3://{signing_data.bucket_name}/signed/signed.zip", zip_dl_path]) + payload_path = BUILD_DIR / "signed" + shutil.rmtree(payload_path, ignore_errors=True) + run_cmd(["unzip", zip_dl_path, "-d", payload_path]) + zip_dl_path.unlink() + signed_exe_path = BUILD_DIR / "signed" / "Payload" / "EXECUTABLES_TO_SIGN" / name + # Verify that the exe is signed + run_cmd(["codesign", "--verify", "--verbose=4", signed_exe_path]) + return signed_exe_path + + +def notarize_executable(signing_data: CdSigningData, exe_path: pathlib.Path): + """ + Submits an executable to Apple notary service. + """ + # Load the Apple id and password from secrets manager. + secret_id = signing_data.apple_notarizing_secret_arn + secret_region = parse_region_from_arn(signing_data.apple_notarizing_secret_arn) + info(f"Loading secretmanager value: {secret_id}") + secret_value = run_cmd_output( + ["aws", "--region", secret_region, "secretsmanager", "get-secret-value", "--secret-id", secret_id] + ) + secret_string = json.loads(secret_value)["SecretString"] + secrets = json.loads(secret_string) + + # Submit the exe to Apple notary service. It must be zipped first. + info(f"Submitting {exe_path} to Apple notary service") + zip_path = BUILD_DIR / f"{exe_path.name}.zip" + zip_path.unlink(missing_ok=True) + run_cmd(["zip", "-j", zip_path, exe_path], cwd=BUILD_DIR) + submit_res = run_cmd_output( + [ + "xcrun", + "notarytool", + "submit", + zip_path, + "--team-id", + APPLE_TEAM_ID, + "--apple-id", + secrets["appleId"], + "--password", + secrets["appleIdPassword"], + "--wait", + "-f", + "json", + ] + ) + debug(f"Notary service response: {submit_res}") + + # Confirm notarization succeeded. + assert json.loads(submit_res)["status"] == "Accepted" + + # Cleanup + zip_path.unlink() + + +def sign_and_notarize(signing_data: CdSigningData, chat_path: pathlib.Path) -> pathlib.Path: + """ + Signs an executable with CD Signer, and verifies it with Apple notary service. + + Returns: + The path to the signed executable. + """ + # First, sign the application + chat_path = sign_executable(signing_data, chat_path) + + # Next, notarize the application + notarize_executable(signing_data, chat_path) + + return chat_path + + +def build_macos(chat_path: pathlib.Path, signing_data: CdSigningData | None): + """ + Creates a qchat.zip under the build directory. + """ + chat_dst = BUILD_DIR / CHAT_BINARY_NAME + chat_dst.unlink(missing_ok=True) + shutil.copy2(chat_path, chat_dst) + + if signing_data: + chat_dst = sign_and_notarize(signing_data, chat_dst) + + zip_path = BUILD_DIR / f"{CHAT_BINARY_NAME}.zip" + zip_path.unlink(missing_ok=True) + + info(f"Creating zip output to {zip_path}") + run_cmd(["zip", "-j", zip_path, chat_dst], cwd=BUILD_DIR) + generate_sha(zip_path) + + +class GpgSigner: + def __init__(self, gpg_id: str, gpg_secret_key: str, gpg_passphrase: str): + self.gpg_id = gpg_id + self.gpg_secret_key = gpg_secret_key + self.gpg_passphrase = gpg_passphrase + + self.gpg_home = pathlib.Path.home() / ".gnupg-tmp" + self.gpg_home.mkdir(parents=True, exist_ok=True, mode=0o700) + + # write gpg secret key to file + self.gpg_secret_key_path = self.gpg_home / "gpg_secret" + self.gpg_secret_key_path.write_bytes(base64.b64decode(gpg_secret_key)) + + self.gpg_passphrase_path = self.gpg_home / "gpg_pass" + self.gpg_passphrase_path.write_text(gpg_passphrase) + + run_cmd(["gpg", "--version"]) + + info("Importing GPG key") + run_cmd(["gpg", "--list-keys"], env=self.gpg_env()) + run_cmd( + ["gpg", *self.sign_args(), "--allow-secret-key-import", "--import", self.gpg_secret_key_path], + env=self.gpg_env(), + ) + run_cmd(["gpg", "--list-keys"], env=self.gpg_env()) + + def gpg_env(self) -> Env: + return {**os.environ, "GNUPGHOME": self.gpg_home} + + def sign_args(self) -> Args: + return [ + "--batch", + "--pinentry-mode", + "loopback", + "--no-tty", + "--yes", + "--passphrase-file", + self.gpg_passphrase_path, + ] + + def sign_file(self, path: pathlib.Path) -> List[pathlib.Path]: + info(f"Signing {path.name}") + run_cmd( + ["gpg", "--detach-sign", *self.sign_args(), "--local-user", self.gpg_id, path], + env=self.gpg_env(), + ) + run_cmd( + ["gpg", "--detach-sign", *self.sign_args(), "--armor", "--local-user", self.gpg_id, path], + env=self.gpg_env(), + ) + return [path.with_suffix(f"{path.suffix}.asc"), path.with_suffix(f"{path.suffix}.sig")] + + def clean(self): + info("Cleaning gpg keys") + shutil.rmtree(self.gpg_home, ignore_errors=True) + + +def get_secretmanager_json(secret_id: str, secret_region: str): + info(f"Loading secretmanager value: {secret_id}") + secret_value = run_cmd_output( + ["aws", "--region", secret_region, "secretsmanager", "get-secret-value", "--secret-id", secret_id] + ) + secret_string = json.loads(secret_value)["SecretString"] + return json.loads(secret_string) + + +def load_gpg_signer() -> Optional[GpgSigner]: + if gpg_id := os.getenv("TEST_PGP_ID"): + gpg_secret_key = os.getenv("TEST_PGP_SECRET_KEY") + gpg_passphrase = os.getenv("TEST_PGP_PASSPHRASE") + if gpg_secret_key is not None and gpg_passphrase is not None: + info("Using test pgp key", gpg_id) + return GpgSigner(gpg_id=gpg_id, gpg_secret_key=gpg_secret_key, gpg_passphrase=gpg_passphrase) + + pgp_secret_arn = os.getenv("SIGNING_PGP_KEY_SECRET_ARN") + info(f"SIGNING_PGP_KEY_SECRET_ARN: {pgp_secret_arn}") + if pgp_secret_arn: + pgp_secret_region = parse_region_from_arn(pgp_secret_arn) + gpg_secret_json = get_secretmanager_json(pgp_secret_arn, pgp_secret_region) + gpg_id = gpg_secret_json["gpg_id"] + gpg_secret_key = gpg_secret_json["gpg_secret_key"] + gpg_passphrase = gpg_secret_json["gpg_passphrase"] + return GpgSigner(gpg_id=gpg_id, gpg_secret_key=gpg_secret_key, gpg_passphrase=gpg_passphrase) + else: + return None + + +def parse_region_from_arn(arn: str) -> str: + # ARN format: arn:partition:service:region:account-id:resource-type/resource-id + # Check if we have enough parts and the ARN starts with "arn:" + parts = arn.split(":") + if len(parts) >= 4: + return parts[3] + + return "" + + +def build_linux(chat_path: pathlib.Path, signer: GpgSigner | None): + """ + Creates tar.gz, tar.xz, tar.zst, and zip archives under `BUILD_DIR`. + + Each archive has the following structure: + - archive/qchat + """ + archive_name = CHAT_BINARY_NAME + + archive_path = pathlib.Path(archive_name) + archive_path.mkdir(parents=True, exist_ok=True) + shutil.copy2(chat_path, archive_path / CHAT_BINARY_NAME) + + info(f"Building {archive_name}.tar.gz") + tar_gz_path = BUILD_DIR / f"{archive_name}.tar.gz" + run_cmd(["tar", "-czf", tar_gz_path, archive_path]) + generate_sha(tar_gz_path) + if signer: + signer.sign_file(tar_gz_path) + + info(f"Building {archive_name}.zip") + zip_path = BUILD_DIR / f"{archive_name}.zip" + run_cmd(["zip", "-r", zip_path, archive_path]) + generate_sha(zip_path) + if signer: + signer.sign_file(zip_path) + + # clean up + shutil.rmtree(archive_path) + if signer: + signer.clean() + + +def build( + release: bool, + stage_name: str | None = None, + run_lints: bool = True, + run_test: bool = True, +): + BUILD_DIR.mkdir(exist_ok=True) + + disable_signing = os.environ.get("DISABLE_SIGNING") + + gpg_signer = load_gpg_signer() if not disable_signing and isLinux() else None + signing_role_arn = os.environ.get("SIGNING_ROLE_ARN") + signing_bucket_name = os.environ.get("SIGNING_BUCKET_NAME") + signing_apple_notarizing_secret_arn = os.environ.get("SIGNING_APPLE_NOTARIZING_SECRET_ARN") + if ( + not disable_signing + and isDarwin() + and signing_role_arn + and signing_bucket_name + and signing_apple_notarizing_secret_arn + ): + signing_data = CdSigningData( + bucket_name=signing_bucket_name, + apple_notarizing_secret_arn=signing_apple_notarizing_secret_arn, + signing_role_arn=signing_role_arn, + ) + else: + signing_data = None + + match stage_name: + case "prod" | None: + info("Building for prod") + case "gamma": + info("Building for gamma") + case _: + raise ValueError(f"Unknown stage name: {stage_name}") + + targets = rust_targets() + + info(f"Release: {release}") + info(f"Targets: {targets}") + info(f"Signing app: {signing_data is not None or gpg_signer is not None}") + + if run_test: + info("Running cargo tests") + run_cargo_tests() + + if run_lints: + info("Running cargo clippy") + run_clippy() + + info("Building", CHAT_PACKAGE_NAME) + chat_path = build_chat_bin( + release=release, + output_name=CHAT_BINARY_NAME, + targets=targets, + ) + + if isDarwin(): + build_macos(chat_path, signing_data) + else: + build_linux(chat_path, gpg_signer) diff --git a/build-scripts/qchatmain.py b/build-scripts/qchatmain.py new file mode 100644 index 0000000000..8389c5e658 --- /dev/null +++ b/build-scripts/qchatmain.py @@ -0,0 +1,50 @@ +import argparse +from qchatbuild import build + + +class StoreIfNotEmptyAction(argparse.Action): + def __call__(self, parser, namespace, values, option_string=None): + if values and len(values) > 0: + setattr(namespace, self.dest, values) + + +parser = argparse.ArgumentParser( + prog="build", + description="Builds the qchat binary", +) +subparsers = parser.add_subparsers(help="sub-command help", dest="subparser", required=True) + +build_subparser = subparsers.add_parser(name="build") +build_subparser.add_argument( + "--stage-name", + action=StoreIfNotEmptyAction, + help="The name of the stage", +) +build_subparser.add_argument( + "--not-release", + action="store_true", + help="Build a non-release version", +) +build_subparser.add_argument( + "--skip-tests", + action="store_true", + help="Skip running npm and rust tests", +) +build_subparser.add_argument( + "--skip-lints", + action="store_true", + help="Skip running lints", +) + +args = parser.parse_args() + +match args.subparser: + case "build": + build( + release=not args.not_release, + stage_name=args.stage_name, + run_lints=not args.skip_lints, + run_test=not args.skip_tests, + ) + case _: + raise ValueError(f"Unsupported subparser {args.subparser}") diff --git a/build-scripts/util.py b/build-scripts/util.py index f2faffb1d4..39158ebdda 100644 --- a/build-scripts/util.py +++ b/build-scripts/util.py @@ -10,7 +10,7 @@ from typing import List, Mapping, Sequence from const import DESKTOP_PACKAGE_NAME, TAURI_PRODUCT_NAME - +DEBUG = "\033[94;1m" INFO = "\033[92;1m" WARN = "\033[93;1m" FAIL = "\033[91;1m" @@ -72,6 +72,10 @@ def log(*value: object, title: str, color: str | None): print(f"{color}{title}:{ENDC}", *value, flush=True) +def debug(*value: object): + log(*value, title="DEBUG", color=DEBUG) + + def info(*value: object): log(*value, title="INFO", color=INFO) @@ -100,6 +104,8 @@ def run_cmd_output( env: Env | None = None, cwd: Cwd | None = None, ) -> str: + args_str = [str(arg) for arg in args] + print(f"+ {shlex.join(args_str)}") res = subprocess.run(args, env=env, cwd=cwd, check=True, stdout=subprocess.PIPE) return res.stdout.decode("utf-8") diff --git a/crates/chat-cli/.gitignore b/crates/chat-cli/.gitignore index 0b0c025e2a..b082f8a65e 100644 --- a/crates/chat-cli/.gitignore +++ b/crates/chat-cli/.gitignore @@ -1,2 +1,5 @@ build/ -spec.ts \ No newline at end of file +spec.ts + +# This is created by the build script for macOS +src/Info.plist diff --git a/crates/chat-cli/build.rs b/crates/chat-cli/build.rs index 3d3c7c6c43..f097298af8 100644 --- a/crates/chat-cli/build.rs +++ b/crates/chat-cli/build.rs @@ -7,6 +7,10 @@ use quote::{ quote, }; +// TODO(brandonskiser): update bundle identifier for signed builds +#[cfg(target_os = "macos")] +const MACOS_BUNDLE_IDENTIFIER: &str = "com.amazon.codewhisperer"; + const DEF: &str = include_str!("./telemetry_definitions.json"); #[derive(Debug, Clone, serde::Deserialize)] @@ -39,9 +43,49 @@ struct Def { metrics: Vec, } +/// Writes a generated Info.plist for the qchat executable under src/. +/// +/// This is required for signing the executable since we must embed the Info.plist directly within +/// the binary. +#[cfg(target_os = "macos")] +fn write_plist() { + let plist = format!( + r#" + + + + CFBundlePackageType + APPL + CFBundleIdentifier + {} + CFBundleName + {} + CFBundleVersion + {} + CFBundleShortVersionString + {} + CFBundleInfoDictionaryVersion + 6.0 + NSHumanReadableCopyright + Copyright © 2022 Amazon Q CLI Team (q-cli@amazon.com):Chay Nabors (nabochay@amazon.com):Brandon Kiser (bskiser@amazon.com) All rights reserved. + + +"#, + MACOS_BUNDLE_IDENTIFIER, + option_env!("AMAZON_Q_BUILD_HASH").unwrap_or("unknown"), + option_env!("AMAZON_Q_BUILD_DATETIME").unwrap_or("unknown"), + env!("CARGO_PKG_VERSION") + ); + + std::fs::write("src/Info.plist", plist).expect("writing the Info.plist should not fail"); +} + fn main() { println!("cargo:rerun-if-changed=def.json"); + #[cfg(target_os = "macos")] + write_plist(); + let outdir = std::env::var("OUT_DIR").unwrap(); let data = serde_json::from_str::(DEF).unwrap(); From e489bb2a577f72b285a22ea86cedf4b1f823d8d9 Mon Sep 17 00:00:00 2001 From: Jayant Dabas Date: Wed, 2 Jul 2025 16:29:01 -0400 Subject: [PATCH 2/4] fix(logs): sanitize strings and print the log message sent by mcp server (#2205) * sanitize log level and data * ouput server logs to user for transparency and progress tracking * allow notification data to accept both string and json objects * disable notification output to stdout --------- Co-authored-by: Jayant Dabas --- crates/chat-cli/src/mcp_client/client.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/chat-cli/src/mcp_client/client.rs b/crates/chat-cli/src/mcp_client/client.rs index 004c0623a9..14b6e2d44d 100644 --- a/crates/chat-cli/src/mcp_client/client.rs +++ b/crates/chat-cli/src/mcp_client/client.rs @@ -379,11 +379,12 @@ where let level = params .as_ref() .and_then(|p| p.get("level")) - .and_then(|v| serde_json::to_string(v).ok()); - let data = params - .as_ref() - .and_then(|p| p.get("data")) - .and_then(|v| serde_json::to_string(v).ok()); + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + let data = params.as_ref().and_then(|p| p.get("data")).map(|v| match v { + serde_json::Value::String(s) => s.clone(), + _ => serde_json::to_string_pretty(v).unwrap_or_default(), + }); if let (Some(level), Some(data)) = (level, data) { match level.to_lowercase().as_str() { "error" => { From caa33dcdca8a72897b2025890731316061fa0817 Mon Sep 17 00:00:00 2001 From: Brandon Kiser <51934408+brandonskiser@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:43:24 -0700 Subject: [PATCH 3/4] fix: macos qchat build config (#2213) --- build-config/buildspec-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-config/buildspec-macos.yml b/build-config/buildspec-macos.yml index 8f935870ac..bdb9733563 100644 --- a/build-config/buildspec-macos.yml +++ b/build-config/buildspec-macos.yml @@ -24,7 +24,7 @@ phases: - mise install - eval "$(mise activate zsh --shims)" # Install python deps - - python3 -m venv scripts/.env + - python3 -m venv build-scripts/.env - source build-scripts/.env/bin/activate - pip3 install -r build-scripts/requirements.txt build: From 36e41a123362d7f93a97aacdd44582f1079ee4a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 04:01:26 +0000 Subject: [PATCH 4/4] chore(deps-dev): bump the eslint group with 2 updates Bumps the eslint group with 2 updates: [eslint](https://github.com/eslint/eslint) and [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js). Updates `eslint` from 9.18.0 to 9.30.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.18.0...v9.30.0) Updates `@eslint/js` from 9.18.0 to 9.30.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.30.0/packages/js) --- updated-dependencies: - dependency-name: eslint dependency-version: 9.30.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint - dependency-name: "@eslint/js" dependency-version: 9.30.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint ... Signed-off-by: dependabot[bot] --- extensions/gnome-extension/package.json | 4 +- .../gnome-legacy-extension/package.json | 4 +- extensions/vscode/package.json | 4 +- packages/api-bindings-wrappers/package.json | 2 +- packages/api-bindings/package.json | 2 +- packages/autocomplete-app/package.json | 2 +- packages/autocomplete-parser/package.json | 2 +- packages/autocomplete/package.json | 2 +- packages/dashboard-app/package.json | 4 +- packages/eslint-config/package.json | 4 +- packages/shared/package.json | 2 +- packages/shell-parser/package.json | 2 +- pnpm-lock.yaml | 493 ++++++++++-------- 13 files changed, 286 insertions(+), 241 deletions(-) diff --git a/extensions/gnome-extension/package.json b/extensions/gnome-extension/package.json index f7ee7d1ecc..623926b648 100644 --- a/extensions/gnome-extension/package.json +++ b/extensions/gnome-extension/package.json @@ -15,8 +15,8 @@ "lint:fix": "eslint --fix src build-scripts && prettier --write src build-scripts types" }, "devDependencies": { - "@eslint/js": "^9.18.0", - "eslint": "9.18.0", + "@eslint/js": "^9.30.1", + "eslint": "9.30.1", "globals": "^16.1.0", "typescript": "^5.8.3", "typescript-eslint": "^8.31.1" diff --git a/extensions/gnome-legacy-extension/package.json b/extensions/gnome-legacy-extension/package.json index 038e9e7918..ee01a0b41e 100644 --- a/extensions/gnome-legacy-extension/package.json +++ b/extensions/gnome-legacy-extension/package.json @@ -7,10 +7,10 @@ "private": true, "type": "module", "devDependencies": { - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.30.1", "@gi.ts/cli": "^1.5.10", "@gi.ts/lib": "^1.5.13", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "globals": "^16.1.0" }, "scripts": { diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 32d3d8a201..cea3dbfcfd 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -40,14 +40,14 @@ } }, "devDependencies": { - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.30.1", "@types/glob": "^8.1.0", "@types/mocha": "^10.0.10", "@types/node": "^22.15.20", "@types/vscode": "~1.80.0", "@vscode/test-electron": "^2.5.2", "@vscode/vsce": "^2.32.0", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "glob": "^11.0.2", "globals": "^16.1.0", "mocha": "^11.4.0", diff --git a/packages/api-bindings-wrappers/package.json b/packages/api-bindings-wrappers/package.json index 5496843b90..f07961e5b5 100644 --- a/packages/api-bindings-wrappers/package.json +++ b/packages/api-bindings-wrappers/package.json @@ -32,7 +32,7 @@ "@amzn/types": "workspace:^", "@aws/amazon-q-developer-cli-shared": "workspace:^", "@withfig/autocomplete-types": "^1.31.0", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "prettier": "^3.4.2", "typescript": "^5.8.3" } diff --git a/packages/api-bindings/package.json b/packages/api-bindings/package.json index dcd33b08ff..9624201f1c 100644 --- a/packages/api-bindings/package.json +++ b/packages/api-bindings/package.json @@ -31,7 +31,7 @@ "@tsconfig/recommended": "^1.0.8", "@types/node": "^22.15.20", "@typescript/analyze-trace": "^0.10.1", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "lint-staged": "^15.5.1", "prettier": "^3.4.2", "ts-morph": "^26.0.0", diff --git a/packages/autocomplete-app/package.json b/packages/autocomplete-app/package.json index c2511e3e66..8a566306a3 100644 --- a/packages/autocomplete-app/package.json +++ b/packages/autocomplete-app/package.json @@ -55,7 +55,7 @@ "@vitejs/plugin-react": "^4.3.4", "@withfig/autocomplete-types": "^1.31.0", "autoprefixer": "^10.4.21", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "postcss": "^8.5.3", "prettier": "^3.4.2", "tailwindcss": "^3.4.17", diff --git a/packages/autocomplete-parser/package.json b/packages/autocomplete-parser/package.json index bdb8f7bbcc..c5d8f3f95c 100644 --- a/packages/autocomplete-parser/package.json +++ b/packages/autocomplete-parser/package.json @@ -38,7 +38,7 @@ "@aws/amazon-q-developer-cli-shared": "workspace:^", "@types/semver": "^7.7.0", "@withfig/autocomplete-types": "^1.31.0", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "typescript": "^5.8.3", "vitest": "^3.0.8" } diff --git a/packages/autocomplete/package.json b/packages/autocomplete/package.json index bda0202222..9048309b4f 100644 --- a/packages/autocomplete/package.json +++ b/packages/autocomplete/package.json @@ -55,7 +55,7 @@ "@vitejs/plugin-react": "^4.3.4", "@withfig/autocomplete-types": "^1.31.0", "autoprefixer": "^10.4.21", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "postcss": "^8.5.3", "prettier": "^3.4.2", "tailwindcss": "^3.4.17", diff --git a/packages/dashboard-app/package.json b/packages/dashboard-app/package.json index c81befc195..e1b0660ee3 100644 --- a/packages/dashboard-app/package.json +++ b/packages/dashboard-app/package.json @@ -40,14 +40,14 @@ }, "devDependencies": { "@amzn/types": "workspace:^", - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.30.1", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@typescript-eslint/eslint-plugin": "^8.31.1", "@typescript-eslint/parser": "^8.31.1", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.21", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.1.0", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index d8cb425bee..51c4301f24 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -26,7 +26,7 @@ }, "devDependencies": { "@amzn/tsconfig": "workspace:^", - "@eslint/js": "^9.18.0", + "@eslint/js": "^9.30.1", "@types/eslint__js": "^8.42.3", "@typescript-eslint/utils": "^8.31.1", "eslint-config-prettier": "^10.1.3", @@ -36,7 +36,7 @@ "eslint-plugin-react-refresh": "^0.4.20", "eslint-plugin-react": "^7.37.5", "eslint-plugin-unicorn": "^59.0.0", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "prettier": "^3.4.2", "typescript-eslint": "^8.31.1", "typescript": "^5.8.3" diff --git a/packages/shared/package.json b/packages/shared/package.json index a7c1ff748f..c4231a0a19 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -30,7 +30,7 @@ "@amzn/types": "workspace:^", "@aws/amazon-q-developer-cli-fuzzysort": "workspace:^", "@withfig/autocomplete-types": "^1.31.0", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "typescript": "^5.8.3", "vitest": "^3.0.8" } diff --git a/packages/shell-parser/package.json b/packages/shell-parser/package.json index a4b7176678..fec71d87a5 100644 --- a/packages/shell-parser/package.json +++ b/packages/shell-parser/package.json @@ -28,7 +28,7 @@ "@amzn/eslint-config": "workspace:^", "@amzn/tsconfig": "workspace:^", "@vitest/coverage-v8": "^3.0.8", - "eslint": "^9.18.0", + "eslint": "^9.30.1", "prettier": "^3.4.2", "typescript": "^5.8.3", "vitest": "^3.0.8" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8d44a9cc3..5196295cbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,11 +46,11 @@ importers: version: 46.0.2 devDependencies: '@eslint/js': - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.30.1 + version: 9.30.1 eslint: - specifier: 9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: 9.30.1 + version: 9.30.1(jiti@1.21.7) globals: specifier: ^16.1.0 version: 16.1.0 @@ -59,13 +59,13 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.31.1 - version: 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) extensions/gnome-legacy-extension: devDependencies: '@eslint/js': - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.30.1 + version: 9.30.1 '@gi.ts/cli': specifier: ^1.5.10 version: 1.5.10(@gi.ts/lib@1.5.13)(@types/node@22.15.20)(typescript@5.8.3) @@ -73,8 +73,8 @@ importers: specifier: ^1.5.13 version: 1.5.13 eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) globals: specifier: ^16.1.0 version: 16.1.0 @@ -82,8 +82,8 @@ importers: extensions/vscode: devDependencies: '@eslint/js': - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.30.1 + version: 9.30.1 '@types/glob': specifier: ^8.1.0 version: 8.1.0 @@ -103,8 +103,8 @@ importers: specifier: ^2.32.0 version: 2.32.0 eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) glob: specifier: ^11.0.2 version: 11.0.2 @@ -143,8 +143,8 @@ importers: specifier: ^0.10.1 version: 0.10.1 eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) lint-staged: specifier: ^15.5.1 version: 15.5.1 @@ -186,8 +186,8 @@ importers: specifier: ^1.31.0 version: 1.31.0 eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) prettier: specifier: ^3.4.2 version: 3.4.2 @@ -295,8 +295,8 @@ importers: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -419,8 +419,8 @@ importers: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -492,8 +492,8 @@ importers: specifier: ^1.31.0 version: 1.31.0 eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -568,8 +568,8 @@ importers: specifier: workspace:^ version: link:../types '@eslint/js': - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.30.1 + version: 9.30.1 '@types/react': specifier: ^18.3.18 version: 18.3.18 @@ -578,10 +578,10 @@ importers: version: 18.3.5(@types/react@18.3.18) '@typescript-eslint/eslint-plugin': specifier: ^8.31.1 - version: 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.31.1 - version: 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.3.4(@types/node@22.15.20)(jiti@1.21.7)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1)) @@ -589,14 +589,14 @@ importers: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.3) eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.18.0(jiti@1.21.7)) + version: 5.2.0(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.18.0(jiti@1.21.7)) + version: 0.4.20(eslint@9.30.1(jiti@1.21.7)) globals: specifier: ^16.1.0 version: 16.1.0 @@ -614,7 +614,7 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.31.1 - version: 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) vite: specifier: ^6.3.4 version: 6.3.4(@types/node@22.15.20)(jiti@1.21.7)(terser@5.39.0)(tsx@4.19.4)(yaml@2.7.1) @@ -625,38 +625,38 @@ importers: specifier: workspace:^ version: link:../tsconfig '@eslint/js': - specifier: ^9.18.0 - version: 9.18.0 + specifier: ^9.30.1 + version: 9.30.1 '@types/eslint__js': specifier: ^8.42.3 version: 8.42.3 '@typescript-eslint/utils': specifier: ^8.31.1 - version: 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) eslint-config-prettier: specifier: ^10.1.3 - version: 10.1.3(eslint@9.18.0(jiti@1.21.7)) + version: 10.1.3(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(eslint@9.18.0(jiti@1.21.7)) + version: 2.31.0(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.18.0(jiti@1.21.7)) + version: 6.10.2(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.18.0(jiti@1.21.7)) + version: 7.37.5(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.18.0(jiti@1.21.7)) + version: 5.2.0(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.18.0(jiti@1.21.7)) + version: 0.4.20(eslint@9.30.1(jiti@1.21.7)) eslint-plugin-unicorn: specifier: ^59.0.0 - version: 59.0.0(eslint@9.18.0(jiti@1.21.7)) + version: 59.0.0(eslint@9.30.1(jiti@1.21.7)) prettier: specifier: ^3.4.2 version: 3.4.2 @@ -665,7 +665,7 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.31.1 - version: 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) packages/fuzzysort: {} @@ -691,8 +691,8 @@ importers: specifier: ^1.31.0 version: 1.31.0 eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -716,8 +716,8 @@ importers: specifier: ^3.0.8 version: 3.0.8(vitest@3.0.8) eslint: - specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + specifier: ^9.30.1 + version: 9.30.1(jiti@1.21.7) prettier: specifier: ^3.4.2 version: 3.4.2 @@ -1480,28 +1480,28 @@ packages: resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} - '@csstools/css-calc@2.1.3': - resolution: {integrity: sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.0.9': - resolution: {integrity: sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==} + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} '@esbuild/aix-ppc64@0.25.3': @@ -1654,14 +1654,14 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1670,38 +1670,46 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.13.0': resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/js@9.30.1': + resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.2.8': resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fig/autocomplete-generators@2.4.0': resolution: {integrity: sha512-fiaaCGmsgnbUJbVbNAcVDmrnCGj/SmfarK6WKt/lfQP9k1hLHkkmZQ836VSMJvPP1vAKFAiXpdJziG6EGyjAYg==} @@ -1935,10 +1943,18 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2531,12 +2547,12 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/glob@8.1.0': resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} @@ -2777,13 +2793,13 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -2965,12 +2981,15 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -3230,8 +3249,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@4.3.1: - resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} csstype@3.1.3: @@ -3415,8 +3434,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} environment@1.1.0: @@ -3551,20 +3570,20 @@ packages: peerDependencies: eslint: '>=9.22.0' - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.30.1: + resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3573,8 +3592,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -3709,8 +3728,8 @@ packages: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} fraction.js@4.3.7: @@ -3931,8 +3950,8 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -4551,6 +4570,10 @@ packages: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -5891,8 +5914,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5999,10 +6022,10 @@ snapshots: '@asamuzakjp/css-color@3.2.0': dependencies: - '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 optional: true @@ -6900,26 +6923,26 @@ snapshots: '@csstools/color-helpers@5.0.2': optional: true - '@csstools/css-calc@2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 optional: true - '@csstools/css-color-parser@3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/color-helpers': 5.0.2 - '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 optional: true - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-tokenizer': 3.0.4 optional: true - '@csstools/css-tokenizer@3.0.3': + '@csstools/css-tokenizer@3.0.4': optional: true '@esbuild/aix-ppc64@0.25.3': @@ -6997,60 +7020,66 @@ snapshots: '@esbuild/win32-x64@0.25.3': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.6.1(eslint@9.30.1(jiti@1.21.7))': dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.6.1(eslint@9.18.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@1.21.7))': dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.21.0': dependencies: - '@eslint/object-schema': 2.1.5 - debug: 4.4.0 + '@eslint/object-schema': 2.1.6 + debug: 4.4.1(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.13.0': + '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/core@0.15.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1(supports-color@8.1.1) + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.30.1': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.13.0 levn: 0.4.1 - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@fig/autocomplete-generators@2.4.0': {} @@ -7717,7 +7746,13 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: @@ -7777,7 +7812,7 @@ snapshots: '@oclif/errors': 1.3.6 '@oclif/help': 1.0.15 '@oclif/parser': 3.8.17 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -7797,7 +7832,7 @@ snapshots: dependencies: '@oclif/errors': 1.3.6 '@oclif/parser': 3.8.17 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) globby: 11.1.0 is-wsl: 2.2.0 tslib: 2.8.1 @@ -8285,7 +8320,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.0.1 + minimatch: 10.0.3 path-browserify: 1.0.1 '@tsconfig/node10@1.0.11': {} @@ -8329,7 +8364,7 @@ snapshots: '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@types/eslint__js@8.42.3': @@ -8338,12 +8373,12 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 - - '@types/estree@1.0.6': {} + '@types/estree': 1.0.8 '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} + '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 @@ -8396,15 +8431,15 @@ snapshots: '@types/vscode@1.80.0': {} - '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.31.1 - '@typescript-eslint/type-utils': 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.31.1 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -8413,14 +8448,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/parser@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.31.1 '@typescript-eslint/types': 8.31.1 '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -8430,12 +8465,12 @@ snapshots: '@typescript-eslint/types': 8.31.1 '@typescript-eslint/visitor-keys': 8.31.1 - '@typescript-eslint/type-utils@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) debug: 4.4.1(supports-color@8.1.1) - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -8457,13 +8492,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/utils@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.30.1(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.31.1 '@typescript-eslint/types': 8.31.1 '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -8471,7 +8506,7 @@ snapshots: '@typescript-eslint/visitor-keys@8.31.1': dependencies: '@typescript-eslint/types': 8.31.1 - eslint-visitor-keys: 4.2.0 + eslint-visitor-keys: 4.2.1 '@typescript/analyze-trace@0.10.1': dependencies: @@ -8670,18 +8705,18 @@ snapshots: '@withfig/autocomplete-types@1.31.0': {} - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.0 + acorn: 8.15.0 acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 - - acorn@8.14.0: {} + acorn: 8.15.0 acorn@8.14.1: {} + acorn@8.15.0: {} + agent-base@7.1.3: {} ajv@6.12.6: @@ -8881,7 +8916,7 @@ snapshots: boolbase@1.0.0: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -8890,6 +8925,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -9150,7 +9189,7 @@ snapshots: cssesc@3.0.0: {} - cssstyle@4.3.1: + cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 @@ -9320,7 +9359,7 @@ snapshots: entities@4.5.0: {} - entities@6.0.0: + entities@6.0.1: optional: true environment@1.1.0: {} @@ -9467,9 +9506,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.3(eslint@9.18.0(jiti@1.21.7)): + eslint-config-prettier@10.1.3(eslint@9.30.1(jiti@1.21.7)): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) eslint-import-resolver-node@0.3.9: dependencies: @@ -9479,16 +9518,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.18.0(jiti@1.21.7)): + eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-import@2.31.0(eslint@9.30.1(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -9497,9 +9536,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.18.0(jiti@1.21.7)) + eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -9515,7 +9554,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -9525,7 +9564,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -9534,15 +9573,15 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@1.21.7)): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) - eslint-plugin-react-refresh@0.4.20(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react-refresh@0.4.20(eslint@9.30.1(jiti@1.21.7)): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) - eslint-plugin-react@7.37.5(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@1.21.7)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -9550,7 +9589,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -9564,15 +9603,15 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-unicorn@59.0.0(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-unicorn@59.0.0(eslint@9.30.1(jiti@1.21.7)): dependencies: '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.6.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.30.1(jiti@1.21.7)) '@eslint/plugin-kit': 0.2.8 ci-info: 4.2.0 clean-regexp: 1.0.0 core-js-compat: 3.42.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.30.1(jiti@1.21.7) esquery: 1.6.0 find-up-simple: 1.0.1 globals: 16.1.0 @@ -9585,37 +9624,38 @@ snapshots: semver: 7.7.2 strip-indent: 4.0.0 - eslint-scope@8.2.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.18.0(jiti@1.21.7): + eslint@9.30.1(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.30.1 + '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -9635,11 +9675,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -9657,7 +9697,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -9765,11 +9805,12 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@4.0.2: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 optional: true @@ -9945,7 +9986,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.2: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -10020,7 +10061,7 @@ snapshots: immediate@3.0.6: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -10277,10 +10318,10 @@ snapshots: jsdom@24.1.0: dependencies: - cssstyle: 4.3.1 + cssstyle: 4.6.0 data-urls: 5.0.0 decimal.js: 10.5.0 - form-data: 4.0.2 + form-data: 4.0.3 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -10296,7 +10337,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.2 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -10793,9 +10834,13 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: @@ -10803,7 +10848,7 @@ snapshots: minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -11017,7 +11062,7 @@ snapshots: parse5@7.3.0: dependencies: - entities: 6.0.0 + entities: 6.0.1 optional: true password-prompt@1.1.3: @@ -11878,7 +11923,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 22.15.20 - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -11985,12 +12030,12 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.7 - typescript-eslint@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3): + typescript-eslint@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/parser': 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.31.1(eslint@9.18.0(jiti@1.21.7))(typescript@5.8.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3))(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.30.1(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.30.1(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -12325,7 +12370,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.2: + ws@8.18.3: optional: true xml-name-validator@5.0.0: