From 4e91501eff12ed7633ecd9807001cceb1cc7cec9 Mon Sep 17 00:00:00 2001 From: Evan Doyle Date: Thu, 19 Dec 2024 11:53:20 -0800 Subject: [PATCH 1/2] Switch from bundled Python LSP server to Tach embedded LSP server --- bundled/tool/__init__.py | 0 bundled/tool/_debug_server.py | 40 -- bundled/tool/lsp_jsonrpc.py | 183 ------ bundled/tool/lsp_server.py | 312 --------- bundled/tool/lsp_utils.py | 60 -- bundled/tool/tach_util.py | 40 -- dev-requirements.txt | 3 +- package-lock.json | 616 +++++++++++------- package.json | 50 +- requirements.in | 15 +- requirements.txt | 172 ++--- src/common/constants.ts | 3 +- src/common/server.ts | 26 +- src/common/settings.ts | 20 +- .../python_tests/lsp_test_client/constants.py | 2 + .../python_tests/lsp_test_client/session.py | 13 +- src/test/python_tests/requirements.txt | 6 +- 17 files changed, 460 insertions(+), 1101 deletions(-) delete mode 100644 bundled/tool/__init__.py delete mode 100644 bundled/tool/_debug_server.py delete mode 100644 bundled/tool/lsp_jsonrpc.py delete mode 100644 bundled/tool/lsp_server.py delete mode 100644 bundled/tool/lsp_utils.py delete mode 100644 bundled/tool/tach_util.py diff --git a/bundled/tool/__init__.py b/bundled/tool/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/bundled/tool/_debug_server.py b/bundled/tool/_debug_server.py deleted file mode 100644 index 1cad231..0000000 --- a/bundled/tool/_debug_server.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -"""Debugging support for LSP.""" - -from __future__ import annotations - -import os -import pathlib -import runpy -import sys - - -def update_sys_path(path_to_add: str) -> None: - """Add given path to `sys.path`.""" - if path_to_add not in sys.path and os.path.isdir(path_to_add): - sys.path.append(path_to_add) - - -# Ensure debugger is loaded before we load anything else, to debug initialization. -debugger_path = os.getenv("DEBUGPY_PATH", None) -if debugger_path: - if debugger_path.endswith("debugpy"): - debugger_path = os.fspath(pathlib.Path(debugger_path).parent) - - update_sys_path(debugger_path) - - import debugpy - - # 5678 is the default port, If you need to change it update it here - # and in launch.json. - debugpy.connect(5678) - - # This will ensure that execution is paused as soon as the debugger - # connects to VS Code. If you don't want to pause here comment this - # line and set breakpoints as appropriate. - debugpy.breakpoint() - -SERVER_PATH = os.fspath(pathlib.Path(__file__).parent / "lsp_server.py") -# NOTE: Set breakpoint in `lsp_server.py` before continuing. -runpy.run_path(SERVER_PATH, run_name="__main__") diff --git a/bundled/tool/lsp_jsonrpc.py b/bundled/tool/lsp_jsonrpc.py deleted file mode 100644 index c98a3dd..0000000 --- a/bundled/tool/lsp_jsonrpc.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -"""Light-weight JSON-RPC over standard IO.""" - -from __future__ import annotations - -import atexit -import contextlib -import json -import pathlib -import subprocess -import threading -import uuid -from concurrent.futures import ThreadPoolExecutor -from typing import TYPE_CHECKING, BinaryIO, Sequence - -if TYPE_CHECKING: - import io - -CONTENT_LENGTH = "Content-Length: " -RUNNER_SCRIPT = str(pathlib.Path(__file__).parent / "lsp_runner.py") - - -def to_str(text: str | bytes) -> str: - """Convert bytes to string as needed.""" - return text.decode("utf-8") if isinstance(text, bytes) else text # pyright: ignore [reportReturnType] - - -class StreamClosedException(Exception): - """JSON RPC stream is closed.""" - - pass - - -class JsonWriter: - """Manages writing JSON-RPC messages to the writer stream.""" - - def __init__(self, writer: io.TextIOWrapper | BinaryIO): - self._writer = writer - self._lock = threading.Lock() - - def close(self): - """Closes the underlying writer stream.""" - with self._lock: - if not self._writer.closed: - self._writer.close() - - def write(self, data): - """Writes given data to stream in JSON-RPC format.""" - if self._writer.closed: - raise StreamClosedException() - - with self._lock: - content = json.dumps(data) - length = len(content.encode("utf-8")) - self._writer.write( - str(f"{CONTENT_LENGTH}{length}\r\n\r\n{content}".encode()) # pyright: ignore - ) - self._writer.flush() - - -class JsonReader: - """Manages reading JSON-RPC messages from stream.""" - - def __init__(self, reader: io.TextIOWrapper | BinaryIO): - self._reader = reader - - def close(self): - """Closes the underlying reader stream.""" - if not self._reader.closed: - self._reader.close() - - def read(self): - """Reads data from the stream in JSON-RPC format.""" - if self._reader.closed: - raise StreamClosedException - length = None - while not length: - line = to_str(self._readline()) - if line.startswith(CONTENT_LENGTH): - length = int(line[len(CONTENT_LENGTH) :]) - - line = to_str(self._readline()).strip() - while line: - line = to_str(self._readline()).strip() - - content = to_str(self._reader.read(length)) - return json.loads(content) - - def _readline(self): - line = self._reader.readline() - if not line: - raise EOFError - return line - - -class JsonRpc: - """Manages sending and receiving data over JSON-RPC.""" - - def __init__( - self, reader: io.TextIOWrapper | BinaryIO, writer: io.TextIOWrapper | BinaryIO - ): - self._reader = JsonReader(reader) - self._writer = JsonWriter(writer) - - def close(self): - """Closes the underlying streams.""" - with contextlib.suppress(Exception): - self._reader.close() - with contextlib.suppress(Exception): - self._writer.close() - - def send_data(self, data): - """Send given data in JSON-RPC format.""" - self._writer.write(data) - - def receive_data(self): - """Receive data in JSON-RPC format.""" - return self._reader.read() - - -def create_json_rpc(readable: BinaryIO, writable: BinaryIO) -> JsonRpc: - """Creates JSON-RPC wrapper for the readable and writable streams.""" - return JsonRpc(readable, writable) - - -class ProcessManager: - """Manages sub-processes launched for running tools.""" - - def __init__(self): - self._args: dict[str, Sequence[str]] = {} - self._processes: dict[str, subprocess.Popen] = {} - self._rpc: dict[str, JsonRpc] = {} - self._lock = threading.Lock() - self._thread_pool = ThreadPoolExecutor(10) - - def stop_all_processes(self): - """Send exit command to all processes and shutdown transport.""" - for i in self._rpc.values(): - with contextlib.suppress(Exception): - i.send_data({"id": str(uuid.uuid4()), "method": "exit"}) - self._thread_pool.shutdown(wait=False) - - def start_process(self, workspace: str, args: Sequence[str], cwd: str) -> None: - """Starts a process and establishes JSON-RPC communication over stdio.""" - - proc = subprocess.Popen( - args, - cwd=cwd, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE, - ) - self._processes[workspace] = proc - self._rpc[workspace] = create_json_rpc(proc.stdout, proc.stdin) # pyright: ignore - - def _monitor_process(): - proc.wait() - with self._lock: - try: - del self._processes[workspace] - rpc = self._rpc.pop(workspace) - rpc.close() - - except: # noqa: E722 - pass - - self._thread_pool.submit(_monitor_process) - - def get_json_rpc(self, workspace: str) -> JsonRpc: - """Gets the JSON-RPC wrapper for the a given id.""" - with self._lock: - if workspace in self._rpc: - return self._rpc[workspace] - raise StreamClosedException() - - -_process_manager = ProcessManager() -atexit.register(_process_manager.stop_all_processes) - - -def shutdown_json_rpc(): - """Shutdown all JSON-RPC processes.""" - _process_manager.stop_all_processes() diff --git a/bundled/tool/lsp_server.py b/bundled/tool/lsp_server.py deleted file mode 100644 index 2b8b79a..0000000 --- a/bundled/tool/lsp_server.py +++ /dev/null @@ -1,312 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -"""Implementation of tool support over LSP.""" - -from __future__ import annotations - -import copy -import json -import os -import pathlib -import sys -import traceback -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from tach.extension import CheckResult - - -# ********************************************************** -# Update sys.path before importing any bundled libraries. -# ********************************************************** -def update_sys_path(path_to_add: str, strategy: str) -> None: - """Add given path to `sys.path`.""" - if path_to_add not in sys.path and os.path.isdir(path_to_add): - if strategy == "useBundled": - sys.path.insert(0, path_to_add) - elif strategy == "fromEnvironment": - sys.path.append(path_to_add) - - -# Ensure that we can import LSP libraries, and other bundled libraries. -update_sys_path( - os.fspath(pathlib.Path(__file__).parent.parent / "libs"), - os.getenv("LS_IMPORT_STRATEGY", "useBundled"), -) - -# ********************************************************** -# Imports needed for the language server goes below this. -# ********************************************************** - -import lsp_jsonrpc as jsonrpc # noqa: E402 -import lsp_utils as utils # noqa: E402 -import lsprotocol.types as lsp # noqa: E402 -from pygls import server, uris, workspace # noqa: E402 -from tach_util import run_tach_check # noqa: E402 - -WORKSPACE_SETTINGS = {} -GLOBAL_SETTINGS = {} - -MAX_WORKERS = 5 -# TODO: Centralize version -LSP_SERVER = server.LanguageServer( - name="Tach", version="0.15.5", max_workers=MAX_WORKERS -) - - -# ********************************************************** -# Tool specific code goes below this. -# ********************************************************** - -# Reference: -# LS Protocol: -# https://microsoft.github.io/language-server-protocol/specifications/specification-3-16/ -# -# Sample implementations: -# Pylint: https://github.com/microsoft/vscode-pylint/blob/main/bundled/tool -# Black: https://github.com/microsoft/vscode-black-formatter/blob/main/bundled/tool -# isort: https://github.com/microsoft/vscode-isort/blob/main/bundled/tool - -TOOL_MODULE = "tach" - -TOOL_DISPLAY = "Tach" - -TOOL_ARGS = ["check"] # default arguments always passed to your tool. - - -@LSP_SERVER.feature(lsp.TEXT_DOCUMENT_DID_OPEN) -def did_open(params: lsp.DidOpenTextDocumentParams) -> None: - """LSP handler for textDocument/didOpen request.""" - document = LSP_SERVER.workspace.get_text_document(params.text_document.uri) - diagnostics: list[lsp.Diagnostic] = _linting_helper(document) - LSP_SERVER.publish_diagnostics(document.uri, diagnostics) - - -@LSP_SERVER.feature(lsp.TEXT_DOCUMENT_DID_SAVE) -def did_save(params: lsp.DidSaveTextDocumentParams) -> None: - """LSP handler for textDocument/didSave request.""" - document = LSP_SERVER.workspace.get_text_document(params.text_document.uri) - diagnostics: list[lsp.Diagnostic] = _linting_helper(document) - LSP_SERVER.publish_diagnostics(document.uri, diagnostics) - - -@LSP_SERVER.feature(lsp.TEXT_DOCUMENT_DID_CLOSE) -def did_close(params: lsp.DidCloseTextDocumentParams) -> None: - """LSP handler for textDocument/didClose request.""" - document = LSP_SERVER.workspace.get_text_document(params.text_document.uri) - # Publishing empty diagnostics to clear the entries for this file. - LSP_SERVER.publish_diagnostics(document.uri, []) - - -# TODO can't process texDocument/didChange because we don't process stdin right now - - -def _linting_helper(document: workspace.Document) -> list[lsp.Diagnostic]: - checked_result = _run_tool_on_document(document) - return _parse_boundary_errors(checked_result, document.uri) - - -def _parse_boundary_errors(checked_result: CheckResult | None, uri): - if checked_result is None: - return [] - diagnostics = [] - for err in checked_result.errors: - if str(err.file_path) in uri and err.error_info.to_pystring(): - start = lsp.Position( - line=err.line_number - 1, - character=0, - ) - end = lsp.Position(line=err.line_number - 1, character=99999) - diagnostic = lsp.Diagnostic( - range=lsp.Range( - start=start, - end=end, - ), - message=err.error_info.to_pystring(), - severity=lsp.DiagnosticSeverity.Error, - source=TOOL_MODULE, - ) - diagnostics.append(diagnostic) - - return diagnostics - - -# ********************************************************** -# Required Language Server Initialization and Exit handlers. -# ********************************************************** -@LSP_SERVER.feature(lsp.INITIALIZE) -def initialize(params: lsp.InitializeParams) -> None: - """LSP handler for initialize request.""" - log_to_output(f"CWD Server: {os.getcwd()}") - - paths = "\r\n ".join(sys.path) - log_to_output(f"sys.path used to run Server:\r\n {paths}") - settings = {} - if params.initialization_options: - GLOBAL_SETTINGS.update( - **params.initialization_options.get("globalSettings", {}) - ) - settings = params.initialization_options["settings"] - - _update_workspace_settings(settings) - log_to_output( - f"Settings used to run Server:\r\n{json.dumps(settings, indent=4, ensure_ascii=False)}\r\n" - ) - log_to_output( - f"Global settings:\r\n{json.dumps(GLOBAL_SETTINGS, indent=4, ensure_ascii=False)}\r\n" - ) - - -@LSP_SERVER.feature(lsp.EXIT) -def on_exit(_params: Any | None = None) -> None: - """Handle clean up on exit.""" - jsonrpc.shutdown_json_rpc() - - -@LSP_SERVER.feature(lsp.SHUTDOWN) -def on_shutdown(_params: Any | None = None) -> None: - """Handle clean up on shutdown.""" - jsonrpc.shutdown_json_rpc() - - -def _get_global_defaults(): - return { - "path": GLOBAL_SETTINGS.get("path", []), - "interpreter": GLOBAL_SETTINGS.get("interpreter", [sys.executable]), - "args": GLOBAL_SETTINGS.get("args", []), - "importStrategy": GLOBAL_SETTINGS.get("importStrategy", "useBundled"), - "showNotifications": GLOBAL_SETTINGS.get("showNotifications", "off"), - } - - -def _update_workspace_settings(settings): - if not settings: - key = os.getcwd() - WORKSPACE_SETTINGS[key] = { - "cwd": key, - "workspaceFS": key, - "workspace": uris.from_fs_path(key), - **_get_global_defaults(), - } - return - - for setting in settings: - key = uris.to_fs_path(setting["workspace"]) - WORKSPACE_SETTINGS[key] = { - "cwd": key, - **setting, - "workspaceFS": key, - } - - -def _get_settings_by_path(file_path: pathlib.Path): - workspaces = {s["workspaceFS"] for s in WORKSPACE_SETTINGS.values()} - - while file_path != file_path.parent: - str_file_path = str(file_path) - if str_file_path in workspaces: - return WORKSPACE_SETTINGS[str_file_path] - file_path = file_path.parent - - setting_values = list(WORKSPACE_SETTINGS.values()) - return setting_values[0] - - -def _get_document_key(document: workspace.Document): - if WORKSPACE_SETTINGS: - document_workspace = pathlib.Path(document.path) - workspaces = {s["workspaceFS"] for s in WORKSPACE_SETTINGS.values()} - - # Find workspace settings for the given file. - while document_workspace != document_workspace.parent: - if str(document_workspace) in workspaces: - return str(document_workspace) - document_workspace = document_workspace.parent - - return None - - -def _get_settings_by_document(document: workspace.Document | None): - if document is None or document.path is None: - return list(WORKSPACE_SETTINGS.values())[0] - - key = _get_document_key(document) - if key is None: - # This is either a non-workspace file or there is no workspace. - key = os.fspath(pathlib.Path(document.path).parent) - return { - "cwd": key, - "workspaceFS": key, - "workspace": uris.from_fs_path(key), - **_get_global_defaults(), - } - - return WORKSPACE_SETTINGS[str(key)] - - -# ***************************************************** -# Internal execution API -# ***************************************************** -def _run_tool_on_document( - document: workspace.Document, -): - """Runs tool on the given document.""" - if str(document.uri).startswith("vscode-notebook-cell"): - # Skip notebook cells - return None - - if utils.is_stdlib_file(document.path): - # Skip standard library python files. - return None - - # deep copy here to prevent accidentally updating global settings. - settings = copy.deepcopy(_get_settings_by_document(document)) - cwd = settings["cwd"] - argv = [TOOL_MODULE] + TOOL_ARGS + settings["args"] - - # In this mode the tool is run as a module in the same process as the language server. - log_to_output(f"CWD Linter (no rpc/doc): {cwd}") - # This is needed to preserve sys.path, in cases where the tool modifies - # sys.path and that might not work for this scenario next time around. - with utils.substitute_attr(sys, "path", sys.path[:]): - try: - boundary_errors = run_tach_check(argv=argv, path=document.path) - except Exception: - log_error(traceback.format_exc(chain=True)) - raise - log_to_output(f"{document.uri} :\r\n{str(boundary_errors.errors)}") - return boundary_errors - - -# ***************************************************** -# Logging and notification. -# ***************************************************** -def log_to_output( - message: str, msg_type: lsp.MessageType = lsp.MessageType.Log -) -> None: - LSP_SERVER.show_message_log(message, msg_type) - - -def log_error(message: str) -> None: - LSP_SERVER.show_message_log(message, lsp.MessageType.Error) - if os.getenv("LS_SHOW_NOTIFICATION", "off") in ["onError", "onWarning", "always"]: - LSP_SERVER.show_message(message, lsp.MessageType.Error) - - -def log_warning(message: str) -> None: - LSP_SERVER.show_message_log(message, lsp.MessageType.Warning) - if os.getenv("LS_SHOW_NOTIFICATION", "off") in ["onWarning", "always"]: - LSP_SERVER.show_message(message, lsp.MessageType.Warning) - - -def log_always(message: str) -> None: - LSP_SERVER.show_message_log(message, lsp.MessageType.Info) - if os.getenv("LS_SHOW_NOTIFICATION", "off") in ["always"]: - LSP_SERVER.show_message(message, lsp.MessageType.Info) - - -# ***************************************************** -# Start the server. -# ***************************************************** -if __name__ == "__main__": - LSP_SERVER.start_io() diff --git a/bundled/tool/lsp_utils.py b/bundled/tool/lsp_utils.py deleted file mode 100644 index 3ef7f2c..0000000 --- a/bundled/tool/lsp_utils.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -"""Utility functions and classes for use with running tools over LSP.""" - -from __future__ import annotations - -import contextlib -import os -import os.path -import site -import sys -import threading -from typing import Any - -# Save the working directory used when loading this module -SERVER_CWD = os.getcwd() -CWD_LOCK = threading.Lock() - - -def as_list(content: Any | list[Any] | tuple[Any]) -> list[Any]: - """Ensures we always get a list""" - if isinstance(content, list): - return content - elif isinstance(content, tuple): - return list(content) - return [content] - - -_site_paths = tuple( - [ - os.path.normcase(os.path.normpath(p)) - for p in (as_list(site.getsitepackages()) + as_list(site.getusersitepackages())) - ] -) - - -def is_same_path(file_path1, file_path2) -> bool: - """Returns true if two paths are the same.""" - return os.path.normcase(os.path.normpath(file_path1)) == os.path.normcase( - os.path.normpath(file_path2) - ) - - -def is_current_interpreter(executable) -> bool: - """Returns true if the executable path is same as the current interpreter.""" - return is_same_path(executable, sys.executable) - - -def is_stdlib_file(file_path) -> bool: - """Return True if the file belongs to standard library.""" - return os.path.normcase(os.path.normpath(file_path)).startswith(_site_paths) - - -@contextlib.contextmanager -def substitute_attr(obj: Any, attribute: str, new_value: Any): - """Manage object attributes context when using runpy.run_module().""" - old_value = getattr(obj, attribute) - setattr(obj, attribute, new_value) - yield - setattr(obj, attribute, old_value) diff --git a/bundled/tool/tach_util.py b/bundled/tool/tach_util.py deleted file mode 100644 index ce0486d..0000000 --- a/bundled/tool/tach_util.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations -from typing import TYPE_CHECKING - -from tach.extension import check -from tach.parsing.config import parse_project_config -from tach.cli import parse_arguments -from tach.colors import BCOLORS -from tach.constants import CONFIG_FILE_NAME -from tach.errors import TachSetupError -from tach.filesystem import find_project_config_root - -if TYPE_CHECKING: - from tach.extension import CheckResult - - -def run_tach_check(argv: list[str], path: str): - args, _ = parse_arguments(argv[1:]) - root = find_project_config_root() - if not root: - raise TachSetupError("Project config root not found") - exclude_paths = args.exclude.split(",") if getattr(args, "exclude", None) else None - project_config = parse_project_config(root=root) - if project_config is None: - raise TachSetupError( - f"{BCOLORS.FAIL} {CONFIG_FILE_NAME}.(toml) not found in {root}{BCOLORS.ENDC}", - ) - - if exclude_paths is not None and project_config.exclude is not None: - exclude_paths.extend(project_config.exclude) - else: - exclude_paths = project_config.exclude - - checked_result: CheckResult = check( - project_root=root, - project_config=project_config, - dependencies=True, - interfaces=True, - exclude_paths=exclude_paths, - ) - return checked_result diff --git a/dev-requirements.txt b/dev-requirements.txt index bf2d0ff..191b997 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -2,9 +2,8 @@ pip==24.0 pytest==8.2.2 pyright==1.1.377 ruff==0.4.1 -tach==0.15.5 +tach==0.18.0 # LSP -pygls==1.3.1 nox==2024.4.15 debugpy==1.8.1 PyHamcrest==2.1.0 diff --git a/package-lock.json b/package-lock.json index da86900..57fcab7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tach", - "version": "0.15.5", + "version": "0.18.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tach", - "version": "0.15.5", + "version": "0.18.0", "license": "LGPL-3.0-only", "dependencies": { "@vscode/python-extension": "^1.0.5", @@ -18,17 +18,17 @@ "@types/glob": "^8.1.0", "@types/node": "16.x", "@types/vscode": "1.78.0", - "@typescript-eslint/eslint-plugin": "^8.16.0", - "@typescript-eslint/parser": "^8.16.0", + "@typescript-eslint/eslint-plugin": "^8.18.1", + "@typescript-eslint/parser": "^8.18.1", "@vscode/test-electron": "^2.4.1", "@vscode/vsce": "^3.2.1", - "eslint": "^9.15.0", + "eslint": "^9.17.0", "glob": "^11.0.0", - "prettier": "^3.4.1", + "prettier": "^3.4.2", "ts-loader": "^9.5.1", "typescript": "^5.7.2", - "webpack": "^5.96.1", - "webpack-cli": "^5.1.4" + "webpack": "^5.97.1", + "webpack-cli": "^6.0.0" }, "engines": { "vscode": "^1.78.0" @@ -252,12 +252,13 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=14.17.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -387,9 +388,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, "license": "MIT", "engines": { @@ -682,17 +683,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", - "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", + "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/type-utils": "8.16.0", - "@typescript-eslint/utils": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/type-utils": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -707,25 +708,21 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", - "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", + "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4" }, "engines": { @@ -736,23 +733,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.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": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", - "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", + "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0" + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -763,14 +756,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", - "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", + "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/utils": "8.18.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -782,18 +775,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.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": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", - "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", + "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", "dev": true, "license": "MIT", "engines": { @@ -805,14 +794,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", - "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", + "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -827,23 +816,21 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", - "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", + "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0" + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -853,22 +840,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", - "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", + "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/types": "8.18.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1130,206 +1113,179 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "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==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "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==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "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==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "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==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "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==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "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==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "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==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/acorn": { "version": "8.14.0", @@ -1743,6 +1699,7 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -2074,10 +2031,11 @@ } }, "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -2132,9 +2090,9 @@ } }, "node_modules/eslint": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", - "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "license": "MIT", "dependencies": { @@ -2143,7 +2101,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.9.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.15.0", + "@eslint/js": "9.17.0", "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2152,7 +2110,7 @@ "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -2565,6 +2523,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } @@ -3076,6 +3035,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -3124,6 +3084,7 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3341,6 +3302,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4139,9 +4101,9 @@ } }, "node_modules/prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", - "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "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": { @@ -4503,6 +4465,7 @@ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -5298,17 +5261,17 @@ } }, "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", + "@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", @@ -5345,10 +5308,112 @@ } }, "node_modules/webpack-cli": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.0.tgz", + "integrity": "sha512-4MxiCcVjpl5h88mdrzz+ZQRHiT0JmwImP6Ss3xz0LkPYFR61qxuVx7/IPnwhUyRvXen4v/aLXlJONYmfhgVG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.0", + "@webpack-cli/info": "^3.0.0", + "@webpack-cli/serve": "^3.0.0", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/@webpack-cli/configtest": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.0.tgz", + "integrity": "sha512-3byRXqOvwm/zGM0OhSbq15aJeX5ZUSe0RS7gfzH9wtX9UX6foShghZKxNOq+oJ59s5dsZrvBk4WHLfSnaBJJWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/webpack-cli/node_modules/@webpack-cli/info": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.0.tgz", + "integrity": "sha512-HIuVImc5NGeL3NKz5i0GkqfSJ1XsNH4YlpTb1O+TXYUdzTL6ZAZFL9zoVKXxcmSW+HBKkmkUsLWwlyLcFTrArw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/webpack-cli/node_modules/@webpack-cli/serve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.0.tgz", + "integrity": "sha512-oX0XqXHb0IgD2jfzxM5sOGuwFTrLpOpfyPT0t4QIXHS69eRRliyuKzbavXgDnOENIs9BxbNnAaDFhTpAEPEChQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-cli/node_modules/webpack-cli": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -5389,20 +5454,85 @@ } } }, - "node_modules/webpack-cli/node_modules/commander": { + "node_modules/webpack-cli/node_modules/webpack-cli/node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-cli/node_modules/webpack-cli/node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/webpack-cli/node_modules/webpack-cli/node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/webpack-cli/node_modules/webpack-cli/node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/webpack-cli/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=14" } }, - "node_modules/webpack-merge": { + "node_modules/webpack-cli/node_modules/webpack-cli/node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -5412,6 +5542,21 @@ "node": ">=10.0.0" } }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -5462,7 +5607,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/word-wrap": { "version": "1.2.5", diff --git a/package.json b/package.json index 072d176..350fc07 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "tach", "displayName": "Tach", "description": "Linting support for python files using `tach`.", - "version": "0.15.5", + "version": "0.18.0", "preview": true, "serverInfo": { "name": "Tach", @@ -68,24 +68,6 @@ "contributes": { "configuration": { "properties": { - "tach.args": { - "default": [], - "description": "Arguments passed in. Each argument is a separate item in the array.", - "items": { - "type": "string" - }, - "scope": "resource", - "type": "array" - }, - "tach.path": { - "default": [], - "description": "When set to a path to tach binary, extension will use that. NOTE: Using this option may slowdown server response time.", - "scope": "resource", - "items": { - "type": "string" - }, - "type": "array" - }, "tach.importStrategy": { "default": "useBundled", "description": "Defines where `tach` is imported from. This setting may be ignored if `tach.path` is set.", @@ -108,24 +90,6 @@ "type": "string" }, "type": "array" - }, - "tach.showNotifications": { - "default": "off", - "description": "Controls when notifications are shown by this extension.", - "enum": [ - "off", - "onError", - "onWarning", - "always" - ], - "enumDescriptions": [ - "All notifications are turned off, any errors or warning are still available in the logs.", - "Notifications are shown only in the case of an error.", - "Notifications are shown for errors and warnings.", - "Notifications are show for anything that the server chooses to show." - ], - "scope": "machine", - "type": "string" } } }, @@ -147,16 +111,16 @@ "@types/glob": "^8.1.0", "@types/node": "16.x", "@types/vscode": "1.78.0", - "@typescript-eslint/eslint-plugin": "^8.16.0", - "@typescript-eslint/parser": "^8.16.0", + "@typescript-eslint/eslint-plugin": "^8.18.1", + "@typescript-eslint/parser": "^8.18.1", "@vscode/test-electron": "^2.4.1", "@vscode/vsce": "^3.2.1", - "eslint": "^9.15.0", + "eslint": "^9.17.0", "glob": "^11.0.0", - "prettier": "^3.4.1", + "prettier": "^3.4.2", "ts-loader": "^9.5.1", "typescript": "^5.7.2", - "webpack": "^5.96.1", - "webpack-cli": "^5.1.4" + "webpack": "^5.97.1", + "webpack-cli": "^6.0.0" } } diff --git a/requirements.in b/requirements.in index 08a2f5a..35b5864 100644 --- a/requirements.in +++ b/requirements.in @@ -1,14 +1 @@ -# This file is used to generate requirements.txt. -# NOTE: -# Use Python 3.8 or greater which ever is the minimum version of the python -# you plan on supporting when creating the environment or using pip-tools. -# Only run the commands below to manually upgrade packages in requirements.txt: -# 1) python -m pip install pip-tools -# 2) pip-compile --generate-hashes --resolver=backtracking --upgrade ./requirements.in -# If you are using nox commands to setup or build package you don't need to -# run the above commands manually. - -# Required packages -pygls -packaging -tach \ No newline at end of file +tach>=0.18.0 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 1bf423e..5e722a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,18 +4,6 @@ # # pip-compile --generate-hashes ./requirements.in # -attrs==24.2.0 \ - --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ - --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 - # via - # cattrs - # lsprotocol -cattrs==24.1.2 \ - --hash=sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0 \ - --hash=sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85 - # via - # lsprotocol - # pygls gitdb==4.0.11 \ --hash=sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4 \ --hash=sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b @@ -24,10 +12,6 @@ gitpython==3.1.43 \ --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff # via tach -lsprotocol==2023.0.1 \ - --hash=sha256:c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2 \ - --hash=sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d - # via pygls markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb @@ -40,22 +24,14 @@ networkx==3.4.2 \ --hash=sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1 \ --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # via tach -packaging==24.2 \ - --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 \ - --hash=sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f - # via -r ./requirements.in prompt-toolkit==3.0.48 \ --hash=sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90 \ --hash=sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e # via tach -pydot==3.0.2 \ - --hash=sha256:9180da540b51b3aa09fbf81140b3edfbe2315d778e8589a7d0a4a69c41332bae \ - --hash=sha256:99cedaa55d04abb0b2bc56d9981a6da781053dd5ac75c428e8dd53db53f90b14 +pydot==3.0.3 \ + --hash=sha256:5e009d97b2fff92b7a88f09ec1fd5b163f07f3b10469c927d362471d6faa0d50 \ + --hash=sha256:9b0b3081e0bd362d0c61148da10eb1281ec80089b02a28cf06f9093843986f3d # via tach -pygls==1.3.1 \ - --hash=sha256:140edceefa0da0e9b3c533547c892a42a7d2fd9217ae848c330c53d266a55018 \ - --hash=sha256:6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e - # via -r ./requirements.in pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a @@ -127,104 +103,52 @@ smmap==5.0.1 \ --hash=sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62 \ --hash=sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da # via gitdb -tach==0.15.5 \ - --hash=sha256:05e0fadb9fe09c3dd24866499fa9e98c1bbfb934caf1147b1570732ccedba9ca \ - --hash=sha256:0b50981941ee3c58f71b85ccf0a2aed254504d40cf447a06a721956140c7ec53 \ - --hash=sha256:0b7cca4ac4c736e0dd1aa887f30b7bab031ad18a636377408c9f72e00c681086 \ - --hash=sha256:0c640b71af0527f2d66cd89b0e5c2ccdc80930282174c749e26a3c8e96ebada2 \ - --hash=sha256:0e3e9b12db4e602d5e5b63a5fa00e697acb1bc7ddfc53f0cebe0a2d979b4051c \ - --hash=sha256:110b1c9f20cbaf000e1af1bba438b0fe959f48f9a7f8e20b09f3e77f313bcc87 \ - --hash=sha256:127166483378f38f681832ecd1fa108770ae379a03c654212b46ee72455403a4 \ - --hash=sha256:132cd70b2302fa6d0c6cae24e793f9a2029af1876749c9e6cd143c55551faf23 \ - --hash=sha256:14eb4e8b80a7e5e3de4fd042f008ba82b75cde5ddd7fa83655c98d173dd6698b \ - --hash=sha256:19963253f83a6ae58f3e78d4da847b2e33dba8acf9d9e203476ddab9bcc3a73e \ - --hash=sha256:19b2a90c0de664f6bc79bb82385d04a9a2ff338d6f66b9ef969f491d1ac598f3 \ - --hash=sha256:1a7b5b349ddb69d90fbad3be9f1934eae979614bddc92c1952a7647315a96eff \ - --hash=sha256:1d27158b927033ac77a6f86e25c7f316db84e56c983aab6021796b3c3ff5973a \ - --hash=sha256:252f41e1f184949c72e52e14141c3fc1777057ab1600b0653725faf5c3578c3e \ - --hash=sha256:262eef86dffb30fab128e702f5ff7d7a4c872b396c7ea21c67d3fbde1d584a56 \ - --hash=sha256:29a8615aeb6a3d4f235f24265e97c74f658ed4381e4a15956bde582678aa9be2 \ - --hash=sha256:2dbd4bdc1f61ba089d7bd0580414cd2b85b50b5f54f70fd5e83b75333be4a8fc \ - --hash=sha256:33a086523edf4ed58d3bdb83203636d1e645c813f0c4fbb29f956346e479aea8 \ - --hash=sha256:350eca163aafd86dc7be0f5e536666692528033effc9cf5a19d94e839dae1a2c \ - --hash=sha256:35aec2162077533d98be5d16d58676974c7b7268247be1d286e4b78d6b0ccc2a \ - --hash=sha256:39e97119adf472aaf68106f08809212f30cc5c2f0c204f214b0a7b85d0fd726d \ - --hash=sha256:3f81f1f612a001ffceb7762443426f5f487ec77bc90abf998e5ad08fb4fda9c8 \ - --hash=sha256:40e6e515f1ac33bee0f5e9780dbc0065ad670c910c401efd3c852f652263ebd1 \ - --hash=sha256:40ec02b5721542851654dd6111eb0753bb98a5b98c21705f5dabd4a231704f20 \ - --hash=sha256:419cce3dbd4999a426ef69359a5aa8b752f102327f253164745caaa732dd5b3d \ - --hash=sha256:46abafd65146c936a21837883b4b288c19d9d8b1be8a32959b25c428dffaa13b \ - --hash=sha256:470e22882dca282ce40bcc84012d9b6634b3ffaac208f1757efe8db59918fac8 \ - --hash=sha256:49a1de5d0c39328b925d381118923a8debdb607803be9339d5cd23cdbb420efc \ - --hash=sha256:4df9cb5f953c02a7b53e98b9fbe287ffb53a7715a504e1b6427ebb1b42169f48 \ - --hash=sha256:4ff7c94ad88fa0277c3c0b3818a1dee8bf1a7637d76fc06031b6894ba57b94cb \ - --hash=sha256:51a54d1bd8b267dbb42b311d5e657f8e007c637b65cd96a75b17d78ff4c1537f \ - --hash=sha256:51ff28a9cf3460198aac89794e6347ced6fb28152262d0cc2eb5718dafd41e52 \ - --hash=sha256:540584385e7915d3b71184f7e65ceac73e0171081fb9370b9d855603c047dfda \ - --hash=sha256:541cc82cf09f46f1fcace90a837e0dccddd86683d86784b16aaabb33adf7e085 \ - --hash=sha256:56481175dc965b481486c310cbe36bf2c2084608c1915393f2ff6ed58277dab2 \ - --hash=sha256:584e03414fe47b50b17d1d2892d33f2b9376dade2d42233fa1bb95f435e7f80e \ - --hash=sha256:5a06a3bb90afc381b14440282ab47288b170eaadbb1d9c320909e866d7460532 \ - --hash=sha256:5d69736aee69da1af00def3de7602ba7f56206222a314208c31a55455265b49f \ - --hash=sha256:60091c0c8a494e00962269198ea792d8364930b240e5023465d513ce0a7ef6f3 \ - --hash=sha256:6548e52cd5dac5242bb9d69d0aa33192306d3a08d7319f62dd196ca3570f5014 \ - --hash=sha256:65f62761669192cd546c508103391095df6d4606973d406ef31157f5183812bd \ - --hash=sha256:667963c6e689b933932c904b1355f6097174dd2c63ceaa85dc5a882cfbf4a3c0 \ - --hash=sha256:6ef026b5593b72190560683654334b2caa5a22a522f2b809b98b11756d55faea \ - --hash=sha256:71a1aa19b804cb29a2eacc75049d1e192c6b43739fdab164929fd2e5d7808be5 \ - --hash=sha256:751b1d6771016f29aed4db88ce31d00af2d5a42eec3207e84f96322a2cc6fa49 \ - --hash=sha256:781a5fedb8c7b7c7201afac49d8dc5a50ec072c19a8553c6a6ddf7ab9242b921 \ - --hash=sha256:79e842eb613839e900fc3485157b01a5d94641dd61525b3f733bc3737dad82e4 \ - --hash=sha256:7ca97fb993e300c3d6258fc6169535cc4b880f9dd7678252629834d42b76d25c \ - --hash=sha256:7d1a8bdd2342524ea4126455098894297f6a787f49e0c4e2acd2ecfe358fff2c \ - --hash=sha256:7de65b040e0f117e08a4bbed81762ece0377fa9bf58dd2ecd756996de9bf0cbe \ - --hash=sha256:84f126444378e19a456304f4c075063f65fb3f67dd83088b33aa9cfcde2c74b3 \ - --hash=sha256:87d967385a22964fa31de5ef46dff8eb035300f4e4145a341d2a47b020cb736a \ - --hash=sha256:87ff1b3d3c0fc689fb1f1dd04f9802e9bf0761851a8b95449fc3a8a915e3b6f0 \ - --hash=sha256:89358ab6b881a78de59b65a5d08eea278ecc1f35e84477a3a171671b931744f0 \ - --hash=sha256:8a18268c8a9dee8170ca547bf0e73fe9a05c883501976a659a2953f64d9ce044 \ - --hash=sha256:8ba8cb13d7812d9fbdaa3608d3fb25f12a95dac3eacefb7ccec7685f12265bca \ - --hash=sha256:94babb6e42983259130899f7118277ce01fc7a0ff12dd6c8d68bddd6a95228e5 \ - --hash=sha256:955ac723c56e39097faa0318a0d7845a3f947cc0e33cad397741cc2b49c7d918 \ - --hash=sha256:9d3c0bec7931cec8f36d86c6e250c64041d990ee6e8546248c2ef6c06e3319ba \ - --hash=sha256:a4c3425961b622ba18cbd00c1448f1ca613107b3ec83c7b5822f2a53558041f4 \ - --hash=sha256:a5aaf9d8936662b3a49f97ca806192ea84df6e66f03005a90030ea99bc29cbde \ - --hash=sha256:a79271aca1f1c1fd86f6c2eb6e425a8b1bac804d34f64b3007173e5e2874b53f \ - --hash=sha256:aa906024dffb8adbe28e949e05a0d723e2d4399be54813d95864d306cbe62266 \ - --hash=sha256:abdfeded3f77705451162a65de0decce7298360dad546b0c6919dbfa46abc98d \ - --hash=sha256:b0650814525cd7dfe27976984d5701853ed4e7fffc1d2a89d092955cfd85fd9f \ - --hash=sha256:b5ed45463625f87762f13e14ad18900652d95462fbd7a0a1808ce49c2419c2fe \ - --hash=sha256:b65ff4f4b5e772482572e387b8142d9cb0d4c38e41f2b2ed14788b46bd1873bf \ - --hash=sha256:b812da3c9c8eacadc44a8ad67c6b4c8357326aac1ca3a058db07a41b47c13ddc \ - --hash=sha256:b98f4f7ac3a952205f674cac4e5d5aead3e38a336de7f859d2ee02cb1fe7dce1 \ - --hash=sha256:ba6c4cc1d0e4e274e191a3310909244abf70938da2bc4d80cf05a2d351cec6a7 \ - --hash=sha256:bdbcbb97569cf677c57de85d6f2475fd2e04893b5df49d3eac5e9ce4812aca54 \ - --hash=sha256:be3c29954d6a237d6de7a7e13daa55ea229a39f0210daabf657a076be0077072 \ - --hash=sha256:c2788610c6401bbae5e1a61a2e54d3e54b2788b1822ba6e7b7abd22e54ef5181 \ - --hash=sha256:c36aa890491ca2b0bc66c6903e611af926aafb96d3fdb05b7ef6aafb046086ca \ - --hash=sha256:c504100317b3b86225eead8d5a6ba858f9d39c05291aabc8045766ee36c347a9 \ - --hash=sha256:c5dc550e49bbb141ec4dd761a341d4f6af1562ef4931cbecbcab7976ed36b887 \ - --hash=sha256:c71ee344689ab37c3527f3fe3519c87d67bf9354c93af92465f2e22cccdbba0f \ - --hash=sha256:c9aca2e3ec76ffaf08bf40a3ee4db657b201a85fa33ed7fbe2623ef8e002f4f6 \ - --hash=sha256:ca2a73e3762cf9cac897057a3364911965f924b206bf8ac4dae51599ebc97a7c \ - --hash=sha256:cbe1e82f12a0a24ebe878a0bc088d5583fc8022d689963ebbfdd8b18cf6060ad \ - --hash=sha256:d7351cd1d046d23b50582b03aa22eed74c8f96103ec94be622a15e2366b42d75 \ - --hash=sha256:d7602ab37ae7f297186b05a4f7346cbce92cf7b912263d22edddfbad3527248a \ - --hash=sha256:e0049ed36561981bf2b9719033467729d37081e2a22fa51d7fe0d6e27e3fab1f \ - --hash=sha256:e53674bd1296173b577129371dd5e86d6360253639417f259ab405f3c3155981 \ - --hash=sha256:e8a7e0567942805fc6c5f1615c3abaa0375784c70ab126a6c7a07930ad8a24d7 \ - --hash=sha256:ec12cbd5051e9edec5521d802726604e71ef3a89b5eb9c2b7add126b967e155d \ - --hash=sha256:ef41b697cec572c7ea571e74ca765a29b451a512c7e31521ef60cadc19a6fe03 \ - --hash=sha256:f17052805caec8be0038ff1f724809c8d9e0a5bf77e379d5e20075efaeec0e01 \ - --hash=sha256:f3c3d779f2aca93d8bf4ec46070f19962b8c6817694b9a322957c184bb410f0c \ - --hash=sha256:f87fb7b17c283256925f9546ca653fb56576c4e90926ca4cb7430c222bc69a6e \ - --hash=sha256:f9dc155711f4c59786cb14a7b67a07d43d8d3fa825157d68e04f639d195f2a37 \ - --hash=sha256:fbb3cb453cd53020ad086051b1e77a65af5f229844d92c397d350179e9321520 \ - --hash=sha256:fe363b2d40f31ed8c55199ba17d2bc1e235d0c87be235e05eb5099f86311e2a3 +tach==0.18.0 \ + --hash=sha256:3c81af8d51079ce11dd0367de08a386ab84ec9fa300347e49cee4d6f2772e039 \ + --hash=sha256:6dc197179a7233146a0af6d0186905ecd6395a5c75aa0dcb84ecdc15b6558bca \ + --hash=sha256:77058df55a7bebe31345f58e124f0b49f695f167408c279f3061a6c80e8610f3 \ + --hash=sha256:78d63503ce88098b2543b5f7b3cd7cbcfe8ee3d8d1a12b2cf11b986014c5caad \ + --hash=sha256:7fa51412fa1abae2c285342a78a67876ed19c22eeb5520d437850de0354810ba \ + --hash=sha256:843b5f8b30d206ea159dd13f9d8af15cdbb882face0cc9bd425ac8d99885e2d7 \ + --hash=sha256:91d510962a69673652a6a7d697ce30b6af10b7a3780d5733f78117f40424d79a \ + --hash=sha256:9cd99bb2702e34f179a416e8834676666855b1efb26d90755fab326554e18835 \ + --hash=sha256:d81cf35024dfbc33e1e694b714779d9bdee1a0fdc8b8566893aaea302d2f2bac \ + --hash=sha256:e7e928ae7790e90b94a698b630a2efad89040390045497d1f5204388164eb9be \ + --hash=sha256:f1871bb40e965748167e2266e603290463a61ebf0db39fc4b087077deb9335c5 # via -r ./requirements.in -tomli==2.1.0 \ - --hash=sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8 \ - --hash=sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391 +tomli==2.2.1 \ + --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \ + --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \ + --hash=sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c \ + --hash=sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b \ + --hash=sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8 \ + --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \ + --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \ + --hash=sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff \ + --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \ + --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \ + --hash=sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249 \ + --hash=sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee \ + --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \ + --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \ + --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \ + --hash=sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4 \ + --hash=sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281 \ + --hash=sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744 \ + --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 \ + --hash=sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13 \ + --hash=sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140 \ + --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \ + --hash=sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e \ + --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \ + --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \ + --hash=sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec \ + --hash=sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2 \ + --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 \ + --hash=sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106 \ + --hash=sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272 \ + --hash=sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a \ + --hash=sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7 # via tach tomli-w==1.1.0 \ --hash=sha256:1403179c78193e3184bfaade390ddbd071cba48a32a2e62ba11aae47490c63f7 \ diff --git a/src/common/constants.ts b/src/common/constants.ts index e33f333..7a0ac6f 100644 --- a/src/common/constants.ts +++ b/src/common/constants.ts @@ -7,5 +7,4 @@ const folderName = path.basename(__dirname); export const EXTENSION_ROOT_DIR = folderName === 'common' ? path.dirname(path.dirname(__dirname)) : path.dirname(__dirname); export const BUNDLED_PYTHON_SCRIPTS_DIR = path.join(EXTENSION_ROOT_DIR, 'bundled'); -export const SERVER_SCRIPT_PATH = path.join(BUNDLED_PYTHON_SCRIPTS_DIR, 'tool', `lsp_server.py`); -export const DEBUG_SERVER_SCRIPT_PATH = path.join(BUNDLED_PYTHON_SCRIPTS_DIR, 'tool', `_debug_server.py`); +export const BUNDLED_PYTHON_LIBS_DIR = path.join(BUNDLED_PYTHON_SCRIPTS_DIR, 'libs'); diff --git a/src/common/server.ts b/src/common/server.ts index 89fcc8f..e42e511 100644 --- a/src/common/server.ts +++ b/src/common/server.ts @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import * as fsapi from 'fs-extra'; import { Disposable, env, LogOutputChannel } from 'vscode'; import { State } from 'vscode-languageclient'; import { @@ -10,9 +9,8 @@ import { RevealOutputChannelOn, ServerOptions, } from 'vscode-languageclient/node'; -import { DEBUG_SERVER_SCRIPT_PATH, SERVER_SCRIPT_PATH } from './constants'; +import { BUNDLED_PYTHON_LIBS_DIR } from './constants'; import { traceError, traceInfo, traceVerbose } from './log/logging'; -import { getDebuggerPath } from './python'; import { getExtensionSettings, getGlobalSettings, getWorkspaceSettings, ISettings } from './settings'; import { getLSClientTraceLevel, getProjectRoot } from './utilities'; import { isVirtualWorkspace } from './vscodeapi'; @@ -28,27 +26,15 @@ async function createServer( ): Promise { const command = settings.interpreter[0]; const cwd = settings.cwd; - - // Set debugger path needed for debugging python code. const newEnv = { ...process.env }; - const debuggerPath = await getDebuggerPath(); - const isDebugScript = await fsapi.pathExists(DEBUG_SERVER_SCRIPT_PATH); - if (newEnv.USE_DEBUGPY && debuggerPath) { - newEnv.DEBUGPY_PATH = debuggerPath; - } else { - newEnv.USE_DEBUGPY = 'False'; - } - // Set import strategy newEnv.LS_IMPORT_STRATEGY = settings.importStrategy; - // Set notification type - newEnv.LS_SHOW_NOTIFICATION = settings.showNotifications; + if (settings.importStrategy === 'useBundled') { + newEnv.PYTHONPATH = BUNDLED_PYTHON_LIBS_DIR; + } - const args = - newEnv.USE_DEBUGPY === 'False' || !isDebugScript - ? settings.interpreter.slice(1).concat([SERVER_SCRIPT_PATH]) - : settings.interpreter.slice(1).concat([DEBUG_SERVER_SCRIPT_PATH]); + const args = settings.interpreter.slice(1).concat(["-m", "tach", "server"]); traceInfo(`Server run command: ${[command, ...args].join(' ')}`); const serverOptions: ServerOptions = { @@ -65,8 +51,6 @@ async function createServer( : [ { scheme: 'file', language: 'python' }, { scheme: 'untitled', language: 'python' }, - { scheme: 'vscode-notebook', language: 'python' }, - { scheme: 'vscode-notebook-cell', language: 'python' }, ], outputChannel: outputChannel, traceOutputChannel: outputChannel, diff --git a/src/common/settings.ts b/src/common/settings.ts index 8aaf9e5..ffada96 100644 --- a/src/common/settings.ts +++ b/src/common/settings.ts @@ -5,14 +5,13 @@ import { ConfigurationChangeEvent, ConfigurationScope, WorkspaceConfiguration, W import { getInterpreterDetails } from './python'; import { getConfiguration, getWorkspaceFolders } from './vscodeapi'; +export type ImportStrategy = 'useBundled' | 'fromEnvironment'; + export interface ISettings { cwd: string; workspace: string; - args: string[]; - path: string[]; interpreter: string[]; - importStrategy: string; - showNotifications: string; + importStrategy: ImportStrategy; } export function getExtensionSettings(namespace: string, includeInterpreter?: boolean): Promise { @@ -64,11 +63,8 @@ export async function getWorkspaceSettings( const workspaceSetting = { cwd: workspace.uri.fsPath, workspace: workspace.uri.toString(), - args: resolveVariables(config.get(`args`) ?? [], workspace), - path: resolveVariables(config.get(`path`) ?? [], workspace), interpreter: resolveVariables(interpreter, workspace), - importStrategy: config.get(`importStrategy`) ?? 'useBundled', - showNotifications: config.get(`showNotifications`) ?? 'off', + importStrategy: config.get(`importStrategy`) ?? 'useBundled', }; return workspaceSetting; } @@ -92,22 +88,16 @@ export async function getGlobalSettings(namespace: string, includeInterpreter?: const setting = { cwd: process.cwd(), workspace: process.cwd(), - args: getGlobalValue(config, 'args', []), - path: getGlobalValue(config, 'path', []), interpreter: interpreter, - importStrategy: getGlobalValue(config, 'importStrategy', 'useBundled'), - showNotifications: getGlobalValue(config, 'showNotifications', 'off'), + importStrategy: getGlobalValue(config, 'importStrategy', 'useBundled'), }; return setting; } export function checkIfConfigurationChanged(e: ConfigurationChangeEvent, namespace: string): boolean { const settings = [ - `${namespace}.args`, - `${namespace}.path`, `${namespace}.interpreter`, `${namespace}.importStrategy`, - `${namespace}.showNotifications`, ]; const changed = settings.map((s) => e.affectsConfiguration(s)); return changed.includes(true); diff --git a/src/test/python_tests/lsp_test_client/constants.py b/src/test/python_tests/lsp_test_client/constants.py index c8ca271..3d31321 100644 --- a/src/test/python_tests/lsp_test_client/constants.py +++ b/src/test/python_tests/lsp_test_client/constants.py @@ -11,3 +11,5 @@ TEST_ROOT = pathlib.Path(__file__).parent.parent PROJECT_ROOT = TEST_ROOT.parent.parent.parent TEST_DATA = TEST_ROOT / "test_data" + +BUNDLED_PYTHON_LIBS_DIR = PROJECT_ROOT / "bundled" / "libs" diff --git a/src/test/python_tests/lsp_test_client/session.py b/src/test/python_tests/lsp_test_client/session.py index 6f9c5cb..71f91bd 100644 --- a/src/test/python_tests/lsp_test_client/session.py +++ b/src/test/python_tests/lsp_test_client/session.py @@ -16,7 +16,7 @@ from pyls_jsonrpc.endpoint import Endpoint from pyls_jsonrpc.streams import JsonRpcStreamReader, JsonRpcStreamWriter -from .constants import PROJECT_ROOT +from .constants import BUNDLED_PYTHON_LIBS_DIR from .defaults import VSCODE_DEFAULT_INITIALIZE LSP_EXIT_TIMEOUT = 5000 @@ -30,7 +30,7 @@ class LspSession(MethodDispatcher): """Send and Receive messages over LSP as a test LS Client.""" - def __init__(self, cwd=None, script=None): + def __init__(self, cwd=None): self.cwd = cwd if cwd else os.getcwd() self._thread_pool = ThreadPoolExecutor() @@ -39,9 +39,6 @@ def __init__(self, cwd=None, script=None): self._reader = None self._endpoint = None self._notification_callbacks = {} - self.script = ( - script if script else (PROJECT_ROOT / "bundled" / "tool" / "lsp_server.py") - ) def __enter__(self): """Context manager entrypoint. @@ -49,13 +46,15 @@ def __enter__(self): shell=True needed for pytest-cov to work in subprocess. """ + env_copy = os.environ.copy() + env_copy["PYTHONPATH"] = str(BUNDLED_PYTHON_LIBS_DIR) self._sub = subprocess.Popen( - [sys.executable, str(self.script)], + [sys.executable, "-m", "tach", "server"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, bufsize=0, cwd=self.cwd, - env=os.environ, + env=env_copy, shell="WITH_COVERAGE" in os.environ, ) if self._sub.stdin is not None and self._sub.stdout is not None: diff --git a/src/test/python_tests/requirements.txt b/src/test/python_tests/requirements.txt index 79b701e..92c2df9 100644 --- a/src/test/python_tests/requirements.txt +++ b/src/test/python_tests/requirements.txt @@ -20,9 +20,9 @@ pyhamcrest==2.1.0 \ --hash=sha256:c6acbec0923d0cb7e72c22af1926f3e7c97b8e8d69fc7498eabacaf7c975bd9c \ --hash=sha256:f6913d2f392e30e0375b3ecbd7aee79e5d1faa25d345c8f4ff597665dcac2587 # via -r ./src/test/python_tests/requirements.in -pytest==8.3.3 \ - --hash=sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181 \ - --hash=sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2 +pytest==8.3.4 \ + --hash=sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6 \ + --hash=sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761 # via -r ./src/test/python_tests/requirements.in python-jsonrpc-server==0.4.0 \ --hash=sha256:62c543e541f101ec5b57dc654efc212d2c2e3ea47ff6f54b2e7dcb36ecf20595 \ From 28af7eb90dd5507595435bbaaebc403fcd7d09c7 Mon Sep 17 00:00:00 2001 From: Evan Doyle Date: Thu, 19 Dec 2024 11:59:56 -0800 Subject: [PATCH 2/2] Remove unnecessary CI steps --- .github/workflows/ci.yml | 9 ------ Makefile | 59 ---------------------------------------- dev-requirements.txt | 2 -- 3 files changed, 70 deletions(-) delete mode 100644 Makefile diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc59efe..3309ae5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,12 +36,3 @@ jobs: run: | source .venv/bin/activate nox --session tests - - name: Check ruff - run: | - source .venv/bin/activate - ruff check - ruff format --check - - name: Check types with pyright - run: | - source .venv/bin/activate - pyright src/ bundled/tool/ diff --git a/Makefile b/Makefile deleted file mode 100644 index 60a868a..0000000 --- a/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -.DEFAULT_GOAL := help - -PYTHONPATH= -SHELL=bash -VENV=.venv - - -# On Windows, `Scripts/` is used. -ifeq ($(OS),Windows_NT) - VENV_BIN=$(VENV)/Scripts -else - VENV_BIN=$(VENV)/bin -endif - - -.PHONY: deps -deps: ## Install dependencies - python -m pip install --upgrade uv - - @if [ ! -d "$(VENV)" ]; then \ - uv venv $(VENV); \ - echo "Virtual environment created at $(VENV)"; \ - else \ - echo "Virtual environment already exists at $(VENV)"; \ - fi - - source $(VENV_BIN)/activate && \ - uv pip install -r dev-requirements.txt - nox --session setup - npm install - - -.PHONY: test -test: ## Run tests - nox --session tests - -.PHONY: lint-python fmt-python - - -fmt-python: ## Format Python code - $(VENV_BIN)/ruff check . --fix - $(VENV_BIN)/ruff format . - - -lint-python: ## Lint Python code - $(VENV_BIN)/ruff check . - $(VENV_BIN)/ruff format . --check - - -.PHONY: type-check -type-check: ## Run type checking - $(VENV_BIN)/pyright - - -.PHONY: help -help: ## Display this help screen - @echo -e "\033[1mAvailable commands:\033[0m" - @grep -E '^[a-z.A-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-22s\033[0m %s\n", $$1, $$2}' | sort - diff --git a/dev-requirements.txt b/dev-requirements.txt index 191b997..3d355e8 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,7 +1,5 @@ pip==24.0 pytest==8.2.2 -pyright==1.1.377 -ruff==0.4.1 tach==0.18.0 # LSP nox==2024.4.15