From bc7a5bf4bbd5773e2110035e73beafcc11d0f14a Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 17 Mar 2026 18:48:17 +0000 Subject: [PATCH 001/147] fix: output structured XML errors in subagent mode When codeflash runs with --subagent (e.g., via the Claude Code plugin), exit_with_message() now outputs XML to stdout instead of Rich panel text. This lets the calling agent parse errors programmatically rather than receiving unstructured text. Co-Authored-By: Claude Opus 4.6 --- codeflash/code_utils/code_utils.py | 7 ++++++- tests/test_code_utils.py | 31 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/codeflash/code_utils/code_utils.py b/codeflash/code_utils/code_utils.py index 45a64f0fc..20b2beaa2 100644 --- a/codeflash/code_utils/code_utils.py +++ b/codeflash/code_utils/code_utils.py @@ -17,7 +17,7 @@ import tomlkit from codeflash.cli_cmds.console import logger, paneled_text from codeflash.code_utils.config_parser import find_pyproject_toml, get_all_closest_config_files -from codeflash.lsp.helpers import is_LSP_enabled +from codeflash.lsp.helpers import is_LSP_enabled, is_subagent_mode _INVALID_CHARS_NT = {"<", ">", ":", '"', "|", "?", "*"} @@ -458,6 +458,11 @@ def exit_with_message(message: str, *, error_on_exit: bool = False) -> None: if is_LSP_enabled(): logger.error(message) return + if is_subagent_mode(): + from xml.sax.saxutils import escape + + sys.stdout.write(f"{escape(message)}\n") + sys.exit(1 if error_on_exit else 0) paneled_text(message, panel_args={"style": "red"}) sys.exit(1 if error_on_exit else 0) diff --git a/tests/test_code_utils.py b/tests/test_code_utils.py index 1d792685b..976120bbe 100644 --- a/tests/test_code_utils.py +++ b/tests/test_code_utils.py @@ -8,6 +8,7 @@ import pytest from codeflash.code_utils.code_utils import ( cleanup_paths, + exit_with_message, file_name_from_test_module_name, file_path_from_module_name, get_all_function_names, @@ -751,3 +752,33 @@ class MyClass: """ result = validate_python_code(code) assert result == code + + +class TestExitWithMessageSubagent: + @patch("codeflash.code_utils.code_utils.is_subagent_mode", return_value=True) + def test_outputs_structured_xml_in_subagent_mode(self, _mock_subagent: MagicMock, capsys: pytest.CaptureFixture[str]) -> None: + with pytest.raises(SystemExit) as exc_info: + exit_with_message("Something went wrong", error_on_exit=True) + assert exc_info.value.code == 1 + captured = capsys.readouterr() + assert "" in captured.out + assert "Something went wrong" in captured.out + assert "" in captured.out + + @patch("codeflash.code_utils.code_utils.is_subagent_mode", return_value=True) + def test_escapes_xml_special_chars(self, _mock_subagent: MagicMock, capsys: pytest.CaptureFixture[str]) -> None: + with pytest.raises(SystemExit): + exit_with_message('File & "bar" not found', error_on_exit=True) + captured = capsys.readouterr() + assert "<foo>" in captured.out + assert "&" in captured.out + + @patch("codeflash.code_utils.code_utils.is_subagent_mode", return_value=False) + @patch("codeflash.code_utils.code_utils.is_LSP_enabled", return_value=False) + def test_no_xml_when_not_subagent( + self, _mock_lsp: MagicMock, _mock_subagent: MagicMock, capsys: pytest.CaptureFixture[str] + ) -> None: + with pytest.raises(SystemExit): + exit_with_message("Normal error", error_on_exit=True) + captured = capsys.readouterr() + assert "" not in captured.out From 43baac1c71d6649fdd23325281acb876236ac3a1 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Wed, 1 Apr 2026 15:28:20 +0000 Subject: [PATCH 002/147] fix: add Spotless skip flags to Maven and Gradle validation Instrumented test files fail Spotless format checks on projects like Apache Flink, Kafka, and Beam. Adds -Dspotless.check.skip=true and -Dspotless.apply.skip=true to Maven, and spotlessCheck/Apply/Java/ Kotlin/Scala task disabling to the Gradle init script. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/gradle_strategy.py | 3 ++- codeflash/languages/java/maven_strategy.py | 2 ++ .../test_java/test_build_tools.py | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/codeflash/languages/java/gradle_strategy.py b/codeflash/languages/java/gradle_strategy.py index 9c17a6cb3..62bd68e32 100644 --- a/codeflash/languages/java/gradle_strategy.py +++ b/codeflash/languages/java/gradle_strategy.py @@ -45,7 +45,8 @@ gradle.projectsEvaluated { 'spotbugsMain', 'spotbugsTest', 'pmdMain', 'pmdTest', 'rat', 'japicmp', - 'jarHell', 'thirdPartyAudit' + 'jarHell', 'thirdPartyAudit', + 'spotlessCheck', 'spotlessApply', 'spotlessJava', 'spotlessKotlin', 'spotlessScala' ] }.configureEach { enabled = false diff --git a/codeflash/languages/java/maven_strategy.py b/codeflash/languages/java/maven_strategy.py index 7f1f64ae6..568aa8cf2 100644 --- a/codeflash/languages/java/maven_strategy.py +++ b/codeflash/languages/java/maven_strategy.py @@ -43,6 +43,8 @@ _MAVEN_VALIDATION_SKIP_FLAGS = [ "-Denforcer.skip=true", "-Djapicmp.skip=true", "-Derrorprone.skip=true", + "-Dspotless.check.skip=true", + "-Dspotless.apply.skip=true", "-Dmaven.compiler.failOnWarning=false", "-Dmaven.compiler.showWarnings=false", ] diff --git a/tests/test_languages/test_java/test_build_tools.py b/tests/test_languages/test_java/test_build_tools.py index a4f01e1a6..10bb90fa9 100644 --- a/tests/test_languages/test_java/test_build_tools.py +++ b/tests/test_languages/test_java/test_build_tools.py @@ -641,3 +641,28 @@ class TestGradleEnsureRuntimeMultiModule: assert result is True nested_build = (nested / "build.gradle.kts").read_text(encoding="utf-8") assert "codeflash-runtime" in nested_build + + +class TestValidationSkipFlags: + """Tests that validation skip flags include all known static analysis and formatting plugins.""" + + def test_maven_skip_flags_include_spotless(self): + from codeflash.languages.java.maven_strategy import _MAVEN_VALIDATION_SKIP_FLAGS + + flags_str = " ".join(_MAVEN_VALIDATION_SKIP_FLAGS) + assert "-Dspotless.check.skip=true" in flags_str + assert "-Dspotless.apply.skip=true" in flags_str + + def test_maven_skip_flags_include_all_known_plugins(self): + from codeflash.languages.java.maven_strategy import _MAVEN_VALIDATION_SKIP_FLAGS + + flags_str = " ".join(_MAVEN_VALIDATION_SKIP_FLAGS) + for plugin in ["rat", "checkstyle", "spotbugs", "pmd", "enforcer", "japicmp", "errorprone", "spotless"]: + assert plugin in flags_str, f"Missing skip flag for {plugin}" + + def test_gradle_skip_script_includes_spotless(self): + from codeflash.languages.java.gradle_strategy import _GRADLE_SKIP_VALIDATION_INIT_SCRIPT + + assert "spotlessCheck" in _GRADLE_SKIP_VALIDATION_INIT_SCRIPT + assert "spotlessApply" in _GRADLE_SKIP_VALIDATION_INIT_SCRIPT + assert "spotlessJava" in _GRADLE_SKIP_VALIDATION_INIT_SCRIPT From 41814cd24b843eedf89773a35078883e62bb2d17 Mon Sep 17 00:00:00 2001 From: HeshamHM28 Date: Thu, 2 Apr 2026 11:55:10 +0200 Subject: [PATCH 003/147] feat: support void method optimization in Java pipeline Discover void methods, instrument them by serializing the receiver instead of a return value, and treat all-null comparisons as equivalent. Co-Authored-By: Claude Opus 4.6 --- codeflash/discovery/functions_to_optimize.py | 6 +- codeflash/languages/java/comparator.py | 10 + codeflash/languages/java/instrumentation.py | 89 +++++-- codeflash/languages/java/remove_asserts.py | 13 +- .../fixtures/java_tracer_e2e/pom.xml | 35 ++- .../test_java/test_instrumentation.py | 226 +++++++++++++++++- 6 files changed, 347 insertions(+), 32 deletions(-) diff --git a/codeflash/discovery/functions_to_optimize.py b/codeflash/discovery/functions_to_optimize.py index 4d98fbde9..ad296804b 100644 --- a/codeflash/discovery/functions_to_optimize.py +++ b/codeflash/discovery/functions_to_optimize.py @@ -195,7 +195,8 @@ def _find_all_functions_via_language_support(file_path: Path) -> dict[Path, list try: lang_support = get_language_support(file_path) - criteria = FunctionFilterCriteria(require_return=True) + require_return = lang_support.language != Language.JAVA + criteria = FunctionFilterCriteria(require_return=require_return) functions[file_path] = lang_support.discover_functions(file_path, criteria) except Exception as e: logger.debug(f"Failed to discover functions in {file_path}: {e}") @@ -454,7 +455,8 @@ def find_all_functions_in_file(file_path: Path) -> dict[Path, list[FunctionToOpt from codeflash.languages.base import FunctionFilterCriteria lang_support = get_language_support(file_path) - criteria = FunctionFilterCriteria(require_return=True) + require_return = lang_support.language != Language.JAVA + criteria = FunctionFilterCriteria(require_return=require_return) source = file_path.read_text(encoding="utf-8") return {file_path: lang_support.discover_functions(source, file_path, criteria)} except Exception as e: diff --git a/codeflash/languages/java/comparator.py b/codeflash/languages/java/comparator.py index 56a1724d7..2e2e66309 100644 --- a/codeflash/languages/java/comparator.py +++ b/codeflash/languages/java/comparator.py @@ -299,6 +299,16 @@ def compare_test_results( skipped_deser_errors = comparison.get("skippedDeserializationErrors", 0) if actual_comparisons == 0: + if skipped_placeholders > 0 and skipped_deser_errors == 0 and not comparison.get("diffs"): + # For void methods, all return values are null → all are "placeholder" skips. + # If no diffs and no deser errors, treat as equivalent (pass/fail verification). + logger.info( + "Java comparison: void method — all return values null, treating as equivalent " + "(total=%s, skipped_placeholders=%s)", + comparison.get("totalInvocations", 0), + skipped_placeholders, + ) + return True, [] logger.warning( "Java comparison: no actual comparisons performed " "(total=%s, skipped_placeholders=%s, skipped_deser_errors=%s). " diff --git a/codeflash/languages/java/instrumentation.py b/codeflash/languages/java/instrumentation.py index 83b52f3c8..ba01dde68 100644 --- a/codeflash/languages/java/instrumentation.py +++ b/codeflash/languages/java/instrumentation.py @@ -337,22 +337,39 @@ def wrap_target_calls_with_treesitter( orig_line = body_lines[line_idx] line_indent_str = " " * (len(orig_line) - len(orig_line.lstrip())) + is_void = target_return_type == "void" var_name = f"_cf_result{iter_id}_{call_counter}" + receiver = call.get("receiver", "this") cast_type = _infer_array_cast_type(orig_line) - if not cast_type and target_return_type and target_return_type != "void": + if not cast_type and target_return_type and not is_void: cast_type = target_return_type var_with_cast = f"({cast_type}){var_name}" if cast_type else var_name - capture_stmt_with_decl = f"var {var_name} = {call['full_call']};" - capture_stmt_assign = f"{var_name} = {call['full_call']};" - if precise_call_timing: - serialize_stmt = f"_cf_serializedResult{iter_id}_{call_counter} = com.codeflash.Serializer.serialize((Object) {var_name});" - start_stmt = f"_cf_start{iter_id}_{call_counter} = System.nanoTime();" - end_stmt = f"_cf_end{iter_id}_{call_counter} = System.nanoTime();" + if is_void: + bare_call_stmt = f"{call['full_call']};" + if precise_call_timing: + serialize_stmt = f"_cf_serializedResult{iter_id}_{call_counter} = com.codeflash.Serializer.serialize((Object) {receiver});" + start_stmt = f"_cf_start{iter_id}_{call_counter} = System.nanoTime();" + end_stmt = f"_cf_end{iter_id}_{call_counter} = System.nanoTime();" + else: + serialize_stmt = ( + f"_cf_serializedResult{iter_id} = com.codeflash.Serializer.serialize((Object) {receiver});" + ) + start_stmt = f"_cf_start{iter_id} = System.nanoTime();" + end_stmt = f"_cf_end{iter_id} = System.nanoTime();" else: - serialize_stmt = f"_cf_serializedResult{iter_id} = com.codeflash.Serializer.serialize((Object) {var_name});" - start_stmt = f"_cf_start{iter_id} = System.nanoTime();" - end_stmt = f"_cf_end{iter_id} = System.nanoTime();" + capture_stmt_with_decl = f"var {var_name} = {call['full_call']};" + capture_stmt_assign = f"{var_name} = {call['full_call']};" + if precise_call_timing: + serialize_stmt = f"_cf_serializedResult{iter_id}_{call_counter} = com.codeflash.Serializer.serialize((Object) {var_name});" + start_stmt = f"_cf_start{iter_id}_{call_counter} = System.nanoTime();" + end_stmt = f"_cf_end{iter_id}_{call_counter} = System.nanoTime();" + else: + serialize_stmt = ( + f"_cf_serializedResult{iter_id} = com.codeflash.Serializer.serialize((Object) {var_name});" + ) + start_stmt = f"_cf_start{iter_id} = System.nanoTime();" + end_stmt = f"_cf_end{iter_id} = System.nanoTime();" if call["parent_type"] == "expression_statement": es_start = call["_es_start_char"] @@ -360,20 +377,36 @@ def wrap_target_calls_with_treesitter( if precise_call_timing: # No indent on first line — body_text[:es_start] already has leading whitespace. # Subsequent lines get line_indent_str. - var_decls = [ - f"Object {var_name} = null;", - f"long _cf_end{iter_id}_{call_counter} = -1;", - f"long _cf_start{iter_id}_{call_counter} = 0;", - f"byte[] _cf_serializedResult{iter_id}_{call_counter} = null;", - ] + if is_void: + var_decls = [ + f"long _cf_end{iter_id}_{call_counter} = -1;", + f"long _cf_start{iter_id}_{call_counter} = 0;", + f"byte[] _cf_serializedResult{iter_id}_{call_counter} = null;", + ] + else: + var_decls = [ + f"Object {var_name} = null;", + f"long _cf_end{iter_id}_{call_counter} = -1;", + f"long _cf_start{iter_id}_{call_counter} = 0;", + f"byte[] _cf_serializedResult{iter_id}_{call_counter} = null;", + ] start_marker = f'System.out.println("!$######" + _cf_mod{iter_id} + ":" + _cf_cls{iter_id} + "." + _cf_test{iter_id} + ":" + _cf_fn{iter_id} + ":" + _cf_loop{iter_id} + ":{inv_id}" + "######$!");' - try_block = [ - "try {", - f" {start_stmt}", - f" {capture_stmt_assign}", - f" {end_stmt}", - f" {serialize_stmt}", - ] + if is_void: + try_block = [ + "try {", + f" {start_stmt}", + f" {bare_call_stmt}", + f" {end_stmt}", + f" {serialize_stmt}", + ] + else: + try_block = [ + "try {", + f" {start_stmt}", + f" {capture_stmt_assign}", + f" {end_stmt}", + f" {serialize_stmt}", + ] finally_block = _generate_sqlite_write_code( iter_id, call_counter, "", class_name, func_name, test_method_name, invocation_id=inv_id ) @@ -381,10 +414,17 @@ def wrap_target_calls_with_treesitter( replacement = ( all_lines[0] + "\n" + "\n".join(f"{line_indent_str}{repl_line}" for repl_line in all_lines[1:]) ) + elif is_void: + replacement = f"{bare_call_stmt} {serialize_stmt}" else: replacement = f"{capture_stmt_with_decl} {serialize_stmt}" body_text = body_text[:es_start] + replacement + body_text[es_end:] else: + if is_void: + # Void calls cannot be embedded in expressions in valid Java — skip instrumentation + logger.warning("Skipping instrumentation of embedded void call: %s", call["full_call"]) + continue + # Embedded call: replace call with variable, then insert capture lines before the line call_start = call["_call_start_char"] call_end = call["_call_end_char"] @@ -451,6 +491,8 @@ def _collect_calls( if parent_type == "expression_statement": es_start = parent.start_byte - prefix_len es_end = parent.end_byte - prefix_len + object_node = node.child_by_field_name("object") + receiver = analyzer.get_node_text(object_node, wrapper_bytes) if object_node else "this" out.append( { "start_byte": start, @@ -461,6 +503,7 @@ def _collect_calls( "in_complex": _is_inside_complex_expression(node), "es_start_byte": es_start, "es_end_byte": es_end, + "receiver": receiver, } ) for child in node.children: diff --git a/codeflash/languages/java/remove_asserts.py b/codeflash/languages/java/remove_asserts.py index 462fcc486..3289a9568 100644 --- a/codeflash/languages/java/remove_asserts.py +++ b/codeflash/languages/java/remove_asserts.py @@ -189,6 +189,7 @@ class JavaAssertTransformer: qualified_name: str | None = None, analyzer: JavaAnalyzer | None = None, mode: str = "capture", + target_return_type: str = "", ) -> None: self.analyzer = analyzer or get_java_analyzer() self.func_name = function_name @@ -196,6 +197,7 @@ class JavaAssertTransformer: self.invocation_counter = 0 self._detected_framework: str | None = None self.mode = mode # "capture" (default, instrumentation) or "strip" (clean display) + self.target_return_type = target_return_type # Precompile the assignment-detection regex to avoid recompiling on each call. self._assign_re = re.compile(r"(\w+(?:<[^>]+>)?)\s+(\w+)\s*=\s*$") @@ -1062,7 +1064,7 @@ class JavaAssertTransformer: if not assertion.target_calls: return "" - if self.mode == "strip": + if self.mode == "strip" or self.target_return_type == "void": return self._generate_strip_replacement(assertion) # Infer the return type from assertion context to avoid Object→primitive cast errors @@ -1244,7 +1246,9 @@ class JavaAssertTransformer: return "".join(cur).rstrip() -def transform_java_assertions(source: str, function_name: str, qualified_name: str | None = None) -> str: +def transform_java_assertions( + source: str, function_name: str, qualified_name: str | None = None, target_return_type: str = "" +) -> str: """Transform Java test code by removing assertions and capturing function calls. This is the main entry point for Java assertion transformation. @@ -1253,12 +1257,15 @@ def transform_java_assertions(source: str, function_name: str, qualified_name: s source: The Java test source code. function_name: Name of the function being tested. qualified_name: Optional fully qualified name of the function. + target_return_type: Return type of the target function (e.g., "void", "int"). Returns: Transformed source code with assertions replaced by capture statements. """ - transformer = JavaAssertTransformer(function_name=function_name, qualified_name=qualified_name) + transformer = JavaAssertTransformer( + function_name=function_name, qualified_name=qualified_name, target_return_type=target_return_type + ) return transformer.transform(source) diff --git a/tests/test_languages/fixtures/java_tracer_e2e/pom.xml b/tests/test_languages/fixtures/java_tracer_e2e/pom.xml index 7fffde8b2..00d73cb81 100644 --- a/tests/test_languages/fixtures/java_tracer_e2e/pom.xml +++ b/tests/test_languages/fixtures/java_tracer_e2e/pom.xml @@ -11,7 +11,18 @@ 11 11 UTF-8 - + true + true + true + true + true + true + true + false + false + false + false + @@ -62,6 +73,26 @@ - + + + org.apache.maven.plugins + maven-checkstyle-plugin + + true + false + false + + + + com.github.spotbugs + spotbugs-maven-plugin + true + + + org.apache.maven.plugins + maven-pmd-plugin + true + + diff --git a/tests/test_languages/test_java/test_instrumentation.py b/tests/test_languages/test_java/test_instrumentation.py index 4290766db..d8f4b4f08 100644 --- a/tests/test_languages/test_java/test_instrumentation.py +++ b/tests/test_languages/test_java/test_instrumentation.py @@ -22,7 +22,6 @@ os.environ["CODEFLASH_API_KEY"] = "cf-test-key" from codeflash.discovery.functions_to_optimize import FunctionToOptimize from codeflash.languages.base import Language from codeflash.languages.current import set_current_language -from codeflash.languages.java.maven_strategy import MavenStrategy from codeflash.languages.java.discovery import discover_functions_from_source from codeflash.languages.java.instrumentation import ( _add_behavior_instrumentation, @@ -34,6 +33,7 @@ from codeflash.languages.java.instrumentation import ( instrument_generated_java_test, remove_instrumentation, ) +from codeflash.languages.java.maven_strategy import MavenStrategy class TestInstrumentForBehavior: @@ -2177,7 +2177,7 @@ public class AccentTest { # Skip all E2E tests if Maven is not available requires_maven = pytest.mark.skipif( - MavenStrategy().find_executable(Path(".")) is None, reason="Maven not found - skipping execution tests" + MavenStrategy().find_executable(Path()) is None, reason="Maven not found - skipping execution tests" ) @@ -3485,3 +3485,225 @@ public class SpinWaitTest__perfonlyinstrumented { assert math.isclose(duration, 100_000_000, rel_tol=0.15), ( f"Long spin measured {duration}ns, expected ~100_000_000ns (15% tolerance)" ) + + +class TestVoidMethodInstrumentation: + """Tests for void method instrumentation — behavior mode captures receiver state.""" + + def test_behavior_mode_void_method_serializes_receiver(self, tmp_path: Path): + """Void method instrumentation should serialize the receiver, not a return value.""" + source_file = (tmp_path / "Sorter.java").resolve() + source_file.write_text( + "public class Sorter {\n" + " public void sort(int[] data) {\n" + " java.util.Arrays.sort(data);\n" + " }\n" + "}\n", + encoding="utf-8", + ) + + test_file = (tmp_path / "SorterTest.java").resolve() + test_source = ( + "import org.junit.jupiter.api.Test;\n" + "\n" + "public class SorterTest {\n" + " @Test\n" + " public void testSort() {\n" + " Sorter sorter = new Sorter();\n" + " int[] data = {3, 1, 2};\n" + " sorter.sort(data);\n" + " }\n" + "}\n" + ) + test_file.write_text(test_source, encoding="utf-8") + + func = FunctionToOptimize( + function_name="sort", + file_path=source_file, + starting_line=2, + ending_line=4, + parents=[], + is_method=True, + language="java", + ) + + success, result = instrument_existing_test( + test_string=test_source, function_to_optimize=func, mode="behavior", test_path=test_file + ) + + assert success is True + assert result is not None + # Void method: no "Object _cf_result" variable declaration + assert "Object _cf_result" not in result + # Void method: bare call without assignment + assert "sorter.sort(data);" in result + # Void method: serializes the receiver (sorter), not a result variable + assert "com.codeflash.Serializer.serialize((Object) sorter)" in result + + def test_behavior_mode_void_method_implicit_this_receiver(self, tmp_path: Path): + """Void method with no explicit receiver uses 'this' for serialization.""" + source_file = (tmp_path / "Container.java").resolve() + source_file.write_text( + "public class Container {\n" + " public void clear() {\n" + " // clears internal state\n" + " }\n" + "}\n", + encoding="utf-8", + ) + + test_file = (tmp_path / "ContainerTest.java").resolve() + test_source = ( + "import org.junit.jupiter.api.Test;\n" + "\n" + "public class ContainerTest {\n" + " @Test\n" + " public void testClear() {\n" + " clear();\n" + " }\n" + "}\n" + ) + test_file.write_text(test_source, encoding="utf-8") + + func = FunctionToOptimize( + function_name="clear", + file_path=source_file, + starting_line=2, + ending_line=4, + parents=[], + is_method=True, + language="java", + ) + + success, result = instrument_existing_test( + test_string=test_source, function_to_optimize=func, mode="behavior", test_path=test_file + ) + + assert success is True + assert result is not None + # Implicit receiver defaults to 'this' + assert "com.codeflash.Serializer.serialize((Object) this)" in result + + def test_behavior_mode_non_void_still_captures_result(self, tmp_path: Path): + """Non-void methods should still capture the return value (not the receiver).""" + source_file = (tmp_path / "Calculator.java").resolve() + source_file.write_text( + "public class Calculator {\n" + " public int add(int a, int b) {\n" + " return a + b;\n" + " }\n" + "}\n", + encoding="utf-8", + ) + + test_file = (tmp_path / "CalculatorTest.java").resolve() + test_source = ( + "import org.junit.jupiter.api.Test;\n" + "\n" + "public class CalculatorTest {\n" + " @Test\n" + " public void testAdd() {\n" + " Calculator calc = new Calculator();\n" + " assertEquals(4, calc.add(2, 2));\n" + " }\n" + "}\n" + ) + test_file.write_text(test_source, encoding="utf-8") + + func = FunctionToOptimize( + function_name="add", + file_path=source_file, + starting_line=2, + ending_line=4, + parents=[], + is_method=True, + language="java", + ) + + success, result = instrument_existing_test( + test_string=test_source, function_to_optimize=func, mode="behavior", test_path=test_file + ) + + assert success is True + assert result is not None + # Non-void: captures return value, not receiver + assert "Object _cf_result1_1" in result + assert "_cf_result1_1 = calc.add(2, 2);" in result + assert "com.codeflash.Serializer.serialize((Object) _cf_result1_1)" in result + + def test_void_discovery_with_require_return_false(self): + """Void methods should be discovered when require_return=False.""" + from codeflash.languages.base import FunctionFilterCriteria + from codeflash.languages.java.discovery import discover_functions_from_source + + source = ( + "public class Example {\n" + " public void doSomething() {\n" + ' System.out.println("hello");\n' + " }\n" + "\n" + " public int getValue() {\n" + " return 42;\n" + " }\n" + "}\n" + ) + + criteria_no_return = FunctionFilterCriteria(require_return=False) + functions = discover_functions_from_source(source, filter_criteria=criteria_no_return) + method_names = {f.function_name for f in functions} + assert "doSomething" in method_names + assert "getValue" in method_names + + criteria_require_return = FunctionFilterCriteria(require_return=True) + functions = discover_functions_from_source(source, filter_criteria=criteria_require_return) + method_names = {f.function_name for f in functions} + assert "doSomething" not in method_names + assert "getValue" in method_names + + def test_performance_mode_void_method_generates_valid_code(self, tmp_path: Path): + """Void methods in performance mode should generate valid timing code.""" + source_file = (tmp_path / "Sorter.java").resolve() + source_file.write_text( + "public class Sorter {\n" + " public void sort(int[] data) {\n" + " java.util.Arrays.sort(data);\n" + " }\n" + "}\n", + encoding="utf-8", + ) + + test_file = (tmp_path / "SorterTest.java").resolve() + test_source = ( + "import org.junit.jupiter.api.Test;\n" + "\n" + "public class SorterTest {\n" + " @Test\n" + " public void testSort() {\n" + " Sorter sorter = new Sorter();\n" + " int[] data = {3, 1, 2};\n" + " sorter.sort(data);\n" + " }\n" + "}\n" + ) + test_file.write_text(test_source, encoding="utf-8") + + func = FunctionToOptimize( + function_name="sort", + file_path=source_file, + starting_line=2, + ending_line=4, + parents=[], + is_method=True, + language="java", + ) + + success, result = instrument_existing_test( + test_string=test_source, function_to_optimize=func, mode="performance", test_path=test_file + ) + + assert success is True + assert result is not None + # Performance mode: no "var _cf_result =" for void + assert "var _cf_result" not in result + # The test should still contain the bare call + assert "sorter.sort(data);" in result From f42b58bb9811b42de61631b404e7fe9ee5d18eed Mon Sep 17 00:00:00 2001 From: HeshamHM28 Date: Fri, 3 Apr 2026 14:55:09 +0200 Subject: [PATCH 004/147] feat: implement bubble sort optimization and corresponding tests in Java --- .../workflows/e2e-java-void-optimization.yaml | 105 ++++++++++++++++++ .../main/java/com/example/InPlaceSorter.java | 21 ++++ .../main/java/com/example/InstanceSorter.java | 21 ++++ .../java/com/example/InPlaceSorterTest.java | 62 +++++++++++ .../java/com/example/InstanceSorterTest.java | 69 ++++++++++++ codeflash/languages/java/instrumentation.py | 22 +++- .../end_to_end_test_java_void_optimization.py | 18 +++ 7 files changed, 316 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/e2e-java-void-optimization.yaml create mode 100644 code_to_optimize/java/src/main/java/com/example/InPlaceSorter.java create mode 100644 code_to_optimize/java/src/main/java/com/example/InstanceSorter.java create mode 100644 code_to_optimize/java/src/test/java/com/example/InPlaceSorterTest.java create mode 100644 code_to_optimize/java/src/test/java/com/example/InstanceSorterTest.java create mode 100644 tests/scripts/end_to_end_test_java_void_optimization.py diff --git a/.github/workflows/e2e-java-void-optimization.yaml b/.github/workflows/e2e-java-void-optimization.yaml new file mode 100644 index 000000000..0e25a2d65 --- /dev/null +++ b/.github/workflows/e2e-java-void-optimization.yaml @@ -0,0 +1,105 @@ +name: E2E - Java Void Optimization (No Git) + +on: + pull_request: + paths: + - 'codeflash/languages/java/**' + - 'codeflash/languages/base.py' + - 'codeflash/languages/registry.py' + - 'codeflash/optimization/**' + - 'codeflash/verification/**' + - 'code_to_optimize/java/**' + - 'codeflash-java-runtime/**' + - 'tests/scripts/end_to_end_test_java_void_optimization.py' + - '.github/workflows/e2e-java-void-optimization.yaml' + + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }} + cancel-in-progress: true + +jobs: + java-void-optimization-no-git: + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 70 + CODEFLASH_END_TO_END: 1 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + env: + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + PR_STATE: ${{ github.event.pull_request.state }} + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + if git diff --name-only "$BASE_SHA" "$HEAD_SHA" | grep -q "^.github/workflows/"; then + echo "⚠️ Workflow changes detected." + echo "PR Author: $PR_AUTHOR" + if [[ "$PR_AUTHOR" == "misrasaurabh1" || "$PR_AUTHOR" == "KRRT7" ]]; then + echo "✅ Authorized user ($PR_AUTHOR). Proceeding." + elif [[ "$PR_STATE" == "open" ]]; then + echo "✅ PR is open. Proceeding." + else + echo "⛔ Unauthorized user ($PR_AUTHOR) attempting to modify workflows. Exiting." + exit 1 + fi + else + echo "✅ No workflow file changes detected. Proceeding." + fi + + - name: Set up JDK 11 + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + + - name: Set up Python 3.11 for CLI + uses: astral-sh/setup-uv@v6 + with: + python-version: 3.11.6 + + - name: Install dependencies (CLI) + run: uv sync + + - name: Build codeflash-runtime JAR + run: | + cd codeflash-java-runtime + mvn clean package -q -DskipTests + mvn install -q -DskipTests + + - name: Verify Java installation + run: | + java -version + mvn --version + + - name: Remove .git + run: | + if [ -d ".git" ]; then + sudo rm -rf .git + echo ".git directory removed." + else + echo ".git directory does not exist." + exit 1 + fi + + - name: Run Codeflash to optimize void function + run: | + uv run python tests/scripts/end_to_end_test_java_void_optimization.py \ No newline at end of file diff --git a/code_to_optimize/java/src/main/java/com/example/InPlaceSorter.java b/code_to_optimize/java/src/main/java/com/example/InPlaceSorter.java new file mode 100644 index 000000000..4d8ce8e06 --- /dev/null +++ b/code_to_optimize/java/src/main/java/com/example/InPlaceSorter.java @@ -0,0 +1,21 @@ +package com.example; + +public class InPlaceSorter { + + public static void bubbleSortInPlace(int[] arr) { + if (arr == null || arr.length <= 1) { + return; + } + + int n = arr.length; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n - 1; j++) { + if (arr[j] > arr[j + 1]) { + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } + } +} \ No newline at end of file diff --git a/code_to_optimize/java/src/main/java/com/example/InstanceSorter.java b/code_to_optimize/java/src/main/java/com/example/InstanceSorter.java new file mode 100644 index 000000000..b4017d65b --- /dev/null +++ b/code_to_optimize/java/src/main/java/com/example/InstanceSorter.java @@ -0,0 +1,21 @@ +package com.example; + +public class InstanceSorter { + + public void bubbleSortInPlace(int[] arr) { + if (arr == null || arr.length <= 1) { + return; + } + + int n = arr.length; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n - 1; j++) { + if (arr[j] > arr[j + 1]) { + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } + } +} \ No newline at end of file diff --git a/code_to_optimize/java/src/test/java/com/example/InPlaceSorterTest.java b/code_to_optimize/java/src/test/java/com/example/InPlaceSorterTest.java new file mode 100644 index 000000000..9412df39c --- /dev/null +++ b/code_to_optimize/java/src/test/java/com/example/InPlaceSorterTest.java @@ -0,0 +1,62 @@ +package com.example; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class InPlaceSorterTest { + + @Test + void testBubbleSortInPlace() { + int[] arr = {5, 3, 1, 4, 2}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 3, 4, 5}, arr); + } + + @Test + void testBubbleSortInPlaceAlreadySorted() { + int[] arr = {1, 2, 3, 4, 5}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 3, 4, 5}, arr); + } + + @Test + void testBubbleSortInPlaceReversed() { + int[] arr = {5, 4, 3, 2, 1}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 3, 4, 5}, arr); + } + + @Test + void testBubbleSortInPlaceWithDuplicates() { + int[] arr = {3, 2, 4, 1, 3, 2}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 2, 3, 3, 4}, arr); + } + + @Test + void testBubbleSortInPlaceWithNegatives() { + int[] arr = {3, -2, 7, 0, -5}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{-5, -2, 0, 3, 7}, arr); + } + + @Test + void testBubbleSortInPlaceSingleElement() { + int[] arr = {42}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{42}, arr); + } + + @Test + void testBubbleSortInPlaceEmpty() { + int[] arr = {}; + InPlaceSorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{}, arr); + } + + @Test + void testBubbleSortInPlaceNull() { + InPlaceSorter.bubbleSortInPlace(null); + } + +} \ No newline at end of file diff --git a/code_to_optimize/java/src/test/java/com/example/InstanceSorterTest.java b/code_to_optimize/java/src/test/java/com/example/InstanceSorterTest.java new file mode 100644 index 000000000..7e57f7b1b --- /dev/null +++ b/code_to_optimize/java/src/test/java/com/example/InstanceSorterTest.java @@ -0,0 +1,69 @@ +package com.example; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class InstanceSorterTest { + + @Test + void testBubbleSortInPlace() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {5, 3, 1, 4, 2}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 3, 4, 5}, arr); + } + + @Test + void testBubbleSortInPlaceAlreadySorted() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {1, 2, 3, 4, 5}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 3, 4, 5}, arr); + } + + @Test + void testBubbleSortInPlaceReversed() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {5, 4, 3, 2, 1}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 3, 4, 5}, arr); + } + + @Test + void testBubbleSortInPlaceWithDuplicates() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {3, 2, 4, 1, 3, 2}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{1, 2, 2, 3, 3, 4}, arr); + } + + @Test + void testBubbleSortInPlaceWithNegatives() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {3, -2, 7, 0, -5}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{-5, -2, 0, 3, 7}, arr); + } + + @Test + void testBubbleSortInPlaceSingleElement() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {42}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{42}, arr); + } + + @Test + void testBubbleSortInPlaceEmpty() { + InstanceSorter sorter = new InstanceSorter(); + int[] arr = {}; + sorter.bubbleSortInPlace(arr); + assertArrayEquals(new int[]{}, arr); + } + + @Test + void testBubbleSortInPlaceNull() { + InstanceSorter sorter = new InstanceSorter(); + sorter.bubbleSortInPlace(null); + } +} \ No newline at end of file diff --git a/codeflash/languages/java/instrumentation.py b/codeflash/languages/java/instrumentation.py index ba01dde68..336774a83 100644 --- a/codeflash/languages/java/instrumentation.py +++ b/codeflash/languages/java/instrumentation.py @@ -340,6 +340,7 @@ def wrap_target_calls_with_treesitter( is_void = target_return_type == "void" var_name = f"_cf_result{iter_id}_{call_counter}" receiver = call.get("receiver", "this") + arg_texts: list[str] = call.get("arg_texts", []) cast_type = _infer_array_cast_type(orig_line) if not cast_type and target_return_type and not is_void: cast_type = target_return_type @@ -347,13 +348,22 @@ def wrap_target_calls_with_treesitter( if is_void: bare_call_stmt = f"{call['full_call']};" + # For void methods, serialize the post-call state to capture side effects. + # For instance methods (receiver is a variable), serialize the receiver. + # For static methods (receiver is a class name), serialize the arguments + # since the class name itself is not a value and can't be cast to Object. + is_static_call = receiver != "this" and receiver[:1].isupper() + if is_static_call and arg_texts: + serialize_target = f"new Object[]{{{', '.join(arg_texts)}}}" + else: + serialize_target = f"(Object) {receiver}" if precise_call_timing: - serialize_stmt = f"_cf_serializedResult{iter_id}_{call_counter} = com.codeflash.Serializer.serialize((Object) {receiver});" + serialize_stmt = f"_cf_serializedResult{iter_id}_{call_counter} = com.codeflash.Serializer.serialize({serialize_target});" start_stmt = f"_cf_start{iter_id}_{call_counter} = System.nanoTime();" end_stmt = f"_cf_end{iter_id}_{call_counter} = System.nanoTime();" else: serialize_stmt = ( - f"_cf_serializedResult{iter_id} = com.codeflash.Serializer.serialize((Object) {receiver});" + f"_cf_serializedResult{iter_id} = com.codeflash.Serializer.serialize({serialize_target});" ) start_stmt = f"_cf_start{iter_id} = System.nanoTime();" end_stmt = f"_cf_end{iter_id} = System.nanoTime();" @@ -493,6 +503,13 @@ def _collect_calls( es_end = parent.end_byte - prefix_len object_node = node.child_by_field_name("object") receiver = analyzer.get_node_text(object_node, wrapper_bytes) if object_node else "this" + # Extract argument texts for void method serialization + args_node = node.child_by_field_name("arguments") + arg_texts: list[str] = [] + if args_node: + for child in args_node.children: + if child.type not in ("(", ")", ","): + arg_texts.append(analyzer.get_node_text(child, wrapper_bytes)) out.append( { "start_byte": start, @@ -504,6 +521,7 @@ def _collect_calls( "es_start_byte": es_start, "es_end_byte": es_end, "receiver": receiver, + "arg_texts": arg_texts, } ) for child in node.children: diff --git a/tests/scripts/end_to_end_test_java_void_optimization.py b/tests/scripts/end_to_end_test_java_void_optimization.py new file mode 100644 index 000000000..b01c2df23 --- /dev/null +++ b/tests/scripts/end_to_end_test_java_void_optimization.py @@ -0,0 +1,18 @@ +import os +import pathlib + +from end_to_end_test_utilities import TestConfig, run_codeflash_command, run_with_retries + + +def run_test(expected_improvement_pct: int) -> bool: + config = TestConfig( + file_path="src/main/java/com/example/InPlaceSorter.java", + function_name="bubbleSortInPlace", + min_improvement_x=0.70, + ) + cwd = (pathlib.Path(__file__).parent.parent.parent / "code_to_optimize" / "java").resolve() + return run_codeflash_command(cwd, config, expected_improvement_pct) + + +if __name__ == "__main__": + exit(run_with_retries(run_test, int(os.getenv("EXPECTED_IMPROVEMENT_PCT", 70)))) \ No newline at end of file From 3bc4941c01d737152194114ee2e9d804c5a05d8e Mon Sep 17 00:00:00 2001 From: HeshamHM28 Date: Fri, 3 Apr 2026 16:45:41 +0200 Subject: [PATCH 005/147] feat: optimize comparison handling for KryoPlaceholder and enhance void method state tests --- .../main/java/com/codeflash/Comparator.java | 16 +- .../codeflash/ComparatorCorrectnessTest.java | 91 +++++- .../java/com/codeflash/ComparatorTest.java | 29 +- .../java/com/codeflash/SerializerTest.java | 9 +- codeflash/languages/java/comparator.py | 10 - codeflash/languages/java/instrumentation.py | 28 +- .../test_java/test_instrumentation.py | 259 ++++++++++++++++-- 7 files changed, 366 insertions(+), 76 deletions(-) diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java b/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java index 3bd62c897..07ac35aa2 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java @@ -284,18 +284,10 @@ public final class Comparator { return false; } - // Detect and reject KryoPlaceholder - if (orig instanceof KryoPlaceholder) { - KryoPlaceholder p = (KryoPlaceholder) orig; - throw new KryoPlaceholderAccessException( - "Cannot compare: original contains placeholder for unserializable object", - p.getObjType(), p.getPath()); - } - if (newObj instanceof KryoPlaceholder) { - KryoPlaceholder p = (KryoPlaceholder) newObj; - throw new KryoPlaceholderAccessException( - "Cannot compare: new object contains placeholder for unserializable object", - p.getObjType(), p.getPath()); + // KryoPlaceholder means the Serializer couldn't serialize this part. + // Skip comparison for placeholder fields — we can't compare what we couldn't serialize. + if (orig instanceof KryoPlaceholder || newObj instanceof KryoPlaceholder) { + return true; } // Handle exceptions specially diff --git a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java index c8273aaf5..462d4dd25 100644 --- a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java +++ b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java @@ -60,9 +60,9 @@ class ComparatorCorrectnessTest { String json = Comparator.compareDatabases(originalDb.toString(), candidateDb.toString()); Map result = parseJson(json); - assertFalse((Boolean) result.get("equivalent")); - assertEquals(0, ((Number) result.get("actualComparisons")).intValue()); - assertTrue(((Number) result.get("skippedPlaceholders")).intValue() > 0); + // Placeholders are skipped during comparison (treated as matching) — counts as actual comparison + assertTrue((Boolean) result.get("equivalent")); + assertEquals(1, ((Number) result.get("actualComparisons")).intValue()); } @Test @@ -108,8 +108,8 @@ class ComparatorCorrectnessTest { Map result = parseJson(json); assertTrue((Boolean) result.get("equivalent")); - assertEquals(2, ((Number) result.get("actualComparisons")).intValue()); - assertEquals(1, ((Number) result.get("skippedPlaceholders")).intValue()); + // All 3 compared: 2 real values + 1 placeholder (placeholder skipped during deep compare) + assertEquals(3, ((Number) result.get("actualComparisons")).intValue()); } @Test @@ -209,6 +209,87 @@ class ComparatorCorrectnessTest { assertFalse(Comparator.isDeserializationError(42)); } + // ============================================================ + // VOID METHOD STATE COMPARISON — proves we actually compare + // post-call state for void methods, not just skip them + // ============================================================ + + @Test + @DisplayName("void state: both sides sorted identically → equivalent") + void testVoidState_identicalMutation_equivalent() throws Exception { + createTestDb(originalDb); + createTestDb(candidateDb); + + // Simulate: bubbleSortInPlace(arr) — both original and candidate sort correctly + // Post-call state: Object[]{sorted_array} + int[] sortedArr = {1, 2, 3, 4, 5}; + byte[] origState = Serializer.serialize(new Object[]{sortedArr}); + byte[] candState = Serializer.serialize(new Object[]{new int[]{1, 2, 3, 4, 5}}); + + insertRow(originalDb, "L1_1", 1, origState); + insertRow(candidateDb, "L1_1", 1, candState); + + String json = Comparator.compareDatabases(originalDb.toString(), candidateDb.toString()); + Map result = parseJson(json); + + assertTrue((Boolean) result.get("equivalent"), + "Both sides produce same sorted array — should be equivalent"); + assertEquals(1, ((Number) result.get("actualComparisons")).intValue()); + } + + @Test + @DisplayName("void state: candidate mutates array differently → NOT equivalent") + void testVoidState_differentMutation_rejected() throws Exception { + createTestDb(originalDb); + createTestDb(candidateDb); + + // Simulate: original sorts [3,1,2] → [1,2,3] + // Bad optimization doesn't sort correctly → [3,1,2] unchanged + byte[] origState = Serializer.serialize(new Object[]{new int[]{1, 2, 3}}); + byte[] candState = Serializer.serialize(new Object[]{new int[]{3, 1, 2}}); + + insertRow(originalDb, "L1_1", 1, origState); + insertRow(candidateDb, "L1_1", 1, candState); + + String json = Comparator.compareDatabases(originalDb.toString(), candidateDb.toString()); + Map result = parseJson(json); + + assertFalse((Boolean) result.get("equivalent"), + "Candidate produced wrong array — must be rejected"); + assertEquals(1, ((Number) result.get("actualComparisons")).intValue()); + } + + @Test + @DisplayName("void state: receiver + args both compared — wrong receiver state rejected") + void testVoidState_receiverAndArgs_wrongReceiverRejected() throws Exception { + createTestDb(originalDb); + createTestDb(candidateDb); + + // Simulate: instance method sorter.sort(data) + // Post-call state is Object[]{receiver_fields_map, mutated_data} + // Original: receiver has size=3, data is [1,2,3] + // Candidate: receiver has size=0 (wrong), data is [1,2,3] + Map origReceiver = new HashMap<>(); + origReceiver.put("size", 3); + origReceiver.put("sorted", true); + Map candReceiver = new HashMap<>(); + candReceiver.put("size", 0); + candReceiver.put("sorted", true); + + byte[] origState = Serializer.serialize(new Object[]{origReceiver, new int[]{1, 2, 3}}); + byte[] candState = Serializer.serialize(new Object[]{candReceiver, new int[]{1, 2, 3}}); + + insertRow(originalDb, "L1_1", 1, origState); + insertRow(candidateDb, "L1_1", 1, candState); + + String json = Comparator.compareDatabases(originalDb.toString(), candidateDb.toString()); + Map result = parseJson(json); + + assertFalse((Boolean) result.get("equivalent"), + "Receiver state differs (size 3 vs 0) — must be rejected even though args match"); + assertEquals(1, ((Number) result.get("actualComparisons")).intValue()); + } + // --- Helpers --- private void createTestDb(Path dbPath) throws Exception { diff --git a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java index 9b3e5462f..1a81728d0 100644 --- a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java +++ b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java @@ -311,31 +311,28 @@ class ComparatorTest { class PlaceholderTests { @Test - @DisplayName("original contains placeholder: throws exception") + @DisplayName("original contains placeholder: skipped, treated as matching") void testOriginalPlaceholder() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "path" ); - assertThrows(KryoPlaceholderAccessException.class, () -> { - Comparator.compare(placeholder, "anything"); - }); + // Placeholders are skipped — comparison returns true (not comparable, so skip) + assertTrue(Comparator.compare(placeholder, "anything")); } @Test - @DisplayName("new contains placeholder: throws exception") + @DisplayName("new contains placeholder: skipped, treated as matching") void testNewPlaceholder() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "path" ); - assertThrows(KryoPlaceholderAccessException.class, () -> { - Comparator.compare("anything", placeholder); - }); + assertTrue(Comparator.compare("anything", placeholder)); } @Test - @DisplayName("placeholder in nested structure: throws exception") + @DisplayName("placeholder in nested structure: skipped, rest compared normally") void testNestedPlaceholder() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "data.socket" @@ -343,17 +340,18 @@ class ComparatorTest { Map map1 = new HashMap<>(); map1.put("socket", placeholder); + map1.put("name", "same"); Map map2 = new HashMap<>(); map2.put("socket", "different"); + map2.put("name", "same"); - assertThrows(KryoPlaceholderAccessException.class, () -> { - Comparator.compare(map1, map2); - }); + // Placeholder field skipped, "name" field compared normally → equivalent + assertTrue(Comparator.compare(map1, map2)); } @Test - @DisplayName("compareWithDetails captures error message") + @DisplayName("compareWithDetails with placeholder returns equal (skipped)") void testCompareWithDetails() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "path" @@ -362,9 +360,8 @@ class ComparatorTest { Comparator.ComparisonResult result = Comparator.compareWithDetails(placeholder, "anything"); - assertFalse(result.isEqual()); - assertTrue(result.hasError()); - assertNotNull(result.getErrorMessage()); + assertTrue(result.isEqual()); + assertFalse(result.hasError()); } } diff --git a/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java b/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java index 903a6f3f9..beb17bce9 100644 --- a/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java +++ b/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java @@ -268,8 +268,8 @@ class SerializerTest { class PlaceholderAccessTests { @Test - @DisplayName("comparing objects with placeholder throws KryoPlaceholderAccessException") - void testPlaceholderComparisonThrowsException() throws Exception { + @DisplayName("comparing objects with placeholder skips the placeholder field") + void testPlaceholderComparisonSkips() throws Exception { try (Socket socket = new Socket()) { Map data = new LinkedHashMap<>(); data.put("socket", socket); @@ -279,9 +279,8 @@ class SerializerTest { KryoPlaceholder placeholder = (KryoPlaceholder) reloaded.get("socket"); - assertThrows(KryoPlaceholderAccessException.class, () -> { - Comparator.compare(placeholder, "anything"); - }); + // Placeholders are skipped during comparison — treated as matching + assertTrue(Comparator.compare(placeholder, "anything")); } } } diff --git a/codeflash/languages/java/comparator.py b/codeflash/languages/java/comparator.py index 2e2e66309..56a1724d7 100644 --- a/codeflash/languages/java/comparator.py +++ b/codeflash/languages/java/comparator.py @@ -299,16 +299,6 @@ def compare_test_results( skipped_deser_errors = comparison.get("skippedDeserializationErrors", 0) if actual_comparisons == 0: - if skipped_placeholders > 0 and skipped_deser_errors == 0 and not comparison.get("diffs"): - # For void methods, all return values are null → all are "placeholder" skips. - # If no diffs and no deser errors, treat as equivalent (pass/fail verification). - logger.info( - "Java comparison: void method — all return values null, treating as equivalent " - "(total=%s, skipped_placeholders=%s)", - comparison.get("totalInvocations", 0), - skipped_placeholders, - ) - return True, [] logger.warning( "Java comparison: no actual comparisons performed " "(total=%s, skipped_placeholders=%s, skipped_deser_errors=%s). " diff --git a/codeflash/languages/java/instrumentation.py b/codeflash/languages/java/instrumentation.py index 336774a83..f614c4be5 100644 --- a/codeflash/languages/java/instrumentation.py +++ b/codeflash/languages/java/instrumentation.py @@ -203,6 +203,7 @@ def _generate_sqlite_write_code( func_name: str, test_method_name: str, invocation_id: str = "", + verification_type: str = "function_call", ) -> list[str]: """Generate SQLite write code for a single function call. @@ -249,7 +250,7 @@ def _generate_sqlite_write_code( f'{inner_indent} _cf_pstmt{id_pair}.setString(6, "{inv_id_str}");', f"{inner_indent} _cf_pstmt{id_pair}.setLong(7, _cf_dur{id_pair});", f"{inner_indent} _cf_pstmt{id_pair}.setBytes(8, _cf_serializedResult{id_pair});", - f'{inner_indent} _cf_pstmt{id_pair}.setString(9, "function_call");', + f'{inner_indent} _cf_pstmt{id_pair}.setString(9, "{verification_type}");', f"{inner_indent} _cf_pstmt{id_pair}.executeUpdate();", f"{inner_indent} }}", f"{inner_indent} }}", @@ -349,14 +350,18 @@ def wrap_target_calls_with_treesitter( if is_void: bare_call_stmt = f"{call['full_call']};" # For void methods, serialize the post-call state to capture side effects. - # For instance methods (receiver is a variable), serialize the receiver. - # For static methods (receiver is a class name), serialize the arguments - # since the class name itself is not a value and can't be cast to Object. + # We always serialize the arguments (which are mutated in place). + # For instance methods, we also include the receiver to capture object state changes. + # For static methods, the receiver is a class name (not a value), so args only. is_static_call = receiver != "this" and receiver[:1].isupper() - if is_static_call and arg_texts: - serialize_target = f"new Object[]{{{', '.join(arg_texts)}}}" + parts: list[str] = [] + if not is_static_call: + parts.append(receiver) + parts.extend(arg_texts) + if parts: + serialize_target = f"new Object[]{{{', '.join(parts)}}}" else: - serialize_target = f"(Object) {receiver}" + serialize_target = "new Object[]{}" if precise_call_timing: serialize_stmt = f"_cf_serializedResult{iter_id}_{call_counter} = com.codeflash.Serializer.serialize({serialize_target});" start_stmt = f"_cf_start{iter_id}_{call_counter} = System.nanoTime();" @@ -418,7 +423,14 @@ def wrap_target_calls_with_treesitter( f" {serialize_stmt}", ] finally_block = _generate_sqlite_write_code( - iter_id, call_counter, "", class_name, func_name, test_method_name, invocation_id=inv_id + iter_id, + call_counter, + "", + class_name, + func_name, + test_method_name, + invocation_id=inv_id, + verification_type="void_state" if is_void else "function_call", ) all_lines = [*var_decls, start_marker, *try_block, *finally_block] replacement = ( diff --git a/tests/test_languages/test_java/test_instrumentation.py b/tests/test_languages/test_java/test_instrumentation.py index d8f4b4f08..acd80ccb6 100644 --- a/tests/test_languages/test_java/test_instrumentation.py +++ b/tests/test_languages/test_java/test_instrumentation.py @@ -3532,13 +3532,74 @@ class TestVoidMethodInstrumentation: ) assert success is True - assert result is not None - # Void method: no "Object _cf_result" variable declaration - assert "Object _cf_result" not in result - # Void method: bare call without assignment - assert "sorter.sort(data);" in result - # Void method: serializes the receiver (sorter), not a result variable - assert "com.codeflash.Serializer.serialize((Object) sorter)" in result + assert result == ( + "import org.junit.jupiter.api.Test;\n" + "import java.sql.Connection;\n" + "import java.sql.DriverManager;\n" + "import java.sql.PreparedStatement;\n" + "\n" + '@SuppressWarnings("CheckReturnValue")\n' + "public class SorterTest__perfinstrumented {\n" + " @Test\n" + " public void testSort() {\n" + " // Codeflash behavior instrumentation\n" + ' int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));\n' + " int _cf_iter1 = 1;\n" + ' String _cf_mod1 = "SorterTest__perfinstrumented";\n' + ' String _cf_cls1 = "SorterTest__perfinstrumented";\n' + ' String _cf_fn1 = "sort";\n' + ' String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");\n' + ' String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");\n' + ' if (_cf_testIteration1 == null) _cf_testIteration1 = "0";\n' + ' String _cf_test1 = "testSort";\n' + " Sorter sorter = new Sorter();\n" + " int[] data = {3, 1, 2};\n" + " long _cf_end1_1 = -1;\n" + " long _cf_start1_1 = 0;\n" + " byte[] _cf_serializedResult1_1 = null;\n" + ' System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":L12_1" + "######$!");\n' + " try {\n" + " _cf_start1_1 = System.nanoTime();\n" + " sorter.sort(data);\n" + " _cf_end1_1 = System.nanoTime();\n" + " _cf_serializedResult1_1 = com.codeflash.Serializer.serialize(new Object[]{sorter, data});\n" + " } finally {\n" + " long _cf_end1_1_finally = System.nanoTime();\n" + " long _cf_dur1_1 = (_cf_end1_1 != -1 ? _cf_end1_1 : _cf_end1_1_finally) - _cf_start1_1;\n" + ' System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + "L12_1" + "######!");\n' + " // Write to SQLite if output file is set\n" + " if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {\n" + " try {\n" + ' Class.forName("org.sqlite.JDBC");\n' + ' try (Connection _cf_conn1_1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {\n' + " try (java.sql.Statement _cf_stmt1_1 = _cf_conn1_1.createStatement()) {\n" + ' _cf_stmt1_1.execute("CREATE TABLE IF NOT EXISTS test_results (" +\n' + ' "test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +\n' + ' "function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +\n' + ' "runtime INTEGER, return_value BLOB, verification_type TEXT)");\n' + " }\n" + ' String _cf_sql1_1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";\n' + " try (PreparedStatement _cf_pstmt1_1 = _cf_conn1_1.prepareStatement(_cf_sql1_1)) {\n" + " _cf_pstmt1_1.setString(1, _cf_mod1);\n" + " _cf_pstmt1_1.setString(2, _cf_cls1);\n" + " _cf_pstmt1_1.setString(3, _cf_test1);\n" + " _cf_pstmt1_1.setString(4, _cf_fn1);\n" + " _cf_pstmt1_1.setInt(5, _cf_loop1);\n" + ' _cf_pstmt1_1.setString(6, "L12_1");\n' + " _cf_pstmt1_1.setLong(7, _cf_dur1_1);\n" + " _cf_pstmt1_1.setBytes(8, _cf_serializedResult1_1);\n" + ' _cf_pstmt1_1.setString(9, "void_state");\n' + " _cf_pstmt1_1.executeUpdate();\n" + " }\n" + " }\n" + " } catch (Exception _cf_e1_1) {\n" + ' System.err.println("CodeflashHelper: SQLite error: " + _cf_e1_1.getMessage());\n' + " }\n" + " }\n" + " }\n" + " }\n" + "}\n" + ) def test_behavior_mode_void_method_implicit_this_receiver(self, tmp_path: Path): """Void method with no explicit receiver uses 'this' for serialization.""" @@ -3580,9 +3641,72 @@ class TestVoidMethodInstrumentation: ) assert success is True - assert result is not None - # Implicit receiver defaults to 'this' - assert "com.codeflash.Serializer.serialize((Object) this)" in result + assert result == ( + "import org.junit.jupiter.api.Test;\n" + "import java.sql.Connection;\n" + "import java.sql.DriverManager;\n" + "import java.sql.PreparedStatement;\n" + "\n" + '@SuppressWarnings("CheckReturnValue")\n' + "public class ContainerTest__perfinstrumented {\n" + " @Test\n" + " public void testClear() {\n" + " // Codeflash behavior instrumentation\n" + ' int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));\n' + " int _cf_iter1 = 1;\n" + ' String _cf_mod1 = "ContainerTest__perfinstrumented";\n' + ' String _cf_cls1 = "ContainerTest__perfinstrumented";\n' + ' String _cf_fn1 = "clear";\n' + ' String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");\n' + ' String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");\n' + ' if (_cf_testIteration1 == null) _cf_testIteration1 = "0";\n' + ' String _cf_test1 = "testClear";\n' + " long _cf_end1_1 = -1;\n" + " long _cf_start1_1 = 0;\n" + " byte[] _cf_serializedResult1_1 = null;\n" + ' System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":L10_1" + "######$!");\n' + " try {\n" + " _cf_start1_1 = System.nanoTime();\n" + " clear();\n" + " _cf_end1_1 = System.nanoTime();\n" + " _cf_serializedResult1_1 = com.codeflash.Serializer.serialize(new Object[]{this});\n" + " } finally {\n" + " long _cf_end1_1_finally = System.nanoTime();\n" + " long _cf_dur1_1 = (_cf_end1_1 != -1 ? _cf_end1_1 : _cf_end1_1_finally) - _cf_start1_1;\n" + ' System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + "L10_1" + "######!");\n' + " // Write to SQLite if output file is set\n" + " if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {\n" + " try {\n" + ' Class.forName("org.sqlite.JDBC");\n' + ' try (Connection _cf_conn1_1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {\n' + " try (java.sql.Statement _cf_stmt1_1 = _cf_conn1_1.createStatement()) {\n" + ' _cf_stmt1_1.execute("CREATE TABLE IF NOT EXISTS test_results (" +\n' + ' "test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +\n' + ' "function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +\n' + ' "runtime INTEGER, return_value BLOB, verification_type TEXT)");\n' + " }\n" + ' String _cf_sql1_1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";\n' + " try (PreparedStatement _cf_pstmt1_1 = _cf_conn1_1.prepareStatement(_cf_sql1_1)) {\n" + " _cf_pstmt1_1.setString(1, _cf_mod1);\n" + " _cf_pstmt1_1.setString(2, _cf_cls1);\n" + " _cf_pstmt1_1.setString(3, _cf_test1);\n" + " _cf_pstmt1_1.setString(4, _cf_fn1);\n" + " _cf_pstmt1_1.setInt(5, _cf_loop1);\n" + ' _cf_pstmt1_1.setString(6, "L10_1");\n' + " _cf_pstmt1_1.setLong(7, _cf_dur1_1);\n" + " _cf_pstmt1_1.setBytes(8, _cf_serializedResult1_1);\n" + ' _cf_pstmt1_1.setString(9, "void_state");\n' + " _cf_pstmt1_1.executeUpdate();\n" + " }\n" + " }\n" + " } catch (Exception _cf_e1_1) {\n" + ' System.err.println("CodeflashHelper: SQLite error: " + _cf_e1_1.getMessage());\n' + " }\n" + " }\n" + " }\n" + " }\n" + "}\n" + ) def test_behavior_mode_non_void_still_captures_result(self, tmp_path: Path): """Non-void methods should still capture the return value (not the receiver).""" @@ -3625,11 +3749,75 @@ class TestVoidMethodInstrumentation: ) assert success is True - assert result is not None - # Non-void: captures return value, not receiver - assert "Object _cf_result1_1" in result - assert "_cf_result1_1 = calc.add(2, 2);" in result - assert "com.codeflash.Serializer.serialize((Object) _cf_result1_1)" in result + assert result == ( + "import org.junit.jupiter.api.Test;\n" + "import java.sql.Connection;\n" + "import java.sql.DriverManager;\n" + "import java.sql.PreparedStatement;\n" + "\n" + '@SuppressWarnings("CheckReturnValue")\n' + "public class CalculatorTest__perfinstrumented {\n" + " @Test\n" + " public void testAdd() {\n" + " // Codeflash behavior instrumentation\n" + ' int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));\n' + " int _cf_iter1 = 1;\n" + ' String _cf_mod1 = "CalculatorTest__perfinstrumented";\n' + ' String _cf_cls1 = "CalculatorTest__perfinstrumented";\n' + ' String _cf_fn1 = "add";\n' + ' String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");\n' + ' String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");\n' + ' if (_cf_testIteration1 == null) _cf_testIteration1 = "0";\n' + ' String _cf_test1 = "testAdd";\n' + " Calculator calc = new Calculator();\n" + " Object _cf_result1_1 = null;\n" + " long _cf_end1_1 = -1;\n" + " long _cf_start1_1 = 0;\n" + " byte[] _cf_serializedResult1_1 = null;\n" + ' System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":L11_1" + "######$!");\n' + " try {\n" + " _cf_start1_1 = System.nanoTime();\n" + " _cf_result1_1 = calc.add(2, 2);\n" + " _cf_end1_1 = System.nanoTime();\n" + " _cf_serializedResult1_1 = com.codeflash.Serializer.serialize((Object) _cf_result1_1);\n" + " } finally {\n" + " long _cf_end1_1_finally = System.nanoTime();\n" + " long _cf_dur1_1 = (_cf_end1_1 != -1 ? _cf_end1_1 : _cf_end1_1_finally) - _cf_start1_1;\n" + ' System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + "L11_1" + "######!");\n' + " // Write to SQLite if output file is set\n" + " if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {\n" + " try {\n" + ' Class.forName("org.sqlite.JDBC");\n' + ' try (Connection _cf_conn1_1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {\n' + " try (java.sql.Statement _cf_stmt1_1 = _cf_conn1_1.createStatement()) {\n" + ' _cf_stmt1_1.execute("CREATE TABLE IF NOT EXISTS test_results (" +\n' + ' "test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +\n' + ' "function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +\n' + ' "runtime INTEGER, return_value BLOB, verification_type TEXT)");\n' + " }\n" + ' String _cf_sql1_1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";\n' + " try (PreparedStatement _cf_pstmt1_1 = _cf_conn1_1.prepareStatement(_cf_sql1_1)) {\n" + " _cf_pstmt1_1.setString(1, _cf_mod1);\n" + " _cf_pstmt1_1.setString(2, _cf_cls1);\n" + " _cf_pstmt1_1.setString(3, _cf_test1);\n" + " _cf_pstmt1_1.setString(4, _cf_fn1);\n" + " _cf_pstmt1_1.setInt(5, _cf_loop1);\n" + ' _cf_pstmt1_1.setString(6, "L11_1");\n' + " _cf_pstmt1_1.setLong(7, _cf_dur1_1);\n" + " _cf_pstmt1_1.setBytes(8, _cf_serializedResult1_1);\n" + ' _cf_pstmt1_1.setString(9, "function_call");\n' + " _cf_pstmt1_1.executeUpdate();\n" + " }\n" + " }\n" + " } catch (Exception _cf_e1_1) {\n" + ' System.err.println("CodeflashHelper: SQLite error: " + _cf_e1_1.getMessage());\n' + " }\n" + " }\n" + " }\n" + " assertEquals(4, (int)_cf_result1_1);\n" + " }\n" + "}\n" + ) def test_void_discovery_with_require_return_false(self): """Void methods should be discovered when require_return=False.""" @@ -3702,8 +3890,39 @@ class TestVoidMethodInstrumentation: ) assert success is True - assert result is not None - # Performance mode: no "var _cf_result =" for void - assert "var _cf_result" not in result - # The test should still contain the bare call - assert "sorter.sort(data);" in result + assert result == ( + "import org.junit.jupiter.api.Test;\n" + "\n" + '@SuppressWarnings("CheckReturnValue")\n' + "public class SorterTest__perfonlyinstrumented {\n" + " @Test\n" + " public void testSort() {\n" + " // Codeflash timing instrumentation with inner loop for JIT warmup\n" + ' int _cf_outerLoop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));\n' + ' int _cf_maxInnerIterations1 = Integer.parseInt(System.getenv().getOrDefault("CODEFLASH_INNER_ITERATIONS", "10"));\n' + ' int _cf_innerIterations1 = Integer.parseInt(System.getenv().getOrDefault("CODEFLASH_INNER_ITERATIONS", "10"));\n' + ' String _cf_mod1 = "SorterTest__perfonlyinstrumented";\n' + ' String _cf_cls1 = "SorterTest__perfonlyinstrumented";\n' + ' String _cf_test1 = "testSort";\n' + ' String _cf_fn1 = "sort";\n' + " \n" + " Sorter sorter = new Sorter();\n" + " int[] data = {3, 1, 2};\n" + " for (int _cf_i1 = 0; _cf_i1 < _cf_innerIterations1; _cf_i1++) {\n" + " int _cf_loopId1 = _cf_outerLoop1 * _cf_maxInnerIterations1 + _cf_i1;\n" + ' System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loopId1 + ":" + "L9_1" + "######$!");\n' + " long _cf_end1 = -1;\n" + " long _cf_start1 = 0;\n" + " try {\n" + " _cf_start1 = System.nanoTime();\n" + " sorter.sort(data);\n" + " _cf_end1 = System.nanoTime();\n" + " } finally {\n" + " long _cf_end1_finally = System.nanoTime();\n" + " long _cf_dur1 = (_cf_end1 != -1 ? _cf_end1 : _cf_end1_finally) - _cf_start1;\n" + ' System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + "." + _cf_test1 + ":" + _cf_fn1 + ":" + _cf_loopId1 + ":" + "L9_1" + ":" + _cf_dur1 + "######!");\n' + " }\n" + " }\n" + " }\n" + "}\n" + ) From f352f9929f8183a4bef5bc9e3a8e6d78443cc40e Mon Sep 17 00:00:00 2001 From: HeshamHM28 Date: Fri, 3 Apr 2026 17:06:04 +0200 Subject: [PATCH 006/147] feat: update comparison logic to throw exceptions for KryoPlaceholder instances --- .../main/java/com/codeflash/Comparator.java | 16 +++++++--- .../codeflash/ComparatorCorrectnessTest.java | 10 +++---- .../java/com/codeflash/ComparatorTest.java | 29 ++++++++++--------- .../java/com/codeflash/SerializerTest.java | 9 +++--- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java b/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java index 07ac35aa2..3bd62c897 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/Comparator.java @@ -284,10 +284,18 @@ public final class Comparator { return false; } - // KryoPlaceholder means the Serializer couldn't serialize this part. - // Skip comparison for placeholder fields — we can't compare what we couldn't serialize. - if (orig instanceof KryoPlaceholder || newObj instanceof KryoPlaceholder) { - return true; + // Detect and reject KryoPlaceholder + if (orig instanceof KryoPlaceholder) { + KryoPlaceholder p = (KryoPlaceholder) orig; + throw new KryoPlaceholderAccessException( + "Cannot compare: original contains placeholder for unserializable object", + p.getObjType(), p.getPath()); + } + if (newObj instanceof KryoPlaceholder) { + KryoPlaceholder p = (KryoPlaceholder) newObj; + throw new KryoPlaceholderAccessException( + "Cannot compare: new object contains placeholder for unserializable object", + p.getObjType(), p.getPath()); } // Handle exceptions specially diff --git a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java index 462d4dd25..c8840dd98 100644 --- a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java +++ b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorCorrectnessTest.java @@ -60,9 +60,9 @@ class ComparatorCorrectnessTest { String json = Comparator.compareDatabases(originalDb.toString(), candidateDb.toString()); Map result = parseJson(json); - // Placeholders are skipped during comparison (treated as matching) — counts as actual comparison - assertTrue((Boolean) result.get("equivalent")); - assertEquals(1, ((Number) result.get("actualComparisons")).intValue()); + assertFalse((Boolean) result.get("equivalent")); + assertEquals(0, ((Number) result.get("actualComparisons")).intValue()); + assertTrue(((Number) result.get("skippedPlaceholders")).intValue() > 0); } @Test @@ -108,8 +108,8 @@ class ComparatorCorrectnessTest { Map result = parseJson(json); assertTrue((Boolean) result.get("equivalent")); - // All 3 compared: 2 real values + 1 placeholder (placeholder skipped during deep compare) - assertEquals(3, ((Number) result.get("actualComparisons")).intValue()); + assertEquals(2, ((Number) result.get("actualComparisons")).intValue()); + assertEquals(1, ((Number) result.get("skippedPlaceholders")).intValue()); } @Test diff --git a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java index 1a81728d0..9b3e5462f 100644 --- a/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java +++ b/codeflash-java-runtime/src/test/java/com/codeflash/ComparatorTest.java @@ -311,28 +311,31 @@ class ComparatorTest { class PlaceholderTests { @Test - @DisplayName("original contains placeholder: skipped, treated as matching") + @DisplayName("original contains placeholder: throws exception") void testOriginalPlaceholder() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "path" ); - // Placeholders are skipped — comparison returns true (not comparable, so skip) - assertTrue(Comparator.compare(placeholder, "anything")); + assertThrows(KryoPlaceholderAccessException.class, () -> { + Comparator.compare(placeholder, "anything"); + }); } @Test - @DisplayName("new contains placeholder: skipped, treated as matching") + @DisplayName("new contains placeholder: throws exception") void testNewPlaceholder() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "path" ); - assertTrue(Comparator.compare("anything", placeholder)); + assertThrows(KryoPlaceholderAccessException.class, () -> { + Comparator.compare("anything", placeholder); + }); } @Test - @DisplayName("placeholder in nested structure: skipped, rest compared normally") + @DisplayName("placeholder in nested structure: throws exception") void testNestedPlaceholder() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "data.socket" @@ -340,18 +343,17 @@ class ComparatorTest { Map map1 = new HashMap<>(); map1.put("socket", placeholder); - map1.put("name", "same"); Map map2 = new HashMap<>(); map2.put("socket", "different"); - map2.put("name", "same"); - // Placeholder field skipped, "name" field compared normally → equivalent - assertTrue(Comparator.compare(map1, map2)); + assertThrows(KryoPlaceholderAccessException.class, () -> { + Comparator.compare(map1, map2); + }); } @Test - @DisplayName("compareWithDetails with placeholder returns equal (skipped)") + @DisplayName("compareWithDetails captures error message") void testCompareWithDetails() { KryoPlaceholder placeholder = new KryoPlaceholder( "java.net.Socket", "", "error", "path" @@ -360,8 +362,9 @@ class ComparatorTest { Comparator.ComparisonResult result = Comparator.compareWithDetails(placeholder, "anything"); - assertTrue(result.isEqual()); - assertFalse(result.hasError()); + assertFalse(result.isEqual()); + assertTrue(result.hasError()); + assertNotNull(result.getErrorMessage()); } } diff --git a/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java b/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java index beb17bce9..903a6f3f9 100644 --- a/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java +++ b/codeflash-java-runtime/src/test/java/com/codeflash/SerializerTest.java @@ -268,8 +268,8 @@ class SerializerTest { class PlaceholderAccessTests { @Test - @DisplayName("comparing objects with placeholder skips the placeholder field") - void testPlaceholderComparisonSkips() throws Exception { + @DisplayName("comparing objects with placeholder throws KryoPlaceholderAccessException") + void testPlaceholderComparisonThrowsException() throws Exception { try (Socket socket = new Socket()) { Map data = new LinkedHashMap<>(); data.put("socket", socket); @@ -279,8 +279,9 @@ class SerializerTest { KryoPlaceholder placeholder = (KryoPlaceholder) reloaded.get("socket"); - // Placeholders are skipped during comparison — treated as matching - assertTrue(Comparator.compare(placeholder, "anything")); + assertThrows(KryoPlaceholderAccessException.class, () -> { + Comparator.compare(placeholder, "anything"); + }); } } } From 80581971a60cd0eb45dd0362d7c7707cc6d97003 Mon Sep 17 00:00:00 2001 From: HeshamHM28 Date: Tue, 7 Apr 2026 08:28:21 +0000 Subject: [PATCH 007/147] fix: add VOID_STATE to VerificationType enum Instrumentation writes verification_type="void_state" for void methods, but the enum lacked this value, causing ValueError on every SQLite row parse. Co-Authored-By: Claude Opus 4.6 (1M context) --- codeflash/models/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/codeflash/models/models.py b/codeflash/models/models.py index 0296ab24e..26b5d0a4c 100644 --- a/codeflash/models/models.py +++ b/codeflash/models/models.py @@ -740,6 +740,7 @@ class VerificationType(str, Enum): ) INIT_STATE_FTO = "init_state_fto" # Correctness verification for fto class instance attributes after init INIT_STATE_HELPER = "init_state_helper" # Correctness verification for helper class instance attributes after init + VOID_STATE = "void_state" # Correctness verification for void methods (no return value) @dataclass(frozen=True, slots=True) From 1fde200bc447ae709b24b1426184f30dae153b69 Mon Sep 17 00:00:00 2001 From: HeshamHM28 Date: Tue, 7 Apr 2026 11:08:16 +0000 Subject: [PATCH 008/147] fix: improve multi-module Gradle detection for dynamic settings.gradle.kts - Parse listOf(...) patterns in settings.gradle.kts for projects that build include lists dynamically (e.g. OpenRewrite) - Use word boundary in include regex to avoid matching variable names like 'includedProjects' - Break module voting ties using codeflash.toml module-root config, so the function's own module is preferred over cross-module tests Co-Authored-By: Claude Opus 4.6 (1M context) --- codeflash/languages/java/gradle_strategy.py | 76 ++++++++----- codeflash/languages/java/test_runner.py | 101 +++++++++++++++++- .../test_java/test_build_tools.py | 37 ++++--- .../test_java/test_java_test_paths.py | 29 +++++ 4 files changed, 196 insertions(+), 47 deletions(-) diff --git a/codeflash/languages/java/gradle_strategy.py b/codeflash/languages/java/gradle_strategy.py index b4481dd6e..660256fdb 100644 --- a/codeflash/languages/java/gradle_strategy.py +++ b/codeflash/languages/java/gradle_strategy.py @@ -9,7 +9,6 @@ from __future__ import annotations import logging import os import re -import shutil import subprocess import tempfile import xml.etree.ElementTree as ET @@ -17,7 +16,7 @@ from pathlib import Path from typing import Any from codeflash.languages.java.build_tool_strategy import BuildToolStrategy, module_to_dir -from codeflash.languages.java.build_tools import BuildTool, JavaProjectInfo +from codeflash.languages.java.build_tools import CODEFLASH_RUNTIME_VERSION, BuildTool, JavaProjectInfo _RE_INCLUDE = re.compile(r"""include\s*\(?([^)\n]+)\)?""") @@ -205,8 +204,32 @@ def _is_multimodule_project(build_root: Path) -> bool: return False -def add_codeflash_dependency_multimodule(build_file: Path, runtime_jar_path: Path) -> bool: - """Add codeflash-runtime dependency wrapped in a subprojects block for multi-module projects. +_CODEFLASH_MAVEN_COORD = f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" + + +def _ensure_maven_central_repo(build_file: Path, content: str) -> str: + """Ensure mavenCentral() is present in the repositories block. Returns updated content.""" + if "mavenCentral()" in content: + return content + + is_kts = build_file.name.endswith(".kts") + + # Try to find existing repositories block and add mavenCentral() inside it + repo_match = re.search(r"repositories\s*\{", content) + if repo_match: + insert_pos = repo_match.end() + return content[:insert_pos] + "\n mavenCentral()" + content[insert_pos:] + + # No repositories block — append one + if is_kts: + content += "\nrepositories {\n mavenCentral()\n}\n" + else: + content += "\nrepositories {\n mavenCentral()\n}\n" + return content + + +def add_codeflash_dependency_multimodule(build_file: Path) -> bool: + """Add codeflash-runtime dependency from Maven Central in a subprojects block for multi-module projects. This avoids adding testImplementation to the root build file directly, which would fail if the root project doesn't apply the java plugin. @@ -222,14 +245,16 @@ def add_codeflash_dependency_multimodule(build_file: Path, runtime_jar_path: Pat return True is_kts = build_file.name.endswith(".kts") - jar_str = str(runtime_jar_path).replace("\\", "/") if is_kts: block = ( f"\nsubprojects {{\n" f' plugins.withId("java") {{\n' + f" repositories {{\n" + f" mavenCentral()\n" + f" }}\n" f" dependencies {{\n" - f' testImplementation(files("{jar_str}")) // codeflash-runtime\n' + f' testImplementation("{_CODEFLASH_MAVEN_COORD}") // codeflash-runtime\n' f" }}\n" f" }}\n" f"}}\n" @@ -238,8 +263,11 @@ def add_codeflash_dependency_multimodule(build_file: Path, runtime_jar_path: Pat block = ( f"\nsubprojects {{\n" f" plugins.withId('java') {{\n" + f" repositories {{\n" + f" mavenCentral()\n" + f" }}\n" f" dependencies {{\n" - f" testImplementation files('{jar_str}') // codeflash-runtime\n" + f" testImplementation '{_CODEFLASH_MAVEN_COORD}' // codeflash-runtime\n" f" }}\n" f" }}\n" f"}}\n" @@ -255,7 +283,7 @@ def add_codeflash_dependency_multimodule(build_file: Path, runtime_jar_path: Pat return False -def add_codeflash_dependency(build_file: Path, runtime_jar_path: Path) -> bool: +def add_codeflash_dependency(build_file: Path) -> bool: if not build_file.exists(): return False @@ -266,13 +294,14 @@ def add_codeflash_dependency(build_file: Path, runtime_jar_path: Path) -> bool: logger.info("codeflash-runtime dependency already present in %s", build_file.name) return True + content = _ensure_maven_central_repo(build_file, content) + is_kts = build_file.name.endswith(".kts") - jar_str = str(runtime_jar_path).replace("\\", "/") if is_kts: - dep_line = f' testImplementation(files("{jar_str}")) // codeflash-runtime\n' + dep_line = f' testImplementation("{_CODEFLASH_MAVEN_COORD}") // codeflash-runtime\n' else: - dep_line = f" testImplementation files('{jar_str}') // codeflash-runtime\n" + dep_line = f" testImplementation '{_CODEFLASH_MAVEN_COORD}' // codeflash-runtime\n" # Use tree-sitter to find the top-level dependencies block insert_pos = _find_top_level_dependencies_block(build_file, content) @@ -284,9 +313,13 @@ def add_codeflash_dependency(build_file: Path, runtime_jar_path: Path) -> bool: # No existing dependencies block — append one if is_kts: - content += f'\ndependencies {{\n testImplementation(files("{jar_str}")) // codeflash-runtime\n}}\n' + content += ( + f'\ndependencies {{\n testImplementation("{_CODEFLASH_MAVEN_COORD}") // codeflash-runtime\n}}\n' + ) else: - content += f"\ndependencies {{\n testImplementation files('{jar_str}') // codeflash-runtime\n}}\n" + content += ( + f"\ndependencies {{\n testImplementation '{_CODEFLASH_MAVEN_COORD}' // codeflash-runtime\n}}\n" + ) build_file.write_text(content, encoding="utf-8") logger.info("Added codeflash-runtime dependency to %s (new block)", build_file.name) return True @@ -420,34 +453,21 @@ class GradleStrategy(BuildToolStrategy): return self.find_wrapper_executable(build_root, ("gradlew", "gradlew.bat"), "gradle") def ensure_runtime(self, build_root: Path, test_module: str | None) -> bool: - runtime_jar = self.find_runtime_jar() - if runtime_jar is None: - logger.error("codeflash-runtime JAR not found. Generated tests will fail to compile.") - return False - if test_module: module_root = build_root / module_to_dir(test_module) else: module_root = build_root - libs_dir = module_root / "libs" - libs_dir.mkdir(parents=True, exist_ok=True) - dest_jar = libs_dir / "codeflash-runtime-1.0.1.jar" - - if not dest_jar.exists(): - logger.info("Copying codeflash-runtime JAR to %s", dest_jar) - shutil.copy2(runtime_jar, dest_jar) - build_file = find_gradle_build_file(module_root) if build_file is None: logger.warning("No build.gradle(.kts) found at %s, cannot add codeflash-runtime dependency", module_root) return False if not test_module and _is_multimodule_project(build_root): - if not add_codeflash_dependency_multimodule(build_file, dest_jar): + if not add_codeflash_dependency_multimodule(build_file): logger.error("Failed to add codeflash-runtime dependency to %s", build_file) return False - elif not add_codeflash_dependency(build_file, dest_jar): + elif not add_codeflash_dependency(build_file): logger.error("Failed to add codeflash-runtime dependency to %s", build_file) return False diff --git a/codeflash/languages/java/test_runner.py b/codeflash/languages/java/test_runner.py index 74830d436..184aaa626 100644 --- a/codeflash/languages/java/test_runner.py +++ b/codeflash/languages/java/test_runner.py @@ -205,12 +205,25 @@ def _extract_modules_from_settings_gradle(content: str) -> list[str]: Looks for include directives like: include("module-a", "module-b") // Kotlin DSL include 'module-a', 'module-b' // Groovy DSL + Also handles dynamic Kotlin DSL patterns like: + val allProjects = listOf("module-a", "module-b") + include(*(allProjects + ...).toTypedArray()) Module names may be prefixed with ':' which is stripped. """ modules: list[str] = [] - for match in re.findall(r"""include\s*\(?[^)\n]*\)?""", content): + # Standard include(...) directives — word boundary avoids matching variable names + # like 'includedProjects' + for match in re.findall(r"""(?:^|(?<=\s))include\s*\(?[^)\n]*\)?""", content, re.MULTILINE): for name in re.findall(r"""['"]([^'"]+)['"]""", match): modules.append(name.lstrip(":")) + # Kotlin DSL: val ... = listOf("module-a", "module-b", ...) spanning multiple lines. + # Used when settings.gradle.kts builds the include list dynamically. + if not modules or not any("/" not in m and "." not in m for m in modules): + for match in re.findall(r"""listOf\s*\(([^)]*)\)""", content, re.DOTALL): + for name in re.findall(r"""['"]([^'"]+)['"]""", match): + stripped = name.lstrip(":") + if stripped not in modules: + modules.append(stripped) return modules @@ -269,6 +282,50 @@ def _match_module_from_rel_path(rel_path: Path, modules: list[str]) -> str | Non return None +def _read_config_module_root(project_root: Path) -> str | None: + """Read module-root from codeflash.toml or pyproject.toml.""" + for cfg_name in ("codeflash.toml", "pyproject.toml"): + cfg_path = project_root / cfg_name + if cfg_path.exists(): + try: + cfg_text = cfg_path.read_text(encoding="utf-8") + m = re.search(r'module-root\s*=\s*["\']([^"\']+)["\']', cfg_text) + if m: + return m.group(1).strip().strip("/") + except Exception: + pass + return None + + +def _infer_module_from_config(project_root: Path) -> str | None: + """Infer the target Gradle module from codeflash config in gradle.properties. + + Reads codeflash.moduleRoot or codeflash.testsRoot and extracts the first + path component as the module name. Verifies the module directory has a + build.gradle(.kts) file. + """ + props_file = project_root / "gradle.properties" + if not props_file.exists(): + return None + try: + content = props_file.read_text(encoding="utf-8") + except Exception: + return None + + for key in ("codeflash.moduleRoot", "codeflash.testsRoot"): + for line in content.splitlines(): + line = line.strip() + if line.startswith(key + "="): + value = line.split("=", 1)[1].strip() + # Extract first path component (e.g. "rewrite-core/src/main/java" → "rewrite-core") + candidate = Path(value).parts[0] if Path(value).parts else None + if candidate: + module_dir = project_root / candidate + if (module_dir / "build.gradle.kts").exists() or (module_dir / "build.gradle").exists(): + return candidate + return None + + def _find_multi_module_root(project_root: Path, test_paths: Any) -> tuple[Path, str | None]: """Find the multi-module parent root if tests are in a different module. @@ -287,10 +344,18 @@ def _find_multi_module_root(project_root: Path, test_paths: Any) -> tuple[Path, test_file_paths.append(test_file.benchmarking_file_path) elif hasattr(test_file, "instrumented_behavior_file_path") and test_file.instrumented_behavior_file_path: test_file_paths.append(test_file.instrumented_behavior_file_path) + elif hasattr(test_file, "original_file_path") and test_file.original_file_path: + test_file_paths.append(test_file.original_file_path) elif isinstance(test_paths, (list, tuple)): test_file_paths = [Path(p) if isinstance(p, str) else p for p in test_paths] if not test_file_paths: + # No test file paths available — try to infer the module from codeflash config + # in gradle.properties (e.g. codeflash.moduleRoot=rewrite-core/src/main/java). + module = _infer_module_from_config(project_root) + if module: + logger.info("Inferred module '%s' from codeflash config (no test file paths)", module) + return project_root, module return project_root, None test_outside_project = False @@ -320,7 +385,14 @@ def _find_multi_module_root(project_root: Path, test_paths: Any) -> tuple[Path, module_counts[matched] = module_counts.get(matched, 0) + 1 if module_counts: - best_module = max(module_counts, key=lambda m: module_counts[m]) + # On ties, prefer the module matching codeflash.toml module-root + config_module = _read_config_module_root(project_root) + max_count = max(module_counts.values()) + tied = [m for m, c in module_counts.items() if c == max_count] + if config_module and config_module in tied: + best_module = config_module + else: + best_module = max(module_counts, key=lambda m: module_counts[m]) logger.debug( "Detected multi-module project. Root: %s, Module votes: %s, Selected: %s", project_root, @@ -328,6 +400,31 @@ def _find_multi_module_root(project_root: Path, test_paths: Any) -> tuple[Path, best_module, ) return project_root, best_module + + # project_root has no sub-modules — check if it is itself a sub-module + # of a parent multi-module project (e.g. rewrite-core/ inside rewrite/). + parent = project_root.parent + while parent != parent.parent: + if _is_build_root(parent): + parent_modules = _detect_modules(parent) + if parent_modules: + try: + rel_path = project_root.relative_to(parent) + matched = _match_module_from_rel_path(rel_path, parent_modules) + if matched: + logger.debug("Detected project_root as sub-module. Root: %s, Module: %s", parent, matched) + return parent, matched + except ValueError: + pass + parent = parent.parent + + # Last resort: settings.gradle may use dynamic includes that _detect_modules + # can't parse. Fall back to codeflash config in gradle.properties. + module = _infer_module_from_config(project_root) + if module: + logger.info("Inferred module '%s' from codeflash config (dynamic settings.gradle)", module) + return project_root, module + return project_root, None current = project_root.parent diff --git a/tests/test_languages/test_java/test_build_tools.py b/tests/test_languages/test_java/test_build_tools.py index a4f01e1a6..254216a9e 100644 --- a/tests/test_languages/test_java/test_build_tools.py +++ b/tests/test_languages/test_java/test_build_tools.py @@ -588,17 +588,14 @@ class TestGradleEnsureRuntimeMultiModule: project = self._make_multi_module_project(tmp_path) strategy = GradleStrategy() - # Provide a fake runtime JAR - fake_jar = tmp_path / "fake-runtime.jar" - fake_jar.write_bytes(b"PK\x03\x04") # minimal zip header - - with patch.object(strategy, "find_runtime_jar", return_value=fake_jar): - result = strategy.ensure_runtime(project, test_module="streams") + result = strategy.ensure_runtime(project, test_module="streams") assert result is True - # Dependency should be in streams/build.gradle.kts + # Dependency should be in streams/build.gradle.kts with Maven Central coordinate streams_build = (project / "streams" / "build.gradle.kts").read_text(encoding="utf-8") assert "codeflash-runtime" in streams_build + assert "com.codeflash:codeflash-runtime:" in streams_build + assert "mavenCentral()" in streams_build # And NOT in clients/build.gradle.kts or root build.gradle.kts clients_build = (project / "clients" / "build.gradle.kts").read_text(encoding="utf-8") assert "codeflash-runtime" not in clients_build @@ -610,15 +607,13 @@ class TestGradleEnsureRuntimeMultiModule: project = self._make_multi_module_project(tmp_path) strategy = GradleStrategy() - fake_jar = tmp_path / "fake-runtime.jar" - fake_jar.write_bytes(b"PK\x03\x04") - - with patch.object(strategy, "find_runtime_jar", return_value=fake_jar): - result = strategy.ensure_runtime(project, test_module=None) + result = strategy.ensure_runtime(project, test_module=None) assert result is True root_build = (project / "build.gradle.kts").read_text(encoding="utf-8") assert "codeflash-runtime" in root_build + assert "com.codeflash:codeflash-runtime:" in root_build + assert "mavenCentral()" in root_build def test_adds_dependency_to_nested_module(self, tmp_path): """When test_module='connect:runtime', the dep goes to connect/runtime/build.gradle.kts.""" @@ -632,12 +627,20 @@ class TestGradleEnsureRuntimeMultiModule: ) strategy = GradleStrategy() - fake_jar = tmp_path / "fake-runtime.jar" - fake_jar.write_bytes(b"PK\x03\x04") - - with patch.object(strategy, "find_runtime_jar", return_value=fake_jar): - result = strategy.ensure_runtime(project, test_module="connect:runtime") + result = strategy.ensure_runtime(project, test_module="connect:runtime") assert result is True nested_build = (nested / "build.gradle.kts").read_text(encoding="utf-8") assert "codeflash-runtime" in nested_build + assert "com.codeflash:codeflash-runtime:" in nested_build + assert "mavenCentral()" in nested_build + + def test_does_not_copy_jar_to_libs(self, tmp_path): + """ensure_runtime should NOT copy JARs locally — Gradle resolves from Maven Central.""" + project = self._make_multi_module_project(tmp_path) + + strategy = GradleStrategy() + strategy.ensure_runtime(project, test_module="streams") + + libs_dir = project / "streams" / "libs" + assert not libs_dir.exists() diff --git a/tests/test_languages/test_java/test_java_test_paths.py b/tests/test_languages/test_java/test_java_test_paths.py index 3a6ff95db..1120862f3 100644 --- a/tests/test_languages/test_java/test_java_test_paths.py +++ b/tests/test_languages/test_java/test_java_test_paths.py @@ -631,3 +631,32 @@ class TestFindMultiModuleRoot: assert build_root == tmp_path assert test_module == "streams" + + def test_submodule_as_project_root_with_tests_inside(self, tmp_path): + """When project_root is a sub-module (e.g. rewrite-core/) and generated tests + are inside it, should walk up to find the real root and detect the module.""" + self._make_kafka_like_project(tmp_path) + submodule_root = tmp_path / "clients" + test_file = submodule_root / "src" / "test" / "java" / "com" / "ClientsTest.java" + test_file.parent.mkdir(parents=True, exist_ok=True) + test_file.touch() + + test_paths = self._make_test_paths_mock([test_file]) + build_root, test_module = _find_multi_module_root(submodule_root, test_paths) + + assert build_root == tmp_path + assert test_module == "clients" + + def test_submodule_as_project_root_nested_module(self, tmp_path): + """When project_root is a nested sub-module (connect/runtime), should detect it.""" + self._make_kafka_like_project(tmp_path) + submodule_root = tmp_path / "connect" / "runtime" + test_file = submodule_root / "src" / "test" / "java" / "com" / "RuntimeTest.java" + test_file.parent.mkdir(parents=True, exist_ok=True) + test_file.touch() + + test_paths = self._make_test_paths_mock([test_file]) + build_root, test_module = _find_multi_module_root(submodule_root, test_paths) + + assert build_root == tmp_path + assert test_module == "connect:runtime" From 2e4df0a7fe883c4aae146c763b9406276f8fd726 Mon Sep 17 00:00:00 2001 From: "codeflash-ai[bot]" <148906541+codeflash-ai[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:40:47 +0000 Subject: [PATCH 009/147] Optimize _extract_modules_from_settings_gradle The optimization pre-compiles three regex patterns at module load time (`_INCLUDE_PATTERN`, `_LISTOF_PATTERN`, `_QUOTED_PATTERN`) instead of recompiling them on every function call, eliminating the ~1 ms pattern-compilation overhead that line profiler shows dominated the original version (44.3% of total time in the first `re.findall` alone). The second major change replaces the O(n) `if stripped not in modules` list scan with a set-based `if stripped not in seen` check, which cuts the deduplication cost from ~288 ns to ~72 ns per check when the fallback listOf branch executes. Runtime improves from 2.35 ms to 1.91 ms (23% faster) with no behavioral regressions. --- codeflash/languages/java/test_runner.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/codeflash/languages/java/test_runner.py b/codeflash/languages/java/test_runner.py index 184aaa626..9bbf95753 100644 --- a/codeflash/languages/java/test_runner.py +++ b/codeflash/languages/java/test_runner.py @@ -24,6 +24,12 @@ from typing import Any from codeflash.code_utils.code_utils import get_run_tmp_file from codeflash.languages.base import TestResult +_INCLUDE_PATTERN = re.compile(r"""(?:^|(?<=\s))include\s*\(?[^)\n]*\)?""", re.MULTILINE) + +_LISTOF_PATTERN = re.compile(r"""listOf\s*\(([^)]*)\)""", re.DOTALL) + +_QUOTED_PATTERN = re.compile(r"""['"]([^'"]+)['"]""") + _result_counter = itertools.count(1) @@ -213,17 +219,19 @@ def _extract_modules_from_settings_gradle(content: str) -> list[str]: modules: list[str] = [] # Standard include(...) directives — word boundary avoids matching variable names # like 'includedProjects' - for match in re.findall(r"""(?:^|(?<=\s))include\s*\(?[^)\n]*\)?""", content, re.MULTILINE): - for name in re.findall(r"""['"]([^'"]+)['"]""", match): + for match in _INCLUDE_PATTERN.findall(content): + for name in _QUOTED_PATTERN.findall(match): modules.append(name.lstrip(":")) # Kotlin DSL: val ... = listOf("module-a", "module-b", ...) spanning multiple lines. # Used when settings.gradle.kts builds the include list dynamically. if not modules or not any("/" not in m and "." not in m for m in modules): - for match in re.findall(r"""listOf\s*\(([^)]*)\)""", content, re.DOTALL): - for name in re.findall(r"""['"]([^'"]+)['"]""", match): + seen = set(modules) + for match in _LISTOF_PATTERN.findall(content): + for name in _QUOTED_PATTERN.findall(match): stripped = name.lstrip(":") - if stripped not in modules: + if stripped not in seen: modules.append(stripped) + seen.add(stripped) return modules From 0ab4800f74e906382c72c019158e5423c329c6e2 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 14:46:37 +0000 Subject: [PATCH 010/147] fix: use tree-sitter for Gradle repositories block and add version update logic - Generalize _find_top_level_dependencies_block() into _find_top_level_block(name) so it can find any top-level block (dependencies, repositories, etc.) - Rewrite _ensure_maven_central_repo() to use tree-sitter instead of regex, preventing false matches inside buildscript/subprojects/allprojects blocks - Add _update_existing_codeflash_dependency() to replace stale versions or old files() format with the current Maven Central coordinate - Wire version update into add_codeflash_dependency() and add_codeflash_dependency_multimodule() so old entries get updated instead of silently skipped Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/gradle_strategy.py | 107 +++++++--- .../test_java/test_build_tools.py | 190 +++++++++++++++++- 2 files changed, 271 insertions(+), 26 deletions(-) diff --git a/codeflash/languages/java/gradle_strategy.py b/codeflash/languages/java/gradle_strategy.py index 660256fdb..1c527ee35 100644 --- a/codeflash/languages/java/gradle_strategy.py +++ b/codeflash/languages/java/gradle_strategy.py @@ -129,12 +129,12 @@ def find_gradle_build_file(project_root: Path) -> Path | None: return None -def _find_top_level_dependencies_block(build_file: Path, content: str) -> int | None: - """Find the insert position (before closing }) of the top-level dependencies block using tree-sitter. +def _find_top_level_block(build_file: Path, content: str, block_name: str) -> int | None: + """Find the insert position (before closing }) of a top-level block using tree-sitter. - Returns the byte offset of the closing brace, or None if no top-level dependencies block exists. - Only matches `dependencies { }` at the root level — ignores blocks nested inside - `buildscript`, `subprojects`, `allprojects`, etc. + Returns the byte offset of the closing brace, or None if no top-level block with the + given name exists. Only matches blocks at the root level — ignores blocks nested inside + ``buildscript``, ``subprojects``, ``allprojects``, etc. """ import tree_sitter as ts @@ -152,10 +152,10 @@ def _find_top_level_dependencies_block(build_file: Path, content: str) -> int | tree = parser.parse(source_bytes) - # Walk only direct children of root to find top-level `dependencies { }` + # Walk only direct children of root to find top-level ` { }` for child in tree.root_node.children: - # Groovy: expression_statement > method_invocation(identifier="dependencies", closure) - # Kotlin: call_expression(identifier="dependencies", annotated_lambda) + # Groovy: expression_statement > method_invocation(identifier, closure) + # Kotlin: call_expression(identifier, annotated_lambda) node = child if node.type == "expression_statement" and node.child_count > 0: node = node.children[0] @@ -175,7 +175,7 @@ def _find_top_level_dependencies_block(build_file: Path, content: str) -> int | continue name = source_bytes[name_node.start_byte : name_node.end_byte].decode("utf-8") - if name != "dependencies": + if name != block_name: continue # Find the closing brace of this block @@ -190,6 +190,11 @@ def _find_top_level_dependencies_block(build_file: Path, content: str) -> int | return None +def _find_top_level_dependencies_block(build_file: Path, content: str) -> int | None: + """Find the insert position (before closing }) of the top-level dependencies block.""" + return _find_top_level_block(build_file, content, "dependencies") + + def _is_multimodule_project(build_root: Path) -> bool: """Check if this is a multi-module Gradle project by looking for include directives in settings files.""" for settings_name in ("settings.gradle", "settings.gradle.kts"): @@ -207,24 +212,58 @@ def _is_multimodule_project(build_root: Path) -> bool: _CODEFLASH_MAVEN_COORD = f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" +def _update_existing_codeflash_dependency(build_file: Path, content: str) -> str | None: + """If the codeflash-runtime dependency exists but is outdated or uses the old files() format, update it. + + Returns the updated content, or None if no update was needed (already current). + """ + is_kts = build_file.name.endswith(".kts") + + if is_kts: + current_dep = f'testImplementation("{_CODEFLASH_MAVEN_COORD}")' + else: + current_dep = f"testImplementation '{_CODEFLASH_MAVEN_COORD}'" + + if current_dep in content: + return None + + # Replace the line containing "codeflash-runtime" with the current Maven Central coordinate. + # This handles both old versions (e.g. 1.0.0) and old files() format. + updated_lines: list[str] = [] + replaced = False + for line in content.splitlines(keepends=True): + if "codeflash-runtime" in line: + indent = len(line) - len(line.lstrip()) + spaces = " " * indent + if is_kts: + updated_lines.append(f'{spaces}testImplementation("{_CODEFLASH_MAVEN_COORD}") // codeflash-runtime\n') + else: + updated_lines.append(f"{spaces}testImplementation '{_CODEFLASH_MAVEN_COORD}' // codeflash-runtime\n") + replaced = True + else: + updated_lines.append(line) + + if replaced: + return "".join(updated_lines) + return None + + def _ensure_maven_central_repo(build_file: Path, content: str) -> str: - """Ensure mavenCentral() is present in the repositories block. Returns updated content.""" + """Ensure mavenCentral() is present in the top-level repositories block. Returns updated content. + + Uses tree-sitter to find the correct top-level ``repositories {}`` block, avoiding + false matches inside ``buildscript {}``, ``subprojects {}``, etc. + """ if "mavenCentral()" in content: return content - is_kts = build_file.name.endswith(".kts") + # Use tree-sitter to find the top-level repositories block + insert_pos = _find_top_level_block(build_file, content, "repositories") + if insert_pos is not None: + return content[:insert_pos] + " mavenCentral()\n" + content[insert_pos:] - # Try to find existing repositories block and add mavenCentral() inside it - repo_match = re.search(r"repositories\s*\{", content) - if repo_match: - insert_pos = repo_match.end() - return content[:insert_pos] + "\n mavenCentral()" + content[insert_pos:] - - # No repositories block — append one - if is_kts: - content += "\nrepositories {\n mavenCentral()\n}\n" - else: - content += "\nrepositories {\n mavenCentral()\n}\n" + # No top-level repositories block — append one + content += "\nrepositories {\n mavenCentral()\n}\n" return content @@ -241,7 +280,16 @@ def add_codeflash_dependency_multimodule(build_file: Path) -> bool: content = build_file.read_text(encoding="utf-8") if "codeflash-runtime" in content: - logger.info("codeflash-runtime dependency already present in %s", build_file.name) + updated = _update_existing_codeflash_dependency(build_file, content) + if updated is not None: + build_file.write_text(updated, encoding="utf-8") + logger.info( + "Updated codeflash-runtime dependency in %s to version %s", + build_file.name, + CODEFLASH_RUNTIME_VERSION, + ) + else: + logger.info("codeflash-runtime dependency already up-to-date in %s", build_file.name) return True is_kts = build_file.name.endswith(".kts") @@ -291,7 +339,18 @@ def add_codeflash_dependency(build_file: Path) -> bool: content = build_file.read_text(encoding="utf-8") if "codeflash-runtime" in content: - logger.info("codeflash-runtime dependency already present in %s", build_file.name) + updated = _update_existing_codeflash_dependency(build_file, content) + if updated is not None: + # Also ensure mavenCentral() is present (old files() format won't have it) + updated = _ensure_maven_central_repo(build_file, updated) + build_file.write_text(updated, encoding="utf-8") + logger.info( + "Updated codeflash-runtime dependency in %s to version %s", + build_file.name, + CODEFLASH_RUNTIME_VERSION, + ) + else: + logger.info("codeflash-runtime dependency already up-to-date in %s", build_file.name) return True content = _ensure_maven_central_repo(build_file, content) diff --git a/tests/test_languages/test_java/test_build_tools.py b/tests/test_languages/test_java/test_build_tools.py index 254216a9e..0b28ba64b 100644 --- a/tests/test_languages/test_java/test_build_tools.py +++ b/tests/test_languages/test_java/test_build_tools.py @@ -2,16 +2,22 @@ import os from pathlib import Path -from unittest.mock import patch from codeflash.languages.java.build_tools import ( + CODEFLASH_RUNTIME_VERSION, BuildTool, detect_build_tool, find_source_root, find_test_root, get_project_info, ) -from codeflash.languages.java.gradle_strategy import GradleStrategy +from codeflash.languages.java.gradle_strategy import ( + GradleStrategy, + _ensure_maven_central_repo, + _find_top_level_block, + _update_existing_codeflash_dependency, +) +from codeflash.languages.java.gradle_strategy import add_codeflash_dependency as gradle_add_codeflash_dependency from codeflash.languages.java.maven_strategy import MavenStrategy, add_codeflash_dependency from codeflash.languages.java.test_runner import _extract_modules_from_pom_content @@ -644,3 +650,183 @@ class TestGradleEnsureRuntimeMultiModule: libs_dir = project / "streams" / "libs" assert not libs_dir.exists() + + +class TestEnsureMavenCentralRepo: + """Tests for _ensure_maven_central_repo with tree-sitter.""" + + def test_skips_when_maven_central_already_present(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "repositories {\n mavenCentral()\n}\n" + build_file.write_text(content, encoding="utf-8") + result = _ensure_maven_central_repo(build_file, content) + assert result == content + + def test_inserts_into_top_level_repositories(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "repositories {\n google()\n}\n" + build_file.write_text(content, encoding="utf-8") + result = _ensure_maven_central_repo(build_file, content) + assert "mavenCentral()" in result + assert "google()" in result + + def test_does_not_match_buildscript_repositories(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "buildscript {\n repositories {\n google()\n }\n}\n" + build_file.write_text(content, encoding="utf-8") + result = _ensure_maven_central_repo(build_file, content) + # Should NOT insert into buildscript repositories — should append a new top-level block + assert result.endswith("\nrepositories {\n mavenCentral()\n}\n") + # The buildscript block should be unchanged + assert "buildscript {\n repositories {\n google()\n }\n}" in result + + def test_appends_new_block_when_no_repositories(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "plugins {\n id 'java'\n}\n" + build_file.write_text(content, encoding="utf-8") + result = _ensure_maven_central_repo(build_file, content) + assert result.endswith("\nrepositories {\n mavenCentral()\n}\n") + + def test_works_with_kts(self, tmp_path): + build_file = tmp_path / "build.gradle.kts" + content = "repositories {\n google()\n}\n" + build_file.write_text(content, encoding="utf-8") + result = _ensure_maven_central_repo(build_file, content) + assert "mavenCentral()" in result + + +class TestFindTopLevelBlock: + """Tests for _find_top_level_block tree-sitter function.""" + + def test_finds_top_level_dependencies(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = 'dependencies {\n testImplementation "junit:junit:4.13"\n}\n' + build_file.write_text(content, encoding="utf-8") + pos = _find_top_level_block(build_file, content, "dependencies") + assert pos is not None + assert content[pos] == "}" + + def test_ignores_nested_dependencies(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = ( + "buildscript {\n dependencies {\n classpath 'com.android.tools.build:gradle:7.0'\n }\n}\n" + ) + build_file.write_text(content, encoding="utf-8") + pos = _find_top_level_block(build_file, content, "dependencies") + assert pos is None + + def test_finds_top_level_repositories(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "repositories {\n google()\n}\n" + build_file.write_text(content, encoding="utf-8") + pos = _find_top_level_block(build_file, content, "repositories") + assert pos is not None + + def test_ignores_buildscript_repositories(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "buildscript {\n repositories {\n google()\n }\n}\n" + build_file.write_text(content, encoding="utf-8") + pos = _find_top_level_block(build_file, content, "repositories") + assert pos is None + + def test_returns_none_when_block_absent(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "plugins {\n id 'java'\n}\n" + build_file.write_text(content, encoding="utf-8") + pos = _find_top_level_block(build_file, content, "repositories") + assert pos is None + + def test_works_with_kts(self, tmp_path): + build_file = tmp_path / "build.gradle.kts" + content = 'dependencies {\n testImplementation("junit:junit:4.13")\n}\n' + build_file.write_text(content, encoding="utf-8") + pos = _find_top_level_block(build_file, content, "dependencies") + assert pos is not None + + +class TestGradleVersionUpdate: + """Tests for version update logic in Gradle dependency management.""" + + def test_updates_old_version(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = ( + "dependencies {\n testImplementation 'com.codeflash:codeflash-runtime:1.0.0' // codeflash-runtime\n}\n" + ) + build_file.write_text(content, encoding="utf-8") + result = _update_existing_codeflash_dependency(build_file, content) + assert result is not None + assert f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" in result + assert "1.0.0" not in result + + def test_updates_old_files_format(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = "dependencies {\n testImplementation files('/path/to/codeflash-runtime-1.0.1.jar')\n}\n" + build_file.write_text(content, encoding="utf-8") + result = _update_existing_codeflash_dependency(build_file, content) + assert result is not None + assert f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" in result + assert "files(" not in result + + def test_returns_none_when_already_current(self, tmp_path): + build_file = tmp_path / "build.gradle" + content = f"dependencies {{\n testImplementation 'com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}' // codeflash-runtime\n}}\n" + build_file.write_text(content, encoding="utf-8") + result = _update_existing_codeflash_dependency(build_file, content) + assert result is None + + def test_returns_none_when_already_current_kts(self, tmp_path): + build_file = tmp_path / "build.gradle.kts" + content = f'dependencies {{\n testImplementation("com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}")\n}}\n' + build_file.write_text(content, encoding="utf-8") + result = _update_existing_codeflash_dependency(build_file, content) + assert result is None + + def test_updates_old_version_kts(self, tmp_path): + build_file = tmp_path / "build.gradle.kts" + content = ( + 'dependencies {\n testImplementation("com.codeflash:codeflash-runtime:1.0.0") // codeflash-runtime\n}\n' + ) + build_file.write_text(content, encoding="utf-8") + result = _update_existing_codeflash_dependency(build_file, content) + assert result is not None + assert f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" in result + + def test_add_codeflash_dependency_updates_old_version(self, tmp_path): + """Full integration: add_codeflash_dependency updates old version instead of skipping.""" + build_file = tmp_path / "build.gradle" + build_file.write_text( + "repositories {\n mavenCentral()\n}\n\n" + "dependencies {\n testImplementation 'com.codeflash:codeflash-runtime:1.0.0'\n}\n", + encoding="utf-8", + ) + result = gradle_add_codeflash_dependency(build_file) + assert result is True + content = build_file.read_text(encoding="utf-8") + assert f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" in content + assert "1.0.0" not in content + + def test_add_codeflash_dependency_replaces_files_format(self, tmp_path): + """Full integration: add_codeflash_dependency replaces old files() with Maven Central coord.""" + build_file = tmp_path / "build.gradle" + build_file.write_text( + "dependencies {\n testImplementation files('/home/user/libs/codeflash-runtime-1.0.1.jar')\n}\n", + encoding="utf-8", + ) + result = gradle_add_codeflash_dependency(build_file) + assert result is True + content = build_file.read_text(encoding="utf-8") + assert f"com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}" in content + assert "files(" not in content + # Should also add mavenCentral() since the old format didn't need it + assert "mavenCentral()" in content + + def test_add_codeflash_dependency_preserves_indent(self, tmp_path): + build_file = tmp_path / "build.gradle" + build_file.write_text( + "dependencies {\n testImplementation 'com.codeflash:codeflash-runtime:1.0.0'\n}\n", encoding="utf-8" + ) + result = gradle_add_codeflash_dependency(build_file) + assert result is True + content = build_file.read_text(encoding="utf-8") + # Should preserve the 8-space indent + assert f" testImplementation 'com.codeflash:codeflash-runtime:{CODEFLASH_RUNTIME_VERSION}'" in content From 32bbe57867905fc2e0e8051c617a877dd0044646 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 14:49:03 +0000 Subject: [PATCH 011/147] fix: add classpath hint to find_agent_jar for Gradle JAR resolution Gradle resolves the codeflash-runtime JAR to ~/.gradle/caches/, not ~/.m2/. Add an optional classpath parameter to find_agent_jar() that searches the resolved classpath for the JAR before falling back to the existing ~/.m2 / resources / dev-build chain. Thread the parameter through build_javaagent_arg, build_agent_env, instrument_source_for_line_profiler, and line_profiler_step so the optimization pipeline passes the resolved classpath automatically. Co-Authored-By: Claude Opus 4.6 --- .../languages/java/function_optimizer.py | 4 +++- codeflash/languages/java/line_profiler.py | 19 ++++++++++++++----- codeflash/languages/java/support.py | 5 +++-- codeflash/languages/java/tracer.py | 4 ++-- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/codeflash/languages/java/function_optimizer.py b/codeflash/languages/java/function_optimizer.py index 5700a907a..08980032e 100644 --- a/codeflash/languages/java/function_optimizer.py +++ b/codeflash/languages/java/function_optimizer.py @@ -404,7 +404,9 @@ class JavaFunctionOptimizer(FunctionOptimizer): line_profiler_output_path = get_run_tmp_file(Path("line_profiler_output.json")) success = self.language_support.instrument_source_for_line_profiler( - func_info=self.function_to_optimize, line_profiler_output_file=line_profiler_output_path + func_info=self.function_to_optimize, + line_profiler_output_file=line_profiler_output_path, + project_classpath=self._get_project_classpath(), ) if not success: return {"timings": {}, "unit": 0, "str_out": ""} diff --git a/codeflash/languages/java/line_profiler.py b/codeflash/languages/java/line_profiler.py index 854a8549d..706b543a8 100644 --- a/codeflash/languages/java/line_profiler.py +++ b/codeflash/languages/java/line_profiler.py @@ -13,6 +13,7 @@ from __future__ import annotations import json import logging +import os import re from pathlib import Path from typing import TYPE_CHECKING, Any @@ -130,9 +131,9 @@ class JavaLineProfiler: config_output_path.write_text(json.dumps(config, indent=2), encoding="utf-8") return config_output_path - def build_javaagent_arg(self, config_path: Path) -> str: + def build_javaagent_arg(self, config_path: Path, classpath: str | None = None) -> str: """Return the -javaagent JVM argument string.""" - agent_jar = find_agent_jar() + agent_jar = find_agent_jar(classpath=classpath) if agent_jar is None: msg = f"{AGENT_JAR_NAME} not found in resources or dev build directory" raise FileNotFoundError(msg) @@ -565,12 +566,20 @@ def find_method_for_line( return Path(file_path).name, line_num -def find_agent_jar() -> Path | None: +def find_agent_jar(classpath: str | None = None) -> Path | None: """Locate the profiler agent JAR file (now bundled in codeflash-runtime). - Checks local Maven repo, package resources, and development build directory. + Checks the resolved classpath (if provided), local Maven repo, package resources, + and development build directory. """ - # Check local Maven repository first (fastest) + # Check resolved classpath first (Gradle projects resolve here, not ~/.m2) + if classpath: + for entry in classpath.split(os.pathsep): + jar_path = Path(entry) + if "codeflash-runtime" in jar_path.name and jar_path.suffix == ".jar" and jar_path.exists(): + return jar_path + + # Check local Maven repository (Maven projects resolve here) m2_jar = ( Path.home() / ".m2" diff --git a/codeflash/languages/java/support.py b/codeflash/languages/java/support.py index ab3818348..7115d2225 100644 --- a/codeflash/languages/java/support.py +++ b/codeflash/languages/java/support.py @@ -590,7 +590,7 @@ class JavaSupport(LanguageSupport): ) def instrument_source_for_line_profiler( - self, func_info: FunctionToOptimize, line_profiler_output_file: Path + self, func_info: FunctionToOptimize, line_profiler_output_file: Path, project_classpath: str | None = None ) -> bool: """Prepare line profiling via the bytecode-instrumentation agent. @@ -602,6 +602,7 @@ class JavaSupport(LanguageSupport): Args: func_info: Function to profile. line_profiler_output_file: Path where profiling results will be written by the agent. + project_classpath: Resolved classpath from the build tool, used to locate the agent JAR. Returns: True if preparation succeeded, False otherwise. @@ -619,7 +620,7 @@ class JavaSupport(LanguageSupport): source=source, file_path=func_info.file_path, functions=[func_info], config_output_path=config_path ) - self.line_profiler_agent_arg = profiler.build_javaagent_arg(config_path) + self.line_profiler_agent_arg = profiler.build_javaagent_arg(config_path, classpath=project_classpath) self.line_profiler_warmup_iterations = profiler.warmup_iterations return True except Exception: diff --git a/codeflash/languages/java/tracer.py b/codeflash/languages/java/tracer.py index ab8f19514..50506797e 100644 --- a/codeflash/languages/java/tracer.py +++ b/codeflash/languages/java/tracer.py @@ -132,9 +132,9 @@ class JavaTracer: env["JAVA_TOOL_OPTIONS"] = f"{existing} {jfr_opts}".strip() return env - def build_agent_env(self, config_path: Path) -> dict[str, str]: + def build_agent_env(self, config_path: Path, classpath: str | None = None) -> dict[str, str]: env = os.environ.copy() - agent_jar = find_agent_jar() + agent_jar = find_agent_jar(classpath=classpath) if agent_jar is None: msg = "codeflash-runtime JAR not found, cannot run tracing agent" raise FileNotFoundError(msg) From 1fa01a3296701c0081bbf61582fdff7e92ca72b8 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 14:50:45 +0000 Subject: [PATCH 012/147] fix: replace Gradle JaCoCo plugin with runtime JAR agent for coverage The Gradle JaCoCo plugin approach (jacocoTestReport task) fails on multi-module projects and adds 5-10 min overhead. Replace with: 1. Inject -javaagent:{runtime_jar}=destfile={exec} via JAVA_TOOL_OPTIONS (AgentDispatcher routes destfile= args to JaCoCo PreMain) 2. Run tests without jacocoTestReport task 3. Convert .exec to .xml via shaded JaCoCo CLI in the runtime JAR This eliminates the "jacocoTestReport not found" error on eureka and similar multi-module Gradle projects, and removes build file mutation for coverage setup. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/gradle_strategy.py | 156 +++++++++++--------- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/codeflash/languages/java/gradle_strategy.py b/codeflash/languages/java/gradle_strategy.py index 1c527ee35..7589d9ca9 100644 --- a/codeflash/languages/java/gradle_strategy.py +++ b/codeflash/languages/java/gradle_strategy.py @@ -102,22 +102,6 @@ gradle.projectsEvaluated { } """ -# Gradle init script that applies JaCoCo plugin for coverage collection. -# Uses projectsEvaluated to avoid triggering configuration of unrelated subprojects. -_JACOCO_INIT_SCRIPT = """\ -gradle.projectsEvaluated { - allprojects { - apply plugin: 'jacoco' - jacocoTestReport { - reports { - xml.required = true - html.required = false - } - } - } -} -""" - def find_gradle_build_file(project_root: Path) -> Path | None: kts = project_root / "build.gradle.kts" @@ -736,7 +720,7 @@ class GradleStrategy(BuildToolStrategy): mode: str, test_module: str | None, javaagent_arg: str | None = None, - enable_coverage: bool = False, + enable_coverage: bool = False, # kept for interface compatibility; coverage now uses JAVA_TOOL_OPTIONS ) -> subprocess.CompletedProcess[str]: from codeflash.languages.java.test_runner import _build_test_filter, _run_cmd_kill_pg_on_timeout @@ -807,25 +791,12 @@ class GradleStrategy(BuildToolStrategy): cmd = [gradle, task, "--no-daemon", "--rerun", "--init-script", init_path] cmd.extend(["--init-script", _get_skip_validation_init_script()]) - # --continue ensures Gradle keeps going even if some tests fail. - # For coverage: needed so jacocoTestReport runs even after test failures - # (matches Maven's -Dmaven.test.failure.ignore=true). - # Note: multi-module --tests filtering is handled by - # filter.failOnNoMatchingTests = false in the init script above - # (matches Maven's -DfailIfNoTests=false). - if enable_coverage: - cmd.append("--continue") - for class_filter in test_filter.split(","): class_filter = class_filter.strip() if class_filter: cmd.extend(["--tests", class_filter]) logger.debug("Added --tests filters to Gradle command") - # Append jacocoTestReport AFTER --tests so Gradle doesn't try to apply --tests to it - if enable_coverage: - cmd.append("jacocoTestReport") - logger.debug("Running Gradle command: %s in %s", " ".join(cmd), build_root) result = _run_cmd_kill_pg_on_timeout(cmd, cwd=build_root, env=env, timeout=timeout) @@ -962,64 +933,105 @@ class GradleStrategy(BuildToolStrategy): timeout: int, candidate_index: int, ) -> tuple[subprocess.CompletedProcess[str], Path, Path | None]: + from codeflash.languages.java.line_profiler import find_agent_jar from codeflash.languages.java.test_runner import _get_combined_junit_xml - coverage_xml_path = self.setup_coverage(build_root, test_module, build_root) + if test_module: + module_path = build_root / module_to_dir(test_module) + else: + module_path = build_root + # Locate the runtime JAR (contains shaded JaCoCo agent + CLI) + classpath = self.get_classpath(build_root, run_env, test_module) + runtime_jar = find_agent_jar(classpath=classpath) + if runtime_jar is None: + logger.warning("codeflash-runtime JAR not found, cannot collect coverage") + result = self.run_tests_via_build_tool( + build_root, test_paths, run_env, timeout=timeout, mode="behavior", test_module=test_module + ) + reports_dir = self.get_reports_dir(build_root, test_module) + result_xml_path = _get_combined_junit_xml(reports_dir, candidate_index) + return result, result_xml_path, None + + # Use the runtime JAR's built-in JaCoCo agent via AgentDispatcher + exec_path = module_path / "build" / "jacoco" / "test.exec" + exec_path.parent.mkdir(parents=True, exist_ok=True) + + jacoco_agent_arg = f"-javaagent:{runtime_jar}=destfile={exec_path}" + run_env = run_env.copy() + existing_opts = run_env.get("JAVA_TOOL_OPTIONS", "") + run_env["JAVA_TOOL_OPTIONS"] = f"{existing_opts} {jacoco_agent_arg}".strip() + + # Run tests WITHOUT enable_coverage (no jacocoTestReport task needed) result = self.run_tests_via_build_tool( - build_root, - test_paths, - run_env, - timeout=timeout, - mode="behavior", - enable_coverage=True, - test_module=test_module, + build_root, test_paths, run_env, timeout=timeout, mode="behavior", test_module=test_module ) reports_dir = self.get_reports_dir(build_root, test_module) result_xml_path = _get_combined_junit_xml(reports_dir, candidate_index) + # Convert .exec → .xml via the shaded JaCoCo CLI in the runtime JAR + coverage_xml_path = self._convert_jacoco_exec_to_xml(runtime_jar, exec_path, module_path) + return result, result_xml_path, coverage_xml_path + def _convert_jacoco_exec_to_xml(self, runtime_jar: Path, exec_path: Path, module_path: Path) -> Path | None: + if not exec_path.exists(): + logger.warning("JaCoCo exec file not found: %s", exec_path) + return None + + xml_path = exec_path.with_suffix(".xml") + + # Collect classfiles directories for the report + classfiles_dirs: list[str] = [] + for classes_dir in [ + module_path / "build" / "classes" / "java" / "main", + module_path / "build" / "classes" / "java" / "test", + ]: + if classes_dir.exists(): + classfiles_dirs.append(str(classes_dir)) + + if not classfiles_dirs: + logger.warning("No classfiles directories found under %s/build/classes", module_path) + return None + + cmd = [ + "java", + "-cp", + str(runtime_jar), + "com.codeflash.shaded.org.jacoco.cli.internal.Main", + "report", + str(exec_path), + ] + for d in classfiles_dirs: + cmd.extend(["--classfiles", d]) + cmd.extend(["--xml", str(xml_path)]) + + logger.debug("Converting JaCoCo exec to XML: %s", " ".join(cmd)) + try: + conv_result = subprocess.run(cmd, capture_output=True, text=True, timeout=30, check=False) + if conv_result.returncode != 0: + logger.warning( + "JaCoCo exec→XML conversion failed (exit %d): %s", conv_result.returncode, conv_result.stderr + ) + return None + except Exception: + logger.exception("JaCoCo exec→XML conversion error") + return None + + if xml_path.exists(): + logger.info("JaCoCo coverage XML generated: %s", xml_path) + return xml_path + + logger.warning("JaCoCo XML not created at %s", xml_path) + return None + def setup_coverage(self, build_root: Path, test_module: str | None, project_root: Path) -> Path | None: if test_module: module_root = build_root / module_to_dir(test_module) else: module_root = project_root - - build_file = find_gradle_build_file(module_root) - if build_file is None: - logger.warning("No build.gradle(.kts) found at %s, cannot setup JaCoCo", module_root) - return None - - content = build_file.read_text(encoding="utf-8") - if "jacoco" not in content.lower(): - logger.info("Adding JaCoCo plugin to %s for coverage collection", build_file.name) - is_kts = build_file.name.endswith(".kts") - if is_kts: - plugin_line = "plugins {\n jacoco\n}\n" - else: - plugin_line = "apply plugin: 'jacoco'\n" - - if "plugins {" in content or "plugins{" in content: - # Insert jacoco inside existing plugins block - plugins_idx = content.find("plugins") - brace_depth = 0 - for i in range(plugins_idx, len(content)): - if content[i] == "{": - brace_depth += 1 - elif content[i] == "}": - brace_depth -= 1 - if brace_depth == 0: - insert = " jacoco\n" if is_kts else " id 'jacoco'\n" - content = content[:i] + insert + content[i:] - break - else: - content = plugin_line + content - - build_file.write_text(content, encoding="utf-8") - - return module_root / "build" / "reports" / "jacoco" / "test" / "jacocoTestReport.xml" + return module_root / "build" / "jacoco" / "test.xml" def get_test_run_command(self, project_root: Path, test_classes: list[str] | None = None) -> list[str]: from codeflash.languages.java.test_runner import _validate_java_class_name From ba8dd8bdb92aa2f865e473b24043cdcea42a01d4 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 14:56:15 +0000 Subject: [PATCH 013/147] fix: add project_classpath param to base LanguageSupport.instrument_source_for_line_profiler --- codeflash/languages/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeflash/languages/base.py b/codeflash/languages/base.py index e699afd2b..dea5126f7 100644 --- a/codeflash/languages/base.py +++ b/codeflash/languages/base.py @@ -897,7 +897,7 @@ class LanguageSupport(Protocol): ... def instrument_source_for_line_profiler( - self, func_info: FunctionToOptimize, line_profiler_output_file: Path + self, func_info: FunctionToOptimize, line_profiler_output_file: Path, project_classpath: str | None = None ) -> bool: """Instrument source code before line profiling.""" ... From 217544f99ea0b04cc3d14aea23305d54e72a2220 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 15:02:55 +0000 Subject: [PATCH 014/147] fix: handle multi-line include directives in settings.gradle The regex for extracting modules from settings.gradle only matched single-line include statements. Multi-line includes like eureka's (include 'a',\n 'b',\n 'c') only captured the first module, causing test_module to be None and breaking multi-module path resolution (e.g., classfiles lookup for JaCoCo coverage conversion). Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/test_runner.py | 5 +++-- .../test_java/test_java_test_paths.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/codeflash/languages/java/test_runner.py b/codeflash/languages/java/test_runner.py index 9bbf95753..b333f2713 100644 --- a/codeflash/languages/java/test_runner.py +++ b/codeflash/languages/java/test_runner.py @@ -24,7 +24,7 @@ from typing import Any from codeflash.code_utils.code_utils import get_run_tmp_file from codeflash.languages.base import TestResult -_INCLUDE_PATTERN = re.compile(r"""(?:^|(?<=\s))include\s*\(?[^)\n]*\)?""", re.MULTILINE) +_INCLUDE_PATTERN = re.compile(r"""(?:^|(?<=\s))include\s*\(?[^)]*\)?""", re.MULTILINE | re.DOTALL) _LISTOF_PATTERN = re.compile(r"""listOf\s*\(([^)]*)\)""", re.DOTALL) @@ -218,7 +218,8 @@ def _extract_modules_from_settings_gradle(content: str) -> list[str]: """ modules: list[str] = [] # Standard include(...) directives — word boundary avoids matching variable names - # like 'includedProjects' + # like 'includedProjects'. Pattern allows multi-line includes (e.g., eureka's + # include 'module-a',\n 'module-b',\n 'module-c') for match in _INCLUDE_PATTERN.findall(content): for name in _QUOTED_PATTERN.findall(match): modules.append(name.lstrip(":")) diff --git a/tests/test_languages/test_java/test_java_test_paths.py b/tests/test_languages/test_java/test_java_test_paths.py index 1120862f3..4c4e7fa08 100644 --- a/tests/test_languages/test_java/test_java_test_paths.py +++ b/tests/test_languages/test_java/test_java_test_paths.py @@ -507,6 +507,25 @@ class TestExtractModulesFromSettingsGradle: assert "streams" in modules assert "clients" in modules + def test_multi_line_groovy_include(self): + content = """rootProject.name='eureka' +include 'eureka-client', + 'eureka-client-jersey2', + 'eureka-server', + 'eureka-core', + 'eureka-resources'""" + modules = _extract_modules_from_settings_gradle(content) + assert modules == ["eureka-client", "eureka-client-jersey2", "eureka-server", "eureka-core", "eureka-resources"] + + def test_multi_line_kotlin_dsl_include(self): + content = """include( + "module-a", + "module-b", + "module-c" +)""" + modules = _extract_modules_from_settings_gradle(content) + assert modules == ["module-a", "module-b", "module-c"] + class TestFindMultiModuleRoot: """Tests for _find_multi_module_root with Gradle multi-module projects.""" From e658fb45af5d192ffa9a83c152ff441bc76ef082 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 15:35:55 +0000 Subject: [PATCH 015/147] fix: increase coverage timeout from 300s to 900s for Gradle builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gradle --no-daemon on multi-module projects (e.g., eureka) needs cold JVM startup + dependency resolution + compilation + test execution + JaCoCo agent overhead, which exceeds 300s. At 300s the process is killed mid-execution, producing partial results that the pipeline can't use for behavioral baseline. Ported from PR #2013 which validated 300s→600s→900s progression on eureka (build takes ~10 min, 900s provides safe headroom). Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/test_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeflash/languages/java/test_runner.py b/codeflash/languages/java/test_runner.py index b333f2713..0b1c6aa8b 100644 --- a/codeflash/languages/java/test_runner.py +++ b/codeflash/languages/java/test_runner.py @@ -526,7 +526,7 @@ def run_behavioral_tests( if enable_coverage: coverage_xml_path = strategy.setup_coverage(build_root, test_module, project_root) - min_timeout = 300 if enable_coverage else 60 + min_timeout = 900 if enable_coverage else 60 effective_timeout = max(timeout or 300, min_timeout) if enable_coverage: From 389aa16f76e8c4aff89d2bce320682d21bc365bc Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 15:55:00 +0000 Subject: [PATCH 016/147] fix: pre-compile test classes and increase compilation timeout for Gradle Two changes to prevent cold-build timeouts on large multi-module Gradle projects (e.g., eureka ~16 min cold build): 1. install_multi_module_deps now compiles testClasses instead of just classes, so the test execution timeout only covers running tests, not compilation. 2. Pre-install compilation timeout increased from 300s to 900s to accommodate cold Gradle --no-daemon builds on large projects. Combined with the coverage min_timeout of 900s (previous commit), compilation and test execution each get their own 900s budget instead of sharing one. Ported from PR #2013 experience where 300s/600s were validated as insufficient for eureka cold builds. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/gradle_strategy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash/languages/java/gradle_strategy.py b/codeflash/languages/java/gradle_strategy.py index 7589d9ca9..2eb27b8b8 100644 --- a/codeflash/languages/java/gradle_strategy.py +++ b/codeflash/languages/java/gradle_strategy.py @@ -532,14 +532,14 @@ class GradleStrategy(BuildToolStrategy): logger.error("Gradle not found — cannot pre-install multi-module dependencies") return False - cmd = [gradle, f":{test_module}:classes", "-x", "test", "--build-cache", "--no-daemon"] + cmd = [gradle, f":{test_module}:testClasses", "-x", "test", "--build-cache", "--no-daemon"] cmd.extend(["--init-script", _get_skip_validation_init_script()]) logger.info("Pre-installing multi-module dependencies: %s (module: %s)", build_root, test_module) logger.debug("Running: %s", " ".join(cmd)) try: - result = _run_cmd_kill_pg_on_timeout(cmd, cwd=build_root, env=env, timeout=300) + result = _run_cmd_kill_pg_on_timeout(cmd, cwd=build_root, env=env, timeout=900) if result.returncode != 0: logger.error( "Failed to pre-install multi-module deps (exit %d).\nstdout: %s\nstderr: %s", From 5e2ef37f6f73c677b789fba9af39bd14dcf29d17 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 16:13:06 +0000 Subject: [PATCH 017/147] fix: increase coverage timeout to 1200s for large Gradle --no-daemon builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gradle --no-daemon on multi-module projects forces a full JVM cold start for every invocation. On eureka, configuration + dependency resolution alone takes ~10 min before tests even start. 900s was still getting killed at the boundary. 1200s (20 min) provides headroom for: cold Gradle startup (~10 min) + test execution (~5 min) + JaCoCo overhead + safety margin. PR #2013 iterated through 300→600→900s and found 900s sufficient only when build caches were warm from prior invocations in the same session. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/test_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeflash/languages/java/test_runner.py b/codeflash/languages/java/test_runner.py index 0b1c6aa8b..6a144b367 100644 --- a/codeflash/languages/java/test_runner.py +++ b/codeflash/languages/java/test_runner.py @@ -526,7 +526,7 @@ def run_behavioral_tests( if enable_coverage: coverage_xml_path = strategy.setup_coverage(build_root, test_module, project_root) - min_timeout = 900 if enable_coverage else 60 + min_timeout = 1200 if enable_coverage else 60 effective_timeout = max(timeout or 300, min_timeout) if enable_coverage: From 4c70a212941d797e4d6e4aa2f635730d0853c9d7 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Tue, 7 Apr 2026 23:54:07 +0000 Subject: [PATCH 018/147] fix: resolve Windows CI failures from path separator mismatches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Normalize paths to forward slashes in JS/TS code generation and coverage parsing — backslashes are escape chars in JavaScript strings and cause silent corruption on Windows. Also relax timing test thresholds for CI. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/javascript/support.py | 5 ++++- codeflash/languages/javascript/test_runner.py | 8 +++++-- codeflash/verification/coverage_utils.py | 9 +++++--- .../test_java/test_run_and_parse.py | 22 ++++++++++++------- .../test_jest_typescript_config_bug.py | 4 ++-- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/codeflash/languages/javascript/support.py b/codeflash/languages/javascript/support.py index 500c02839..768afce9f 100644 --- a/codeflash/languages/javascript/support.py +++ b/codeflash/languages/javascript/support.py @@ -2268,7 +2268,10 @@ class JavaScriptSupport: source_without_ext = source_file_abs.with_suffix("") # Use os.path.relpath to compute relative path from tests_root to source file - rel_path = os.path.relpath(str(source_without_ext), str(tests_root_abs)) + # Replace backslashes with forward slashes — JavaScript import/require paths + # must use forward slashes. Backslashes are escape chars in JS strings + # (e.g. \t → tab, \n → newline) and would break imports on Windows. + rel_path = os.path.relpath(str(source_without_ext), str(tests_root_abs)).replace("\\", "/") # For ESM, add .js extension (TypeScript convention) # TypeScript requires imports to reference the OUTPUT file extension (.js), diff --git a/codeflash/languages/javascript/test_runner.py b/codeflash/languages/javascript/test_runner.py index c5e029455..e3ade6969 100644 --- a/codeflash/languages/javascript/test_runner.py +++ b/codeflash/languages/javascript/test_runner.py @@ -369,7 +369,9 @@ def _create_runtime_jest_config(base_config_path: Path | None, project_root: Pat runtime_config_path = config_dir / f"jest.codeflash.runtime.config{config_ext}" - test_dirs_js = ", ".join(f"'{d}'" for d in sorted(test_dirs)) + # Normalize to forward slashes — backslashes in JS strings are escape chars + # (e.g. \t → tab, \n → newline) and would corrupt paths on Windows. + test_dirs_js = ", ".join(f"'{d.replace(chr(92), '/')}'" for d in sorted(test_dirs)) # In monorepos, add the root node_modules to moduleDirectories so Jest # can resolve workspace packages that are hoisted to the monorepo root. @@ -382,6 +384,8 @@ def _create_runtime_jest_config(base_config_path: Path | None, project_root: Pat else: module_dirs_line_no_base = "" + project_root_posix = project_root.as_posix() + # TypeScript configs (.ts) cannot be required from CommonJS modules # because Node.js cannot parse TypeScript syntax in require(). # When the base config is TypeScript, we create a standalone config @@ -403,7 +407,7 @@ module.exports = {{ else: config_content = f"""// Auto-generated by codeflash - runtime config with test roots module.exports = {{ - roots: ['{project_root}', {test_dirs_js}], + roots: ['{project_root_posix}', {test_dirs_js}], testMatch: ['**/*.test.ts', '**/*.test.js', '**/*.test.tsx', '**/*.test.jsx'], {module_dirs_line_no_base}}}; """ diff --git a/codeflash/verification/coverage_utils.py b/codeflash/verification/coverage_utils.py index e92c95947..62a4d2eea 100644 --- a/codeflash/verification/coverage_utils.py +++ b/codeflash/verification/coverage_utils.py @@ -54,14 +54,17 @@ class JestCoverageUtils: return CoverageData.create_empty(source_code_path, function_name, code_context) # Find the file entry in coverage data - # Jest uses absolute paths as keys + # Jest/Vitest always writes coverage keys with forward slashes (POSIX paths), + # so we normalize our paths to POSIX for comparison — critical on Windows + # where Path.resolve() and str(Path) produce backslash paths. file_coverage = None - source_path_str = str(source_code_path.resolve()) + source_path_posix = source_code_path.resolve().as_posix() + source_relative_posix = source_code_path.as_posix() for file_path, file_data in coverage_data.items(): # Match exact path or path ending with full relative path from src/ # Avoid matching files with same name in different directories (e.g., db/utils.ts vs utils/utils.ts) - if file_path == source_path_str or file_path.endswith(str(source_code_path)): + if file_path == source_path_posix or file_path.endswith(source_relative_posix): file_coverage = file_data break diff --git a/tests/test_languages/test_java/test_run_and_parse.py b/tests/test_languages/test_java/test_run_and_parse.py index 7d093dbb3..1470b9ce8 100644 --- a/tests/test_languages/test_java/test_run_and_parse.py +++ b/tests/test_languages/test_java/test_run_and_parse.py @@ -512,13 +512,16 @@ public class PreciseWaiterTest { stddev_runtime = statistics.stdev(runtimes) coefficient_of_variation = stddev_runtime / mean_runtime - # Target: 10ms (10,000,000 ns), allow <5% coefficient of variation - # (accounts for JIT warmup - first iteration is cold, subsequent are optimized) + # Target: 10ms (10,000,000 ns), allow <15% coefficient of variation. + # The first iteration per test method runs with cold JIT, and shared CI VMs + # (especially Windows) have ~15ms scheduler granularity that adds noise. + # 15% still catches instrumentation bugs (e.g., 0ms or 100ms outliers) + # while the ±5% mean check below validates timing accuracy. expected_ns = 10_000_000 runtimes_ms = [r / 1_000_000 for r in runtimes] - assert coefficient_of_variation < 0.05, ( - f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <5%). " + assert coefficient_of_variation < 0.15, ( + f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <15%). " f"Runtimes: {runtimes_ms} ms (mean={mean_runtime / 1_000_000:.3f}ms)" ) @@ -597,13 +600,16 @@ public class PreciseWaiterMultiTest { stddev_runtime = statistics.stdev(runtimes) coefficient_of_variation = stddev_runtime / mean_runtime - # Target: 10ms (10,000,000 ns), allow <5% coefficient of variation - # (accounts for JIT warmup - first iteration is cold, subsequent are optimized) + # Target: 10ms (10,000,000 ns), allow <15% coefficient of variation. + # The first iteration per test method runs with cold JIT, and shared CI VMs + # (especially Windows) have ~15ms scheduler granularity that adds noise. + # 15% still catches instrumentation bugs (e.g., 0ms or 100ms outliers) + # while the ±5% mean check below validates timing accuracy. expected_ns = 10_000_000 runtimes_ms = [r / 1_000_000 for r in runtimes] - assert coefficient_of_variation < 0.05, ( - f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <5%). " + assert coefficient_of_variation < 0.15, ( + f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <15%). " f"Runtimes: {runtimes_ms} ms (mean={mean_runtime / 1_000_000:.3f}ms)" ) diff --git a/tests/test_languages/test_jest_typescript_config_bug.py b/tests/test_languages/test_jest_typescript_config_bug.py index 36383edd6..8902a462e 100644 --- a/tests/test_languages/test_jest_typescript_config_bug.py +++ b/tests/test_languages/test_jest_typescript_config_bug.py @@ -91,7 +91,7 @@ try {{ capture_output=True, text=True, cwd=project_path, - timeout=5, + timeout=30, ) assert result.returncode == 0, ( @@ -148,7 +148,7 @@ try {{ capture_output=True, text=True, cwd=project_path, - timeout=5, + timeout=30, ) assert result.returncode == 0, f"JS config should load: {result.stderr}" From 8961b14d6f00c418e34e2443bb0f69d1c6088b91 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Wed, 8 Apr 2026 12:12:26 +0000 Subject: [PATCH 019/147] fix: update test assertion to match POSIX-normalized paths in Jest config Co-Authored-By: Claude Opus 4.6 --- tests/test_languages/test_javascript_test_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_languages/test_javascript_test_runner.py b/tests/test_languages/test_javascript_test_runner.py index 33898a870..6a7165946 100644 --- a/tests/test_languages/test_javascript_test_runner.py +++ b/tests/test_languages/test_javascript_test_runner.py @@ -122,7 +122,7 @@ class TestJestRootsConfiguration: runtime_configs = [f for f in get_created_config_files() if "codeflash.runtime" in f.name] assert len(runtime_configs) == 1, f"Expected 1 runtime config, got {len(runtime_configs)}" config_content = runtime_configs[0].read_text(encoding="utf-8") - assert str(external_path) in config_content, "Runtime config should contain external test directory" + assert external_path.as_posix() in config_content, "Runtime config should contain external test directory" clear_created_config_files() From 81e665dde423896b0a78970ab8e8a9f08b3f0237 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Wed, 8 Apr 2026 16:28:19 +0000 Subject: [PATCH 020/147] docs: fix Java documentation gaps across 5 pages Add Java to supported languages in how-codeflash-works, add auth and GitHub App steps to java-installation, add Java tab to codeflash-all tip, reorder trace-and-optimize Java examples, and clarify Java class method syntax in one-function. Closes CF-1090 Co-Authored-By: Claude Opus 4.6 --- .../how-codeflash-works.mdx | 12 ++-- docs/getting-started/java-installation.mdx | 72 +++++++++++++++++-- .../codeflash-all.mdx | 7 +- .../one-function.mdx | 2 + .../trace-and-optimize.mdx | 22 +++--- 5 files changed, 92 insertions(+), 23 deletions(-) diff --git a/docs/codeflash-concepts/how-codeflash-works.mdx b/docs/codeflash-concepts/how-codeflash-works.mdx index b9ab9a060..d38bdf35e 100644 --- a/docs/codeflash-concepts/how-codeflash-works.mdx +++ b/docs/codeflash-concepts/how-codeflash-works.mdx @@ -3,20 +3,20 @@ title: "How Codeflash Works" description: "Understand Codeflash's generate-and-verify approach to code optimization and correctness verification" icon: "gear" sidebarTitle: "How It Works" -keywords: ["architecture", "verification", "correctness", "testing", "optimization", "LLM", "benchmarking", "javascript", "typescript", "python"] +keywords: ["architecture", "verification", "correctness", "testing", "optimization", "LLM", "benchmarking", "javascript", "typescript", "python", "java"] --- # How Codeflash Works Codeflash follows a "generate and verify" approach to optimize code. It uses LLMs to generate optimizations, then it rigorously verifies if those optimizations are indeed faster and if they have the same behavior. The basic unit of optimization is a function—Codeflash tries to speed up the function, and tries to ensure that it still behaves the same way. This way if you merge the optimized code, it simply runs faster without breaking any functionality. -Codeflash supports **Python**, **JavaScript**, and **TypeScript** projects. +Codeflash supports **Python**, **JavaScript**, **TypeScript**, and **Java** projects. ## Analysis of your code Codeflash scans your codebase to identify all available functions. It locates existing unit tests in your projects and maps which functions they test. When optimizing a function, Codeflash runs these discovered tests to verify nothing has broken. -For Python, code analysis uses `libcst` and `jedi`. For JavaScript/TypeScript, it uses `tree-sitter` for AST parsing. +For Python, code analysis uses `libcst` and `jedi`. For JavaScript/TypeScript and Java, it uses `tree-sitter` for AST parsing. #### What kind of functions can Codeflash optimize? @@ -25,7 +25,7 @@ Codeflash supports optimizing async functions in all supported languages. #### Test Discovery -Codeflash discovers tests that directly call the target function in their test body. For Python, it finds pytest and unittest tests. For JavaScript/TypeScript, it finds Jest and Vitest test files. +Codeflash discovers tests that directly call the target function in their test body. For Python, it finds pytest and unittest tests. For JavaScript/TypeScript, it finds Jest and Vitest test files. For Java, it finds JUnit 5, JUnit 4, and TestNG test classes. To discover tests that indirectly call the function, you can use the Codeflash Tracer. The Tracer analyzes your test suite and identifies all tests that eventually call a function. @@ -54,12 +54,12 @@ We recommend manually reviewing the optimized code since there might be importan Codeflash generates two types of tests: -- **LLM Generated tests** - Codeflash uses LLMs to create several regression test cases that cover typical function usage, edge cases, and large-scale inputs to verify both correctness and performance. This works for Python, JavaScript, and TypeScript. +- **LLM Generated tests** - Codeflash uses LLMs to create several regression test cases that cover typical function usage, edge cases, and large-scale inputs to verify both correctness and performance. This works for Python, JavaScript, TypeScript, and Java. - **Concolic coverage tests** - Codeflash uses state-of-the-art concolic testing with an SMT Solver (a theorem prover) to explore execution paths and generate function arguments. This aims to maximize code coverage for the function being optimized. Currently, this feature only supports Python (pytest). ## Code Execution -Codeflash runs tests for the target function on your machine. For Python, it uses pytest or unittest. For JavaScript/TypeScript, it uses Jest or Vitest. Running on your machine ensures access to your environment and dependencies, and provides accurate performance measurements since runtime varies by system. +Codeflash runs tests for the target function on your machine. For Python, it uses pytest or unittest. For JavaScript/TypeScript, it uses Jest or Vitest. For Java, it uses Maven Surefire or Gradle's test task. Running on your machine ensures access to your environment and dependencies, and provides accurate performance measurements since runtime varies by system. #### Performance benchmarking diff --git a/docs/getting-started/java-installation.mdx b/docs/getting-started/java-installation.mdx index 48b1b7887..1b288477c 100644 --- a/docs/getting-started/java-installation.mdx +++ b/docs/getting-started/java-installation.mdx @@ -47,7 +47,38 @@ uv tool install codeflash ``` - + + +Codeflash uses cloud-hosted AI models. You need to authenticate before running any commands. + +**Option A: Browser login (recommended)** + +```bash +codeflash auth login +``` + +This opens your browser to sign in with your GitHub account. Your API key is saved automatically to your shell profile. + +If you're on a remote server without a browser, a URL will be displayed that you can open on any device. + +**Option B: API key** + +1. Visit the [Codeflash Web App](https://app.codeflash.ai/) and sign up with your GitHub account (free tier available) +2. Navigate to the [API Key](https://app.codeflash.ai/app/apikeys) page to generate your key +3. Set it as an environment variable: + +```bash +export CODEFLASH_API_KEY="your-api-key-here" +``` + +Add this to your shell profile (`~/.bashrc`, `~/.zshrc`) so it persists across sessions. + + +If you skip this step, `codeflash init` will prompt you to authenticate interactively. + + + + Navigate to your Java project root (where `pom.xml` or `build.gradle` is) and run: @@ -55,10 +86,33 @@ Navigate to your Java project root (where `pom.xml` or `build.gradle` is) and ru codeflash init ``` -This will: -- Detect your build tool (Maven/Gradle) -- Find your source and test directories -- Write Codeflash configuration to your `pom.xml` properties (Maven) or `gradle.properties` (Gradle) +The init command will: +1. **Auto-detect your project** — find your build tool, source root (e.g., `src/main/java`), test root (e.g., `src/test/java`), and test framework +2. **Confirm settings** — show the detected values and ask if you want to change anything +3. **Configure formatter** — let you set up a code formatter (e.g., Spotless, google-java-format) +4. **Install GitHub App** — offer to set up the [Codeflash GitHub App](https://github.com/apps/codeflash-ai/installations/select_target) for automatic PR creation (see next step) +5. **Install GitHub Actions** — offer to add a CI workflow for automated optimization on PRs + +Only non-default settings are written to your `pom.xml` properties (Maven) or `gradle.properties` (Gradle). For standard layouts, no config changes are needed. + + +**Can I skip init?** Yes. For standard Maven/Gradle projects, Codeflash auto-detects your project structure from `pom.xml` or `build.gradle` at runtime. If you're already authenticated and your project uses a standard layout (`src/main/java`, `src/test/java`), you can skip straight to optimizing. + +Init is recommended because it also sets up the GitHub App and Actions workflow, and lets you override paths for non-standard project layouts (e.g., multi-module projects where source is under `client/src/`). + + + + + +To have Codeflash create pull requests with optimizations automatically, install the GitHub App: + +[Install Codeflash GitHub App](https://github.com/apps/codeflash-ai/installations/select_target) + +Select the repositories you want Codeflash to optimize. This allows the codeflash-ai bot to open PRs with optimization suggestions in your repository. + + +If you prefer to try Codeflash locally first, you can skip this step and use the `--no-pr` flag to apply optimizations directly to your local files (see next step). + @@ -69,6 +123,12 @@ Optimize a specific function: codeflash --file src/main/java/com/example/Utils.java --function myMethod ``` +If you installed the GitHub App, Codeflash will create a pull request with the optimization. If you haven't installed the app yet, or prefer to review changes locally first, add `--no-pr`: + +```bash +codeflash --file src/main/java/com/example/Utils.java --function myMethod --no-pr +``` + Or optimize all functions in your project: ```bash @@ -80,7 +140,7 @@ Codeflash will: 2. Generate tests and optimization candidates using AI 3. Verify correctness by running tests (JUnit 5, JUnit 4, or TestNG) 4. Benchmark performance improvements -5. Create a pull request with the optimization (if the GitHub App is installed) +5. Create a pull request with the optimization (or apply locally with `--no-pr`) For advanced workflow tracing (profiling a running Java program), see [Trace & Optimize](/optimizing-with-codeflash/trace-and-optimize). diff --git a/docs/optimizing-with-codeflash/codeflash-all.mdx b/docs/optimizing-with-codeflash/codeflash-all.mdx index b975ca75f..aba275c38 100644 --- a/docs/optimizing-with-codeflash/codeflash-all.mdx +++ b/docs/optimizing-with-codeflash/codeflash-all.mdx @@ -3,7 +3,7 @@ title: "Optimize Your Entire Codebase" description: "Automatically optimize all codepaths in your project with Codeflash's comprehensive analysis" icon: "database" sidebarTitle: "Optimize Entire Codebase" -keywords: ["codebase optimization", "all functions", "batch optimization", "github app", "checkpoint", "recovery", "javascript", "typescript", "python"] +keywords: ["codebase optimization", "all functions", "batch optimization", "github app", "checkpoint", "recovery", "javascript", "typescript", "python", "java"] --- # Optimize your entire codebase @@ -45,6 +45,11 @@ codeflash --all path/to/dir codeflash optimize --trace-only --vitest ; codeflash --all ``` + + ```bash + codeflash optimize --timeout 60 java -cp target/classes com.example.Main ; codeflash --all + ``` + This runs your test suite, traces all the code covered by your tests, ensuring higher correctness guarantees diff --git a/docs/optimizing-with-codeflash/one-function.mdx b/docs/optimizing-with-codeflash/one-function.mdx index b2e13e3f6..601356378 100644 --- a/docs/optimizing-with-codeflash/one-function.mdx +++ b/docs/optimizing-with-codeflash/one-function.mdx @@ -93,5 +93,7 @@ codeflash --file path/to/your/file.ts --function ClassName.methodName ```bash codeflash --file src/main/java/com/example/Utils.java --function methodName ``` + +In Java, use just the method name — no `ClassName.` prefix is needed. Codeflash discovers the method by name within the specified file. diff --git a/docs/optimizing-with-codeflash/trace-and-optimize.mdx b/docs/optimizing-with-codeflash/trace-and-optimize.mdx index 4c332a929..9a3e84531 100644 --- a/docs/optimizing-with-codeflash/trace-and-optimize.mdx +++ b/docs/optimizing-with-codeflash/trace-and-optimize.mdx @@ -60,12 +60,12 @@ codeflash optimize --language javascript script.js To trace and optimize a running Java program, replace your `java` command with `codeflash optimize java`: ```bash -# JAR application -codeflash optimize java -jar target/my-app.jar --app-args - -# Class with classpath +# Class with classpath (recommended — works with any compiled project) codeflash optimize java -cp target/classes com.example.Main +# Executable JAR (requires maven-jar-plugin or equivalent with Main-Class manifest) +codeflash optimize java -jar target/my-app.jar --app-args + # Maven exec codeflash optimize mvn exec:java -Dexec.mainClass="com.example.Main" ``` @@ -73,7 +73,7 @@ codeflash optimize mvn exec:java -Dexec.mainClass="com.example.Main" For long-running programs (servers, benchmarks), use `--timeout` to limit each tracing stage: ```bash -codeflash optimize --timeout 30 java -jar target/my-app.jar +codeflash optimize --timeout 30 java -cp target/classes com.example.Main ``` @@ -228,13 +228,15 @@ The Java tracer uses a **two-stage approach**: JFR (Java Flight Recorder) for ac Replace your `java` command with `codeflash optimize java`: ```bash - # JAR application - codeflash optimize java -jar target/my-app.jar --app-args - - # Class with classpath + # Class with classpath (recommended — works with any compiled project) codeflash optimize java -cp target/classes com.example.Main + + # Executable JAR (requires maven-jar-plugin or equivalent with Main-Class manifest) + codeflash optimize java -jar target/my-app.jar --app-args ``` + The `-cp` approach works with any project after `mvn compile` or `gradle build`. The `-jar` approach requires your project to produce an executable JAR with a `Main-Class` entry in the manifest — this is not the default Maven behavior. + Codeflash will run your program twice (once for profiling, once for argument capture), generate JUnit replay tests, then optimize the most impactful functions. 2. **Long-running programs** @@ -242,7 +244,7 @@ The Java tracer uses a **two-stage approach**: JFR (Java Flight Recorder) for ac For servers, benchmarks, or programs that don't terminate on their own, use `--timeout` to limit each tracing stage: ```bash - codeflash optimize --timeout 30 java -jar target/my-benchmark.jar + codeflash optimize --timeout 30 java -cp target/classes com.example.Main ``` Each stage runs for at most 30 seconds, then the program is terminated and captured data is processed. From 4a50528c4928e666f8defc52c7d60d499fc89987 Mon Sep 17 00:00:00 2001 From: aseembits93 Date: Wed, 8 Apr 2026 12:29:49 -0700 Subject: [PATCH 021/147] feat: track subagent mode in cli-optimize-run-start PostHog event Adds `subagent: bool` property to the existing run-start event so PostHog can segment and compare agent-driven vs human CLI optimization runs. Co-Authored-By: Claude Sonnet 4.6 --- codeflash/optimization/optimizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeflash/optimization/optimizer.py b/codeflash/optimization/optimizer.py index 917a413e1..1c8cc9fc5 100644 --- a/codeflash/optimization/optimizer.py +++ b/codeflash/optimization/optimizer.py @@ -486,7 +486,7 @@ class Optimizer: def run(self) -> None: from codeflash.code_utils.checkpoint import CodeflashRunCheckpoint - ph("cli-optimize-run-start") + ph("cli-optimize-run-start", {"subagent": is_subagent_mode()}) logger.info("Running optimizer.") console.rule() if not env_utils.ensure_codeflash_api_key(): From 5f2a1c84de949bccf353d9434c24bc7cdbfe3acf Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Wed, 8 Apr 2026 20:33:52 +0000 Subject: [PATCH 022/147] feat: track subagent mode globally in all PostHog events Move subagent tracking from a single event property to the ph() function so every PostHog event is automatically tagged with subagent: true/false. Co-Authored-By: Claude Opus 4.6 --- codeflash/optimization/optimizer.py | 2 +- codeflash/telemetry/posthog_cf.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/codeflash/optimization/optimizer.py b/codeflash/optimization/optimizer.py index 1c8cc9fc5..917a413e1 100644 --- a/codeflash/optimization/optimizer.py +++ b/codeflash/optimization/optimizer.py @@ -486,7 +486,7 @@ class Optimizer: def run(self) -> None: from codeflash.code_utils.checkpoint import CodeflashRunCheckpoint - ph("cli-optimize-run-start", {"subagent": is_subagent_mode()}) + ph("cli-optimize-run-start") logger.info("Running optimizer.") console.rule() if not env_utils.ensure_codeflash_api_key(): diff --git a/codeflash/telemetry/posthog_cf.py b/codeflash/telemetry/posthog_cf.py index 1638f1ffc..3535f3b9e 100644 --- a/codeflash/telemetry/posthog_cf.py +++ b/codeflash/telemetry/posthog_cf.py @@ -7,6 +7,7 @@ from posthog import Posthog from codeflash.api.cfapi import get_user_id from codeflash.cli_cmds.console import logger +from codeflash.lsp.helpers import is_subagent_mode from codeflash.version import __version__ _posthog = None @@ -36,7 +37,7 @@ def ph(event: str, properties: dict[str, Any] | None = None) -> None: return properties = properties or {} - properties.update({"cli_version": __version__}) + properties.update({"cli_version": __version__, "subagent": is_subagent_mode()}) user_id = get_user_id() From d344324325e2d18a87756fcedb31775575b00d95 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 02:06:28 -0500 Subject: [PATCH 023/147] ci: replace wildcard path triggers with targeted filters on E2E tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All 12 E2E workflows used `paths: ['**']` which triggered on every file change — docs, configs, experiments, etc. This caused ~140-200 min of compute per push event (18+ parallel workflows). Now E2E tests only trigger when relevant source code changes: - Python E2E: codeflash/**, tests/**, pyproject.toml, uv.lock, workflow files - JS E2E: same + packages/** - Java E2E: already had proper path filters (no change needed) Estimated savings: ~$150-200/mo in CI compute. --- .github/workflows/e2e-async.yaml | 6 +++++- .github/workflows/e2e-bubblesort-benchmark.yaml | 6 +++++- .github/workflows/e2e-bubblesort-pytest-nogit.yaml | 6 +++++- .github/workflows/e2e-bubblesort-unittest.yaml | 6 +++++- .github/workflows/e2e-coverage-optimization.yaml | 6 +++++- .github/workflows/e2e-futurehouse-structure.yaml | 6 +++++- .github/workflows/e2e-init-optimization.yaml | 6 +++++- .github/workflows/e2e-js-cjs-function.yaml | 7 ++++++- .github/workflows/e2e-js-esm-async.yaml | 7 ++++++- .github/workflows/e2e-js-ts-class.yaml | 7 ++++++- .github/workflows/e2e-topological-sort.yaml | 6 +++++- .github/workflows/e2e-tracer-replay.yaml | 6 +++++- 12 files changed, 63 insertions(+), 12 deletions(-) diff --git a/.github/workflows/e2e-async.yaml b/.github/workflows/e2e-async.yaml index 9eb408298..1acefa63f 100644 --- a/.github/workflows/e2e-async.yaml +++ b/.github/workflows/e2e-async.yaml @@ -3,7 +3,11 @@ name: E2E - Async on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-bubblesort-benchmark.yaml b/.github/workflows/e2e-bubblesort-benchmark.yaml index 2a9f413c0..b3d9dc140 100644 --- a/.github/workflows/e2e-bubblesort-benchmark.yaml +++ b/.github/workflows/e2e-bubblesort-benchmark.yaml @@ -3,7 +3,11 @@ name: E2E - Bubble Sort Benchmark on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-bubblesort-pytest-nogit.yaml b/.github/workflows/e2e-bubblesort-pytest-nogit.yaml index ac63b7cec..9fe357108 100644 --- a/.github/workflows/e2e-bubblesort-pytest-nogit.yaml +++ b/.github/workflows/e2e-bubblesort-pytest-nogit.yaml @@ -3,7 +3,11 @@ name: E2E - Bubble Sort Pytest (No Git) on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-bubblesort-unittest.yaml b/.github/workflows/e2e-bubblesort-unittest.yaml index af0634ba3..654873b53 100644 --- a/.github/workflows/e2e-bubblesort-unittest.yaml +++ b/.github/workflows/e2e-bubblesort-unittest.yaml @@ -3,7 +3,11 @@ name: E2E - Bubble Sort Unittest on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-coverage-optimization.yaml b/.github/workflows/e2e-coverage-optimization.yaml index cd5a16e6a..c5d72c083 100644 --- a/.github/workflows/e2e-coverage-optimization.yaml +++ b/.github/workflows/e2e-coverage-optimization.yaml @@ -3,7 +3,11 @@ name: Coverage E2E on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-futurehouse-structure.yaml b/.github/workflows/e2e-futurehouse-structure.yaml index 72631dc9a..e6a68d17a 100644 --- a/.github/workflows/e2e-futurehouse-structure.yaml +++ b/.github/workflows/e2e-futurehouse-structure.yaml @@ -3,7 +3,11 @@ name: E2E - Futurehouse Structure on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-init-optimization.yaml b/.github/workflows/e2e-init-optimization.yaml index 5bb6d2c02..d33107af3 100644 --- a/.github/workflows/e2e-init-optimization.yaml +++ b/.github/workflows/e2e-init-optimization.yaml @@ -3,7 +3,11 @@ name: E2E - Init Optimization on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: concurrency: diff --git a/.github/workflows/e2e-js-cjs-function.yaml b/.github/workflows/e2e-js-cjs-function.yaml index 9191d18f2..e97e263d3 100644 --- a/.github/workflows/e2e-js-cjs-function.yaml +++ b/.github/workflows/e2e-js-cjs-function.yaml @@ -3,7 +3,12 @@ name: E2E - JS CommonJS Function on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'packages/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-js-esm-async.yaml b/.github/workflows/e2e-js-esm-async.yaml index e1fdbb1f7..44e94d670 100644 --- a/.github/workflows/e2e-js-esm-async.yaml +++ b/.github/workflows/e2e-js-esm-async.yaml @@ -3,7 +3,12 @@ name: E2E - JS ESM Async on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'packages/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-js-ts-class.yaml b/.github/workflows/e2e-js-ts-class.yaml index 4287468ac..04618e823 100644 --- a/.github/workflows/e2e-js-ts-class.yaml +++ b/.github/workflows/e2e-js-ts-class.yaml @@ -3,7 +3,12 @@ name: E2E - JS TypeScript Class on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'packages/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-topological-sort.yaml b/.github/workflows/e2e-topological-sort.yaml index dc40df845..200b33d5b 100644 --- a/.github/workflows/e2e-topological-sort.yaml +++ b/.github/workflows/e2e-topological-sort.yaml @@ -3,7 +3,11 @@ name: E2E - Topological Sort (Worktree) on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: diff --git a/.github/workflows/e2e-tracer-replay.yaml b/.github/workflows/e2e-tracer-replay.yaml index dd64af9b2..3e157676b 100644 --- a/.github/workflows/e2e-tracer-replay.yaml +++ b/.github/workflows/e2e-tracer-replay.yaml @@ -3,7 +3,11 @@ name: E2E - Tracer Replay on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/e2e-*.yaml' workflow_dispatch: concurrency: From 3dc21bdec3e7252e3c516ffe9fe99da701ee8e9b Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 02:12:14 -0500 Subject: [PATCH 024/147] ci: pin claude-code-action to v1.0.89 to fix Bedrock auth MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v1.0.90 broke Bedrock OIDC auth — all Claude Code runs have been failing with 403 since Apr 8. Root cause: anthropics/claude-code-action#1196 Pinning to v1.0.89 (last working version) until upstream fix lands. --- .github/workflows/claude.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index f2c623d17..cfed60d21 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -68,7 +68,7 @@ jobs: - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@v1 + uses: anthropics/claude-code-action@v1.0.89 with: use_bedrock: "true" use_sticky_comment: true @@ -328,7 +328,7 @@ jobs: - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@v1 + uses: anthropics/claude-code-action@v1.0.89 with: use_bedrock: "true" claude_args: '--model us.anthropic.claude-sonnet-4-6 --allowedTools "Read,Edit,Write,Glob,Grep,Bash(git status*),Bash(git diff*),Bash(git add *),Bash(git commit *),Bash(git push*),Bash(git log*),Bash(git merge*),Bash(git fetch*),Bash(git checkout*),Bash(git branch*),Bash(uv run prek *),Bash(prek *),Bash(uv run ruff *),Bash(uv run pytest *),Bash(uv run mypy *),Bash(uv run coverage *),Bash(gh pr comment*),Bash(gh pr view*),Bash(gh pr diff*),Bash(gh pr merge*),Bash(gh pr close*)"' From 50224baee9be853c8b4352554d513ff11b7d38ea Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 02:50:03 -0500 Subject: [PATCH 025/147] ci: add dependabot.yml to exclude test fixture directories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dependabot was auto-discovering all package.json and pyproject.toml files including 12 in code_to_optimize/ (test fixtures). These PRs always fail because E2E tests need secrets unavailable on Dependabot PRs — 70% of Dependabot runs were failing on vite updates to fixtures. Explicit config monitors only the real dependency files: - / (root pyproject.toml) - /packages/codeflash (npm package) - GitHub Actions versions --- .github/dependabot.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..a8249b879 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: + # Python (root pyproject.toml) + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + + # JavaScript (codeflash npm package) + - package-ecosystem: "npm" + directory: "/packages/codeflash" + schedule: + interval: "weekly" + + # GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + + # code_to_optimize/ directories are test fixtures — do NOT update them. + # Dependabot PRs for these always fail (missing secrets) and waste CI. From 2cd23f91917a0fe60da185e73392544b120c2fd1 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 09:16:37 +0000 Subject: [PATCH 026/147] perf: defer posthog, sentry_sdk, and requests imports in telemetry Move heavy third-party imports (posthog, sentry_sdk, and their integrations) from module level into the functions that use them. These imports cost ~350ms combined but are only needed when telemetry is actually initialized, not on every CLI invocation. - posthog_cf.py: defer `from posthog import Posthog` into initialize_posthog(), defer cfapi/console/lsp imports into ph() - sentry.py: defer `import sentry_sdk` and integrations into init_sentry() --- codeflash/telemetry/posthog_cf.py | 23 +++++++++------- codeflash/telemetry/sentry.py | 45 ++++++++++++++++--------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/codeflash/telemetry/posthog_cf.py b/codeflash/telemetry/posthog_cf.py index 3535f3b9e..2d336e3c2 100644 --- a/codeflash/telemetry/posthog_cf.py +++ b/codeflash/telemetry/posthog_cf.py @@ -1,16 +1,11 @@ from __future__ import annotations -import logging -from typing import Any +from typing import TYPE_CHECKING, Any -from posthog import Posthog +if TYPE_CHECKING: + from posthog import Posthog -from codeflash.api.cfapi import get_user_id -from codeflash.cli_cmds.console import logger -from codeflash.lsp.helpers import is_subagent_mode -from codeflash.version import __version__ - -_posthog = None +_posthog: Posthog | None = None def initialize_posthog(*, enabled: bool = True) -> None: @@ -21,6 +16,10 @@ def initialize_posthog(*, enabled: bool = True) -> None: if not enabled: return + import logging + + from posthog import Posthog + global _posthog _posthog = Posthog(project_api_key="phc_aUO790jHd7z1SXwsYCz8dRApxueplZlZWeDSpKc5hol", host="https://us.posthog.com") _posthog.log.setLevel(logging.CRITICAL) # Suppress PostHog logging @@ -36,6 +35,10 @@ def ph(event: str, properties: dict[str, Any] | None = None) -> None: if _posthog is None: return + from codeflash.api.cfapi import get_user_id + from codeflash.lsp.helpers import is_subagent_mode + from codeflash.version import __version__ + properties = properties or {} properties.update({"cli_version": __version__, "subagent": is_subagent_mode()}) @@ -44,4 +47,6 @@ def ph(event: str, properties: dict[str, Any] | None = None) -> None: if user_id: _posthog.capture(distinct_id=user_id, event=event, properties=properties) else: + from codeflash.cli_cmds.console import logger + logger.debug("Failed to log event to PostHog: User ID could not be retrieved.") diff --git a/codeflash/telemetry/sentry.py b/codeflash/telemetry/sentry.py index 3ee266326..236b27fca 100644 --- a/codeflash/telemetry/sentry.py +++ b/codeflash/telemetry/sentry.py @@ -1,24 +1,25 @@ -import logging - -import sentry_sdk -from sentry_sdk.integrations.logging import LoggingIntegration -from sentry_sdk.integrations.stdlib import StdlibIntegration - - def init_sentry(*, enabled: bool = False, exclude_errors: bool = False) -> None: - if enabled: - sentry_logging = LoggingIntegration( - level=logging.INFO, # Capture info and above as breadcrumbs - event_level=logging.CRITICAL # Send only fatal errors as events if exclude_errors is True - if exclude_errors - else logging.ERROR, # Otherwise, error logs will create sentry events - ) + if not enabled: + return - sentry_sdk.init( - dsn="https://4b9a1902f9361b48c04376df6483bc96@o4506833230561280.ingest.sentry.io/4506833262477312", - integrations=[sentry_logging], - disabled_integrations=[StdlibIntegration], - traces_sample_rate=0, - profiles_sample_rate=0, - ignore_errors=[KeyboardInterrupt], - ) + import logging + + import sentry_sdk + from sentry_sdk.integrations.logging import LoggingIntegration + from sentry_sdk.integrations.stdlib import StdlibIntegration + + sentry_logging = LoggingIntegration( + level=logging.INFO, # Capture info and above as breadcrumbs + event_level=logging.CRITICAL # Send only fatal errors as events if exclude_errors is True + if exclude_errors + else logging.ERROR, # Otherwise, error logs will create sentry events + ) + + sentry_sdk.init( + dsn="https://4b9a1902f9361b48c04376df6483bc96@o4506833230561280.ingest.sentry.io/4506833262477312", + integrations=[sentry_logging], + disabled_integrations=[StdlibIntegration], + traces_sample_rate=0, + profiles_sample_rate=0, + ignore_errors=[KeyboardInterrupt], + ) From 507319066a74f67b7fdf2a38d1f59532d0a65d6b Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 04:33:11 -0500 Subject: [PATCH 027/147] ci: temporarily disable automatic PR review job Adds `false &&` guard to the pr-review job condition. The job will be skipped on all triggers until this is reverted. The @claude mention job is unaffected. --- .github/workflows/claude.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index cfed60d21..df85db340 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -27,17 +27,21 @@ on: jobs: # Automatic PR review (can fix linting issues and push) # Blocked for fork PRs to prevent malicious code execution + # TEMPORARILY DISABLED — re-enable by removing `false &&` below pr-review: concurrency: group: pr-review-${{ github.head_ref || github.run_id }} cancel-in-progress: true if: | + false && ( - github.event_name == 'pull_request' && - github.event.sender.login != 'claude[bot]' && - github.event.pull_request.head.repo.full_name == github.repository - ) || - github.event_name == 'workflow_dispatch' + ( + github.event_name == 'pull_request' && + github.event.sender.login != 'claude[bot]' && + github.event.pull_request.head.repo.full_name == github.repository + ) || + github.event_name == 'workflow_dispatch' + ) runs-on: ubuntu-latest permissions: contents: write From 9af6ce8064fde33b3a4acdd8c779dbe30fcb3066 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 04:38:12 -0500 Subject: [PATCH 028/147] ci: temporarily disable Dependabot PRs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sets open-pull-requests-limit: 0 on all ecosystems. Existing open Dependabot PRs are unaffected — this only prevents new ones. Re-enable by removing the open-pull-requests-limit lines. --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a8249b879..cf9d36fc5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,3 +1,4 @@ +# TEMPORARILY DISABLED — re-enable by removing open-pull-requests-limit: 0 version: 2 updates: # Python (root pyproject.toml) @@ -5,18 +6,21 @@ updates: directory: "/" schedule: interval: "weekly" + open-pull-requests-limit: 0 # JavaScript (codeflash npm package) - package-ecosystem: "npm" directory: "/packages/codeflash" schedule: interval: "weekly" + open-pull-requests-limit: 0 # GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" + open-pull-requests-limit: 0 # code_to_optimize/ directories are test fixtures — do NOT update them. # Dependabot PRs for these always fail (missing secrets) and waste CI. From fd7e2c01a2bf732e33bc345688ac1e2ce8799130 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 09:17:59 +0000 Subject: [PATCH 029/147] perf: add --version fast-path to skip full import chain When the user runs `codeflash --version`, read the version string and exit immediately without importing cli, telemetry, models, or any other heavy modules. This mirrors the pattern used in pip where `pip --version` was optimized from 138ms to 20ms (7x). Before: 524ms (imports cli.py -> cfapi -> models -> libcst -> ...) After: ~16ms (imports only codeflash.version) --- codeflash/main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/codeflash/main.py b/codeflash/main.py index a5743f6db..0d4ba1ca5 100644 --- a/codeflash/main.py +++ b/codeflash/main.py @@ -22,6 +22,13 @@ if TYPE_CHECKING: def main() -> None: """Entry point for the codeflash command-line interface.""" + # Fast path: --version exits before importing the full stack + if len(sys.argv) == 2 and sys.argv[1] == "--version": + from codeflash.version import __version__ + + print(f"Codeflash version {__version__}") + return + from pathlib import Path from codeflash.cli_cmds.cli import parse_args, process_pyproject_config From 6f3f88498a5dddb665cd7692a9d9b6cfa982763f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 09:17:29 +0000 Subject: [PATCH 030/147] perf: defer module-level imports in main.py into main() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move cli, console, env_utils, checkpoint, config_parser, and version_check imports from module level into main(). These imports trigger the full dependency chain (cfapi, models, PrComment, libcst, requests, Rich) costing ~500ms on every CLI invocation — even for simple commands that dont need most of these modules. Also moves paneled_text import into print_codeflash_banner() and passes process_pyproject_config as parameter to _handle_config_loading to avoid a module-level reference. --- codeflash/main.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/codeflash/main.py b/codeflash/main.py index da0d83db6..a5743f6db 100644 --- a/codeflash/main.py +++ b/codeflash/main.py @@ -8,8 +8,7 @@ from __future__ import annotations import os import sys -from pathlib import Path -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Callable if "--subagent" in sys.argv: os.environ["CODEFLASH_SUBAGENT_MODE"] = "true" @@ -17,19 +16,19 @@ if "--subagent" in sys.argv: warnings.filterwarnings("ignore") -from codeflash.cli_cmds.cli import parse_args, process_pyproject_config -from codeflash.cli_cmds.console import paneled_text -from codeflash.code_utils import env_utils -from codeflash.code_utils.checkpoint import ask_should_use_checkpoint_get_functions -from codeflash.code_utils.config_parser import parse_config_file -from codeflash.code_utils.version_check import check_for_newer_minor_version - if TYPE_CHECKING: from argparse import Namespace def main() -> None: """Entry point for the codeflash command-line interface.""" + from pathlib import Path + + from codeflash.cli_cmds.cli import parse_args, process_pyproject_config + from codeflash.code_utils import env_utils + from codeflash.code_utils.checkpoint import ask_should_use_checkpoint_get_functions + from codeflash.code_utils.config_parser import parse_config_file + from codeflash.code_utils.version_check import check_for_newer_minor_version from codeflash.telemetry import posthog_cf from codeflash.telemetry.sentry import init_sentry @@ -89,7 +88,7 @@ def main() -> None: ask_run_end_to_end_test(args) else: # Check for first-run experience (no config exists) - loaded_args = _handle_config_loading(args) + loaded_args = _handle_config_loading(args, process_pyproject_config) if loaded_args is None: sys.exit(0) args = loaded_args @@ -105,7 +104,9 @@ def main() -> None: optimizer.run_with_args(args) -def _handle_config_loading(args: Namespace) -> Namespace | None: +def _handle_config_loading( + args: Namespace, process_pyproject_config: Callable[[Namespace], Namespace] +) -> Namespace | None: """Handle config loading with first-run experience support. If no config exists and not in CI, triggers the first-run experience. @@ -113,6 +114,7 @@ def _handle_config_loading(args: Namespace) -> Namespace | None: Args: args: CLI args namespace. + process_pyproject_config: Config processing function. Returns: Updated args with config loaded, or None if user cancelled first-run. @@ -157,6 +159,7 @@ def print_codeflash_banner() -> None: Renders the Codeflash ASCII logo inside a non-expanding panel titled with https://codeflash.ai, using bold gold text for visual emphasis. """ + from codeflash.cli_cmds.console import paneled_text from codeflash.cli_cmds.console_constants import CODEFLASH_LOGO paneled_text( From b38cfd21861b5552c2831dca5582a454f4fca59a Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 04:59:24 -0500 Subject: [PATCH 031/147] ci: scope workflow triggers to relevant paths - codeflash-optimize.yaml: replace paths: ['**'] wildcard with targeted filters - mypy.yml: add path filters (was firing on every PR/push including docs) - prek.yaml: add path filters (was firing on every PR) - unit-tests.yaml: add path filters (was firing on every PR/push) Docs-only, README, experiment, and LICENSE changes no longer trigger these workflows. Saves ~20 workflow runs per docs-only PR. --- .github/workflows/codeflash-optimize.yaml | 6 +++++- .github/workflows/mypy.yml | 12 ++++++++++++ .github/workflows/prek.yaml | 10 +++++++++- .github/workflows/unit-tests.yaml | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeflash-optimize.yaml b/.github/workflows/codeflash-optimize.yaml index ee8362df4..fd0603adb 100644 --- a/.github/workflows/codeflash-optimize.yaml +++ b/.github/workflows/codeflash-optimize.yaml @@ -3,7 +3,11 @@ name: CodeFlash on: pull_request: paths: - - '**' # Trigger for all paths + - 'codeflash/**' + - 'tests/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/codeflash-optimize.yaml' workflow_dispatch: diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 34fc2fe9e..ded12eaee 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -4,7 +4,19 @@ on: push: branches: - main + paths: + - 'codeflash/**' + - 'pyproject.toml' + - 'uv.lock' + - 'mypy_allowlist.txt' + - '.github/workflows/mypy.yml' pull_request: + paths: + - 'codeflash/**' + - 'pyproject.toml' + - 'uv.lock' + - 'mypy_allowlist.txt' + - '.github/workflows/mypy.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref_name }} diff --git a/.github/workflows/prek.yaml b/.github/workflows/prek.yaml index af48e9330..757c1323c 100644 --- a/.github/workflows/prek.yaml +++ b/.github/workflows/prek.yaml @@ -1,5 +1,13 @@ name: Lint -on: [pull_request] +on: + pull_request: + paths: + - 'codeflash/**' + - 'tests/**' + - 'packages/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/prek.yaml' concurrency: group: ${{ github.workflow }}-${{ github.ref_name }} diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index dd050623e..22bce4b33 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -3,7 +3,25 @@ name: unit-tests on: push: branches: [main] + paths: + - 'codeflash/**' + - 'codeflash-benchmark/**' + - 'codeflash-java-runtime/**' + - 'tests/**' + - 'packages/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/unit-tests.yaml' pull_request: + paths: + - 'codeflash/**' + - 'codeflash-benchmark/**' + - 'codeflash-java-runtime/**' + - 'tests/**' + - 'packages/**' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/unit-tests.yaml' workflow_dispatch: concurrency: From e2e85579587e7b990caf4bfd276546d9bf279a7f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 05:04:32 -0500 Subject: [PATCH 032/147] ci: remove self-reference from codeflash-optimize paths Editing the workflow config shouldn't trigger a full optimization run. --- .github/workflows/codeflash-optimize.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/codeflash-optimize.yaml b/.github/workflows/codeflash-optimize.yaml index fd0603adb..a27cc1ce9 100644 --- a/.github/workflows/codeflash-optimize.yaml +++ b/.github/workflows/codeflash-optimize.yaml @@ -7,7 +7,6 @@ on: - 'tests/**' - 'pyproject.toml' - 'uv.lock' - - '.github/workflows/codeflash-optimize.yaml' workflow_dispatch: From 07e456627179f56f8aa7e93d12956327d901d517 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 05:08:19 -0500 Subject: [PATCH 033/147] ci: remove self-references from workflow path filters Editing a workflow YAML file should not trigger that same workflow to run. Removes .github/workflows/ from its own paths filter in mypy.yml, prek.yaml, and unit-tests.yaml. --- .github/workflows/mypy.yml | 2 -- .github/workflows/prek.yaml | 1 - .github/workflows/unit-tests.yaml | 2 -- 3 files changed, 5 deletions(-) diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index ded12eaee..f19d6c3dc 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -9,14 +9,12 @@ on: - 'pyproject.toml' - 'uv.lock' - 'mypy_allowlist.txt' - - '.github/workflows/mypy.yml' pull_request: paths: - 'codeflash/**' - 'pyproject.toml' - 'uv.lock' - 'mypy_allowlist.txt' - - '.github/workflows/mypy.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref_name }} diff --git a/.github/workflows/prek.yaml b/.github/workflows/prek.yaml index 757c1323c..88bda6436 100644 --- a/.github/workflows/prek.yaml +++ b/.github/workflows/prek.yaml @@ -7,7 +7,6 @@ on: - 'packages/**' - 'pyproject.toml' - 'uv.lock' - - '.github/workflows/prek.yaml' concurrency: group: ${{ github.workflow }}-${{ github.ref_name }} diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index 22bce4b33..4591922e3 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -11,7 +11,6 @@ on: - 'packages/**' - 'pyproject.toml' - 'uv.lock' - - '.github/workflows/unit-tests.yaml' pull_request: paths: - 'codeflash/**' @@ -21,7 +20,6 @@ on: - 'packages/**' - 'pyproject.toml' - 'uv.lock' - - '.github/workflows/unit-tests.yaml' workflow_dispatch: concurrency: From 46e4035b0575121eea072766a0bd224aae4f6f9f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 05:16:10 -0500 Subject: [PATCH 034/147] ci: bump astral-sh/setup-uv from v6 to v8.0.0 v8 uses immutable releases (no major/minor tags) for supply chain security. Pinning to exact version tag per upstream recommendation. --- .github/workflows/claude.yml | 4 ++-- .github/workflows/codeflash-optimize.yaml | 2 +- .github/workflows/e2e-async.yaml | 2 +- .github/workflows/e2e-bubblesort-benchmark.yaml | 2 +- .github/workflows/e2e-bubblesort-pytest-nogit.yaml | 2 +- .github/workflows/e2e-bubblesort-unittest.yaml | 2 +- .github/workflows/e2e-coverage-optimization.yaml | 2 +- .github/workflows/e2e-futurehouse-structure.yaml | 2 +- .github/workflows/e2e-init-optimization.yaml | 2 +- .github/workflows/e2e-java-fibonacci-nogit.yaml | 2 +- .github/workflows/e2e-java-tracer.yaml | 2 +- .github/workflows/e2e-js-cjs-function.yaml | 2 +- .github/workflows/e2e-js-esm-async.yaml | 2 +- .github/workflows/e2e-js-ts-class.yaml | 2 +- .github/workflows/e2e-topological-sort.yaml | 2 +- .github/workflows/e2e-tracer-replay.yaml | 2 +- .github/workflows/java-e2e-tests.yml | 2 +- .github/workflows/mypy.yml | 2 +- .github/workflows/prek.yaml | 2 +- .github/workflows/publish.yml | 4 ++-- .github/workflows/unit-tests.yaml | 2 +- 21 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index df85db340..d7959b4cf 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -57,7 +57,7 @@ jobs: ref: ${{ github.event.pull_request.head.ref || github.ref }} - name: Install uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 - name: Install dependencies run: | @@ -317,7 +317,7 @@ jobs: ref: ${{ steps.pr-ref.outputs.ref }} - name: Install uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 - name: Install dependencies run: | diff --git a/.github/workflows/codeflash-optimize.yaml b/.github/workflows/codeflash-optimize.yaml index a27cc1ce9..c3f16d668 100644 --- a/.github/workflows/codeflash-optimize.yaml +++ b/.github/workflows/codeflash-optimize.yaml @@ -31,7 +31,7 @@ jobs: fetch-depth: 0 - name: 🐍 Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-async.yaml b/.github/workflows/e2e-async.yaml index 1acefa63f..f091ffdaf 100644 --- a/.github/workflows/e2e-async.yaml +++ b/.github/workflows/e2e-async.yaml @@ -63,7 +63,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-bubblesort-benchmark.yaml b/.github/workflows/e2e-bubblesort-benchmark.yaml index b3d9dc140..406a67bd0 100644 --- a/.github/workflows/e2e-bubblesort-benchmark.yaml +++ b/.github/workflows/e2e-bubblesort-benchmark.yaml @@ -63,7 +63,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-bubblesort-pytest-nogit.yaml b/.github/workflows/e2e-bubblesort-pytest-nogit.yaml index 9fe357108..10bf43dac 100644 --- a/.github/workflows/e2e-bubblesort-pytest-nogit.yaml +++ b/.github/workflows/e2e-bubblesort-pytest-nogit.yaml @@ -62,7 +62,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-bubblesort-unittest.yaml b/.github/workflows/e2e-bubblesort-unittest.yaml index 654873b53..7fa012b44 100644 --- a/.github/workflows/e2e-bubblesort-unittest.yaml +++ b/.github/workflows/e2e-bubblesort-unittest.yaml @@ -62,7 +62,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-coverage-optimization.yaml b/.github/workflows/e2e-coverage-optimization.yaml index c5d72c083..e4df7d0b2 100644 --- a/.github/workflows/e2e-coverage-optimization.yaml +++ b/.github/workflows/e2e-coverage-optimization.yaml @@ -60,7 +60,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-futurehouse-structure.yaml b/.github/workflows/e2e-futurehouse-structure.yaml index e6a68d17a..dc67cd07c 100644 --- a/.github/workflows/e2e-futurehouse-structure.yaml +++ b/.github/workflows/e2e-futurehouse-structure.yaml @@ -62,7 +62,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-init-optimization.yaml b/.github/workflows/e2e-init-optimization.yaml index d33107af3..2e76c64bc 100644 --- a/.github/workflows/e2e-init-optimization.yaml +++ b/.github/workflows/e2e-init-optimization.yaml @@ -61,7 +61,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-java-fibonacci-nogit.yaml b/.github/workflows/e2e-java-fibonacci-nogit.yaml index 132b10d89..bab4f9a34 100644 --- a/.github/workflows/e2e-java-fibonacci-nogit.yaml +++ b/.github/workflows/e2e-java-fibonacci-nogit.yaml @@ -72,7 +72,7 @@ jobs: cache: maven - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-java-tracer.yaml b/.github/workflows/e2e-java-tracer.yaml index 6ed17ce90..cfefaa8fa 100644 --- a/.github/workflows/e2e-java-tracer.yaml +++ b/.github/workflows/e2e-java-tracer.yaml @@ -67,7 +67,7 @@ jobs: cache: maven - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-js-cjs-function.yaml b/.github/workflows/e2e-js-cjs-function.yaml index e97e263d3..e25e1c89b 100644 --- a/.github/workflows/e2e-js-cjs-function.yaml +++ b/.github/workflows/e2e-js-cjs-function.yaml @@ -79,7 +79,7 @@ jobs: npm install - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-js-esm-async.yaml b/.github/workflows/e2e-js-esm-async.yaml index 44e94d670..8590108ea 100644 --- a/.github/workflows/e2e-js-esm-async.yaml +++ b/.github/workflows/e2e-js-esm-async.yaml @@ -79,7 +79,7 @@ jobs: npm install - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-js-ts-class.yaml b/.github/workflows/e2e-js-ts-class.yaml index 04618e823..a34d8d0c0 100644 --- a/.github/workflows/e2e-js-ts-class.yaml +++ b/.github/workflows/e2e-js-ts-class.yaml @@ -79,7 +79,7 @@ jobs: npm install - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-topological-sort.yaml b/.github/workflows/e2e-topological-sort.yaml index 200b33d5b..945e338f7 100644 --- a/.github/workflows/e2e-topological-sort.yaml +++ b/.github/workflows/e2e-topological-sort.yaml @@ -87,7 +87,7 @@ jobs: fi - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/e2e-tracer-replay.yaml b/.github/workflows/e2e-tracer-replay.yaml index 3e157676b..56a038ddb 100644 --- a/.github/workflows/e2e-tracer-replay.yaml +++ b/.github/workflows/e2e-tracer-replay.yaml @@ -62,7 +62,7 @@ jobs: - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 diff --git a/.github/workflows/java-e2e-tests.yml b/.github/workflows/java-e2e-tests.yml index b8eb9c76f..0e84aada5 100644 --- a/.github/workflows/java-e2e-tests.yml +++ b/.github/workflows/java-e2e-tests.yml @@ -39,7 +39,7 @@ jobs: cache: maven - name: Install uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 - name: Set up Python environment run: | diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index f19d6c3dc..a3f950105 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -31,7 +31,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 - name: sync uv run: | diff --git a/.github/workflows/prek.yaml b/.github/workflows/prek.yaml index 88bda6436..abaad1457 100644 --- a/.github/workflows/prek.yaml +++ b/.github/workflows/prek.yaml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: astral-sh/setup-uv@v6 + - uses: astral-sh/setup-uv@v8.0.0 - uses: j178/prek-action@v1 with: extra-args: '--from-ref origin/${{ github.base_ref }} --to-ref ${{ github.sha }}' diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 541fdbe41..224d5de3a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -78,7 +78,7 @@ jobs: - name: Install uv if: steps.check_tag.outputs.exists == 'false' - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 - name: Build if: steps.check_tag.outputs.exists == 'false' @@ -150,7 +150,7 @@ jobs: - name: Install uv if: steps.check_tag.outputs.exists == 'false' - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 - name: Build if: steps.check_tag.outputs.exists == 'false' diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index 4591922e3..1ff8553c1 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -70,7 +70,7 @@ jobs: mvn install -q -DskipTests - name: Install uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v8.0.0 with: python-version: ${{ matrix.python-version }} From 5877864fc873f91928360d2d99e1233fd40de14d Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 05:43:16 -0500 Subject: [PATCH 035/147] ci: consolidate required checks into single ci.yaml with gate job Replace 7 individual required-check workflows (unit-tests, mypy, 5 E2E tests) with a single ci.yaml following the astral-sh/ruff gate pattern: - determine-changes job uses native git diff (no third-party deps) - Each test job skipped at job level when paths don't match - Single required-checks-passed gate job accepts success + skipped - E2E security preserved: environment gating, author allowlists This fixes the long-standing issue where workflow-level path filters leave required checks "Pending" on PRs that don't touch code paths, blocking merge without admin override. Estimated savings: ~$1.05/skipped PR ($0.64 unit-tests + $0.01 type-check + $0.40 E2E), ~$50-100/yr in compute, plus eliminating all admin-merge workarounds. --- .github/workflows/ci.yaml | 477 ++++++++++++++++++ .../e2e-bubblesort-pytest-nogit.yaml | 92 ---- .../workflows/e2e-bubblesort-unittest.yaml | 76 --- .../workflows/e2e-futurehouse-structure.yaml | 76 --- .github/workflows/e2e-topological-sort.yaml | 101 ---- .github/workflows/e2e-tracer-replay.yaml | 76 --- .github/workflows/mypy.yml | 43 -- .github/workflows/unit-tests.yaml | 85 ---- 8 files changed, 477 insertions(+), 549 deletions(-) create mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/e2e-bubblesort-pytest-nogit.yaml delete mode 100644 .github/workflows/e2e-bubblesort-unittest.yaml delete mode 100644 .github/workflows/e2e-futurehouse-structure.yaml delete mode 100644 .github/workflows/e2e-topological-sort.yaml delete mode 100644 .github/workflows/e2e-tracer-replay.yaml delete mode 100644 .github/workflows/mypy.yml delete mode 100644 .github/workflows/unit-tests.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 000000000..144477bd4 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,477 @@ +name: CI + +on: + push: + branches: [main] + paths: + - 'codeflash/**' + - 'codeflash-benchmark/**' + - 'codeflash-java-runtime/**' + - 'tests/**' + - 'packages/**' + - 'pyproject.toml' + - 'uv.lock' + - 'mypy_allowlist.txt' + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref_name }} + cancel-in-progress: true + +jobs: + # --------------------------------------------------------------------------- + # Change detection — decides which downstream jobs actually run. + # On push/workflow_dispatch every flag is true so all jobs execute. + # On pull_request we diff against the merge base (same approach as astral-sh/ruff). + # --------------------------------------------------------------------------- + determine-changes: + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + unit_tests: ${{ github.event_name != 'pull_request' || steps.check.outputs.unit_tests == 'true' }} + type_check: ${{ github.event_name != 'pull_request' || steps.check.outputs.type_check == 'true' }} + e2e: ${{ github.event_name != 'pull_request' || steps.check.outputs.e2e == 'true' }} + steps: + - uses: actions/checkout@v4 + if: github.event_name == 'pull_request' + with: + fetch-depth: 0 + + - name: Determine merge base + if: github.event_name == 'pull_request' + id: merge_base + run: | + sha=$(git merge-base HEAD "origin/${{ github.event.pull_request.base.ref }}") + echo "sha=${sha}" >> "$GITHUB_OUTPUT" + + - name: Check changed paths + if: github.event_name == 'pull_request' + id: check + run: | + check_paths() { + local name="$1"; shift + if ! git diff --quiet "$MERGE_BASE...HEAD" -- "$@" 2>/dev/null; then + echo "${name}=true" >> "$GITHUB_OUTPUT" + else + echo "${name}=false" >> "$GITHUB_OUTPUT" + fi + } + + # Unit tests: code + test infra + java + packages + build config + check_paths unit_tests \ + 'codeflash/' 'codeflash-benchmark/' 'codeflash-java-runtime/' \ + 'tests/' 'packages/' 'pyproject.toml' 'uv.lock' \ + '.github/workflows/ci.yaml' + + # Type checking: code + build config + mypy config + check_paths type_check \ + 'codeflash/' 'pyproject.toml' 'uv.lock' 'mypy_allowlist.txt' \ + '.github/workflows/ci.yaml' + + # E2E tests: code + tests + build config + this workflow + check_paths e2e \ + 'codeflash/' 'tests/' 'pyproject.toml' 'uv.lock' \ + '.github/workflows/ci.yaml' + env: + MERGE_BASE: ${{ steps.merge_base.outputs.sha }} + + # --------------------------------------------------------------------------- + # Unit tests — 6 Linux + 1 Windows matrix + # --------------------------------------------------------------------------- + unit-tests: + needs: determine-changes + if: needs.determine-changes.outputs.unit_tests == 'true' + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + python-version: "3.9" + - os: ubuntu-latest + python-version: "3.10" + - os: ubuntu-latest + python-version: "3.11" + - os: ubuntu-latest + python-version: "3.12" + - os: ubuntu-latest + python-version: "3.13" + - os: ubuntu-latest + python-version: "3.14" + - os: windows-latest + python-version: "3.13" + continue-on-error: true + runs-on: ${{ matrix.os }} + env: + PYTHONIOENCODING: utf-8 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up JDK 11 + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + + - name: Build codeflash-runtime JAR + run: | + cd codeflash-java-runtime + mvn clean package -q -DskipTests + mvn install -q -DskipTests + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: uv sync + + - name: Install test-only dependencies (Python 3.9 and 3.13) + if: matrix.python-version == '3.9' || matrix.python-version == '3.13' + run: uv sync --group tests + + - name: Unit tests + run: uv run pytest tests/ + + # --------------------------------------------------------------------------- + # Mypy type checking + # --------------------------------------------------------------------------- + type-check: + needs: determine-changes + if: needs.determine-changes.outputs.type_check == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + + - name: Install dependencies + run: | + uv venv --seed + uv sync + + - name: Run mypy + run: uv run mypy --non-interactive --config-file pyproject.toml @mypy_allowlist.txt + + # --------------------------------------------------------------------------- + # E2E tests — only on pull_request and workflow_dispatch (not push to main) + # --------------------------------------------------------------------------- + tracer-replay: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 10 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_tracer_replay.py + + bubble-sort-pytest-nogit: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 70 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Remove .git + run: | + if [ -d ".git" ]; then + echo ".git directory exists!" + sudo rm -rf .git + if [ -d ".git" ]; then + echo ".git directory still exists after removal attempt!" + exit 1 + else + echo ".git directory successfully removed." + fi + else + echo ".git directory does not exist. Nothing to remove." + exit 1 + fi + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_bubblesort_pytest.py + + bubble-sort-unittest: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 40 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_bubblesort_unittest.py + + futurehouse-structure: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 5 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_futurehouse.py + + topological-sort: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 5 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_topological_sort_worktree.py + + # --------------------------------------------------------------------------- + # Gate job — the ONLY required check in the GitHub ruleset. + # Accepts "success" and "skipped" (job skipped by change detection). + # Rejects "failure" and "cancelled". + # --------------------------------------------------------------------------- + required-checks-passed: + name: required checks passed + if: always() + needs: + - unit-tests + - type-check + - tracer-replay + - bubble-sort-pytest-nogit + - bubble-sort-unittest + - futurehouse-structure + - topological-sort + runs-on: ubuntu-latest + steps: + - name: Verify all required jobs passed + run: | + failing=$(echo "$NEEDS_JSON" | jq -r 'to_entries[] | select(.value.result != "success" and .value.result != "skipped") | "\(.key): \(.value.result)"') + if [ -n "$failing" ]; then + echo "Required jobs failed or were cancelled:" + echo "$failing" + exit 1 + fi + env: + NEEDS_JSON: ${{ toJSON(needs) }} diff --git a/.github/workflows/e2e-bubblesort-pytest-nogit.yaml b/.github/workflows/e2e-bubblesort-pytest-nogit.yaml deleted file mode 100644 index 10bf43dac..000000000 --- a/.github/workflows/e2e-bubblesort-pytest-nogit.yaml +++ /dev/null @@ -1,92 +0,0 @@ -name: E2E - Bubble Sort Pytest (No Git) - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - bubble-sort-optimization-pytest-no-git: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 70 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Remove .git - run: | - if [ -d ".git" ]; then - echo ".git directory exists!" - sudo rm -rf .git - if [ -d ".git" ]; then - echo ".git directory still exists after removal attempt!" - exit 1 - else - echo ".git directory successfully removed." - fi - else - echo ".git directory does not exist. Nothing to remove." - exit 1 - fi - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_bubblesort_pytest.py diff --git a/.github/workflows/e2e-bubblesort-unittest.yaml b/.github/workflows/e2e-bubblesort-unittest.yaml deleted file mode 100644 index 7fa012b44..000000000 --- a/.github/workflows/e2e-bubblesort-unittest.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: E2E - Bubble Sort Unittest - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - bubble-sort-optimization-unittest: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 40 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_bubblesort_unittest.py \ No newline at end of file diff --git a/.github/workflows/e2e-futurehouse-structure.yaml b/.github/workflows/e2e-futurehouse-structure.yaml deleted file mode 100644 index dc67cd07c..000000000 --- a/.github/workflows/e2e-futurehouse-structure.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: E2E - Futurehouse Structure - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - futurehouse-structure: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 5 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_futurehouse.py diff --git a/.github/workflows/e2e-topological-sort.yaml b/.github/workflows/e2e-topological-sort.yaml deleted file mode 100644 index 945e338f7..000000000 --- a/.github/workflows/e2e-topological-sort.yaml +++ /dev/null @@ -1,101 +0,0 @@ -name: E2E - Topological Sort (Worktree) - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - topological-sort-worktree-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 5 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Debug Environment Decision - run: | - # Construct the condition result manually for debugging - EVENT_NAME="${{ github.event_name }}" - FILES_CHANGED="${{ toJSON(github.event.pull_request.files.*.filename) }}" - PR_AUTHOR="${{ github.event.pull_request.user.login }}" - - echo "Event Name: $EVENT_NAME" - echo "Files Changed: $FILES_CHANGED" - echo "PR Author: $PR_AUTHOR" - - # Check workflow file changes - if [[ "$FILES_CHANGED" == *".github/workflows/"* ]]; then - echo "Workflow files changed: YES" - else - echo "Workflow files changed: NO" - fi - - # Check author conditions - if [[ "$PR_AUTHOR" != "misrasaurabh1" && "$PR_AUTHOR" != "KRRT7" ]]; then - echo "Author needs approval: YES" - else - echo "Author needs approval: NO" - fi - - # Selected environment - echo "Selected Environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }}" - - - name: Validate PR for workflow changes - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_topological_sort_worktree.py diff --git a/.github/workflows/e2e-tracer-replay.yaml b/.github/workflows/e2e-tracer-replay.yaml deleted file mode 100644 index 56a038ddb..000000000 --- a/.github/workflows/e2e-tracer-replay.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: E2E - Tracer Replay - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - tracer-replay: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_tracer_replay.py diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml deleted file mode 100644 index a3f950105..000000000 --- a/.github/workflows/mypy.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Mypy Type Checking for CLI - -on: - push: - branches: - - main - paths: - - 'codeflash/**' - - 'pyproject.toml' - - 'uv.lock' - - 'mypy_allowlist.txt' - pull_request: - paths: - - 'codeflash/**' - - 'pyproject.toml' - - 'uv.lock' - - 'mypy_allowlist.txt' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - type-check-cli: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - - - name: sync uv - run: | - uv venv --seed - uv sync - - - - name: Run mypy on allowlist - run: uv run mypy --non-interactive --config-file pyproject.toml @mypy_allowlist.txt diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml deleted file mode 100644 index 1ff8553c1..000000000 --- a/.github/workflows/unit-tests.yaml +++ /dev/null @@ -1,85 +0,0 @@ -name: unit-tests - -on: - push: - branches: [main] - paths: - - 'codeflash/**' - - 'codeflash-benchmark/**' - - 'codeflash-java-runtime/**' - - 'tests/**' - - 'packages/**' - - 'pyproject.toml' - - 'uv.lock' - pull_request: - paths: - - 'codeflash/**' - - 'codeflash-benchmark/**' - - 'codeflash-java-runtime/**' - - 'tests/**' - - 'packages/**' - - 'pyproject.toml' - - 'uv.lock' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - unit-tests: - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-latest - python-version: "3.9" - - os: ubuntu-latest - python-version: "3.10" - - os: ubuntu-latest - python-version: "3.11" - - os: ubuntu-latest - python-version: "3.12" - - os: ubuntu-latest - python-version: "3.13" - - os: ubuntu-latest - python-version: "3.14" - - os: windows-latest - python-version: "3.13" - continue-on-error: true - runs-on: ${{ matrix.os }} - env: - PYTHONIOENCODING: utf-8 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: ${{ matrix.python-version }} - - - name: install dependencies - run: uv sync - - - name: Install test-only dependencies (Python 3.9 and 3.13) - if: matrix.python-version == '3.9' || matrix.python-version == '3.13' - run: uv sync --group tests - - - name: Unit tests - run: uv run pytest tests/ From 7e40e944b16751bf03c7566082a96396565d0534 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 05:47:02 -0500 Subject: [PATCH 036/147] ci: remove self-reference from change detection paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ci.yaml was in all three check_paths calls, so creating/modifying the workflow itself triggered all test jobs. Workflow-only PRs should skip tests — the gate job still validates the pattern. --- .github/workflows/ci.yaml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 144477bd4..cc877139f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -62,18 +62,15 @@ jobs: # Unit tests: code + test infra + java + packages + build config check_paths unit_tests \ 'codeflash/' 'codeflash-benchmark/' 'codeflash-java-runtime/' \ - 'tests/' 'packages/' 'pyproject.toml' 'uv.lock' \ - '.github/workflows/ci.yaml' + 'tests/' 'packages/' 'pyproject.toml' 'uv.lock' # Type checking: code + build config + mypy config check_paths type_check \ - 'codeflash/' 'pyproject.toml' 'uv.lock' 'mypy_allowlist.txt' \ - '.github/workflows/ci.yaml' + 'codeflash/' 'pyproject.toml' 'uv.lock' 'mypy_allowlist.txt' - # E2E tests: code + tests + build config + this workflow + # E2E tests: code + tests + build config check_paths e2e \ - 'codeflash/' 'tests/' 'pyproject.toml' 'uv.lock' \ - '.github/workflows/ci.yaml' + 'codeflash/' 'tests/' 'pyproject.toml' 'uv.lock' env: MERGE_BASE: ${{ steps.merge_base.outputs.sha }} From d941f3645f5253531ebbb537ea66c55b07eed856 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 06:35:55 -0500 Subject: [PATCH 037/147] ci: consolidate remaining 10 workflows into ci.yaml Add all non-required-check E2E workflows and prek lint to the consolidated ci.yaml: - 4 standard Python E2Es (async, benchmark, coverage, init) - 3 JS E2Es (cjs-function, esm-async, ts-class) - 2 Java E2Es (fibonacci-nogit, tracer) - prek lint New change detection outputs: - e2e_js: triggers JS E2Es when packages/ changes - e2e_java: triggers Java E2Es when java runtime/fixtures change Total: 17 jobs + determine-changes + gate = 19 jobs in one file. Down from 22 workflow files to 7 (remaining are non-test: claude, codeflash self-optimize, label-workflow-changes, publish, java-e2e). Additional savings per irrelevant PR: ~$0.80 (10 jobs x ~$0.08). Total per skipped PR: ~$1.85. --- .github/workflows/ci.yaml | 619 ++++++++++++++++++ .github/workflows/e2e-async.yaml | 77 --- .../workflows/e2e-bubblesort-benchmark.yaml | 76 --- .../workflows/e2e-coverage-optimization.yaml | 75 --- .github/workflows/e2e-init-optimization.yaml | 75 --- .../workflows/e2e-java-fibonacci-nogit.yaml | 105 --- .github/workflows/e2e-java-tracer.yaml | 90 --- .github/workflows/e2e-js-cjs-function.yaml | 93 --- .github/workflows/e2e-js-esm-async.yaml | 93 --- .github/workflows/e2e-js-ts-class.yaml | 93 --- .github/workflows/prek.yaml | 25 - 11 files changed, 619 insertions(+), 802 deletions(-) delete mode 100644 .github/workflows/e2e-async.yaml delete mode 100644 .github/workflows/e2e-bubblesort-benchmark.yaml delete mode 100644 .github/workflows/e2e-coverage-optimization.yaml delete mode 100644 .github/workflows/e2e-init-optimization.yaml delete mode 100644 .github/workflows/e2e-java-fibonacci-nogit.yaml delete mode 100644 .github/workflows/e2e-java-tracer.yaml delete mode 100644 .github/workflows/e2e-js-cjs-function.yaml delete mode 100644 .github/workflows/e2e-js-esm-async.yaml delete mode 100644 .github/workflows/e2e-js-ts-class.yaml delete mode 100644 .github/workflows/prek.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cc877139f..4d092949a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,6 +33,8 @@ jobs: unit_tests: ${{ github.event_name != 'pull_request' || steps.check.outputs.unit_tests == 'true' }} type_check: ${{ github.event_name != 'pull_request' || steps.check.outputs.type_check == 'true' }} e2e: ${{ github.event_name != 'pull_request' || steps.check.outputs.e2e == 'true' }} + e2e_js: ${{ github.event_name != 'pull_request' || steps.check.outputs.e2e_js == 'true' }} + e2e_java: ${{ github.event_name != 'pull_request' || steps.check.outputs.e2e_java == 'true' }} steps: - uses: actions/checkout@v4 if: github.event_name == 'pull_request' @@ -71,6 +73,14 @@ jobs: # E2E tests: code + tests + build config check_paths e2e \ 'codeflash/' 'tests/' 'pyproject.toml' 'uv.lock' + + # JS E2E tests: JS packages changed + check_paths e2e_js \ + 'packages/' + + # Java E2E tests: java runtime or java test fixtures changed + check_paths e2e_java \ + 'codeflash-java-runtime/' 'code_to_optimize/java/' env: MERGE_BASE: ${{ steps.merge_base.outputs.sha }} @@ -160,9 +170,31 @@ jobs: - name: Run mypy run: uv run mypy --non-interactive --config-file pyproject.toml @mypy_allowlist.txt + # --------------------------------------------------------------------------- + # Lint (prek) — pull_request only + # --------------------------------------------------------------------------- + prek: + needs: determine-changes + if: >- + github.event_name == 'pull_request' + && (needs.determine-changes.outputs.e2e == 'true' + || needs.determine-changes.outputs.e2e_js == 'true') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: astral-sh/setup-uv@v8.0.0 + - uses: j178/prek-action@v1 + with: + extra-args: '--from-ref origin/${{ github.base_ref }} --to-ref ${{ github.sha }}' + # --------------------------------------------------------------------------- # E2E tests — only on pull_request and workflow_dispatch (not push to main) # --------------------------------------------------------------------------- + + # --- Standard Python E2Es --- + tracer-replay: needs: determine-changes if: >- @@ -444,6 +476,583 @@ jobs: - name: Run E2E test run: uv run python tests/scripts/end_to_end_test_topological_sort_worktree.py + async-optimization: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 10 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_async.py + + benchmark-bubble-sort: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 5 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_benchmark_sort.py + + coverage-e2e: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + MAX_RETRIES: 3 + RETRY_DELAY: 5 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: | + uv sync + uv add black + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_coverage.py + + init-optimization: + needs: determine-changes + if: >- + needs.determine-changes.outputs.e2e == 'true' + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 10 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_init_optimization.py + + # --- JS E2Es (need Node.js + packages/) --- + + js-cjs-function: + needs: determine-changes + if: >- + (needs.determine-changes.outputs.e2e == 'true' + || needs.determine-changes.outputs.e2e_js == 'true') + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 50 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install codeflash npm package dependencies + run: | + cd packages/codeflash + npm install + + - name: Install JS test project dependencies + run: | + cd code_to_optimize/js/code_to_optimize_js + npm install + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_js_cjs_function.py + + js-esm-async: + needs: determine-changes + if: >- + (needs.determine-changes.outputs.e2e == 'true' + || needs.determine-changes.outputs.e2e_js == 'true') + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 10 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install codeflash npm package dependencies + run: | + cd packages/codeflash + npm install + + - name: Install JS test project dependencies + run: | + cd code_to_optimize/js/code_to_optimize_js_esm + npm install + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_js_esm_async.py + + js-ts-class: + needs: determine-changes + if: >- + (needs.determine-changes.outputs.e2e == 'true' + || needs.determine-changes.outputs.e2e_js == 'true') + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 30 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install codeflash npm package dependencies + run: | + cd packages/codeflash + npm install + + - name: Install JS test project dependencies + run: | + cd code_to_optimize/js/code_to_optimize_ts + npm install + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_js_ts_class.py + + # --- Java E2Es (need JDK + Maven) --- + + java-fibonacci-nogit: + needs: determine-changes + if: >- + (needs.determine-changes.outputs.e2e == 'true' + || needs.determine-changes.outputs.e2e_java == 'true') + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 70 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Set up JDK 11 + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Build codeflash-runtime JAR + run: | + cd codeflash-java-runtime + mvn clean package -q -DskipTests + mvn install -q -DskipTests + + - name: Verify Java installation + run: | + java -version + mvn --version + + - name: Remove .git + run: | + if [ -d ".git" ]; then + sudo rm -rf .git + echo ".git directory removed." + else + echo ".git directory does not exist." + exit 1 + fi + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_java_fibonacci.py + + java-tracer: + needs: determine-changes + if: >- + (needs.determine-changes.outputs.e2e == 'true' + || needs.determine-changes.outputs.e2e_java == 'true') + && github.event_name != 'push' + environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: 10 + CODEFLASH_END_TO_END: 1 + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref || '' }} + repository: ${{ github.event.pull_request.head.repo.full_name || '' }} + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Validate PR + if: github.event_name == 'pull_request' + run: | + if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ github.event.pull_request.user.login }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi + + - name: Set up JDK 11 + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + + - name: Install dependencies + run: uv sync + + - name: Build codeflash-runtime JAR + run: | + cd codeflash-java-runtime + mvn clean package -q -DskipTests + mvn install -q -DskipTests + + - name: Verify Java installation + run: | + java -version + mvn --version + + - name: Run E2E test + run: uv run python tests/scripts/end_to_end_test_java_tracer.py + # --------------------------------------------------------------------------- # Gate job — the ONLY required check in the GitHub ruleset. # Accepts "success" and "skipped" (job skipped by change detection). @@ -455,11 +1064,21 @@ jobs: needs: - unit-tests - type-check + - prek - tracer-replay - bubble-sort-pytest-nogit - bubble-sort-unittest - futurehouse-structure - topological-sort + - async-optimization + - benchmark-bubble-sort + - coverage-e2e + - init-optimization + - js-cjs-function + - js-esm-async + - js-ts-class + - java-fibonacci-nogit + - java-tracer runs-on: ubuntu-latest steps: - name: Verify all required jobs passed diff --git a/.github/workflows/e2e-async.yaml b/.github/workflows/e2e-async.yaml deleted file mode 100644 index f091ffdaf..000000000 --- a/.github/workflows/e2e-async.yaml +++ /dev/null @@ -1,77 +0,0 @@ -name: E2E - Async - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - async-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize async code - id: optimize_async_code - run: | - uv run python tests/scripts/end_to_end_test_async.py \ No newline at end of file diff --git a/.github/workflows/e2e-bubblesort-benchmark.yaml b/.github/workflows/e2e-bubblesort-benchmark.yaml deleted file mode 100644 index 406a67bd0..000000000 --- a/.github/workflows/e2e-bubblesort-benchmark.yaml +++ /dev/null @@ -1,76 +0,0 @@ -name: E2E - Bubble Sort Benchmark - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - benchmark-bubble-sort-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 5 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - name: Run Codeflash to optimize code - id: optimize_code_with_benchmarks - run: | - uv run python tests/scripts/end_to_end_test_benchmark_sort.py \ No newline at end of file diff --git a/.github/workflows/e2e-coverage-optimization.yaml b/.github/workflows/e2e-coverage-optimization.yaml deleted file mode 100644 index e4df7d0b2..000000000 --- a/.github/workflows/e2e-coverage-optimization.yaml +++ /dev/null @@ -1,75 +0,0 @@ -name: Coverage E2E - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - end-to-end-test-coverage: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - MAX_RETRIES: 3 - RETRY_DELAY: 5 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - uv add black # my-best-repo in end_to_end_test_coverage.py is configured to use black - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_coverage.py diff --git a/.github/workflows/e2e-init-optimization.yaml b/.github/workflows/e2e-init-optimization.yaml deleted file mode 100644 index 2e76c64bc..000000000 --- a/.github/workflows/e2e-init-optimization.yaml +++ /dev/null @@ -1,75 +0,0 @@ -name: E2E - Init Optimization - -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - init-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize code - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_init_optimization.py diff --git a/.github/workflows/e2e-java-fibonacci-nogit.yaml b/.github/workflows/e2e-java-fibonacci-nogit.yaml deleted file mode 100644 index bab4f9a34..000000000 --- a/.github/workflows/e2e-java-fibonacci-nogit.yaml +++ /dev/null @@ -1,105 +0,0 @@ -name: E2E - Java Fibonacci (No Git) - -on: - pull_request: - paths: - - 'codeflash/languages/java/**' - - 'codeflash/languages/base.py' - - 'codeflash/languages/registry.py' - - 'codeflash/optimization/**' - - 'codeflash/verification/**' - - 'code_to_optimize/java/**' - - 'codeflash-java-runtime/**' - - 'tests/scripts/end_to_end_test_java_fibonacci.py' - - '.github/workflows/e2e-java-fibonacci-nogit.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - java-fibonacci-optimization-no-git: - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 70 - CODEFLASH_END_TO_END: 1 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - env: - PR_AUTHOR: ${{ github.event.pull_request.user.login }} - PR_STATE: ${{ github.event.pull_request.state }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - if git diff --name-only "$BASE_SHA" "$HEAD_SHA" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - echo "PR Author: $PR_AUTHOR" - if [[ "$PR_AUTHOR" == "misrasaurabh1" || "$PR_AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($PR_AUTHOR). Proceeding." - elif [[ "$PR_STATE" == "open" ]]; then - echo "✅ PR is open. Proceeding." - else - echo "⛔ Unauthorized user ($PR_AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: uv sync - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - - name: Verify Java installation - run: | - java -version - mvn --version - - - name: Remove .git - run: | - if [ -d ".git" ]; then - sudo rm -rf .git - echo ".git directory removed." - else - echo ".git directory does not exist." - exit 1 - fi - - - name: Run Codeflash to optimize Fibonacci - run: | - uv run python tests/scripts/end_to_end_test_java_fibonacci.py diff --git a/.github/workflows/e2e-java-tracer.yaml b/.github/workflows/e2e-java-tracer.yaml deleted file mode 100644 index cfefaa8fa..000000000 --- a/.github/workflows/e2e-java-tracer.yaml +++ /dev/null @@ -1,90 +0,0 @@ -name: E2E - Java Tracer - -on: - pull_request: - paths: - - 'codeflash/**' - - 'codeflash-java-runtime/**' - - 'tests/**' - - '.github/workflows/e2e-java-tracer.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - java-tracer-e2e: - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - env: - PR_AUTHOR: ${{ github.event.pull_request.user.login }} - PR_STATE: ${{ github.event.pull_request.state }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - if git diff --name-only "$BASE_SHA" "$HEAD_SHA" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - echo "PR Author: $PR_AUTHOR" - if [[ "$PR_AUTHOR" == "misrasaurabh1" || "$PR_AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($PR_AUTHOR). Proceeding." - elif [[ "$PR_STATE" == "open" ]]; then - echo "✅ PR is open. Proceeding." - else - echo "⛔ Unauthorized user ($PR_AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: uv sync - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - - name: Verify Java installation - run: | - java -version - mvn --version - - - name: Run Java tracer e2e test - run: | - uv run python tests/scripts/end_to_end_test_java_tracer.py diff --git a/.github/workflows/e2e-js-cjs-function.yaml b/.github/workflows/e2e-js-cjs-function.yaml deleted file mode 100644 index e25e1c89b..000000000 --- a/.github/workflows/e2e-js-cjs-function.yaml +++ /dev/null @@ -1,93 +0,0 @@ -name: E2E - JS CommonJS Function - -on: - pull_request: - paths: - - 'codeflash/**' - - 'packages/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - js-cjs-function-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 50 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install codeflash npm package dependencies - run: | - cd packages/codeflash - npm install - - - name: Install JS test project dependencies - run: | - cd code_to_optimize/js/code_to_optimize_js - npm install - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize JS CommonJS function - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_js_cjs_function.py diff --git a/.github/workflows/e2e-js-esm-async.yaml b/.github/workflows/e2e-js-esm-async.yaml deleted file mode 100644 index 8590108ea..000000000 --- a/.github/workflows/e2e-js-esm-async.yaml +++ /dev/null @@ -1,93 +0,0 @@ -name: E2E - JS ESM Async - -on: - pull_request: - paths: - - 'codeflash/**' - - 'packages/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - js-esm-async-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install codeflash npm package dependencies - run: | - cd packages/codeflash - npm install - - - name: Install JS test project dependencies - run: | - cd code_to_optimize/js/code_to_optimize_js_esm - npm install - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize ESM async function - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_js_esm_async.py diff --git a/.github/workflows/e2e-js-ts-class.yaml b/.github/workflows/e2e-js-ts-class.yaml deleted file mode 100644 index a34d8d0c0..000000000 --- a/.github/workflows/e2e-js-ts-class.yaml +++ /dev/null @@ -1,93 +0,0 @@ -name: E2E - JS TypeScript Class - -on: - pull_request: - paths: - - 'codeflash/**' - - 'packages/**' - - 'tests/**' - - 'pyproject.toml' - - 'uv.lock' - - '.github/workflows/e2e-*.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - js-ts-class-optimization: - # Dynamically determine if environment is needed only when workflow files change and contributor is external - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 30 - CODEFLASH_END_TO_END: 1 - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - run: | - # Check for any workflow changes - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - - # Get the PR author - AUTHOR="${{ github.event.pull_request.user.login }}" - echo "PR Author: $AUTHOR" - - # Allowlist check - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "✅ PR triggered by 'pull_request_target' and is open. Assuming protection rules are in place. Proceeding." - else - echo "⛔ Unauthorized user ($AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install codeflash npm package dependencies - run: | - cd packages/codeflash - npm install - - - name: Install JS test project dependencies - run: | - cd code_to_optimize/js/code_to_optimize_ts - npm install - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: | - uv sync - - - name: Run Codeflash to optimize TypeScript class method - id: optimize_code - run: | - uv run python tests/scripts/end_to_end_test_js_ts_class.py diff --git a/.github/workflows/prek.yaml b/.github/workflows/prek.yaml deleted file mode 100644 index abaad1457..000000000 --- a/.github/workflows/prek.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Lint -on: - pull_request: - paths: - - 'codeflash/**' - - 'tests/**' - - 'packages/**' - - 'pyproject.toml' - - 'uv.lock' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - prek: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: astral-sh/setup-uv@v8.0.0 - - uses: j178/prek-action@v1 - with: - extra-args: '--from-ref origin/${{ github.base_ref }} --to-ref ${{ github.sha }}' From 19927fad07e173f023d40b94ee16b484018d72a6 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 11:31:47 -0500 Subject: [PATCH 038/147] =?UTF-8?q?ci:=20refactor=2014=20E2E=20jobs=20into?= =?UTF-8?q?=203=20matrix=20jobs=20(1094=20=E2=86=92=20521=20lines)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidate individual E2E workflow jobs into matrix strategy: - 9 Python E2Es → 1 `e2e-python` matrix job - 3 JS E2Es → 1 `e2e-js` matrix job - 2 Java E2Es + new void-optimization → 1 `e2e-java` matrix job Also absorbs standalone `e2e-java-void-optimization.yaml` into ci.yaml, fixing its mutable `@v6` tag to `@v8.0.0` in the process. Gate job now references 6 needs instead of 17. --- .github/workflows/ci.yaml | 752 +++--------------- .../workflows/e2e-java-void-optimization.yaml | 105 --- 2 files changed, 90 insertions(+), 767 deletions(-) delete mode 100644 .github/workflows/e2e-java-void-optimization.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4d092949a..82d688084 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -193,23 +193,53 @@ jobs: # E2E tests — only on pull_request and workflow_dispatch (not push to main) # --------------------------------------------------------------------------- - # --- Standard Python E2Es --- - - tracer-replay: + # --- Standard Python E2Es (9 tests) --- + e2e-python: needs: determine-changes if: >- needs.determine-changes.outputs.e2e == 'true' && github.event_name != 'push' + strategy: + fail-fast: false + matrix: + include: + - name: tracer-replay + script: end_to_end_test_tracer_replay.py + expected_improvement: 10 + - name: bubble-sort-pytest-nogit + script: end_to_end_test_bubblesort_pytest.py + expected_improvement: 70 + remove_git: true + - name: bubble-sort-unittest + script: end_to_end_test_bubblesort_unittest.py + expected_improvement: 40 + - name: futurehouse-structure + script: end_to_end_test_futurehouse.py + expected_improvement: 5 + - name: topological-sort + script: end_to_end_test_topological_sort_worktree.py + expected_improvement: 5 + - name: async-optimization + script: end_to_end_test_async.py + expected_improvement: 10 + - name: benchmark-bubble-sort + script: end_to_end_test_benchmark_sort.py + expected_improvement: 5 + - name: coverage-e2e + script: end_to_end_test_coverage.py + extra_deps: black + - name: init-optimization + script: end_to_end_test_init_optimization.py + expected_improvement: 10 + name: ${{ matrix.name }} environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: CODEFLASH_AIS_SERVER: prod POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 MAX_RETRIES: 3 RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 CODEFLASH_END_TO_END: 1 steps: - uses: actions/checkout@v4 @@ -245,60 +275,18 @@ jobs: - name: Install dependencies run: uv sync - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_tracer_replay.py + - name: Install extra dependencies + if: matrix.extra_deps + run: uv add ${{ matrix.extra_deps }} - bubble-sort-pytest-nogit: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 70 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' + - name: Set test configuration + if: matrix.expected_improvement run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync + echo "COLUMNS=110" >> "$GITHUB_ENV" + echo "EXPECTED_IMPROVEMENT_PCT=${{ matrix.expected_improvement }}" >> "$GITHUB_ENV" - name: Remove .git + if: matrix.remove_git run: | if [ -d ".git" ]; then echo ".git directory exists!" @@ -315,387 +303,32 @@ jobs: fi - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_bubblesort_pytest.py + run: uv run python tests/scripts/${{ matrix.script }} - bubble-sort-unittest: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 40 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_bubblesort_unittest.py - - futurehouse-structure: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 5 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_futurehouse.py - - topological-sort: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 5 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_topological_sort_worktree.py - - async-optimization: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_async.py - - benchmark-bubble-sort: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 5 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_benchmark_sort.py - - coverage-e2e: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - MAX_RETRIES: 3 - RETRY_DELAY: 5 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: | - uv sync - uv add black - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_coverage.py - - init-optimization: - needs: determine-changes - if: >- - needs.determine-changes.outputs.e2e == 'true' - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_init_optimization.py - - # --- JS E2Es (need Node.js + packages/) --- - - js-cjs-function: + # --- JS E2Es (3 tests, need Node.js + packages/) --- + e2e-js: needs: determine-changes if: >- (needs.determine-changes.outputs.e2e == 'true' || needs.determine-changes.outputs.e2e_js == 'true') && github.event_name != 'push' + strategy: + fail-fast: false + matrix: + include: + - name: js-cjs-function + script: end_to_end_test_js_cjs_function.py + js_project_dir: code_to_optimize/js/code_to_optimize_js + expected_improvement: 50 + - name: js-esm-async + script: end_to_end_test_js_esm_async.py + js_project_dir: code_to_optimize/js/code_to_optimize_js_esm + expected_improvement: 10 + - name: js-ts-class + script: end_to_end_test_js_ts_class.py + js_project_dir: code_to_optimize/js/code_to_optimize_ts + expected_improvement: 30 + name: ${{ matrix.name }} environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: @@ -705,7 +338,7 @@ jobs: COLUMNS: 110 MAX_RETRIES: 3 RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 50 + EXPECTED_IMPROVEMENT_PCT: ${{ matrix.expected_improvement }} CODEFLASH_END_TO_END: 1 steps: - uses: actions/checkout@v4 @@ -745,7 +378,7 @@ jobs: - name: Install JS test project dependencies run: | - cd code_to_optimize/js/code_to_optimize_js + cd ${{ matrix.js_project_dir }} npm install - name: Install uv @@ -757,154 +390,31 @@ jobs: run: uv sync - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_js_cjs_function.py + run: uv run python tests/scripts/${{ matrix.script }} - js-esm-async: - needs: determine-changes - if: >- - (needs.determine-changes.outputs.e2e == 'true' - || needs.determine-changes.outputs.e2e_js == 'true') - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install codeflash npm package dependencies - run: | - cd packages/codeflash - npm install - - - name: Install JS test project dependencies - run: | - cd code_to_optimize/js/code_to_optimize_js_esm - npm install - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_js_esm_async.py - - js-ts-class: - needs: determine-changes - if: >- - (needs.determine-changes.outputs.e2e == 'true' - || needs.determine-changes.outputs.e2e_js == 'true') - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 30 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install codeflash npm package dependencies - run: | - cd packages/codeflash - npm install - - - name: Install JS test project dependencies - run: | - cd code_to_optimize/js/code_to_optimize_ts - npm install - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_js_ts_class.py - - # --- Java E2Es (need JDK + Maven) --- - - java-fibonacci-nogit: + # --- Java E2Es (3 tests, need JDK + Maven) --- + e2e-java: needs: determine-changes if: >- (needs.determine-changes.outputs.e2e == 'true' || needs.determine-changes.outputs.e2e_java == 'true') && github.event_name != 'push' + strategy: + fail-fast: false + matrix: + include: + - name: java-fibonacci-nogit + script: end_to_end_test_java_fibonacci.py + expected_improvement: 70 + remove_git: true + - name: java-tracer + script: end_to_end_test_java_tracer.py + expected_improvement: 10 + - name: java-void-optimization-nogit + script: end_to_end_test_java_void_optimization.py + expected_improvement: 70 + remove_git: true + name: ${{ matrix.name }} environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: @@ -914,7 +424,7 @@ jobs: COLUMNS: 110 MAX_RETRIES: 3 RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 70 + EXPECTED_IMPROVEMENT_PCT: ${{ matrix.expected_improvement }} CODEFLASH_END_TO_END: 1 steps: - uses: actions/checkout@v4 @@ -969,6 +479,7 @@ jobs: mvn --version - name: Remove .git + if: matrix.remove_git run: | if [ -d ".git" ]; then sudo rm -rf .git @@ -979,79 +490,7 @@ jobs: fi - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_java_fibonacci.py - - java-tracer: - needs: determine-changes - if: >- - (needs.determine-changes.outputs.e2e == 'true' - || needs.determine-changes.outputs.e2e_java == 'true') - && github.event_name != 'push' - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 10 - CODEFLASH_END_TO_END: 1 - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref || '' }} - repository: ${{ github.event.pull_request.head.repo.full_name || '' }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi - - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - with: - python-version: 3.11.6 - - - name: Install dependencies - run: uv sync - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - - name: Verify Java installation - run: | - java -version - mvn --version - - - name: Run E2E test - run: uv run python tests/scripts/end_to_end_test_java_tracer.py + run: uv run python tests/scripts/${{ matrix.script }} # --------------------------------------------------------------------------- # Gate job — the ONLY required check in the GitHub ruleset. @@ -1065,20 +504,9 @@ jobs: - unit-tests - type-check - prek - - tracer-replay - - bubble-sort-pytest-nogit - - bubble-sort-unittest - - futurehouse-structure - - topological-sort - - async-optimization - - benchmark-bubble-sort - - coverage-e2e - - init-optimization - - js-cjs-function - - js-esm-async - - js-ts-class - - java-fibonacci-nogit - - java-tracer + - e2e-python + - e2e-js + - e2e-java runs-on: ubuntu-latest steps: - name: Verify all required jobs passed diff --git a/.github/workflows/e2e-java-void-optimization.yaml b/.github/workflows/e2e-java-void-optimization.yaml deleted file mode 100644 index 0e25a2d65..000000000 --- a/.github/workflows/e2e-java-void-optimization.yaml +++ /dev/null @@ -1,105 +0,0 @@ -name: E2E - Java Void Optimization (No Git) - -on: - pull_request: - paths: - - 'codeflash/languages/java/**' - - 'codeflash/languages/base.py' - - 'codeflash/languages/registry.py' - - 'codeflash/optimization/**' - - 'codeflash/verification/**' - - 'code_to_optimize/java/**' - - 'codeflash-java-runtime/**' - - 'tests/scripts/end_to_end_test_java_void_optimization.py' - - '.github/workflows/e2e-java-void-optimization.yaml' - - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - java-void-optimization-no-git: - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} - - runs-on: ubuntu-latest - env: - CODEFLASH_AIS_SERVER: prod - POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - COLUMNS: 110 - MAX_RETRIES: 3 - RETRY_DELAY: 5 - EXPECTED_IMPROVEMENT_PCT: 70 - CODEFLASH_END_TO_END: 1 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - repository: ${{ github.event.pull_request.head.repo.full_name }} - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Validate PR - env: - PR_AUTHOR: ${{ github.event.pull_request.user.login }} - PR_STATE: ${{ github.event.pull_request.state }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - if git diff --name-only "$BASE_SHA" "$HEAD_SHA" | grep -q "^.github/workflows/"; then - echo "⚠️ Workflow changes detected." - echo "PR Author: $PR_AUTHOR" - if [[ "$PR_AUTHOR" == "misrasaurabh1" || "$PR_AUTHOR" == "KRRT7" ]]; then - echo "✅ Authorized user ($PR_AUTHOR). Proceeding." - elif [[ "$PR_STATE" == "open" ]]; then - echo "✅ PR is open. Proceeding." - else - echo "⛔ Unauthorized user ($PR_AUTHOR) attempting to modify workflows. Exiting." - exit 1 - fi - else - echo "✅ No workflow file changes detected. Proceeding." - fi - - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v6 - with: - python-version: 3.11.6 - - - name: Install dependencies (CLI) - run: uv sync - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - - name: Verify Java installation - run: | - java -version - mvn --version - - - name: Remove .git - run: | - if [ -d ".git" ]; then - sudo rm -rf .git - echo ".git directory removed." - else - echo ".git directory does not exist." - exit 1 - fi - - - name: Run Codeflash to optimize void function - run: | - uv run python tests/scripts/end_to_end_test_java_void_optimization.py \ No newline at end of file From 4863ec36173732e6e622f807af36565eb8105d28 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 11:34:19 -0500 Subject: [PATCH 039/147] ci: remove matrix name override to fix skipped check display When matrix jobs are skipped, `${{ matrix.name }}` is never expanded, showing literal "matrix.name" in the checks UI. Removing the `name:` field lets GitHub use the job ID when skipped and auto-expand matrix values when running. --- .github/workflows/ci.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 82d688084..19303ac9b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -231,7 +231,6 @@ jobs: - name: init-optimization script: end_to_end_test_init_optimization.py expected_improvement: 10 - name: ${{ matrix.name }} environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: @@ -328,7 +327,6 @@ jobs: script: end_to_end_test_js_ts_class.py js_project_dir: code_to_optimize/js/code_to_optimize_ts expected_improvement: 30 - name: ${{ matrix.name }} environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: @@ -414,7 +412,6 @@ jobs: script: end_to_end_test_java_void_optimization.py expected_improvement: 70 remove_git: true - name: ${{ matrix.name }} environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: From 39eef53657833e86e6606b5cd16cd3a0e9154c17 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 11:41:20 -0500 Subject: [PATCH 040/147] ci: remove unnecessary JDK/Maven setup from unit-tests Only 5 of 3,943 unit tests need Java, and they already have skip_if_maven_not_available() guards. Java execution is validated by the e2e-java job. Saves ~30-60s per matrix entry (7 entries). --- .github/workflows/ci.yaml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 19303ac9b..72aad9f0c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -118,19 +118,6 @@ jobs: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - name: Install uv uses: astral-sh/setup-uv@v8.0.0 with: From 3d50ac5aae0c18c89743ba684b81758a3c3109fa Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 11:48:19 -0500 Subject: [PATCH 041/147] ci: auto-fix formatting in prek job Run ruff check --fix and ruff format before prek validation. If files were modified, commit and push the fixes automatically. --- .github/workflows/ci.yaml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 72aad9f0c..bdc148d97 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -167,14 +167,32 @@ jobs: && (needs.determine-changes.outputs.e2e == 'true' || needs.determine-changes.outputs.e2e_js == 'true') runs-on: ubuntu-latest + permissions: + contents: write steps: - uses: actions/checkout@v4 with: + ref: ${{ github.head_ref }} fetch-depth: 0 - uses: astral-sh/setup-uv@v8.0.0 + + - name: Auto-fix formatting + run: | + uv run ruff check --fix . || true + uv run ruff format . + + - name: Commit and push fixes + run: | + git diff --quiet && exit 0 + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + git commit -m "style: auto-format with ruff" + git push + - uses: j178/prek-action@v1 with: - extra-args: '--from-ref origin/${{ github.base_ref }} --to-ref ${{ github.sha }}' + extra-args: '--from-ref origin/${{ github.base_ref }} --to-ref HEAD' # --------------------------------------------------------------------------- # E2E tests — only on pull_request and workflow_dispatch (not push to main) From 8bcfbb3d81cec63a45a93842c27199da4a429d2e Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 11:52:16 -0500 Subject: [PATCH 042/147] ci: scope Java/JS E2Es to language-specific paths Expand e2e_java and e2e_js change detection to include shared pipeline code (optimization/, verification/, languages/base.py) but decouple from the broad e2e flag. A change to codeflash/version.py now only triggers Python E2Es, not Java/JS E2Es. --- .github/workflows/ci.yaml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bdc148d97..5bc8e03f2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -74,13 +74,20 @@ jobs: check_paths e2e \ 'codeflash/' 'tests/' 'pyproject.toml' 'uv.lock' - # JS E2E tests: JS packages changed + # JS E2E tests: JS language support + shared pipeline + packages check_paths e2e_js \ - 'packages/' + 'codeflash/languages/javascript/' 'codeflash/languages/base.py' \ + 'codeflash/languages/registry.py' 'codeflash/optimization/' \ + 'codeflash/verification/' 'packages/' \ + 'tests/' 'pyproject.toml' 'uv.lock' - # Java E2E tests: java runtime or java test fixtures changed + # Java E2E tests: Java language support + shared pipeline + runtime check_paths e2e_java \ - 'codeflash-java-runtime/' 'code_to_optimize/java/' + 'codeflash/languages/java/' 'codeflash/languages/base.py' \ + 'codeflash/languages/registry.py' 'codeflash/optimization/' \ + 'codeflash/verification/' 'codeflash-java-runtime/' \ + 'code_to_optimize/java/' \ + 'tests/' 'pyproject.toml' 'uv.lock' env: MERGE_BASE: ${{ steps.merge_base.outputs.sha }} @@ -313,8 +320,7 @@ jobs: e2e-js: needs: determine-changes if: >- - (needs.determine-changes.outputs.e2e == 'true' - || needs.determine-changes.outputs.e2e_js == 'true') + needs.determine-changes.outputs.e2e_js == 'true' && github.event_name != 'push' strategy: fail-fast: false @@ -399,8 +405,7 @@ jobs: e2e-java: needs: determine-changes if: >- - (needs.determine-changes.outputs.e2e == 'true' - || needs.determine-changes.outputs.e2e_java == 'true') + needs.determine-changes.outputs.e2e_java == 'true' && github.event_name != 'push' strategy: fail-fast: false From 82249efb4f15159514b4814595cf4494d628b299 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 11:52:33 -0500 Subject: [PATCH 043/147] ci: remove pyproject.toml/uv.lock from Java/JS E2E triggers --- .github/workflows/ci.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5bc8e03f2..4fd16014c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -78,16 +78,14 @@ jobs: check_paths e2e_js \ 'codeflash/languages/javascript/' 'codeflash/languages/base.py' \ 'codeflash/languages/registry.py' 'codeflash/optimization/' \ - 'codeflash/verification/' 'packages/' \ - 'tests/' 'pyproject.toml' 'uv.lock' + 'codeflash/verification/' 'packages/' 'tests/' # Java E2E tests: Java language support + shared pipeline + runtime check_paths e2e_java \ 'codeflash/languages/java/' 'codeflash/languages/base.py' \ 'codeflash/languages/registry.py' 'codeflash/optimization/' \ 'codeflash/verification/' 'codeflash-java-runtime/' \ - 'code_to_optimize/java/' \ - 'tests/' 'pyproject.toml' 'uv.lock' + 'code_to_optimize/java/' 'tests/' env: MERGE_BASE: ${{ steps.merge_base.outputs.sha }} From d97f372f43c4afa7adef43c701fa381e5aa4bd4f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 12:00:17 -0500 Subject: [PATCH 044/147] ci: narrow paths, extract validate-pr, remove continue-on-error - Remove codeflash-java-runtime/ from unit_tests change detection - Narrow e2e flag from codeflash/ to explicit Python subdirs (excludes java/, javascript/) - Narrow tests/ in e2e_java/e2e_js to specific test scripts - Extract duplicated Validate PR step into composite action - Use fetch-depth: 1 for unit-tests and type-check (no git history needed) - Remove continue-on-error: true from unit-tests (was masking real failures) - Change git add -A to git add -u in prek auto-fix (won't stage untracked files) --- .github/actions/validate-pr/action.yml | 35 ++++++++++ .github/workflows/ci.yaml | 90 ++++++++++---------------- 2 files changed, 70 insertions(+), 55 deletions(-) create mode 100644 .github/actions/validate-pr/action.yml diff --git a/.github/actions/validate-pr/action.yml b/.github/actions/validate-pr/action.yml new file mode 100644 index 000000000..60849f50b --- /dev/null +++ b/.github/actions/validate-pr/action.yml @@ -0,0 +1,35 @@ +name: Validate PR +description: Ensure only authorized users can modify workflow files in PRs +inputs: + base_sha: + description: Base commit SHA of the pull request + required: true + head_sha: + description: Head commit SHA of the pull request + required: true + author: + description: Login of the PR author + required: true + pr_state: + description: State of the pull request (open/closed) + required: true +runs: + using: composite + steps: + - name: Check workflow file changes + shell: bash + run: | + if git diff --name-only "${{ inputs.base_sha }}" "${{ inputs.head_sha }}" | grep -q "^.github/workflows/"; then + echo "Workflow changes detected." + AUTHOR="${{ inputs.author }}" + if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then + echo "Authorized user ($AUTHOR). Proceeding." + elif [[ "${{ inputs.pr_state }}" == "open" ]]; then + echo "PR is open. Protection rules in place. Proceeding." + else + echo "Unauthorized user ($AUTHOR). Exiting." + exit 1 + fi + else + echo "No workflow file changes. Proceeding." + fi diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4fd16014c..bf118078b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -61,31 +61,39 @@ jobs: fi } - # Unit tests: code + test infra + java + packages + build config + # Unit tests: code + test infra + packages + build config check_paths unit_tests \ - 'codeflash/' 'codeflash-benchmark/' 'codeflash-java-runtime/' \ + 'codeflash/' 'codeflash-benchmark/' \ 'tests/' 'packages/' 'pyproject.toml' 'uv.lock' # Type checking: code + build config + mypy config check_paths type_check \ 'codeflash/' 'pyproject.toml' 'uv.lock' 'mypy_allowlist.txt' - # E2E tests: code + tests + build config + # E2E tests: Python pipeline + tests + build config (excludes java/ and javascript/) check_paths e2e \ - 'codeflash/' 'tests/' 'pyproject.toml' 'uv.lock' + 'codeflash/*.py' \ + 'codeflash/api/' 'codeflash/benchmarking/' 'codeflash/cli_cmds/' \ + 'codeflash/code_utils/' 'codeflash/discovery/' 'codeflash/github/' \ + 'codeflash/languages/python/' 'codeflash/languages/*.py' \ + 'codeflash/lsp/' 'codeflash/models/' 'codeflash/optimization/' \ + 'codeflash/picklepatch/' 'codeflash/result/' 'codeflash/setup/' \ + 'codeflash/telemetry/' 'codeflash/tracing/' 'codeflash/verification/' \ + 'tests/' 'pyproject.toml' 'uv.lock' # JS E2E tests: JS language support + shared pipeline + packages check_paths e2e_js \ 'codeflash/languages/javascript/' 'codeflash/languages/base.py' \ 'codeflash/languages/registry.py' 'codeflash/optimization/' \ - 'codeflash/verification/' 'packages/' 'tests/' + 'codeflash/verification/' 'packages/' \ + 'tests/scripts/end_to_end_test_js*' # Java E2E tests: Java language support + shared pipeline + runtime check_paths e2e_java \ 'codeflash/languages/java/' 'codeflash/languages/base.py' \ 'codeflash/languages/registry.py' 'codeflash/optimization/' \ 'codeflash/verification/' 'codeflash-java-runtime/' \ - 'code_to_optimize/java/' 'tests/' + 'code_to_optimize/java/' 'tests/scripts/end_to_end_test_java*' env: MERGE_BASE: ${{ steps.merge_base.outputs.sha }} @@ -113,14 +121,13 @@ jobs: python-version: "3.14" - os: windows-latest python-version: "3.13" - continue-on-error: true runs-on: ${{ matrix.os }} env: PYTHONIOENCODING: utf-8 steps: - uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv @@ -148,7 +155,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv @@ -191,7 +198,7 @@ jobs: git diff --quiet && exit 0 git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A + git add -u git commit -m "style: auto-format with ruff" git push @@ -260,21 +267,12 @@ jobs: - name: Validate PR if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi + uses: ./.github/actions/validate-pr + with: + base_sha: ${{ github.event.pull_request.base.sha }} + head_sha: ${{ github.event.pull_request.head.sha }} + author: ${{ github.event.pull_request.user.login }} + pr_state: ${{ github.event.pull_request.state }} - name: Install uv uses: astral-sh/setup-uv@v8.0.0 @@ -357,21 +355,12 @@ jobs: - name: Validate PR if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi + uses: ./.github/actions/validate-pr + with: + base_sha: ${{ github.event.pull_request.base.sha }} + head_sha: ${{ github.event.pull_request.head.sha }} + author: ${{ github.event.pull_request.user.login }} + pr_state: ${{ github.event.pull_request.state }} - name: Set up Node.js uses: actions/setup-node@v4 @@ -441,21 +430,12 @@ jobs: - name: Validate PR if: github.event_name == 'pull_request' - run: | - if git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep -q "^.github/workflows/"; then - echo "Workflow changes detected." - AUTHOR="${{ github.event.pull_request.user.login }}" - if [[ "$AUTHOR" == "misrasaurabh1" || "$AUTHOR" == "KRRT7" ]]; then - echo "Authorized user ($AUTHOR). Proceeding." - elif [[ "${{ github.event.pull_request.state }}" == "open" ]]; then - echo "PR is open. Protection rules in place. Proceeding." - else - echo "Unauthorized user ($AUTHOR). Exiting." - exit 1 - fi - else - echo "No workflow file changes. Proceeding." - fi + uses: ./.github/actions/validate-pr + with: + base_sha: ${{ github.event.pull_request.base.sha }} + head_sha: ${{ github.event.pull_request.head.sha }} + author: ${{ github.event.pull_request.user.login }} + pr_state: ${{ github.event.pull_request.state }} - name: Set up JDK 11 uses: actions/setup-java@v4 From 619ef3de34192b8854330d6b2725964a8b96944f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 12:02:44 -0500 Subject: [PATCH 045/147] ci: trigger test run (will revert) --- codeflash/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeflash/version.py b/codeflash/version.py index 226fdf7ad..338afabad 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5" +__version__ = "0.20.5" # ci: trigger test run From 9a86e09460c7bb4373d17829ef5d3f1659490a90 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:03:22 +0000 Subject: [PATCH 046/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 616b1bc71..2512f240d 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.1.post242.dev0+7c7eeb5b" +__version__ = "0.20.5.post138.dev0+619ef3de" diff --git a/codeflash/version.py b/codeflash/version.py index 338afabad..2512f240d 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5" # ci: trigger test run +__version__ = "0.20.5.post138.dev0+619ef3de" From be446cd8dee337e2874c2de8da9a3ca87a147fdc Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 12:06:19 -0500 Subject: [PATCH 047/147] test: skip Java comparator tests when Maven is unavailable The requires_java marker only checked for java binary but the tests also need mvn to build the codeflash-runtime JAR. These 13 tests were silently failing in unit-tests (masked by continue-on-error). --- tests/test_languages/test_java/test_comparator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_languages/test_java/test_comparator.py b/tests/test_languages/test_java/test_comparator.py index 13adcab86..04b1ac924 100644 --- a/tests/test_languages/test_java/test_comparator.py +++ b/tests/test_languages/test_java/test_comparator.py @@ -11,7 +11,8 @@ from codeflash.models.models import TestDiffScope # Skip tests that require Java runtime if Java is not available requires_java = pytest.mark.skipif( - shutil.which("java") is None, reason="Java not found - skipping Comparator integration tests" + shutil.which("java") is None or shutil.which("mvn") is None, + reason="Java/Maven not found - skipping Comparator integration tests", ) # Kryo-serialized bytes for common test values. From 241fd2d59cadcbbce0759e96f27903920a499480 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:08:10 +0000 Subject: [PATCH 048/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 2512f240d..c1acdf67e 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post138.dev0+619ef3de" +__version__ = "0.20.5.post140.dev0+be446cd8" diff --git a/codeflash/version.py b/codeflash/version.py index 2512f240d..c1acdf67e 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post138.dev0+619ef3de" +__version__ = "0.20.5.post140.dev0+be446cd8" From e5a18feb61fe6439923f4577d55317f1f0286274 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 12:19:10 -0500 Subject: [PATCH 049/147] test: fix requires_java to check for runtime JAR, not just binaries Ubuntu runners have Java/Maven pre-installed, so checking for java/mvn binaries doesn't skip. The actual dependency is the codeflash-runtime JAR which must be built from codeflash-java-runtime/ via Maven. --- tests/test_languages/test_java/test_comparator.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/test_languages/test_java/test_comparator.py b/tests/test_languages/test_java/test_comparator.py index 04b1ac924..268044e5c 100644 --- a/tests/test_languages/test_java/test_comparator.py +++ b/tests/test_languages/test_java/test_comparator.py @@ -6,13 +6,18 @@ from pathlib import Path import pytest -from codeflash.languages.java.comparator import compare_invocations_directly, compare_test_results, values_equal +from codeflash.languages.java.comparator import ( + _find_comparator_jar, + compare_invocations_directly, + compare_test_results, + values_equal, +) from codeflash.models.models import TestDiffScope -# Skip tests that require Java runtime if Java is not available +# Skip tests that require the codeflash-runtime JAR (built by Maven from codeflash-java-runtime/) requires_java = pytest.mark.skipif( - shutil.which("java") is None or shutil.which("mvn") is None, - reason="Java/Maven not found - skipping Comparator integration tests", + _find_comparator_jar() is None, + reason="codeflash-runtime JAR not found - skipping Comparator integration tests", ) # Kryo-serialized bytes for common test values. From 15811c8c03109b1fed9d03979db1b4eec9f1d85d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:20:24 +0000 Subject: [PATCH 050/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index c1acdf67e..8dfd1dda8 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post140.dev0+be446cd8" +__version__ = "0.20.5.post142.dev0+e5a18feb" diff --git a/codeflash/version.py b/codeflash/version.py index c1acdf67e..8dfd1dda8 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post140.dev0+be446cd8" +__version__ = "0.20.5.post142.dev0+e5a18feb" From 78372bfbfbe9642bc2118a2e77997673efc7dd51 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 15:47:04 -0500 Subject: [PATCH 051/147] test: skip test_behavior_return_value_correctness when JAR missing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same fix as test_comparator.py — uses _find_comparator_jar() to skip when the codeflash-runtime JAR isn't built. Fixes Windows unit-tests which don't have Java pre-installed (unlike Linux runners). --- tests/test_languages/test_java/test_run_and_parse.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_languages/test_java/test_run_and_parse.py b/tests/test_languages/test_java/test_run_and_parse.py index 1470b9ce8..09a646271 100644 --- a/tests/test_languages/test_java/test_run_and_parse.py +++ b/tests/test_languages/test_java/test_run_and_parse.py @@ -13,6 +13,13 @@ from pathlib import Path import pytest +from codeflash.languages.java.comparator import _find_comparator_jar + +requires_java_runtime = pytest.mark.skipif( + _find_comparator_jar() is None, + reason="codeflash-runtime JAR not found - skipping Java integration tests", +) + from codeflash.discovery.functions_to_optimize import FunctionToOptimize from codeflash.languages.base import Language from codeflash.languages.current import set_current_language @@ -369,6 +376,7 @@ public class AdderMultiTest { assert "testAddPositive" in test_names assert "testAddZero" in test_names + @requires_java_runtime def test_behavior_return_value_correctness(self, tmp_path): """Verify the Comparator JAR correctly identifies equivalent vs. differing results. From 72cf0e16546f0a40bc5d65e260122b31e0081e08 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:47:47 +0000 Subject: [PATCH 052/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 8dfd1dda8..5793dff4e 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post142.dev0+e5a18feb" +__version__ = "0.20.5.post144.dev0+78372bfb" diff --git a/codeflash/version.py b/codeflash/version.py index 8dfd1dda8..5793dff4e 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post142.dev0+e5a18feb" +__version__ = "0.20.5.post144.dev0+78372bfb" From 5ff38597efe4564fdb25f19da9b15c212b97b3bb Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 16:01:40 -0500 Subject: [PATCH 053/147] test: skip all Java integration test classes when JAR missing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply @requires_java_runtime to TestJavaRunAndParseBehavior and TestJavaRunAndParsePerformance at the class level. The performance test was failing on Windows with a flaky 10ms timing assertion (10.515ms actual, 5% tolerance) — pre-existing issue masked by continue-on-error. --- tests/test_languages/test_java/test_run_and_parse.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_languages/test_java/test_run_and_parse.py b/tests/test_languages/test_java/test_run_and_parse.py index 09a646271..74d6818f2 100644 --- a/tests/test_languages/test_java/test_run_and_parse.py +++ b/tests/test_languages/test_java/test_run_and_parse.py @@ -234,6 +234,7 @@ public class PreciseWaiter { """ +@requires_java_runtime class TestJavaRunAndParseBehavior: def test_behavior_single_test_method(self, java_project): """Full pipeline: instrument → run → parse with precise field assertions.""" @@ -413,6 +414,7 @@ public class AdderMultiTest { assert equivalent is False +@requires_java_runtime class TestJavaRunAndParsePerformance: """Tests that the performance instrumentation produces correct timing data. From a957a0e6c9241950c10e7e8fe838a533a1cbdbdf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:02:29 +0000 Subject: [PATCH 054/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 5793dff4e..a421c3690 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post144.dev0+78372bfb" +__version__ = "0.20.5.post146.dev0+5ff38597" diff --git a/codeflash/version.py b/codeflash/version.py index 5793dff4e..a421c3690 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post144.dev0+78372bfb" +__version__ = "0.20.5.post146.dev0+5ff38597" From 65b117c8b845f8d8ea43ad60c4ced266d66a1fcf Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 18:11:26 -0500 Subject: [PATCH 055/147] revert: restore version.py (remove CI trigger) --- codeflash/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeflash/version.py b/codeflash/version.py index a421c3690..226fdf7ad 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post146.dev0+5ff38597" +__version__ = "0.20.5" From 64790d5b609a16a7a2dddfb47e0bdb6413d96e54 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 23:13:50 +0000 Subject: [PATCH 056/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index a421c3690..4eb66411f 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post146.dev0+5ff38597" +__version__ = "0.20.5.post163.dev0+3f533098" diff --git a/codeflash/version.py b/codeflash/version.py index 226fdf7ad..4eb66411f 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5" +__version__ = "0.20.5.post163.dev0+3f533098" From e2eb677d189a139194988ad3e9ac4319030faa18 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 18:40:22 -0500 Subject: [PATCH 057/147] Optimize CI caching and remove duplicate Java workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete standalone java-e2e-tests.yml (duplicate of ci.yaml e2e-java) - Add npm cache to e2e-js jobs via setup-node cache option - Consolidate Maven build: mvn clean package + install → single mvn install - Add .github/workflows/ci.yaml and .github/actions/** to push paths so CI validates its own changes when merged to main --- .github/workflows/ci.yaml | 14 ++--- .github/workflows/java-e2e-tests.yml | 76 ---------------------------- 2 files changed, 7 insertions(+), 83 deletions(-) delete mode 100644 .github/workflows/java-e2e-tests.yml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bf118078b..fd53ba2c1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,6 +12,8 @@ on: - 'pyproject.toml' - 'uv.lock' - 'mypy_allowlist.txt' + - '.github/workflows/ci.yaml' + - '.github/actions/**' pull_request: workflow_dispatch: @@ -366,6 +368,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: '20' + cache: 'npm' + cache-dependency-path: | + packages/codeflash/package-lock.json + code_to_optimize/js/*/package-lock.json - name: Install codeflash npm package dependencies run: | @@ -452,17 +458,11 @@ jobs: - name: Install dependencies run: uv sync - - name: Build codeflash-runtime JAR + - name: Build and install codeflash-runtime JAR run: | cd codeflash-java-runtime - mvn clean package -q -DskipTests mvn install -q -DskipTests - - name: Verify Java installation - run: | - java -version - mvn --version - - name: Remove .git if: matrix.remove_git run: | diff --git a/.github/workflows/java-e2e-tests.yml b/.github/workflows/java-e2e-tests.yml deleted file mode 100644 index 0e84aada5..000000000 --- a/.github/workflows/java-e2e-tests.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Java E2E Tests - -on: - push: - branches: - - main - - omni-java - paths: - - 'codeflash/languages/java/**' - - 'tests/test_languages/test_java*.py' - - 'code_to_optimize/java/**' - - '.github/workflows/java-e2e-tests.yml' - pull_request: - paths: - - 'codeflash/languages/java/**' - - 'tests/test_languages/test_java*.py' - - 'code_to_optimize/java/**' - - '.github/workflows/java-e2e-tests.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true - -jobs: - java-e2e: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up JDK 11 - uses: actions/setup-java@v4 - with: - java-version: '11' - distribution: 'temurin' - cache: maven - - - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 - - - name: Set up Python environment - run: | - uv venv --seed - uv sync - - - name: Verify Java installation - run: | - java -version - mvn --version - - - name: Build codeflash-runtime JAR - run: | - cd codeflash-java-runtime - mvn clean package -q -DskipTests - mvn install -q -DskipTests - - - name: Build Java sample project - run: | - cd code_to_optimize/java - mvn compile -q - - - name: Run Java sample project tests - run: | - cd code_to_optimize/java - mvn test -q - - - name: Run Java E2E tests - run: | - uv run pytest tests/test_languages/test_java_e2e.py -v --tb=short - - - name: Run Java unit tests - run: | - uv run pytest tests/test_languages/test_java/ -v --tb=short -x From 44c1bcf458e9bdb21a3f4f08f1a0cf35e898a0c7 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 18:42:16 -0500 Subject: [PATCH 058/147] ci: retrigger CI From 11201fe7c6c95ef7216674eee7cf60fe185a6479 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 23:43:15 +0000 Subject: [PATCH 059/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 4eb66411f..8605f062a 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post163.dev0+3f533098" +__version__ = "0.20.5.post165.dev0+44c1bcf4" diff --git a/codeflash/version.py b/codeflash/version.py index 4eb66411f..8605f062a 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post163.dev0+3f533098" +__version__ = "0.20.5.post165.dev0+44c1bcf4" From a6ea56bf50f408026364761990de141144b28fbc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 23:44:22 +0000 Subject: [PATCH 060/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 8605f062a..a759bb9fd 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post165.dev0+44c1bcf4" +__version__ = "0.20.5.post169.dev0+2dba3e38" diff --git a/codeflash/version.py b/codeflash/version.py index 8605f062a..a759bb9fd 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post165.dev0+44c1bcf4" +__version__ = "0.20.5.post169.dev0+2dba3e38" From be4c459d0141f6d835f9361ed3587748265b9a3f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 22:06:41 -0500 Subject: [PATCH 061/147] ci: upgrade action versions, add uv cache, fix broken paths, DRY publish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bump actions/checkout v4/v5 → v6, setup-node v4 → v6, setup-java v4 → v5, prek-action v1 → v2, github-script v6 → v7, aws-credentials v4 → v6, claude-code-action v1.0.89 → v1 - Add enable-cache: true to all astral-sh/setup-uv steps - Remove redundant uv venv --seed (uv sync creates venvs automatically) - Merge double uv sync steps in unit-tests into single conditional - Fix codeflash.yaml: broken path filter and working-directory - Consolidate duplicate publish jobs into a single matrix job - Remove generate_release_notes overridden by manual body --- .github/workflows/ci.yaml | 43 ++++--- .github/workflows/claude.yml | 24 ++-- .github/workflows/codeflash-optimize.yaml | 3 +- .github/workflows/codeflash.yaml | 11 +- .github/workflows/label-workflow-changes.yml | 2 +- .github/workflows/publish.yml | 127 +++++++------------ 6 files changed, 90 insertions(+), 120 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fd53ba2c1..a82685570 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -38,7 +38,7 @@ jobs: e2e_js: ${{ github.event_name != 'pull_request' || steps.check.outputs.e2e_js == 'true' }} e2e_java: ${{ github.event_name != 'pull_request' || steps.check.outputs.e2e_java == 'true' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 if: github.event_name == 'pull_request' with: fetch-depth: 0 @@ -127,7 +127,7 @@ jobs: env: PYTHONIOENCODING: utf-8 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 1 token: ${{ secrets.GITHUB_TOKEN }} @@ -136,13 +136,15 @@ jobs: uses: astral-sh/setup-uv@v8.0.0 with: python-version: ${{ matrix.python-version }} + enable-cache: true - name: Install dependencies - run: uv sync - - - name: Install test-only dependencies (Python 3.9 and 3.13) - if: matrix.python-version == '3.9' || matrix.python-version == '3.13' - run: uv sync --group tests + run: | + if [[ "${{ matrix.python-version }}" == "3.9" || "${{ matrix.python-version }}" == "3.13" ]]; then + uv sync --group tests + else + uv sync + fi - name: Unit tests run: uv run pytest tests/ @@ -155,18 +157,18 @@ jobs: if: needs.determine-changes.outputs.type_check == 'true' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 1 token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv uses: astral-sh/setup-uv@v8.0.0 + with: + enable-cache: true - name: Install dependencies - run: | - uv venv --seed - uv sync + run: uv sync - name: Run mypy run: uv run mypy --non-interactive --config-file pyproject.toml @mypy_allowlist.txt @@ -184,11 +186,13 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.head_ref }} fetch-depth: 0 - uses: astral-sh/setup-uv@v8.0.0 + with: + enable-cache: true - name: Auto-fix formatting run: | @@ -204,7 +208,7 @@ jobs: git commit -m "style: auto-format with ruff" git push - - uses: j178/prek-action@v1 + - uses: j178/prek-action@v2 with: extra-args: '--from-ref origin/${{ github.base_ref }} --to-ref HEAD' @@ -260,7 +264,7 @@ jobs: RETRY_DELAY: 5 CODEFLASH_END_TO_END: 1 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref || '' }} repository: ${{ github.event.pull_request.head.repo.full_name || '' }} @@ -280,6 +284,7 @@ jobs: uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 + enable-cache: true - name: Install dependencies run: uv sync @@ -348,7 +353,7 @@ jobs: EXPECTED_IMPROVEMENT_PCT: ${{ matrix.expected_improvement }} CODEFLASH_END_TO_END: 1 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref || '' }} repository: ${{ github.event.pull_request.head.repo.full_name || '' }} @@ -365,7 +370,7 @@ jobs: pr_state: ${{ github.event.pull_request.state }} - name: Set up Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' cache: 'npm' @@ -387,6 +392,7 @@ jobs: uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 + enable-cache: true - name: Install dependencies run: uv sync @@ -427,7 +433,7 @@ jobs: EXPECTED_IMPROVEMENT_PCT: ${{ matrix.expected_improvement }} CODEFLASH_END_TO_END: 1 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref || '' }} repository: ${{ github.event.pull_request.head.repo.full_name || '' }} @@ -444,7 +450,7 @@ jobs: pr_state: ${{ github.event.pull_request.state }} - name: Set up JDK 11 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '11' distribution: 'temurin' @@ -454,6 +460,7 @@ jobs: uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 + enable-cache: true - name: Install dependencies run: uv sync diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index d7959b4cf..006d308b6 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -51,28 +51,28 @@ jobs: actions: read steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.ref || github.ref }} - name: Install uv uses: astral-sh/setup-uv@v8.0.0 + with: + enable-cache: true - name: Install dependencies - run: | - uv venv --seed - uv sync + run: uv sync - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 + uses: aws-actions/configure-aws-credentials@v6 with: role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} aws-region: ${{ secrets.AWS_REGION }} - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@v1.0.89 + uses: anthropics/claude-code-action@v1 with: use_bedrock: "true" use_sticky_comment: true @@ -311,28 +311,28 @@ jobs: fi - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 ref: ${{ steps.pr-ref.outputs.ref }} - name: Install uv uses: astral-sh/setup-uv@v8.0.0 + with: + enable-cache: true - name: Install dependencies - run: | - uv venv --seed - uv sync + run: uv sync - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 + uses: aws-actions/configure-aws-credentials@v6 with: role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} aws-region: ${{ secrets.AWS_REGION }} - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@v1.0.89 + uses: anthropics/claude-code-action@v1 with: use_bedrock: "true" claude_args: '--model us.anthropic.claude-sonnet-4-6 --allowedTools "Read,Edit,Write,Glob,Grep,Bash(git status*),Bash(git diff*),Bash(git add *),Bash(git commit *),Bash(git push*),Bash(git log*),Bash(git merge*),Bash(git fetch*),Bash(git checkout*),Bash(git branch*),Bash(uv run prek *),Bash(prek *),Bash(uv run ruff *),Bash(uv run pytest *),Bash(uv run mypy *),Bash(uv run coverage *),Bash(gh pr comment*),Bash(gh pr view*),Bash(gh pr diff*),Bash(gh pr merge*),Bash(gh pr close*)"' diff --git a/.github/workflows/codeflash-optimize.yaml b/.github/workflows/codeflash-optimize.yaml index c3f16d668..9884665da 100644 --- a/.github/workflows/codeflash-optimize.yaml +++ b/.github/workflows/codeflash-optimize.yaml @@ -26,7 +26,7 @@ jobs: COLUMNS: 110 steps: - name: 🛎️ Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 @@ -34,6 +34,7 @@ jobs: uses: astral-sh/setup-uv@v8.0.0 with: python-version: 3.11.6 + enable-cache: true - name: 📦 Install dependencies (CLI) run: | diff --git a/.github/workflows/codeflash.yaml b/.github/workflows/codeflash.yaml index 79f1e43b4..147e5ed5e 100644 --- a/.github/workflows/codeflash.yaml +++ b/.github/workflows/codeflash.yaml @@ -4,7 +4,7 @@ on: pull_request: paths: # So that this workflow only runs when code within the target module is modified - - 'code_to_optimize_js_esm/**' + - 'code_to_optimize/js/code_to_optimize_js_esm/**' workflow_dispatch: concurrency: @@ -23,19 +23,20 @@ jobs: CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} defaults: run: - working-directory: ./code_to_optimize_js_esm + working-directory: ./code_to_optimize/js/code_to_optimize_js_esm steps: - name: 🛎️ Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: 🟢 Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '22' cache: 'npm' + cache-dependency-path: code_to_optimize/js/code_to_optimize_js_esm/package-lock.json - name: 📦 Install Dependencies run: npm ci - + - name: ⚡️ Codeflash Optimization run: npx codeflash diff --git a/.github/workflows/label-workflow-changes.yml b/.github/workflows/label-workflow-changes.yml index ec074af53..3bc8d6c54 100644 --- a/.github/workflows/label-workflow-changes.yml +++ b/.github/workflows/label-workflow-changes.yml @@ -13,7 +13,7 @@ jobs: pull-requests: write steps: - name: Label PR with workflow changes - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const labelName = 'workflow-modified'; diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 224d5de3a..f2b6a3ccd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,7 +16,7 @@ jobs: benchmark: ${{ steps.filter.outputs.benchmark }} steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 2 @@ -34,9 +34,27 @@ jobs: echo "benchmark=false" >> $GITHUB_OUTPUT fi - publish-codeflash: + publish: needs: detect-changes - if: needs.detect-changes.outputs.codeflash == 'true' + if: >- + needs.detect-changes.outputs.codeflash == 'true' + || needs.detect-changes.outputs.benchmark == 'true' + strategy: + fail-fast: false + matrix: + include: + - package: codeflash + version_file: codeflash/version.py + tag_prefix: v + build_cmd: uv build + flag: codeflash + release_name_prefix: "Release" + - package: codeflash-benchmark + version_file: codeflash-benchmark/codeflash_benchmark/version.py + tag_prefix: benchmark-v + build_cmd: uv build --package codeflash-benchmark + flag: benchmark + release_name_prefix: "codeflash-benchmark" runs-on: ubuntu-latest environment: name: pypi @@ -44,92 +62,34 @@ jobs: id-token: write contents: write steps: - - name: Checkout - uses: actions/checkout@v5 - with: - fetch-depth: 0 - - - name: Extract version from version.py - id: extract_version + - name: Check if this matrix leg should run + id: should_run run: | - VERSION=$(grep -oP '__version__ = "\K[^"]+' codeflash/version.py) - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "tag=v$VERSION" >> $GITHUB_OUTPUT - echo "Extracted version: $VERSION" - - - name: Check if tag already exists - id: check_tag - run: | - if git rev-parse "v${{ steps.extract_version.outputs.version }}" >/dev/null 2>&1; then - echo "exists=true" >> $GITHUB_OUTPUT - echo "Tag v${{ steps.extract_version.outputs.version }} already exists, skipping release" + if [[ "${{ matrix.flag }}" == "codeflash" && "${{ needs.detect-changes.outputs.codeflash }}" == "true" ]]; then + echo "run=true" >> $GITHUB_OUTPUT + elif [[ "${{ matrix.flag }}" == "benchmark" && "${{ needs.detect-changes.outputs.benchmark }}" == "true" ]]; then + echo "run=true" >> $GITHUB_OUTPUT else - echo "exists=false" >> $GITHUB_OUTPUT - echo "Tag v${{ steps.extract_version.outputs.version }} does not exist, proceeding with release" + echo "run=false" >> $GITHUB_OUTPUT fi - - name: Create and push git tag - if: steps.check_tag.outputs.exists == 'false' - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git tag -a "${{ steps.extract_version.outputs.tag }}" -m "Release ${{ steps.extract_version.outputs.tag }}" - git push origin "${{ steps.extract_version.outputs.tag }}" - - - name: Install uv - if: steps.check_tag.outputs.exists == 'false' - uses: astral-sh/setup-uv@v8.0.0 - - - name: Build - if: steps.check_tag.outputs.exists == 'false' - run: uv build - - - name: Publish to PyPI - if: steps.check_tag.outputs.exists == 'false' - run: uv publish - - - name: Create GitHub Release - if: steps.check_tag.outputs.exists == 'false' - uses: softprops/action-gh-release@v2 - with: - tag_name: ${{ steps.extract_version.outputs.tag }} - name: Release ${{ steps.extract_version.outputs.tag }} - body: | - ## What's Changed - - Release ${{ steps.extract_version.outputs.version }} of codeflash. - - **Full Changelog**: https://github.com/${{ github.repository }}/commits/${{ steps.extract_version.outputs.tag }} - draft: false - prerelease: false - generate_release_notes: true - files: | - dist/* - - publish-benchmark: - needs: detect-changes - if: needs.detect-changes.outputs.benchmark == 'true' - runs-on: ubuntu-latest - environment: - name: pypi - permissions: - id-token: write - contents: write - steps: - name: Checkout - uses: actions/checkout@v5 + if: steps.should_run.outputs.run == 'true' + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Extract version from version.py + if: steps.should_run.outputs.run == 'true' id: extract_version run: | - VERSION=$(grep -oP '__version__ = "\K[^"]+' codeflash-benchmark/codeflash_benchmark/version.py) + VERSION=$(grep -oP '__version__ = "\K[^"]+' ${{ matrix.version_file }}) echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "tag=benchmark-v$VERSION" >> $GITHUB_OUTPUT + echo "tag=${{ matrix.tag_prefix }}$VERSION" >> $GITHUB_OUTPUT echo "Extracted version: $VERSION" - name: Check if tag already exists + if: steps.should_run.outputs.run == 'true' id: check_tag run: | if git rev-parse "${{ steps.extract_version.outputs.tag }}" >/dev/null 2>&1; then @@ -141,7 +101,7 @@ jobs: fi - name: Create and push git tag - if: steps.check_tag.outputs.exists == 'false' + if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" @@ -149,31 +109,32 @@ jobs: git push origin "${{ steps.extract_version.outputs.tag }}" - name: Install uv - if: steps.check_tag.outputs.exists == 'false' + if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' uses: astral-sh/setup-uv@v8.0.0 + with: + enable-cache: true - name: Build - if: steps.check_tag.outputs.exists == 'false' - run: uv build --package codeflash-benchmark + if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' + run: ${{ matrix.build_cmd }} - name: Publish to PyPI - if: steps.check_tag.outputs.exists == 'false' + if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' run: uv publish - name: Create GitHub Release - if: steps.check_tag.outputs.exists == 'false' + if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.extract_version.outputs.tag }} - name: codeflash-benchmark ${{ steps.extract_version.outputs.tag }} + name: ${{ matrix.release_name_prefix }} ${{ steps.extract_version.outputs.tag }} body: | ## What's Changed - Release ${{ steps.extract_version.outputs.version }} of codeflash-benchmark. + Release ${{ steps.extract_version.outputs.version }} of ${{ matrix.package }}. **Full Changelog**: https://github.com/${{ github.repository }}/commits/${{ steps.extract_version.outputs.tag }} draft: false prerelease: false - generate_release_notes: true files: | dist/* From 7c4d98c6e72b4d5126105ef74c7f901c6b15ecaf Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 22:08:59 -0500 Subject: [PATCH 062/147] ci: restore uv venv --seed in claude.yml uv venv --seed makes pip available in the venv, which the Claude Code action may need. --- .github/workflows/claude.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 006d308b6..c012a94d1 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -62,7 +62,9 @@ jobs: enable-cache: true - name: Install dependencies - run: uv sync + run: | + uv venv --seed + uv sync - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v6 @@ -322,7 +324,9 @@ jobs: enable-cache: true - name: Install dependencies - run: uv sync + run: | + uv venv --seed + uv sync - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v6 From 5b6318fcbbc5faba55e14e192a662f3fba9bf02c Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 22:22:11 -0500 Subject: [PATCH 063/147] fix(ci): add shell: bash to conditional install step for Windows The bash [[ ]] syntax fails on Windows runners which default to PowerShell. Explicitly setting shell: bash fixes the ParserError. --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a82685570..afdab9259 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -139,6 +139,7 @@ jobs: enable-cache: true - name: Install dependencies + shell: bash run: | if [[ "${{ matrix.python-version }}" == "3.9" || "${{ matrix.python-version }}" == "3.13" ]]; then uv sync --group tests From da536db8a2f39a941cbd2f141cf3bdf095d534d6 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 18:21:23 -0500 Subject: [PATCH 064/147] Clean up Java test skip markers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove dead `import shutil` from test_comparator.py - Rename `requires_java` → `requires_java_runtime` for consistency with test_run_and_parse.py - Remove redundant `@requires_java_runtime` on test_behavior_return_value_correctness (class already has it) --- tests/test_languages/test_java/test_comparator.py | 7 +++---- tests/test_languages/test_java/test_run_and_parse.py | 1 - 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/test_languages/test_java/test_comparator.py b/tests/test_languages/test_java/test_comparator.py index 268044e5c..2c01db806 100644 --- a/tests/test_languages/test_java/test_comparator.py +++ b/tests/test_languages/test_java/test_comparator.py @@ -1,6 +1,5 @@ """Tests for Java test result comparison.""" -import shutil import sqlite3 from pathlib import Path @@ -15,7 +14,7 @@ from codeflash.languages.java.comparator import ( from codeflash.models.models import TestDiffScope # Skip tests that require the codeflash-runtime JAR (built by Maven from codeflash-java-runtime/) -requires_java = pytest.mark.skipif( +requires_java_runtime = pytest.mark.skipif( _find_comparator_jar() is None, reason="codeflash-runtime JAR not found - skipping Comparator integration tests", ) @@ -451,7 +450,7 @@ class TestEdgeCases: assert equivalent is True -@requires_java +@requires_java_runtime class TestTestResultsTableSchema: """Tests for Java Comparator reading from test_results table schema. @@ -926,7 +925,7 @@ class TestComparatorErrorHandling: assert diffs[0].scope == TestDiffScope.DID_PASS -@requires_java +@requires_java_runtime class TestComparatorJavaEdgeCases(TestTestResultsTableSchema): """Tests for Java Comparator edge cases that require Java runtime. diff --git a/tests/test_languages/test_java/test_run_and_parse.py b/tests/test_languages/test_java/test_run_and_parse.py index 74d6818f2..4ae1f7254 100644 --- a/tests/test_languages/test_java/test_run_and_parse.py +++ b/tests/test_languages/test_java/test_run_and_parse.py @@ -377,7 +377,6 @@ public class AdderMultiTest { assert "testAddPositive" in test_names assert "testAddZero" in test_names - @requires_java_runtime def test_behavior_return_value_correctness(self, tmp_path): """Verify the Comparator JAR correctly identifies equivalent vs. differing results. From 41841325e2a65a20d7f38923a7cea0c0eee7558a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 03:23:38 +0000 Subject: [PATCH 065/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index a759bb9fd..4dfa84c29 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post169.dev0+2dba3e38" +__version__ = "0.20.5.post177.dev0+da536db8" diff --git a/codeflash/version.py b/codeflash/version.py index a759bb9fd..4dfa84c29 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post169.dev0+2dba3e38" +__version__ = "0.20.5.post177.dev0+da536db8" From a73ccca4261444964ea8b0645254f9d514997098 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 19:18:50 -0500 Subject: [PATCH 066/147] Increase test data size for TS findDuplicates benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The js-ts-class E2E test was flaky because n=100 is too small for the O(n²)→O(n) optimization to overcome Map/Set per-operation overhead. At n=100, the LLM correctly generates a Map-based O(n) solution but it benchmarks as slower (-10.6%) due to constant factor dominance. Bump to n=10,000 so the algorithmic improvement produces measurable speedup, making the 30% E2E threshold reliably achievable. --- .../js/code_to_optimize_ts/tests/data_processor.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code_to_optimize/js/code_to_optimize_ts/tests/data_processor.test.ts b/code_to_optimize/js/code_to_optimize_ts/tests/data_processor.test.ts index 3344bc149..b9720ac29 100644 --- a/code_to_optimize/js/code_to_optimize_ts/tests/data_processor.test.ts +++ b/code_to_optimize/js/code_to_optimize_ts/tests/data_processor.test.ts @@ -24,7 +24,7 @@ describe('DataProcessor', () => { test('handles larger arrays with duplicates', () => { const data: number[] = []; - for (let i = 0; i < 100; i++) { + for (let i = 0; i < 10000; i++) { data.push(i % 20); } const processor = new DataProcessor(data); From b7bcd0fe2e4204a3a7c6ba37f03ce973c238e2eb Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 19:22:58 -0500 Subject: [PATCH 067/147] ci: add code_to_optimize/js/ to e2e_js path filter The change detection for JS E2E tests was missing the test fixture directory, so PRs that only modify JS test data (like this one) were skipped. Java already had its equivalent path included. --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index afdab9259..87422cbd5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,12 +83,12 @@ jobs: 'codeflash/telemetry/' 'codeflash/tracing/' 'codeflash/verification/' \ 'tests/' 'pyproject.toml' 'uv.lock' - # JS E2E tests: JS language support + shared pipeline + packages + # JS E2E tests: JS language support + shared pipeline + packages + test fixtures check_paths e2e_js \ 'codeflash/languages/javascript/' 'codeflash/languages/base.py' \ 'codeflash/languages/registry.py' 'codeflash/optimization/' \ 'codeflash/verification/' 'packages/' \ - 'tests/scripts/end_to_end_test_js*' + 'code_to_optimize/js/' 'tests/scripts/end_to_end_test_js*' # Java E2E tests: Java language support + shared pipeline + runtime check_paths e2e_java \ From 23d9e73bfa10cfd63d15d892082d90e921c3497b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 00:23:36 +0000 Subject: [PATCH 068/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 4dfa84c29..0f1baf8bc 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post177.dev0+da536db8" +__version__ = "0.20.5.post151.dev0+95b62113" diff --git a/codeflash/version.py b/codeflash/version.py index 4dfa84c29..0f1baf8bc 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post177.dev0+da536db8" +__version__ = "0.20.5.post151.dev0+95b62113" From 8ca0f8d2cc6fbe15a113a217fef4a18dfcf08ef7 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 19:40:24 -0500 Subject: [PATCH 069/147] Fix JS line profiler empty output file causing JSONDecodeError MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The profiler's save() was called every 100 hit() calls. With O(n²) algorithms this produced hundreds of thousands of writeFileSync calls, each truncating the file to 0 bytes before writing. If the subprocess timed out (SIGKILL), the file was left at 0 bytes → JSONDecodeError. Fixes: - Move require('fs')/require('path') to module scope (not inside save()) - Reduce save-every-N from 100 → 10,000 hits (100x fewer syscalls) - Pre-create output file with {} before running Jest (safety net) - Handle empty files gracefully in parse_results - Fix misleading "file not found" warning → "file empty or no timing data" --- .../javascript/function_optimizer.py | 5 ++++ .../languages/javascript/line_profiler.py | 27 ++++++++++--------- codeflash/languages/javascript/support.py | 18 ++++++++----- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/codeflash/languages/javascript/function_optimizer.py b/codeflash/languages/javascript/function_optimizer.py index bd72ce033..bb4b16ce6 100644 --- a/codeflash/languages/javascript/function_optimizer.py +++ b/codeflash/languages/javascript/function_optimizer.py @@ -182,6 +182,11 @@ class JavaScriptFunctionOptimizer(FunctionOptimizer): try: line_profiler_output_path = get_run_tmp_file(Path("line_profiler_output.json")) + # Pre-create with valid empty JSON so the file is never 0 bytes + # even if the JS profiler save() is interrupted (e.g. SIGKILL on timeout) + line_profiler_output_path.parent.mkdir(parents=True, exist_ok=True) + line_profiler_output_path.write_text("{}", encoding="utf-8") + success = self.language_support.instrument_source_for_line_profiler( func_info=self.function_to_optimize, line_profiler_output_file=line_profiler_output_path ) diff --git a/codeflash/languages/javascript/line_profiler.py b/codeflash/languages/javascript/line_profiler.py index 81b38983c..c31588f2f 100644 --- a/codeflash/languages/javascript/line_profiler.py +++ b/codeflash/languages/javascript/line_profiler.py @@ -86,9 +86,10 @@ class JavaScriptLineProfiler: # Serialize line contents map for embedding in JavaScript line_contents_json = json.dumps(getattr(self, "line_contents", {})) - return f""" + return f"""// @ts-nocheck // Codeflash line profiler initialization -// @ts-nocheck +const __codeflash_fs__ = require('fs'); +const __codeflash_path__ = require('path'); const {self.profiler_var} = {{ stats: {{}}, lineContents: {line_contents_json}, @@ -123,19 +124,18 @@ const {self.profiler_var} = {{ this.lastLineTime = now; this.totalHits++; - // Save every 100 hits to ensure we capture results even with --forceExit - if (this.totalHits % 100 === 0) {{ + // Save periodically to capture results even with --forceExit. + // Use 10000 (not 100) to avoid excessive I/O on hot loops. + if (this.totalHits % 10000 === 0) {{ this.save(); }} }}, save: function() {{ - const fs = require('fs'); - const pathModule = require('path'); - const outputDir = pathModule.dirname('{self.output_file.as_posix()}'); + const outputDir = __codeflash_path__.dirname('{self.output_file.as_posix()}'); try {{ - if (!fs.existsSync(outputDir)) {{ - fs.mkdirSync(outputDir, {{ recursive: true }}); + if (!__codeflash_fs__.existsSync(outputDir)) {{ + __codeflash_fs__.mkdirSync(outputDir, {{ recursive: true }}); }} // Merge line contents into stats before saving const statsWithContent = {{}}; @@ -145,7 +145,7 @@ const {self.profiler_var} = {{ content: this.lineContents[key] || '' }}; }} - fs.writeFileSync( + __codeflash_fs__.writeFileSync( '{self.output_file.as_posix()}', JSON.stringify(statsWithContent, null, 2) ); @@ -298,8 +298,11 @@ if (__codeflash_save_interval__.unref) __codeflash_save_interval__.unref(); // D return {"timings": {}, "unit": 1e-9, "functions": {}} try: - with profile_file.open("r") as f: - data = json.load(f) + content = profile_file.read_text(encoding="utf-8").strip() + if not content: + logger.warning("Line profiler output file is empty: %s", profile_file) + return {"timings": {}, "unit": 1e-9, "functions": {}} + data = json.loads(content) # Group by file and function timings = {} diff --git a/codeflash/languages/javascript/support.py b/codeflash/languages/javascript/support.py index 768afce9f..2faeb76a3 100644 --- a/codeflash/languages/javascript/support.py +++ b/codeflash/languages/javascript/support.py @@ -2497,13 +2497,17 @@ class JavaScriptSupport: def parse_line_profile_results(self, line_profiler_output_file: Path) -> dict: from codeflash.languages.javascript.line_profiler import JavaScriptLineProfiler - if line_profiler_output_file.exists(): - parsed_results = JavaScriptLineProfiler.parse_results(line_profiler_output_file) - if parsed_results.get("timings"): - # Format output string for display - str_out = self._format_js_line_profile_output(parsed_results) - return {"timings": parsed_results.get("timings", {}), "unit": 1e-9, "str_out": str_out} - logger.warning("No line profiler output file found at %s", line_profiler_output_file) + if not line_profiler_output_file.exists(): + logger.warning("Line profiler output file not found: %s", line_profiler_output_file) + return {"timings": {}, "unit": 0, "str_out": ""} + + parsed_results = JavaScriptLineProfiler.parse_results(line_profiler_output_file) + if parsed_results.get("timings"): + # Format output string for display + str_out = self._format_js_line_profile_output(parsed_results) + return {"timings": parsed_results.get("timings", {}), "unit": 1e-9, "str_out": str_out} + + logger.warning("Line profiler output file empty or contained no timing data: %s", line_profiler_output_file) return {"timings": {}, "unit": 0, "str_out": ""} def _format_js_line_profile_output(self, parsed_results: dict) -> str: From 70e3ce1a67f0a791f30c1552cc17df6b225998ca Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:03:28 -0500 Subject: [PATCH 070/147] perf: defer cli.py imports for 7.7x faster --help MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move heavy module-level imports in cli.py (console, env_utils, code_utils, config_parser, lsp.helpers, version) into the functions that actually use them. Split main.py imports so parse_args() is called before loading the full stack — --help exits via argparse before any heavy modules load. Benchmark (Azure Standard_D4s_v5, Python 3.13, hyperfine --min-runs 30): --help: 297ms → 39ms (7.7x faster) --version: 17ms (unchanged) --- codeflash/cli_cmds/cli.py | 23 ++++++++++++++--------- codeflash/main.py | 8 ++++++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/codeflash/cli_cmds/cli.py b/codeflash/cli_cmds/cli.py index bbc26ea86..bfb29c168 100644 --- a/codeflash/cli_cmds/cli.py +++ b/codeflash/cli_cmds/cli.py @@ -5,15 +5,6 @@ from argparse import SUPPRESS, ArgumentParser, Namespace from functools import lru_cache from pathlib import Path -from codeflash.cli_cmds import logging_config -from codeflash.cli_cmds.console import apologize_and_exit, logger -from codeflash.code_utils import env_utils -from codeflash.code_utils.code_utils import exit_with_message, normalize_ignore_paths -from codeflash.code_utils.config_parser import parse_config_file -from codeflash.languages.test_framework import set_current_test_framework -from codeflash.lsp.helpers import is_LSP_enabled -from codeflash.version import __version__ as version - def parse_args() -> Namespace: parser = _build_parser() @@ -30,12 +21,17 @@ def parse_args() -> Namespace: def process_and_validate_cmd_args(args: Namespace) -> Namespace: + from codeflash.cli_cmds import logging_config + from codeflash.cli_cmds.console import apologize_and_exit, logger + from codeflash.code_utils import env_utils + from codeflash.code_utils.code_utils import exit_with_message from codeflash.code_utils.git_utils import ( check_running_in_git_repo, confirm_proceeding_with_no_git_repo, get_repo_owner_and_name, ) from codeflash.code_utils.github_utils import require_github_app_or_exit + from codeflash.version import __version__ as version if args.server: os.environ["CODEFLASH_AIS_SERVER"] = args.server @@ -85,6 +81,12 @@ def process_and_validate_cmd_args(args: Namespace) -> Namespace: def process_pyproject_config(args: Namespace) -> Namespace: + from codeflash.code_utils import env_utils + from codeflash.code_utils.code_utils import normalize_ignore_paths + from codeflash.code_utils.config_parser import parse_config_file + from codeflash.languages.test_framework import set_current_test_framework + from codeflash.lsp.helpers import is_LSP_enabled + try: pyproject_config, pyproject_file_path = parse_config_file(args.config_file) except ValueError as e: @@ -222,6 +224,9 @@ def project_root_from_module_root(module_root: Path, pyproject_file_path: Path) def handle_optimize_all_arg_parsing(args: Namespace) -> Namespace: + from codeflash.cli_cmds.console import apologize_and_exit, logger + from codeflash.code_utils.code_utils import exit_with_message + if hasattr(args, "all") or (hasattr(args, "file") and args.file): no_pr = getattr(args, "no_pr", False) diff --git a/codeflash/main.py b/codeflash/main.py index 0d4ba1ca5..8a13dbd1b 100644 --- a/codeflash/main.py +++ b/codeflash/main.py @@ -29,9 +29,14 @@ def main() -> None: print(f"Codeflash version {__version__}") return + from codeflash.cli_cmds.cli import parse_args + + args = parse_args() + + # Heavy imports deferred until after parse_args() so --help exits fast from pathlib import Path - from codeflash.cli_cmds.cli import parse_args, process_pyproject_config + from codeflash.cli_cmds.cli import process_pyproject_config from codeflash.code_utils import env_utils from codeflash.code_utils.checkpoint import ask_should_use_checkpoint_get_functions from codeflash.code_utils.config_parser import parse_config_file @@ -39,7 +44,6 @@ def main() -> None: from codeflash.telemetry import posthog_cf from codeflash.telemetry.sentry import init_sentry - args = parse_args() if args.command != "auth": print_codeflash_banner() From 05a7641405d7ab7af6266cf7b8928cbdd2c39978 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:09:00 +0000 Subject: [PATCH 071/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/cli_cmds/cli.py | 2 +- codeflash/version.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 0f1baf8bc..ba8363813 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post151.dev0+95b62113" +__version__ = "0.20.5.post185.dev0+70e3ce1a" diff --git a/codeflash/cli_cmds/cli.py b/codeflash/cli_cmds/cli.py index bfb29c168..1c3be5a35 100644 --- a/codeflash/cli_cmds/cli.py +++ b/codeflash/cli_cmds/cli.py @@ -22,7 +22,7 @@ def parse_args() -> Namespace: def process_and_validate_cmd_args(args: Namespace) -> Namespace: from codeflash.cli_cmds import logging_config - from codeflash.cli_cmds.console import apologize_and_exit, logger + from codeflash.cli_cmds.console import logger from codeflash.code_utils import env_utils from codeflash.code_utils.code_utils import exit_with_message from codeflash.code_utils.git_utils import ( diff --git a/codeflash/version.py b/codeflash/version.py index 0f1baf8bc..ba8363813 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post151.dev0+95b62113" +__version__ = "0.20.5.post185.dev0+70e3ce1a" From a8c004164e1667e9d26dd381f5f38a9968acd93b Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:13:36 -0500 Subject: [PATCH 072/147] perf: skip telemetry/banner for auth and compare commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restructure main() command dispatch so auth and compare exit early without loading telemetry (sentry, posthog), version_check, or the banner. Defer cmd_auth.py imports into functions. auth status: ~1000ms → 237ms (4.2x) compare --help: ~297ms → 38ms (7.9x) --- codeflash/cli_cmds/cmd_auth.py | 19 ++++++++------ codeflash/main.py | 46 ++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/codeflash/cli_cmds/cmd_auth.py b/codeflash/cli_cmds/cmd_auth.py index 96b863fec..148649116 100644 --- a/codeflash/cli_cmds/cmd_auth.py +++ b/codeflash/cli_cmds/cmd_auth.py @@ -2,17 +2,17 @@ from __future__ import annotations import os -import click - -from codeflash.cli_cmds.console import console -from codeflash.cli_cmds.oauth_handler import perform_oauth_signin -from codeflash.code_utils.env_utils import get_codeflash_api_key -from codeflash.code_utils.shell_utils import save_api_key_to_rc -from codeflash.either import is_successful - def auth_login() -> None: """Perform OAuth login and save the API key.""" + import click + + from codeflash.cli_cmds.console import console + from codeflash.cli_cmds.oauth_handler import perform_oauth_signin + from codeflash.code_utils.env_utils import get_codeflash_api_key + from codeflash.code_utils.shell_utils import save_api_key_to_rc + from codeflash.either import is_successful + try: existing_api_key = get_codeflash_api_key() except OSError: @@ -41,6 +41,9 @@ def auth_login() -> None: def auth_status() -> None: """Check and display current authentication status.""" + from codeflash.cli_cmds.console import console + from codeflash.code_utils.env_utils import get_codeflash_api_key + try: api_key = get_codeflash_api_key() except OSError: diff --git a/codeflash/main.py b/codeflash/main.py index 8a13dbd1b..5193fd736 100644 --- a/codeflash/main.py +++ b/codeflash/main.py @@ -33,7 +33,29 @@ def main() -> None: args = parse_args() - # Heavy imports deferred until after parse_args() so --help exits fast + # Auth commands skip banner, telemetry, and version check entirely + if args.command == "auth": + from codeflash.cli_cmds.cmd_auth import auth_login, auth_status + + if args.auth_command == "login": + auth_login() + elif args.auth_command == "status": + auth_status() + else: + from codeflash.code_utils.code_utils import exit_with_message + + exit_with_message("Usage: codeflash auth {login,status}", error_on_exit=True) + return + + # Compare command only needs its own imports + if args.command == "compare": + print_codeflash_banner() + from codeflash.cli_cmds.cmd_compare import run_compare + + run_compare(args) + return + + # All other commands need the full stack from pathlib import Path from codeflash.cli_cmds.cli import process_pyproject_config @@ -44,10 +66,7 @@ def main() -> None: from codeflash.telemetry import posthog_cf from codeflash.telemetry.sentry import init_sentry - if args.command != "auth": - print_codeflash_banner() - - # Check for newer version for all commands + print_codeflash_banner() check_for_newer_minor_version() if args.command: @@ -58,18 +77,7 @@ def main() -> None: init_sentry(enabled=not disable_telemetry, exclude_errors=True) posthog_cf.initialize_posthog(enabled=not disable_telemetry) - if args.command == "auth": - from codeflash.cli_cmds.cmd_auth import auth_login, auth_status - - if args.auth_command == "login": - auth_login() - elif args.auth_command == "status": - auth_status() - else: - from codeflash.code_utils.code_utils import exit_with_message - - exit_with_message("Usage: codeflash auth {login,status}", error_on_exit=True) - elif args.command == "init": + if args.command == "init": from codeflash.cli_cmds.cmd_init import init_codeflash init_codeflash() @@ -81,10 +89,6 @@ def main() -> None: from codeflash.cli_cmds.extension import install_vscode_extension install_vscode_extension() - elif args.command == "compare": - from codeflash.cli_cmds.cmd_compare import run_compare - - run_compare(args) elif args.command == "optimize": from codeflash.tracer import main as tracer_main From 1e8e5d2cc2215ee17c67a1abe710ed12b686f7c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:14:58 +0000 Subject: [PATCH 073/147] style: auto-format with ruff --- codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index ba8363813..96ae2807e 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post185.dev0+70e3ce1a" +__version__ = "0.20.5.post187.dev0+a8c00416" diff --git a/codeflash/version.py b/codeflash/version.py index ba8363813..96ae2807e 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post185.dev0+70e3ce1a" +__version__ = "0.20.5.post187.dev0+a8c00416" From 992e91abc732adc088f5cd3264ba0f843973258c Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:19:37 -0500 Subject: [PATCH 074/147] fix: prevent ruff auto-format from rewriting version.py placeholders uv-dynamic-versioning rewrites version.py on every `uv run`, so the ruff auto-format job was inadvertently committing dev version strings. Restore version.py files after formatting and revert the ones already changed on this branch. --- .github/workflows/ci.yaml | 2 ++ codeflash-benchmark/codeflash_benchmark/version.py | 2 +- codeflash/version.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 87422cbd5..63c83149f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -199,6 +199,8 @@ jobs: run: | uv run ruff check --fix . || true uv run ruff format . + # uv-dynamic-versioning rewrites version.py on every `uv run` — discard those changes + git checkout HEAD -- codeflash/version.py codeflash-benchmark/codeflash_benchmark/version.py 2>/dev/null || true - name: Commit and push fixes run: | diff --git a/codeflash-benchmark/codeflash_benchmark/version.py b/codeflash-benchmark/codeflash_benchmark/version.py index 96ae2807e..0f1baf8bc 100644 --- a/codeflash-benchmark/codeflash_benchmark/version.py +++ b/codeflash-benchmark/codeflash_benchmark/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post187.dev0+a8c00416" +__version__ = "0.20.5.post151.dev0+95b62113" diff --git a/codeflash/version.py b/codeflash/version.py index 96ae2807e..0f1baf8bc 100644 --- a/codeflash/version.py +++ b/codeflash/version.py @@ -1,2 +1,2 @@ # These version placeholders will be replaced by uv-dynamic-versioning during build. -__version__ = "0.20.5.post187.dev0+a8c00416" +__version__ = "0.20.5.post151.dev0+95b62113" From 2fc528ebda69d9e2de250093aa50a4a518f9e87c Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:29:31 -0500 Subject: [PATCH 075/147] perf: defer heavy imports in env_utils and shell_utils MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Defer console, formatter, code_utils, registry, and lsp.helpers imports from module level into the functions that use them. Inline is_LSP_enabled (a one-liner env var check) to avoid importing lsp.helpers on the happy path of get_codeflash_api_key. auth status: 237ms → 160ms on Azure Standard_D4s_v5. --- codeflash/code_utils/env_utils.py | 20 +++++++++++++------- codeflash/code_utils/shell_utils.py | 7 ++++++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/codeflash/code_utils/env_utils.py b/codeflash/code_utils/env_utils.py index 03c7abef2..eddf94c1d 100644 --- a/codeflash/code_utils/env_utils.py +++ b/codeflash/code_utils/env_utils.py @@ -9,17 +9,16 @@ from functools import lru_cache from pathlib import Path from typing import Any, Optional -from codeflash.cli_cmds.console import logger -from codeflash.code_utils.code_utils import exit_with_message -from codeflash.code_utils.formatter import format_code from codeflash.code_utils.shell_utils import read_api_key_from_shell_config, save_api_key_to_rc -from codeflash.languages.registry import get_language_support_by_common_formatters -from codeflash.lsp.helpers import is_LSP_enabled def check_formatter_installed( formatter_cmds: list[str], exit_on_failure: bool = True, language: str = "python" ) -> bool: + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.code_utils.formatter import format_code # noqa: PLC0415 + from codeflash.languages.registry import get_language_support_by_common_formatters # noqa: PLC0415 + if not formatter_cmds or formatter_cmds[0] == "disabled": return True first_cmd = formatter_cmds[0] @@ -69,6 +68,8 @@ def check_formatter_installed( @lru_cache(maxsize=1) def get_codeflash_api_key() -> str: + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + # Check environment variable first env_api_key = os.environ.get("CODEFLASH_API_KEY") shell_api_key = read_api_key_from_shell_config() @@ -78,7 +79,7 @@ def get_codeflash_api_key() -> str: # If we have an env var but it's not in shell config, save it for persistence if env_api_key and not shell_api_key: try: - from codeflash.either import is_successful + from codeflash.either import is_successful # noqa: PLC0415 logger.debug("env_utils.py:get_codeflash_api_key - Saving API key from environment to shell config") result = save_api_key_to_rc(env_api_key) @@ -96,7 +97,8 @@ def get_codeflash_api_key() -> str: # Prefer the shell configuration over environment variables for lsp, # as the API key may change in the RC file during lsp runtime. Since the LSP client (extension) can restart # within the same process, the environment variable could become outdated. - api_key = shell_api_key or env_api_key if is_LSP_enabled() else env_api_key or shell_api_key + is_lsp = os.getenv("CODEFLASH_LSP", default="false").lower() == "true" + api_key = shell_api_key or env_api_key if is_lsp else env_api_key or shell_api_key api_secret_docs_message = "For more information, refer to the documentation at [https://docs.codeflash.ai/optimizing-with-codeflash/codeflash-github-actions#manual-setup]." # noqa if not api_key: @@ -106,6 +108,8 @@ def get_codeflash_api_key() -> str: f"{api_secret_docs_message}" ) if is_repo_a_fork(): + from codeflash.code_utils.code_utils import exit_with_message # noqa: PLC0415 + msg = ( "Codeflash API key not detected in your environment. It appears you're running Codeflash from a GitHub fork.\n" "For external contributors, please ensure you've added your own API key to your fork's repository secrets and set it as the CODEFLASH_API_KEY environment variable.\n" @@ -124,6 +128,8 @@ def get_codeflash_api_key() -> str: def ensure_codeflash_api_key() -> bool: + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + try: get_codeflash_api_key() except OSError: diff --git a/codeflash/code_utils/shell_utils.py b/codeflash/code_utils/shell_utils.py index 1569b51a1..52e161921 100644 --- a/codeflash/code_utils/shell_utils.py +++ b/codeflash/code_utils/shell_utils.py @@ -8,7 +8,6 @@ import sys from pathlib import Path from typing import TYPE_CHECKING, Optional -from codeflash.cli_cmds.console import logger from codeflash.code_utils.compat import LF from codeflash.either import Failure, Success @@ -41,6 +40,8 @@ def is_powershell() -> bool: 2. COMSPEC pointing to powershell.exe 3. TERM_PROGRAM indicating Windows Terminal (often uses PowerShell) """ + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + if os.name != "nt": return False @@ -72,6 +73,8 @@ def is_powershell() -> bool: def read_api_key_from_shell_config() -> Optional[str]: """Read API key from shell configuration file.""" + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + shell_rc_path = get_shell_rc_path() # Ensure shell_rc_path is a Path object for consistent handling if not isinstance(shell_rc_path, Path): @@ -127,6 +130,8 @@ def get_api_key_export_line(api_key: str) -> str: def save_api_key_to_rc(api_key: str) -> Result[str, str]: """Save API key to the appropriate shell configuration file.""" + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + shell_rc_path = get_shell_rc_path() # Ensure shell_rc_path is a Path object for consistent handling if not isinstance(shell_rc_path, Path): From 88babfef2502b81d3a0e02cc6d059286965a5df1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:30:36 +0000 Subject: [PATCH 076/147] style: auto-format with ruff --- codeflash/code_utils/env_utils.py | 14 +++++++------- codeflash/code_utils/shell_utils.py | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/codeflash/code_utils/env_utils.py b/codeflash/code_utils/env_utils.py index eddf94c1d..eb2cab1d9 100644 --- a/codeflash/code_utils/env_utils.py +++ b/codeflash/code_utils/env_utils.py @@ -15,9 +15,9 @@ from codeflash.code_utils.shell_utils import read_api_key_from_shell_config, sav def check_formatter_installed( formatter_cmds: list[str], exit_on_failure: bool = True, language: str = "python" ) -> bool: - from codeflash.cli_cmds.console import logger # noqa: PLC0415 - from codeflash.code_utils.formatter import format_code # noqa: PLC0415 - from codeflash.languages.registry import get_language_support_by_common_formatters # noqa: PLC0415 + from codeflash.cli_cmds.console import logger + from codeflash.code_utils.formatter import format_code + from codeflash.languages.registry import get_language_support_by_common_formatters if not formatter_cmds or formatter_cmds[0] == "disabled": return True @@ -68,7 +68,7 @@ def check_formatter_installed( @lru_cache(maxsize=1) def get_codeflash_api_key() -> str: - from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.cli_cmds.console import logger # Check environment variable first env_api_key = os.environ.get("CODEFLASH_API_KEY") @@ -79,7 +79,7 @@ def get_codeflash_api_key() -> str: # If we have an env var but it's not in shell config, save it for persistence if env_api_key and not shell_api_key: try: - from codeflash.either import is_successful # noqa: PLC0415 + from codeflash.either import is_successful logger.debug("env_utils.py:get_codeflash_api_key - Saving API key from environment to shell config") result = save_api_key_to_rc(env_api_key) @@ -108,7 +108,7 @@ def get_codeflash_api_key() -> str: f"{api_secret_docs_message}" ) if is_repo_a_fork(): - from codeflash.code_utils.code_utils import exit_with_message # noqa: PLC0415 + from codeflash.code_utils.code_utils import exit_with_message msg = ( "Codeflash API key not detected in your environment. It appears you're running Codeflash from a GitHub fork.\n" @@ -128,7 +128,7 @@ def get_codeflash_api_key() -> str: def ensure_codeflash_api_key() -> bool: - from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.cli_cmds.console import logger try: get_codeflash_api_key() diff --git a/codeflash/code_utils/shell_utils.py b/codeflash/code_utils/shell_utils.py index 52e161921..fa17045bf 100644 --- a/codeflash/code_utils/shell_utils.py +++ b/codeflash/code_utils/shell_utils.py @@ -40,7 +40,7 @@ def is_powershell() -> bool: 2. COMSPEC pointing to powershell.exe 3. TERM_PROGRAM indicating Windows Terminal (often uses PowerShell) """ - from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.cli_cmds.console import logger if os.name != "nt": return False @@ -73,7 +73,7 @@ def is_powershell() -> bool: def read_api_key_from_shell_config() -> Optional[str]: """Read API key from shell configuration file.""" - from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.cli_cmds.console import logger shell_rc_path = get_shell_rc_path() # Ensure shell_rc_path is a Path object for consistent handling @@ -130,7 +130,7 @@ def get_api_key_export_line(api_key: str) -> str: def save_api_key_to_rc(api_key: str) -> Result[str, str]: """Save API key to the appropriate shell configuration file.""" - from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.cli_cmds.console import logger shell_rc_path = get_shell_rc_path() # Ensure shell_rc_path is a Path object for consistent handling From 436d64284725508e20614a1427f45a611b75ec2a Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:38:26 -0500 Subject: [PATCH 077/147] perf: defer libcst, Rich, comparator imports in models.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move libcst, rich.tree.Tree, console, comparator, code_utils, registry, lsp.helpers, and LspMarkdownMessage from module-level to the methods that use them. Only pydantic and TestType remain at module level (needed for class definitions). models.py import: 633ms → 125ms on Azure Standard_D4s_v5. --- codeflash/models/models.py | 61 ++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/codeflash/models/models.py b/codeflash/models/models.py index 8ac873b70..4931a3af2 100644 --- a/codeflash/models/models.py +++ b/codeflash/models/models.py @@ -1,37 +1,23 @@ from __future__ import annotations -from collections import Counter, defaultdict -from functools import lru_cache -from typing import TYPE_CHECKING - -import libcst as cst -from rich.tree import Tree - -from codeflash.cli_cmds.console import DEBUG_MODE, lsp_log -from codeflash.languages.registry import get_language_support -from codeflash.lsp.helpers import is_LSP_enabled, report_to_markdown_table -from codeflash.lsp.lsp_message import LspMarkdownMessage -from codeflash.models.test_type import TestType - -if TYPE_CHECKING: - from collections.abc import Iterator - import enum import re import sys +from collections import Counter, defaultdict from collections.abc import Collection from enum import Enum, IntEnum +from functools import lru_cache from pathlib import Path from re import Pattern -from typing import Any, NamedTuple, Optional, cast +from typing import TYPE_CHECKING, Any, NamedTuple, Optional, cast from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, ValidationError, model_validator from pydantic.dataclasses import dataclass -from codeflash.cli_cmds.console import console, logger -from codeflash.code_utils.code_utils import diff_length, module_name_from_file_path, validate_python_code -from codeflash.code_utils.env_utils import is_end_to_end -from codeflash.verification.comparator import comparator +from codeflash.models.test_type import TestType + +if TYPE_CHECKING: + from collections.abc import Iterator @dataclass(frozen=True) @@ -254,6 +240,8 @@ class CodeString(BaseModel): def validate_code_syntax(self) -> CodeString: """Validate code syntax for the specified language.""" if self.language == "python": + from codeflash.code_utils.code_utils import validate_python_code # noqa: PLC0415 + validate_python_code(self.code) else: from codeflash.languages.registry import get_language_support @@ -267,6 +255,8 @@ class CodeString(BaseModel): def get_comment_prefix(file_path: Path) -> str: """Get the comment prefix for a given language.""" + from codeflash.languages.registry import get_language_support # noqa: PLC0415 + support = get_language_support(file_path) return support.comment_prefix @@ -565,6 +555,8 @@ class CandidateEvaluationContext: self.optimizations_post[past_opt_id] = self.ast_code_to_id[normalized_code]["shorter_source_code"].markdown # Update to shorter code if this candidate has a shorter diff + from codeflash.code_utils.code_utils import diff_length # noqa: PLC0415 + new_diff_len = diff_length(candidate.source_code.flat, original_flat_code) if new_diff_len < self.ast_code_to_id[normalized_code]["diff_len"]: self.ast_code_to_id[normalized_code]["shorter_source_code"] = candidate.source_code @@ -574,6 +566,8 @@ class CandidateEvaluationContext: self, normalized_code: str, candidate: OptimizedCandidate, original_flat_code: str ) -> None: """Register a new candidate that hasn't been seen before.""" + from codeflash.code_utils.code_utils import diff_length # noqa: PLC0415 + self.ast_code_to_id[normalized_code] = { "optimization_id": candidate.optimization_id, "shorter_source_code": candidate.source_code, @@ -668,7 +662,10 @@ class CoverageData: return f"{self.coverage:.1f}%" def log_coverage(self) -> None: - from rich.tree import Tree + from rich.tree import Tree # noqa: PLC0415 + + from codeflash.cli_cmds.console import console, logger # noqa: PLC0415 + from codeflash.code_utils.env_utils import is_end_to_end # noqa: PLC0415 tree = Tree("Test Coverage Results") tree.add(f"Main Function: {self.main_func_coverage.name}: {self.coverage:.2f}%") @@ -769,12 +766,16 @@ class InvocationId: ) def find_func_in_class(self, class_node: cst.ClassDef, func_name: str) -> Optional[cst.FunctionDef]: + import libcst as cst # noqa: PLC0415 + for stmt in class_node.body.body: if isinstance(stmt, cst.FunctionDef) and stmt.name.value == func_name: return stmt return None def get_src_code(self, test_path: Path) -> Optional[str]: + import libcst as cst # noqa: PLC0415 + if not test_path.exists(): return None try: @@ -856,6 +857,8 @@ class TestResults(BaseModel): # noqa: PLW1641 unique_id = function_test_invocation.unique_invocation_loop_id test_result_idx = self.test_result_idx if unique_id in test_result_idx: + from codeflash.cli_cmds.console import DEBUG_MODE, logger # noqa: PLC0415 + if DEBUG_MODE: logger.warning(f"Test result with id {unique_id} already exists. SKIPPING") return @@ -876,6 +879,8 @@ class TestResults(BaseModel): # noqa: PLW1641 self, benchmark_keys: list[BenchmarkKey], benchmark_replay_test_dir: Path, project_root: Path ) -> dict[BenchmarkKey, TestResults]: """Group TestResults by benchmark for calculating improvements for each benchmark.""" + from codeflash.code_utils.code_utils import module_name_from_file_path # noqa: PLC0415 + test_results_by_benchmark = defaultdict(TestResults) benchmark_module_path = {} for benchmark_key in benchmark_keys: @@ -929,9 +934,17 @@ class TestResults(BaseModel): # noqa: PLW1641 @staticmethod def report_to_tree(report: dict[TestType, dict[str, int]], title: str) -> Tree: + from rich.tree import Tree # noqa: PLC0415 + + from codeflash.lsp.helpers import is_LSP_enabled # noqa: PLC0415 + tree = Tree(title) if is_LSP_enabled(): + from codeflash.cli_cmds.console import lsp_log # noqa: PLC0415 + from codeflash.lsp.helpers import report_to_markdown_table # noqa: PLC0415 + from codeflash.lsp.lsp_message import LspMarkdownMessage # noqa: PLC0415 + # Build markdown table markdown = report_to_markdown_table(report, title) lsp_log(LspMarkdownMessage(markdown=markdown)) @@ -946,6 +959,8 @@ class TestResults(BaseModel): # noqa: PLW1641 return tree def usable_runtime_data_by_test_case(self) -> dict[InvocationId, list[int]]: + from codeflash.cli_cmds.console import logger # noqa: PLC0415 + # Efficient single traversal, directly accumulating into a dict. # can track mins here and only sums can be return in total_passed_runtime by_id: dict[InvocationId, list[int]] = {} @@ -1025,6 +1040,8 @@ class TestResults(BaseModel): # noqa: PLW1641 return bool(self.test_results) def __eq__(self, other: object) -> bool: + from codeflash.verification.comparator import comparator # noqa: PLC0415 + # Unordered comparison if type(self) is not type(other): return False From 61053be9ce8f26567062d1f98d3087a7fdd119b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:39:45 +0000 Subject: [PATCH 078/147] style: auto-format with ruff --- codeflash/models/models.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/codeflash/models/models.py b/codeflash/models/models.py index 4931a3af2..9269bdabc 100644 --- a/codeflash/models/models.py +++ b/codeflash/models/models.py @@ -240,7 +240,7 @@ class CodeString(BaseModel): def validate_code_syntax(self) -> CodeString: """Validate code syntax for the specified language.""" if self.language == "python": - from codeflash.code_utils.code_utils import validate_python_code # noqa: PLC0415 + from codeflash.code_utils.code_utils import validate_python_code validate_python_code(self.code) else: @@ -255,7 +255,7 @@ class CodeString(BaseModel): def get_comment_prefix(file_path: Path) -> str: """Get the comment prefix for a given language.""" - from codeflash.languages.registry import get_language_support # noqa: PLC0415 + from codeflash.languages.registry import get_language_support support = get_language_support(file_path) return support.comment_prefix @@ -555,7 +555,7 @@ class CandidateEvaluationContext: self.optimizations_post[past_opt_id] = self.ast_code_to_id[normalized_code]["shorter_source_code"].markdown # Update to shorter code if this candidate has a shorter diff - from codeflash.code_utils.code_utils import diff_length # noqa: PLC0415 + from codeflash.code_utils.code_utils import diff_length new_diff_len = diff_length(candidate.source_code.flat, original_flat_code) if new_diff_len < self.ast_code_to_id[normalized_code]["diff_len"]: @@ -566,7 +566,7 @@ class CandidateEvaluationContext: self, normalized_code: str, candidate: OptimizedCandidate, original_flat_code: str ) -> None: """Register a new candidate that hasn't been seen before.""" - from codeflash.code_utils.code_utils import diff_length # noqa: PLC0415 + from codeflash.code_utils.code_utils import diff_length self.ast_code_to_id[normalized_code] = { "optimization_id": candidate.optimization_id, @@ -662,10 +662,10 @@ class CoverageData: return f"{self.coverage:.1f}%" def log_coverage(self) -> None: - from rich.tree import Tree # noqa: PLC0415 + from rich.tree import Tree - from codeflash.cli_cmds.console import console, logger # noqa: PLC0415 - from codeflash.code_utils.env_utils import is_end_to_end # noqa: PLC0415 + from codeflash.cli_cmds.console import console, logger + from codeflash.code_utils.env_utils import is_end_to_end tree = Tree("Test Coverage Results") tree.add(f"Main Function: {self.main_func_coverage.name}: {self.coverage:.2f}%") @@ -766,7 +766,7 @@ class InvocationId: ) def find_func_in_class(self, class_node: cst.ClassDef, func_name: str) -> Optional[cst.FunctionDef]: - import libcst as cst # noqa: PLC0415 + import libcst as cst for stmt in class_node.body.body: if isinstance(stmt, cst.FunctionDef) and stmt.name.value == func_name: @@ -774,7 +774,7 @@ class InvocationId: return None def get_src_code(self, test_path: Path) -> Optional[str]: - import libcst as cst # noqa: PLC0415 + import libcst as cst if not test_path.exists(): return None @@ -857,7 +857,7 @@ class TestResults(BaseModel): # noqa: PLW1641 unique_id = function_test_invocation.unique_invocation_loop_id test_result_idx = self.test_result_idx if unique_id in test_result_idx: - from codeflash.cli_cmds.console import DEBUG_MODE, logger # noqa: PLC0415 + from codeflash.cli_cmds.console import DEBUG_MODE, logger if DEBUG_MODE: logger.warning(f"Test result with id {unique_id} already exists. SKIPPING") @@ -879,7 +879,7 @@ class TestResults(BaseModel): # noqa: PLW1641 self, benchmark_keys: list[BenchmarkKey], benchmark_replay_test_dir: Path, project_root: Path ) -> dict[BenchmarkKey, TestResults]: """Group TestResults by benchmark for calculating improvements for each benchmark.""" - from codeflash.code_utils.code_utils import module_name_from_file_path # noqa: PLC0415 + from codeflash.code_utils.code_utils import module_name_from_file_path test_results_by_benchmark = defaultdict(TestResults) benchmark_module_path = {} @@ -934,16 +934,16 @@ class TestResults(BaseModel): # noqa: PLW1641 @staticmethod def report_to_tree(report: dict[TestType, dict[str, int]], title: str) -> Tree: - from rich.tree import Tree # noqa: PLC0415 + from rich.tree import Tree - from codeflash.lsp.helpers import is_LSP_enabled # noqa: PLC0415 + from codeflash.lsp.helpers import is_LSP_enabled tree = Tree(title) if is_LSP_enabled(): - from codeflash.cli_cmds.console import lsp_log # noqa: PLC0415 - from codeflash.lsp.helpers import report_to_markdown_table # noqa: PLC0415 - from codeflash.lsp.lsp_message import LspMarkdownMessage # noqa: PLC0415 + from codeflash.cli_cmds.console import lsp_log + from codeflash.lsp.helpers import report_to_markdown_table + from codeflash.lsp.lsp_message import LspMarkdownMessage # Build markdown table markdown = report_to_markdown_table(report, title) @@ -959,7 +959,7 @@ class TestResults(BaseModel): # noqa: PLW1641 return tree def usable_runtime_data_by_test_case(self) -> dict[InvocationId, list[int]]: - from codeflash.cli_cmds.console import logger # noqa: PLC0415 + from codeflash.cli_cmds.console import logger # Efficient single traversal, directly accumulating into a dict. # can track mins here and only sums can be return in total_passed_runtime @@ -1040,7 +1040,7 @@ class TestResults(BaseModel): # noqa: PLW1641 return bool(self.test_results) def __eq__(self, other: object) -> bool: - from codeflash.verification.comparator import comparator # noqa: PLC0415 + from codeflash.verification.comparator import comparator # Unordered comparison if type(self) is not type(other): From b533f50bdcbca3b8bbfe3e2dc8bbefbcfc0a9e03 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:46:33 -0500 Subject: [PATCH 079/147] perf: backport libcst visitor dispatch cache from codeflash-python Cache the visitor dispatch tables that libcst rebuilds on every MatcherDecoratableTransformer/Visitor instantiation. The tables depend only on the class, not the instance, so caching by type is safe. Saves ~27ms per visitor instantiation (24x faster). Also fix pre-existing ruff F821 in cli.py (missing exit_with_message import in process_pyproject_config). --- .../instrument_codeflash_trace.py | 1 + codeflash/cli_cmds/cli.py | 2 +- codeflash/code_utils/_libcst_cache.py | 64 +++++++++++++++++++ .../code_utils/instrument_existing_tests.py | 1 + codeflash/languages/function_optimizer.py | 1 + .../python/context/code_context_extractor.py | 1 + .../context/unused_definition_remover.py | 1 + .../python/static_analysis/code_extractor.py | 1 + .../python/static_analysis/code_replacer.py | 1 + .../static_analysis/edit_generated_tests.py | 1 + .../static_analysis/line_profile_utils.py | 1 + codeflash/languages/python/support.py | 1 + codeflash/models/models.py | 3 + 13 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 codeflash/code_utils/_libcst_cache.py diff --git a/codeflash/benchmarking/instrument_codeflash_trace.py b/codeflash/benchmarking/instrument_codeflash_trace.py index bc779dd9c..c5797ccad 100644 --- a/codeflash/benchmarking/instrument_codeflash_trace.py +++ b/codeflash/benchmarking/instrument_codeflash_trace.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Optional, Union import libcst as cst +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.code_utils.formatter import sort_imports if TYPE_CHECKING: diff --git a/codeflash/cli_cmds/cli.py b/codeflash/cli_cmds/cli.py index 1c3be5a35..400403843 100644 --- a/codeflash/cli_cmds/cli.py +++ b/codeflash/cli_cmds/cli.py @@ -82,7 +82,7 @@ def process_and_validate_cmd_args(args: Namespace) -> Namespace: def process_pyproject_config(args: Namespace) -> Namespace: from codeflash.code_utils import env_utils - from codeflash.code_utils.code_utils import normalize_ignore_paths + from codeflash.code_utils.code_utils import exit_with_message, normalize_ignore_paths from codeflash.code_utils.config_parser import parse_config_file from codeflash.languages.test_framework import set_current_test_framework from codeflash.lsp.helpers import is_LSP_enabled diff --git a/codeflash/code_utils/_libcst_cache.py b/codeflash/code_utils/_libcst_cache.py new file mode 100644 index 000000000..0db7e258a --- /dev/null +++ b/codeflash/code_utils/_libcst_cache.py @@ -0,0 +1,64 @@ +"""Cache libcst visitor dispatch table construction. + +libcst's ``MatcherDecoratableTransformer`` and +``MatcherDecoratableVisitor`` rebuild visitor dispatch tables on +every instantiation by iterating ``dir(self)`` (~600 attributes) +and calling ``getattr`` + ``inspect.ismethod`` on each. The +results depend only on the class, not the instance, so caching +by ``type(obj)`` is safe. + +Import this module before any libcst visitors are instantiated +to install the cache. +""" + +from __future__ import annotations + +from typing import Any + +import libcst.matchers._visitors as _mv + +_visit_cache: dict[type, Any] = {} +_leave_cache: dict[type, Any] = {} +_matchers_cache: dict[type, Any] = {} + +_original_visit = _mv._gather_constructed_visit_funcs # noqa: SLF001 +_original_leave = _mv._gather_constructed_leave_funcs # noqa: SLF001 +_original_matchers = _mv._gather_matchers # noqa: SLF001 + + +def _cached_visit(obj: object) -> Any: + """Return cached visit-function dispatch table for the object's class.""" + cls = type(obj) + try: + return _visit_cache[cls] + except KeyError: + result = _original_visit(obj) + _visit_cache[cls] = result + return result + + +def _cached_leave(obj: object) -> Any: + """Return cached leave-function dispatch table for the object's class.""" + cls = type(obj) + try: + return _leave_cache[cls] + except KeyError: + result = _original_leave(obj) + _leave_cache[cls] = result + return result + + +def _cached_matchers(obj: object) -> Any: + """Return cached matcher dispatch table for the object's class.""" + cls = type(obj) + try: + return dict(_matchers_cache[cls]) + except KeyError: + result = _original_matchers(obj) + _matchers_cache[cls] = result + return dict(result) + + +_mv._gather_constructed_visit_funcs = _cached_visit # noqa: SLF001 +_mv._gather_constructed_leave_funcs = _cached_leave # noqa: SLF001 +_mv._gather_matchers = _cached_matchers # noqa: SLF001 diff --git a/codeflash/code_utils/instrument_existing_tests.py b/codeflash/code_utils/instrument_existing_tests.py index f15b2d56a..02450bb12 100644 --- a/codeflash/code_utils/instrument_existing_tests.py +++ b/codeflash/code_utils/instrument_existing_tests.py @@ -7,6 +7,7 @@ from typing import TYPE_CHECKING import libcst as cst +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.cli_cmds.console import logger from codeflash.code_utils.code_utils import get_run_tmp_file, module_name_from_file_path from codeflash.code_utils.formatter import sort_imports diff --git a/codeflash/languages/function_optimizer.py b/codeflash/languages/function_optimizer.py index 7a5322857..d9b4918fd 100644 --- a/codeflash/languages/function_optimizer.py +++ b/codeflash/languages/function_optimizer.py @@ -20,6 +20,7 @@ from rich.syntax import Syntax from rich.text import Text from rich.tree import Tree +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.api.aiservice import AiServiceClient, AIServiceRefinerRequest, LocalAiServiceClient from codeflash.api.cfapi import add_code_context_hash, create_staging, get_cfapi_base_urls, mark_optimization_success from codeflash.benchmarking.utils import process_benchmark_data diff --git a/codeflash/languages/python/context/code_context_extractor.py b/codeflash/languages/python/context/code_context_extractor.py index 4fdbd5291..67abdae6b 100644 --- a/codeflash/languages/python/context/code_context_extractor.py +++ b/codeflash/languages/python/context/code_context_extractor.py @@ -11,6 +11,7 @@ from typing import TYPE_CHECKING, Any import libcst as cst +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.cli_cmds.console import logger from codeflash.code_utils.code_utils import encoded_tokens_len, get_qualified_name, path_belongs_to_site_packages from codeflash.code_utils.config_consts import ( diff --git a/codeflash/languages/python/context/unused_definition_remover.py b/codeflash/languages/python/context/unused_definition_remover.py index 575797b3d..355a23528 100644 --- a/codeflash/languages/python/context/unused_definition_remover.py +++ b/codeflash/languages/python/context/unused_definition_remover.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Optional, Union import libcst as cst +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.cli_cmds.console import logger from codeflash.languages import current_language from codeflash.languages.base import Language diff --git a/codeflash/languages/python/static_analysis/code_extractor.py b/codeflash/languages/python/static_analysis/code_extractor.py index 899ee438f..132e8f078 100644 --- a/codeflash/languages/python/static_analysis/code_extractor.py +++ b/codeflash/languages/python/static_analysis/code_extractor.py @@ -11,6 +11,7 @@ from libcst.codemod import CodemodContext from libcst.codemod.visitors import AddImportsVisitor, GatherImportsVisitor, RemoveImportsVisitor from libcst.helpers import calculate_module_and_package +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.cli_cmds.console import logger from codeflash.code_utils.config_consts import MAX_CONTEXT_LEN_REVIEW from codeflash.languages.base import Language diff --git a/codeflash/languages/python/static_analysis/code_replacer.py b/codeflash/languages/python/static_analysis/code_replacer.py index 89dc2751e..2383f0930 100644 --- a/codeflash/languages/python/static_analysis/code_replacer.py +++ b/codeflash/languages/python/static_analysis/code_replacer.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, TypeVar import libcst as cst from libcst.metadata import PositionProvider +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.cli_cmds.console import logger from codeflash.code_utils.config_parser import find_conftest_files from codeflash.code_utils.formatter import sort_imports diff --git a/codeflash/languages/python/static_analysis/edit_generated_tests.py b/codeflash/languages/python/static_analysis/edit_generated_tests.py index c4aed07de..6ee1e06a0 100644 --- a/codeflash/languages/python/static_analysis/edit_generated_tests.py +++ b/codeflash/languages/python/static_analysis/edit_generated_tests.py @@ -10,6 +10,7 @@ import libcst as cst from libcst import MetadataWrapper from libcst.metadata import PositionProvider +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.cli_cmds.console import logger from codeflash.code_utils.time_utils import format_perf, format_time from codeflash.models.models import GeneratedTests, GeneratedTestsList diff --git a/codeflash/languages/python/static_analysis/line_profile_utils.py b/codeflash/languages/python/static_analysis/line_profile_utils.py index 93997b2c6..b7857e161 100644 --- a/codeflash/languages/python/static_analysis/line_profile_utils.py +++ b/codeflash/languages/python/static_analysis/line_profile_utils.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Union import libcst as cst +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.code_utils.code_utils import get_run_tmp_file from codeflash.code_utils.formatter import sort_imports diff --git a/codeflash/languages/python/support.py b/codeflash/languages/python/support.py index 34f0527b2..356a3d216 100644 --- a/codeflash/languages/python/support.py +++ b/codeflash/languages/python/support.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Any import libcst as cst +import codeflash.code_utils._libcst_cache # noqa: F401 from codeflash.discovery.functions_to_optimize import FunctionToOptimize from codeflash.languages.base import ( CodeContext, diff --git a/codeflash/models/models.py b/codeflash/models/models.py index 9269bdabc..640e5230a 100644 --- a/codeflash/models/models.py +++ b/codeflash/models/models.py @@ -19,6 +19,9 @@ from codeflash.models.test_type import TestType if TYPE_CHECKING: from collections.abc import Iterator + import libcst as cst + from rich.tree import Tree + @dataclass(frozen=True) class AIServiceRefinerRequest: From 2208e8ca77b40a7703edec65ccaed99cc7271601 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 9 Apr 2026 23:59:26 -0500 Subject: [PATCH 080/147] bench: add CLI startup benchmark for codeflash compare --script Measures median wall-clock time for --version, --help, auth status, and compare --help across 30 runs with 3 warmups. Usage: codeflash compare main codeflash/optimize \ --script "python benchmarks/bench_cli_startup.py" \ --script-output benchmarks/results.json --- benchmarks/__init__.py | 0 benchmarks/bench_cli_startup.py | 72 +++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 benchmarks/__init__.py create mode 100644 benchmarks/bench_cli_startup.py diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/bench_cli_startup.py b/benchmarks/bench_cli_startup.py new file mode 100644 index 000000000..e6b8e0ad0 --- /dev/null +++ b/benchmarks/bench_cli_startup.py @@ -0,0 +1,72 @@ +"""Benchmark CLI startup latency for codeflash compare --script mode. + +Run from a worktree root. Installs deps via uv sync, then times several +CLI entry points and writes a JSON file mapping command names to median +wall-clock seconds. + +Usage: + codeflash compare main codeflash/optimize \ + --script "python benchmarks/bench_cli_startup.py" \ + --script-output benchmarks/results.json +""" + +from __future__ import annotations + +import json +import os +import subprocess +import time +from pathlib import Path + +WARMUP = 3 +RUNS = 30 +OUTPUT = os.environ.get("BENCH_OUTPUT", "benchmarks/results.json") + +COMMANDS: dict[str, list[str]] = { + "version": ["uv", "run", "codeflash", "--version"], + "help": ["uv", "run", "codeflash", "--help"], + "auth_status": ["uv", "run", "codeflash", "auth", "status"], + "compare_help": ["uv", "run", "codeflash", "compare", "--help"], +} + + +def measure(cmd: list[str], warmup: int = WARMUP, runs: int = RUNS) -> float: + """Return median wall-clock seconds for *cmd* over *runs* iterations.""" + env = {**os.environ, "CODEFLASH_API_KEY": "bench_dummy_key"} + for _ in range(warmup): + subprocess.run(cmd, capture_output=True, check=False, env=env) + + times: list[float] = [] + for _ in range(runs): + t0 = time.perf_counter() + subprocess.run(cmd, capture_output=True, check=False, env=env) + times.append(time.perf_counter() - t0) + + times.sort() + mid = len(times) // 2 + return times[mid] if len(times) % 2 else (times[mid - 1] + times[mid]) / 2 + + +def main() -> None: + # Ensure deps are installed in the worktree + subprocess.run(["uv", "sync"], check=True, capture_output=True) + + results: dict[str, float] = {} + for name, cmd in COMMANDS.items(): + print(f" {name}: ", end="", flush=True) + median = measure(cmd) + results[name] = round(median, 4) + print(f"{median * 1000:.0f} ms") + + # Total = sum of medians (useful for a single summary number) + results["__total__"] = round(sum(results.values()), 4) + + output_path = Path(OUTPUT) + output_path.parent.mkdir(parents=True, exist_ok=True) + with output_path.open("w") as f: + json.dump(results, f, indent=2) + print(f"\nResults written to {OUTPUT}") + + +if __name__ == "__main__": + main() From 1a25f05e14c95e2c96caa8dd0eb12f67015da547 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 00:10:36 -0500 Subject: [PATCH 081/147] fix: remove unnecessary Optimizer from benchmark test The test only needs project_root, not a full Optimizer (which requires an API key). Also adds missing __init__.py to tests/benchmarks/. --- tests/benchmarks/__init__.py | 0 ...est_benchmark_code_extract_code_context.py | 19 +++---------------- 2 files changed, 3 insertions(+), 16 deletions(-) create mode 100644 tests/benchmarks/__init__.py diff --git a/tests/benchmarks/__init__.py b/tests/benchmarks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/benchmarks/test_benchmark_code_extract_code_context.py b/tests/benchmarks/test_benchmark_code_extract_code_context.py index 4fe06b14d..81b4eaa53 100644 --- a/tests/benchmarks/test_benchmark_code_extract_code_context.py +++ b/tests/benchmarks/test_benchmark_code_extract_code_context.py @@ -1,31 +1,18 @@ -from argparse import Namespace from pathlib import Path from codeflash.discovery.functions_to_optimize import FunctionToOptimize from codeflash.languages.python.context.code_context_extractor import get_code_optimization_context from codeflash.models.models import FunctionParent -from codeflash.optimization.optimizer import Optimizer def test_benchmark_extract(benchmark) -> None: - file_path = Path(__file__).parent.parent.parent.resolve() / "codeflash" - opt = Optimizer( - Namespace( - project_root=file_path.resolve(), - disable_telemetry=True, - tests_root=(file_path / "tests").resolve(), - test_framework="pytest", - pytest_cmd="pytest", - experiment_id=None, - test_project_root=Path.cwd(), - ) - ) + project_root = Path(__file__).parent.parent.parent.resolve() / "codeflash" function_to_optimize = FunctionToOptimize( function_name="replace_function_and_helpers_with_optimized_code", - file_path=file_path / "languages" / "function_optimizer.py", + file_path=project_root / "languages" / "function_optimizer.py", parents=[FunctionParent(name="FunctionOptimizer", type="ClassDef")], starting_line=None, ending_line=None, ) - benchmark(get_code_optimization_context, function_to_optimize, opt.args.project_root) + benchmark(get_code_optimization_context, function_to_optimize, project_root) From 2e2e19f7aee9c08adcd6882ed5df2e6fca712a69 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 00:21:45 -0500 Subject: [PATCH 082/147] bench: add libcst visitor benchmarks for multi-file and full pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - test_benchmark_libcst_multi_file: discover_functions + get_code_optimization_context across 10 real source files - test_benchmark_libcst_pipeline: full discover → extract → replace → merge pipeline on one file --- .../test_benchmark_libcst_multi_file.py | 75 +++++++++++++++++++ .../test_benchmark_libcst_pipeline.py | 56 ++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 tests/benchmarks/test_benchmark_libcst_multi_file.py create mode 100644 tests/benchmarks/test_benchmark_libcst_pipeline.py diff --git a/tests/benchmarks/test_benchmark_libcst_multi_file.py b/tests/benchmarks/test_benchmark_libcst_multi_file.py new file mode 100644 index 000000000..2e04d9f3c --- /dev/null +++ b/tests/benchmarks/test_benchmark_libcst_multi_file.py @@ -0,0 +1,75 @@ +"""Benchmark libcst visitor performance across many files. + +Exercises the visitor-heavy codepaths that benefit from the libcst dispatch +table cache: discover_functions + get_code_optimization_context on multiple +real source files. +""" + +from __future__ import annotations + +from pathlib import Path + +from codeflash.discovery.functions_to_optimize import FunctionToOptimize +from codeflash.languages.python.context.code_context_extractor import get_code_optimization_context +from codeflash.languages.python.support import PythonSupport +from codeflash.models.models import FunctionParent + +# Real source files from the codeflash codebase, chosen for size and visitor diversity. +_CODEFLASH_ROOT = Path(__file__).parent.parent.parent.resolve() / "codeflash" + +_SOURCE_FILES: list[Path] = [ + _CODEFLASH_ROOT / "languages" / "function_optimizer.py", + _CODEFLASH_ROOT / "languages" / "python" / "context" / "code_context_extractor.py", + _CODEFLASH_ROOT / "languages" / "python" / "support.py", + _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "code_extractor.py", + _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "code_replacer.py", + _CODEFLASH_ROOT / "code_utils" / "instrument_existing_tests.py", + _CODEFLASH_ROOT / "benchmarking" / "compare.py", + _CODEFLASH_ROOT / "models" / "models.py", + _CODEFLASH_ROOT / "discovery" / "discover_unit_tests.py", + _CODEFLASH_ROOT / "languages" / "base.py", +] + +# For each file, pick one top-level function to extract context for. +# (class, function_name) — class=None means module-level. +_TARGETS: list[tuple[Path, str | None, str]] = [ + (_SOURCE_FILES[0], "FunctionOptimizer", "replace_function_and_helpers_with_optimized_code"), + (_SOURCE_FILES[1], None, "get_code_optimization_context"), + (_SOURCE_FILES[2], "PythonSupport", "discover_functions"), + (_SOURCE_FILES[3], None, "add_global_assignments"), + (_SOURCE_FILES[4], None, "replace_functions_in_file"), + (_SOURCE_FILES[5], None, "inject_profiling_into_existing_test"), + (_SOURCE_FILES[6], None, "compare_branches"), + (_SOURCE_FILES[7], None, "get_comment_prefix"), + (_SOURCE_FILES[8], None, "discover_unit_tests"), + (_SOURCE_FILES[9], None, "convert_parents_to_tuple"), +] + + +def _discover_all() -> None: + """Run discover_functions on all source files.""" + ps = PythonSupport() + for file_path in _SOURCE_FILES: + source = file_path.read_text() + ps.discover_functions(source=source, file_path=file_path) + + +def _extract_all_contexts() -> None: + """Run get_code_optimization_context on every target function.""" + project_root = _CODEFLASH_ROOT.parent + for file_path, class_name, func_name in _TARGETS: + parents = [FunctionParent(name=class_name, type="ClassDef")] if class_name else [] + fto = FunctionToOptimize( + function_name=func_name, file_path=file_path, parents=parents, starting_line=None, ending_line=None + ) + get_code_optimization_context(fto, project_root) + + +def test_benchmark_discover_functions_multi_file(benchmark) -> None: + """Discover functions across 10 source files.""" + benchmark(_discover_all) + + +def test_benchmark_extract_context_multi_file(benchmark) -> None: + """Extract code optimization context for 10 functions across 10 files.""" + benchmark(_extract_all_contexts) diff --git a/tests/benchmarks/test_benchmark_libcst_pipeline.py b/tests/benchmarks/test_benchmark_libcst_pipeline.py new file mode 100644 index 000000000..4361181c5 --- /dev/null +++ b/tests/benchmarks/test_benchmark_libcst_pipeline.py @@ -0,0 +1,56 @@ +"""Benchmark the full libcst-heavy pipeline on a single file. + +Runs discover → extract context → replace functions → add global assignments +in sequence, exercising ~15 distinct visitor/transformer classes in one pass. +""" + +from __future__ import annotations + +from pathlib import Path + +from codeflash.discovery.functions_to_optimize import FunctionToOptimize +from codeflash.languages.python.context.code_context_extractor import get_code_optimization_context +from codeflash.languages.python.static_analysis.code_extractor import add_global_assignments +from codeflash.languages.python.static_analysis.code_replacer import replace_functions_in_file +from codeflash.languages.python.support import PythonSupport + +_CODEFLASH_ROOT = Path(__file__).parent.parent.parent.resolve() / "codeflash" +_PROJECT_ROOT = _CODEFLASH_ROOT.parent + +# Target: a real, non-trivial file with classes and module-level functions. +_TARGET_FILE = _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "code_extractor.py" +_TARGET_FUNC = "add_global_assignments" + +# A second file to serve as "optimized" source for replace/merge steps. +_SECOND_FILE = _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "code_replacer.py" + + +def _run_pipeline() -> None: + """Simulate a single-file optimization pass through the full visitor pipeline.""" + source = _TARGET_FILE.read_text() + source2 = _SECOND_FILE.read_text() + + # 1. Discover functions (FunctionVisitor + MetadataWrapper) + ps = PythonSupport() + functions = ps.discover_functions(source=source, file_path=_TARGET_FILE) + + # 2. Extract code optimization context (multiple collectors + dependency resolver) + fto = FunctionToOptimize( + function_name=_TARGET_FUNC, file_path=_TARGET_FILE, parents=[], starting_line=None, ending_line=None + ) + get_code_optimization_context(fto, _PROJECT_ROOT) + + # 3. Replace functions (GlobalFunctionCollector + GlobalFunctionTransformer) + # Use a class method from discovered functions if available, else module-level. + func_names = [_TARGET_FUNC] + replace_functions_in_file( + source_code=source, original_function_names=func_names, optimized_code=source2, preexisting_objects=set() + ) + + # 4. Add global assignments (6 visitors/transformers) + add_global_assignments(source2, source) + + +def test_benchmark_full_pipeline(benchmark) -> None: + """Full discover → extract → replace → merge pipeline on one file.""" + benchmark(_run_pipeline) From accbab4a16fe59e8f158d6ce410bd18314ad73c3 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 00:36:02 -0500 Subject: [PATCH 083/147] fix: update test_cmd_auth patches for deferred imports Imports in cmd_auth.py were moved into function bodies, so mock patches must target the source modules instead of cmd_auth's namespace. --- tests/test_cmd_auth.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/test_cmd_auth.py b/tests/test_cmd_auth.py index d12cecf58..7ad156c0b 100644 --- a/tests/test_cmd_auth.py +++ b/tests/test_cmd_auth.py @@ -9,8 +9,8 @@ from codeflash.either import Success class TestAuthLogin: - @patch("codeflash.cli_cmds.cmd_auth.get_codeflash_api_key") - @patch("codeflash.cli_cmds.cmd_auth.console") + @patch("codeflash.code_utils.env_utils.get_codeflash_api_key") + @patch("codeflash.cli_cmds.console.console") def test_existing_api_key_skips_oauth(self, mock_console: MagicMock, mock_get_key: MagicMock) -> None: mock_get_key.return_value = "cf-test1234abcd" @@ -21,19 +21,19 @@ class TestAuthLogin: "To re-authenticate, unset [bold]CODEFLASH_API_KEY[/bold] and run this command again." ) - @patch("codeflash.cli_cmds.cmd_auth.get_codeflash_api_key") - @patch("codeflash.cli_cmds.cmd_auth.console") + @patch("codeflash.code_utils.env_utils.get_codeflash_api_key") + @patch("codeflash.cli_cmds.console.console") def test_existing_api_key_oserror_treated_as_missing( self, mock_console: MagicMock, mock_get_key: MagicMock ) -> None: mock_get_key.side_effect = OSError("permission denied") with pytest.raises(SystemExit): - with patch("codeflash.cli_cmds.cmd_auth.perform_oauth_signin", return_value=None): + with patch("codeflash.cli_cmds.oauth_handler.perform_oauth_signin", return_value=None): auth_login() - @patch("codeflash.cli_cmds.cmd_auth.perform_oauth_signin") - @patch("codeflash.cli_cmds.cmd_auth.get_codeflash_api_key", return_value="") + @patch("codeflash.cli_cmds.oauth_handler.perform_oauth_signin") + @patch("codeflash.code_utils.env_utils.get_codeflash_api_key", return_value="") def test_oauth_failure_exits_with_code_1(self, mock_get_key: MagicMock, mock_oauth: MagicMock) -> None: mock_oauth.return_value = None @@ -41,10 +41,10 @@ class TestAuthLogin: auth_login() @patch("codeflash.cli_cmds.cmd_auth.os") - @patch("codeflash.cli_cmds.cmd_auth.save_api_key_to_rc") - @patch("codeflash.cli_cmds.cmd_auth.perform_oauth_signin") - @patch("codeflash.cli_cmds.cmd_auth.get_codeflash_api_key", return_value="") - @patch("codeflash.cli_cmds.cmd_auth.console") + @patch("codeflash.code_utils.shell_utils.save_api_key_to_rc") + @patch("codeflash.cli_cmds.oauth_handler.perform_oauth_signin") + @patch("codeflash.code_utils.env_utils.get_codeflash_api_key", return_value="") + @patch("codeflash.cli_cmds.console.console") def test_successful_oauth_saves_key( self, mock_console: MagicMock, @@ -63,10 +63,10 @@ class TestAuthLogin: mock_console.print.assert_called_with("[green]Signed in successfully![/green]") @patch("codeflash.cli_cmds.cmd_auth.os") - @patch("codeflash.cli_cmds.cmd_auth.save_api_key_to_rc") - @patch("codeflash.cli_cmds.cmd_auth.perform_oauth_signin") - @patch("codeflash.cli_cmds.cmd_auth.get_codeflash_api_key", return_value="") - @patch("codeflash.cli_cmds.cmd_auth.console") + @patch("codeflash.code_utils.shell_utils.save_api_key_to_rc") + @patch("codeflash.cli_cmds.oauth_handler.perform_oauth_signin") + @patch("codeflash.code_utils.env_utils.get_codeflash_api_key", return_value="") + @patch("codeflash.cli_cmds.console.console") def test_windows_oauth_saves_key( self, mock_console: MagicMock, From 4c3c6ea167fdc3c7379748baf5951d6f186da741 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 00:53:55 -0500 Subject: [PATCH 084/147] perf: add frozenset fast-path for comparator type dispatch Use O(1) frozenset membership test with type identity before falling through to isinstance MRO traversal. Backported from codeflash-python. --- codeflash/verification/comparator.py | 40 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/codeflash/verification/comparator.py b/codeflash/verification/comparator.py index 5b7c18825..02768c06e 100644 --- a/codeflash/verification/comparator.py +++ b/codeflash/verification/comparator.py @@ -74,6 +74,27 @@ _DICT_KEYS_TYPE = type({}.keys()) _DICT_VALUES_TYPE = type({}.values()) _DICT_ITEMS_TYPE = type({}.items()) +_IDENTITY_EQ_TYPES: frozenset[type[Any]] = frozenset( + { + int, + bool, + complex, + type(None), + type(Ellipsis), + decimal.Decimal, + set, + bytes, + bytearray, + memoryview, + frozenset, + type, + range, + slice, + OrderedDict, + types.GenericAlias, + } +) + _EQUALITY_TYPES = ( int, bool, @@ -184,12 +205,18 @@ def comparator(orig: Any, new: Any, superset_obj: bool = False) -> bool: return False - if type(orig) is not type(new): - type_obj = type(orig) - new_type_obj = type(new) + orig_type = type(orig) + if orig_type is not type(new): # distinct type objects are created at runtime, even if the class code is exactly the same, so we can only compare the names - if type_obj.__name__ != new_type_obj.__name__ or type_obj.__qualname__ != new_type_obj.__qualname__: + if orig_type.__name__ != type(new).__name__ or orig_type.__qualname__ != type(new).__qualname__: return False + # Fast-path: O(1) frozenset lookup for common types (avoids isinstance MRO traversal) + if orig_type in _IDENTITY_EQ_TYPES: + return orig == new + if orig_type is float: + if math.isnan(orig) and math.isnan(new): + return True + return math.isclose(orig, new) if isinstance(orig, (list, tuple, deque, ChainMap)): if len(orig) != len(new): return False @@ -204,12 +231,9 @@ def comparator(orig: Any, new: Any, superset_obj: bool = False) -> bool: return _normalize_temp_path(orig) == _normalize_temp_path(new) return False + # enum.Enum subclasses and UnionType fall through from the frozenset fast-path if isinstance(orig, _EQUALITY_TYPES): return orig == new - if isinstance(orig, float): - if math.isnan(orig) and math.isnan(new): - return True - return math.isclose(orig, new) # Handle weak references (e.g., found in torch.nn.LSTM/GRU modules) if isinstance(orig, weakref.ref): From 5a5b6e46ac5aeb5d355d912a1cc4d7d7b61c544e Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 01:05:02 -0500 Subject: [PATCH 085/147] bench: add dedicated comparator microbenchmark for frozenset fast-path 5 scenarios: primitives, nested dicts, DB rows, deep nesting, and identity types (frozenset/range/complex/Decimal/OrderedDict). --- tests/benchmarks/test_benchmark_comparator.py | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 tests/benchmarks/test_benchmark_comparator.py diff --git a/tests/benchmarks/test_benchmark_comparator.py b/tests/benchmarks/test_benchmark_comparator.py new file mode 100644 index 000000000..71576c370 --- /dev/null +++ b/tests/benchmarks/test_benchmark_comparator.py @@ -0,0 +1,133 @@ +"""Benchmark comparator type dispatch performance. + +Exercises the fast-path frozenset lookup vs isinstance MRO traversal +across realistic return value shapes: primitives, nested containers, +and mixed-type structures typical of real optimization verification. +""" + +from __future__ import annotations + +from collections import OrderedDict +from decimal import Decimal + +from codeflash.verification.comparator import comparator + +# --- Test data: realistic return value shapes --- + +# 1. Flat primitives (int, bool, None, str, float, bytes) — the fast-path sweet spot +_PRIMITIVES_A = [ + 42, + True, + None, + 3.14, + "hello", + b"bytes", + 0, + False, + "", + 1.0, + -1, + None, + True, + 99, + "world", + b"\x00\x01", + 2**31, + 0.0, + False, + None, +] +_PRIMITIVES_B = list(_PRIMITIVES_A) + +# 2. Nested dict of lists (common return value shape: API responses, parsed configs) +_NESTED_DICT_A = { + "users": [{"id": i, "name": f"user_{i}", "active": i % 2 == 0, "score": i * 1.5} for i in range(50)], + "metadata": {"total": 50, "page": 1, "has_next": True}, + "tags": [f"tag_{i}" for i in range(20)], + "config": {"timeout": 30, "retries": 3, "debug": False, "threshold": Decimal("0.95")}, +} +_NESTED_DICT_B = { + "users": [{"id": i, "name": f"user_{i}", "active": i % 2 == 0, "score": i * 1.5} for i in range(50)], + "metadata": {"total": 50, "page": 1, "has_next": True}, + "tags": [f"tag_{i}" for i in range(20)], + "config": {"timeout": 30, "retries": 3, "debug": False, "threshold": Decimal("0.95")}, +} + +# 3. List of tuples (common: database rows, CSV data) +_ROWS_A = [(i, f"row_{i}", i * 0.1, i % 3 == 0, None if i % 5 == 0 else i) for i in range(200)] +_ROWS_B = [(i, f"row_{i}", i * 0.1, i % 3 == 0, None if i % 5 == 0 else i) for i in range(200)] + + +# 4. Deeply nested structure (worst case for recursive comparator) +def _make_deep(depth: int) -> dict: + if depth == 0: + return {"leaf": True, "value": 42, "items": [1, 2, 3], "label": "end"} + return {"level": depth, "child": _make_deep(depth - 1), "siblings": list(range(depth))} + + +_DEEP_A = _make_deep(15) +_DEEP_B = _make_deep(15) + +# 5. Mixed identity types (frozenset, range, slice, OrderedDict, bytes, complex) +_IDENTITY_TYPES_A = [ + frozenset({1, 2, 3}), + range(100), + complex(1, 2), + Decimal("3.14"), + OrderedDict(a=1, b=2), + b"binary", + bytearray(b"mutable"), + memoryview(b"view"), + type(None), + True, + 42, + None, +] * 10 +_IDENTITY_TYPES_B = list(_IDENTITY_TYPES_A) + + +def _compare_all_primitives() -> None: + for a, b in zip(_PRIMITIVES_A, _PRIMITIVES_B): + comparator(a, b) + + +def _compare_nested_dict() -> None: + comparator(_NESTED_DICT_A, _NESTED_DICT_B) + + +def _compare_rows() -> None: + comparator(_ROWS_A, _ROWS_B) + + +def _compare_deep() -> None: + comparator(_DEEP_A, _DEEP_B) + + +def _compare_identity_types() -> None: + for a, b in zip(_IDENTITY_TYPES_A, _IDENTITY_TYPES_B): + comparator(a, b) + + +def test_benchmark_comparator_primitives(benchmark) -> None: + """20 flat primitive comparisons (int, bool, None, str, float, bytes).""" + benchmark(_compare_all_primitives) + + +def test_benchmark_comparator_nested_dict(benchmark) -> None: + """Nested dict with 50-element user list, metadata, tags, config.""" + benchmark(_compare_nested_dict) + + +def test_benchmark_comparator_rows(benchmark) -> None: + """200 tuples of (int, str, float, bool, Optional[int]).""" + benchmark(_compare_rows) + + +def test_benchmark_comparator_deep(benchmark) -> None: + """15-level deep nested dict structure.""" + benchmark(_compare_deep) + + +def test_benchmark_comparator_identity_types(benchmark) -> None: + """120 frozenset/range/complex/Decimal/OrderedDict/bytes comparisons.""" + benchmark(_compare_identity_types) From fe39d40e1becadd911d1a09bc0fdaef75599501c Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 01:25:05 -0500 Subject: [PATCH 086/147] perf: add type identity fast-paths for str/list/tuple/dict in comparator Move the 4 most common return-value types (str, list/tuple, dict) to `orig_type is T` identity checks at the top of the dispatch chain, before the frozenset lookup. A single pointer comparison is cheaper than a frozenset hash, and these types need special handling anyway (temp-path normalization, recursive comparison, superset support). Before: dict traversed ~8 isinstance checks before being handled. After: dict is handled at check #3 via `orig_type is dict`. The isinstance fallbacks remain as slow-paths for subclasses (deque, ChainMap, defaultdict, scipy dok_matrix, etc.). Backported from codeflash-python dispatch ordering. --- codeflash/verification/comparator.py | 36 ++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/codeflash/verification/comparator.py b/codeflash/verification/comparator.py index 02768c06e..36b98e6e2 100644 --- a/codeflash/verification/comparator.py +++ b/codeflash/verification/comparator.py @@ -210,23 +210,49 @@ def comparator(orig: Any, new: Any, superset_obj: bool = False) -> bool: # distinct type objects are created at runtime, even if the class code is exactly the same, so we can only compare the names if orig_type.__name__ != type(new).__name__ or orig_type.__qualname__ != type(new).__qualname__: return False - # Fast-path: O(1) frozenset lookup for common types (avoids isinstance MRO traversal) - if orig_type in _IDENTITY_EQ_TYPES: - return orig == new + + # Fast-path: type identity checks for the most common return-value types. + # `orig_type is T` is a single pointer comparison — cheaper than frozenset hash + # lookup or isinstance MRO traversal — and these 4 types dominate real workloads. + if orig_type is str: + if orig == new: + return True + if _is_temp_path(orig) and _is_temp_path(new): + return _normalize_temp_path(orig) == _normalize_temp_path(new) + return False + if orig_type is list or orig_type is tuple: + if len(orig) != len(new): + return False + return all(comparator(elem1, elem2, superset_obj) for elem1, elem2 in zip(orig, new)) + if orig_type is dict: + if superset_obj: + return all(k in new and comparator(v, new[k], superset_obj) for k, v in orig.items()) + if len(orig) != len(new): + return False + for key in orig: + if key not in new: + return False + if not comparator(orig[key], new[key], superset_obj): + return False + return True if orig_type is float: if math.isnan(orig) and math.isnan(new): return True return math.isclose(orig, new) + # O(1) frozenset lookup for remaining common types (int, bool, None, Decimal, etc.) + if orig_type in _IDENTITY_EQ_TYPES: + return orig == new + + # Slower isinstance path for subclasses (deque, ChainMap, etc.) if isinstance(orig, (list, tuple, deque, ChainMap)): if len(orig) != len(new): return False return all(comparator(elem1, elem2, superset_obj) for elem1, elem2 in zip(orig, new)) - # Handle strings separately to normalize temp paths + # Handle string subclasses separately to normalize temp paths if isinstance(orig, str): if orig == new: return True - # If strings differ, check if they're temp paths that differ only in session number if _is_temp_path(orig) and _is_temp_path(new): return _normalize_temp_path(orig) == _normalize_temp_path(new) return False From 381d1319ea787464c4a2aebf5a1a293cc50131b5 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 01:48:31 -0500 Subject: [PATCH 087/147] fix: specify utf-8 encoding in benchmark read_text for Windows CI Windows defaults to cp1252 which can't decode some source file bytes. --- tests/benchmarks/test_benchmark_libcst_multi_file.py | 2 +- tests/benchmarks/test_benchmark_libcst_pipeline.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/benchmarks/test_benchmark_libcst_multi_file.py b/tests/benchmarks/test_benchmark_libcst_multi_file.py index 2e04d9f3c..d9faf1722 100644 --- a/tests/benchmarks/test_benchmark_libcst_multi_file.py +++ b/tests/benchmarks/test_benchmark_libcst_multi_file.py @@ -50,7 +50,7 @@ def _discover_all() -> None: """Run discover_functions on all source files.""" ps = PythonSupport() for file_path in _SOURCE_FILES: - source = file_path.read_text() + source = file_path.read_text(encoding="utf-8") ps.discover_functions(source=source, file_path=file_path) diff --git a/tests/benchmarks/test_benchmark_libcst_pipeline.py b/tests/benchmarks/test_benchmark_libcst_pipeline.py index 4361181c5..eca0a7e3f 100644 --- a/tests/benchmarks/test_benchmark_libcst_pipeline.py +++ b/tests/benchmarks/test_benchmark_libcst_pipeline.py @@ -27,8 +27,8 @@ _SECOND_FILE = _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "c def _run_pipeline() -> None: """Simulate a single-file optimization pass through the full visitor pipeline.""" - source = _TARGET_FILE.read_text() - source2 = _SECOND_FILE.read_text() + source = _TARGET_FILE.read_text(encoding="utf-8") + source2 = _SECOND_FILE.read_text(encoding="utf-8") # 1. Discover functions (FunctionVisitor + MetadataWrapper) ps = PythonSupport() From 79d47e0fae48ea425cf918f9fdb35fa3f3b9e376 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 01:51:52 -0500 Subject: [PATCH 088/147] chore: delete disabled codeflash.yaml workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JS ESM integration test — disabled and superseded by ci.yaml's e2e-js matrix. --- .github/workflows/codeflash.yaml | 42 -------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/codeflash.yaml diff --git a/.github/workflows/codeflash.yaml b/.github/workflows/codeflash.yaml deleted file mode 100644 index 147e5ed5e..000000000 --- a/.github/workflows/codeflash.yaml +++ /dev/null @@ -1,42 +0,0 @@ -name: Codeflash - -on: - pull_request: - paths: - # So that this workflow only runs when code within the target module is modified - - 'code_to_optimize/js/code_to_optimize_js_esm/**' - workflow_dispatch: - -concurrency: - # Any new push to the PR will cancel the previous run, so that only the latest code is optimized - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - - -jobs: - optimize: - name: Optimize new code - # Don't run codeflash on codeflash-ai[bot] commits, prevent duplicate optimizations - if: ${{ github.actor != 'codeflash-ai[bot]' }} - runs-on: ubuntu-latest - env: - CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} - defaults: - run: - working-directory: ./code_to_optimize/js/code_to_optimize_js_esm - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - name: 🟢 Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: '22' - cache: 'npm' - cache-dependency-path: code_to_optimize/js/code_to_optimize_js_esm/package-lock.json - - name: 📦 Install Dependencies - run: npm ci - - - name: ⚡️ Codeflash Optimization - run: npx codeflash From 4ac573f10f4ab8c6ed6c264a0d8e0e2a83093c0b Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 02:33:16 -0500 Subject: [PATCH 089/147] fix: increase API read timeout from 90s to 300s to prevent flaky E2E failures The flat 90s timeout was too aggressive for LLM-powered endpoints (/testgen, /optimize, /refinement) under load, causing ReadTimeoutError and failing the async-optimization E2E test. Split into (10s connect, 300s read) tuple so connections fail fast but LLM inference gets adequate time. --- codeflash/api/aiservice.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/codeflash/api/aiservice.py b/codeflash/api/aiservice.py index d70abe0df..3127649f2 100644 --- a/codeflash/api/aiservice.py +++ b/codeflash/api/aiservice.py @@ -47,7 +47,9 @@ class AiServiceClient: self.headers = {"Authorization": f"Bearer {get_codeflash_api_key()}", "Connection": "close"} self.llm_call_counter = count(1) self.is_local = self.base_url == "http://localhost:8000" - self.timeout: float | None = 300 if self.is_local else 90 + # (connect_timeout, read_timeout) — connect should be fast; read + # can be slow because the server runs LLM inference. + self.timeout: float | tuple[float, float] | None = (10, 300) def get_next_sequence(self) -> int: """Get the next LLM call sequence number.""" @@ -88,7 +90,7 @@ class AiServiceClient: endpoint: str, method: str = "POST", payload: dict[str, Any] | list[dict[str, Any]] | None = None, - timeout: float | None = None, + timeout: float | tuple[float, float] | None = None, ) -> requests.Response: """Make an API request to the given endpoint on the AI service. From 2b0f633c0fc936b3338f21c8228648eabe03884e Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 03:04:29 -0500 Subject: [PATCH 090/147] perf: reduce java-tracer E2E from ~75 min to ~15 min MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove filterEvens and instanceMethod from the Workload fixture (4→2 functions) and reduce main() loop from 1000→100 rounds. The E2E test only needs to verify the tracer→optimizer pipeline works end-to-end; it doesn't need 4 functions or 1604 replay tests to prove that. Expected impact: ~2 functions × ~8 candidates × fewer replay tests should bring the job from ~75 min down to ~10-15 min. --- .../src/main/java/com/example/Workload.java | 34 ++----------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java index 7beb2a4ea..7c46668d5 100644 --- a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java +++ b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java @@ -1,8 +1,5 @@ package com.example; -import java.util.ArrayList; -import java.util.List; - public class Workload { public static int computeSum(int n) { @@ -21,46 +18,19 @@ public class Workload { return result; } - public static List filterEvens(List numbers) { - List result = new ArrayList<>(); - for (int n : numbers) { - if (n % 2 == 0) { - result.add(n); - } - } - return result; - } - - public int instanceMethod(int x, int y) { - return x * y + computeSum(x); - } - public static void main(String[] args) { // Run methods with large inputs so JFR can capture CPU samples. // Small inputs finish too fast (<1ms) for JFR's 10ms sampling interval. - for (int round = 0; round < 1000; round++) { + // 100 rounds is enough for JFR to collect ~10 samples per function. + for (int round = 0; round < 100; round++) { computeSum(100_000); repeatString("hello world ", 1000); - - List nums = new ArrayList<>(); - for (int i = 1; i <= 10_000; i++) nums.add(i); - filterEvens(nums); - - Workload w = new Workload(); - w.instanceMethod(100_000, 42); } // Also call with small inputs for variety in traced args System.out.println("computeSum(100) = " + computeSum(100)); System.out.println("repeatString(\"ab\", 3) = " + repeatString("ab", 3)); - List small = new ArrayList<>(); - for (int i = 1; i <= 10; i++) small.add(i); - System.out.println("filterEvens(1..10) = " + filterEvens(small)); - - Workload w = new Workload(); - System.out.println("instanceMethod(5, 3) = " + w.instanceMethod(5, 3)); - System.out.println("Workload complete."); } } From 21f61ec93d837f6c919e0d008cf037c8989047a7 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 03:08:03 -0500 Subject: [PATCH 091/147] ci: add java_tracer_e2e fixture path to e2e_java change detection The fixture directory wasn't in the path filter, so changes to Workload.java didn't trigger the java E2E tests. --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 63c83149f..368459608 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -95,7 +95,8 @@ jobs: 'codeflash/languages/java/' 'codeflash/languages/base.py' \ 'codeflash/languages/registry.py' 'codeflash/optimization/' \ 'codeflash/verification/' 'codeflash-java-runtime/' \ - 'code_to_optimize/java/' 'tests/scripts/end_to_end_test_java*' + 'code_to_optimize/java/' 'tests/scripts/end_to_end_test_java*' \ + 'tests/test_languages/fixtures/java_tracer_e2e/' env: MERGE_BASE: ${{ steps.merge_base.outputs.sha }} From 46957e190f0490e1480dcd9a2d4985835f7c27ec Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 03:17:46 -0500 Subject: [PATCH 092/147] fix: update java tracer unit tests for reduced Workload fixture Remove assertions for filterEvens and instanceMethod which were removed from the Workload fixture. Adjust expected invocation counts accordingly. --- tests/test_languages/test_java/test_java_tracer_e2e.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/test_languages/test_java/test_java_tracer_e2e.py b/tests/test_languages/test_java/test_java_tracer_e2e.py index 157f23eb6..054b934f7 100644 --- a/tests/test_languages/test_java/test_java_tracer_e2e.py +++ b/tests/test_languages/test_java/test_java_tracer_e2e.py @@ -81,14 +81,12 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: rows = conn.execute("SELECT function, classname, descriptor, length(args) FROM function_calls").fetchall() - assert len(rows) >= 5, f"Expected at least 5 captured invocations, got {len(rows)}" + assert len(rows) >= 3, f"Expected at least 3 captured invocations, got {len(rows)}" # Check that specific methods were captured functions = {row[0] for row in rows} assert "computeSum" in functions assert "repeatString" in functions - assert "filterEvens" in functions - assert "instanceMethod" in functions # Verify all rows have non-empty args blobs for row in rows: @@ -97,7 +95,7 @@ class TestTracingAgent: # Verify metadata metadata = dict(conn.execute("SELECT key, value FROM metadata").fetchall()) assert "totalCaptures" in metadata - assert int(metadata["totalCaptures"]) >= 5 + assert int(metadata["totalCaptures"]) >= 3 finally: conn.close() @@ -136,7 +134,7 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: - # computeSum is called 4 times (2 direct + 2 from instanceMethod) + # computeSum is called 2 times (direct calls in main) compute_count = conn.execute( "SELECT COUNT(*) FROM function_calls WHERE function = 'computeSum'" ).fetchone()[0] @@ -296,7 +294,7 @@ class TestJavaTracerOrchestration: assert len(workload_files) == 1 content = workload_files[0].read_text(encoding="utf-8") assert "replay_computeSum" in content - assert "replay_instanceMethod" in content + assert "replay_repeatString" in content def test_package_detection(self) -> None: """Test that package detection finds Java packages from source files.""" From 08aa94c54ac74d07a5265c0871da5b0da4dd67ca Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 03:44:54 -0500 Subject: [PATCH 093/147] perf: reduce java-tracer E2E to single function for ~11 min target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop repeatString from the Workload fixture (2→1 function). computeSum alone exercises the full tracer→optimizer pipeline (trace → replay tests → optimize → evaluate → rank → explain → review). The second function added no additional pipeline coverage. --- .../src/main/java/com/example/Workload.java | 13 +------------ .../test_java/test_java_tracer_e2e.py | 6 ++---- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java index 7c46668d5..ff0ae4d8a 100644 --- a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java +++ b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java @@ -10,26 +10,15 @@ public class Workload { return sum; } - public static String repeatString(String s, int count) { - String result = ""; - for (int i = 0; i < count; i++) { - result = result + s; - } - return result; - } - public static void main(String[] args) { - // Run methods with large inputs so JFR can capture CPU samples. + // Run with large inputs so JFR can capture CPU samples. // Small inputs finish too fast (<1ms) for JFR's 10ms sampling interval. - // 100 rounds is enough for JFR to collect ~10 samples per function. for (int round = 0; round < 100; round++) { computeSum(100_000); - repeatString("hello world ", 1000); } // Also call with small inputs for variety in traced args System.out.println("computeSum(100) = " + computeSum(100)); - System.out.println("repeatString(\"ab\", 3) = " + repeatString("ab", 3)); System.out.println("Workload complete."); } diff --git a/tests/test_languages/test_java/test_java_tracer_e2e.py b/tests/test_languages/test_java/test_java_tracer_e2e.py index 054b934f7..c7dce2379 100644 --- a/tests/test_languages/test_java/test_java_tracer_e2e.py +++ b/tests/test_languages/test_java/test_java_tracer_e2e.py @@ -81,12 +81,11 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: rows = conn.execute("SELECT function, classname, descriptor, length(args) FROM function_calls").fetchall() - assert len(rows) >= 3, f"Expected at least 3 captured invocations, got {len(rows)}" + assert len(rows) >= 2, f"Expected at least 2 captured invocations, got {len(rows)}" # Check that specific methods were captured functions = {row[0] for row in rows} assert "computeSum" in functions - assert "repeatString" in functions # Verify all rows have non-empty args blobs for row in rows: @@ -95,7 +94,7 @@ class TestTracingAgent: # Verify metadata metadata = dict(conn.execute("SELECT key, value FROM metadata").fetchall()) assert "totalCaptures" in metadata - assert int(metadata["totalCaptures"]) >= 3 + assert int(metadata["totalCaptures"]) >= 2 finally: conn.close() @@ -294,7 +293,6 @@ class TestJavaTracerOrchestration: assert len(workload_files) == 1 content = workload_files[0].read_text(encoding="utf-8") assert "replay_computeSum" in content - assert "replay_repeatString" in content def test_package_detection(self) -> None: """Test that package detection finds Java packages from source files.""" From 0772398c59840d20202b6cb8c2d2fda18f709538 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 04:55:36 -0500 Subject: [PATCH 094/147] perf: optimize Java tracing agent serialization and writes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reuse ThreadLocal Kryo Output buffers (eliminates #1 allocation hotspot) - Fast-path inline serialization for safe arg types (bypasses executor) - Skip verification roundtrip for known-safe containers (ArrayList, HashMap, etc.) - Batch SQLite inserts (256/txn) with permanent autocommit-off - Switch to ArrayBlockingQueue (no per-element Node allocation) - Add opt-in in-memory SQLite mode (VACUUM INTO at shutdown), enabled in CI - Add timing instrumentation (onEntry, serialization, writes, dump) - Add ProfilingWorkload fixture for benchmarking Benchmark (50k captures): onEntry 5200ms→1200ms (4.3x), avg/capture 0.43ms→0.02ms (21x), writes 3200ms→900ms (3.5x) with in-memory mode. --- .../main/java/com/codeflash/Serializer.java | 131 +++++++++++++---- .../com/codeflash/tracer/TraceRecorder.java | 58 +++++--- .../com/codeflash/tracer/TraceWriter.java | 132 +++++++++++++++--- .../com/codeflash/tracer/TracerConfig.java | 7 + codeflash/languages/java/tracer.py | 2 + .../java/com/example/ProfilingWorkload.java | 91 ++++++++++++ .../test_java/test_java_tracer_e2e.py | 1 - 7 files changed, 355 insertions(+), 67 deletions(-) create mode 100644 tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/ProfilingWorkload.java diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/Serializer.java b/codeflash-java-runtime/src/main/java/com/codeflash/Serializer.java index 80d400935..e1c177ac9 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/Serializer.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/Serializer.java @@ -6,7 +6,6 @@ import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy; import org.objenesis.strategy.StdInstantiatorStrategy; -import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; @@ -36,7 +35,11 @@ public final class Serializer { private static final int MAX_COLLECTION_SIZE = 1000; private static final int BUFFER_SIZE = 4096; - // Thread-local Kryo instances (Kryo is not thread-safe) + // Thread-local Kryo, Output, and IdentityHashMap instances for reuse + private static final ThreadLocal OUTPUT = ThreadLocal.withInitial(() -> new Output(BUFFER_SIZE, -1)); + private static final ThreadLocal> SEEN = + ThreadLocal.withInitial(IdentityHashMap::new); + private static final ThreadLocal KRYO = ThreadLocal.withInitial(() -> { Kryo kryo = new Kryo(); kryo.setRegistrationRequired(false); @@ -89,10 +92,78 @@ public final class Serializer { * @return Serialized bytes (may contain KryoPlaceholder for unserializable parts) */ public static byte[] serialize(Object obj) { - Object processed = recursiveProcess(obj, new IdentityHashMap<>(), 0, ""); + // Fast path: if args are all safe types, skip recursive processing entirely + if (obj instanceof Object[] && isSafeArgs((Object[]) obj)) { + return directSerialize(obj); + } + + IdentityHashMap seen = SEEN.get(); + seen.clear(); + Object processed = recursiveProcess(obj, seen, 0, ""); return directSerialize(processed); } + /** + * Attempt fast-path serialization for args that are all known-safe types. + * Returns serialized bytes if all args are safe, or null if the slow path is needed. + * Callers can use this to avoid executor submission overhead for simple arguments. + */ + public static byte[] serializeFast(Object obj) { + if (obj instanceof Object[] && isSafeArgs((Object[]) obj)) { + return directSerialize(obj); + } + return null; + } + + /** + * Check if all elements of an args array can be serialized directly without recursive processing. + */ + private static boolean isSafeArgs(Object[] args) { + for (Object arg : args) { + if (!isSafeForDirectSerialization(arg)) { + return false; + } + } + return true; + } + + /** + * Check if an object is safe to serialize directly without recursive processing. + * Covers: null, simple types, primitive arrays, and safe containers (up to 3 levels deep). + */ + private static boolean isSafeForDirectSerialization(Object obj) { + return isSafeForDirectSerialization(obj, 3); + } + + private static boolean isSafeForDirectSerialization(Object obj, int depthLeft) { + if (obj == null || isSimpleType(obj)) { + return true; + } + if (depthLeft <= 0) { + return false; + } + Class clazz = obj.getClass(); + if (clazz.isArray() && clazz.getComponentType().isPrimitive()) { + return true; + } + if (isSafeContainerType(clazz)) { + if (obj instanceof Collection) { + for (Object item : (Collection) obj) { + if (!isSafeForDirectSerialization(item, depthLeft - 1)) return false; + } + return true; + } + if (obj instanceof Map) { + for (Map.Entry e : ((Map) obj).entrySet()) { + if (!isSafeForDirectSerialization(e.getKey(), depthLeft - 1) || + !isSafeForDirectSerialization(e.getValue(), depthLeft - 1)) return false; + } + return true; + } + } + return false; + } + /** * Deserialize bytes back to an object. * The returned object may contain KryoPlaceholder instances for parts @@ -141,14 +212,15 @@ public final class Serializer { /** * Direct serialization without recursive processing. + * Reuses a ThreadLocal Output buffer to avoid per-call allocation. */ private static byte[] directSerialize(Object obj) { Kryo kryo = KRYO.get(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFFER_SIZE); - try (Output output = new Output(baos)) { - kryo.writeClassAndObject(output, obj); - } - return baos.toByteArray(); + Output output = OUTPUT.get(); + output.reset(); + kryo.writeClassAndObject(output, obj); + output.flush(); + return output.toBytes(); } /** @@ -201,37 +273,23 @@ public final class Serializer { // unserializable types, recursively process to catch and replace unserializable objects. if (obj instanceof Map) { Map map = (Map) obj; - if (containsOnlySimpleTypes(map)) { - // Simple map - try direct serialization to preserve full size - byte[] serialized = tryDirectSerialize(obj); - if (serialized != null) { - try { - deserialize(serialized); - return obj; // Success - return original - } catch (Exception e) { - // Fall through to recursive handling - } - } + if (isSafeContainerType(clazz) && containsOnlySimpleTypes(map)) { + return obj; } return handleMap(map, seen, depth, path); } if (obj instanceof Collection) { Collection collection = (Collection) obj; - if (containsOnlySimpleTypes(collection)) { - // Simple collection - try direct serialization to preserve full size - byte[] serialized = tryDirectSerialize(obj); - if (serialized != null) { - try { - deserialize(serialized); - return obj; // Success - return original - } catch (Exception e) { - // Fall through to recursive handling - } - } + if (isSafeContainerType(clazz) && containsOnlySimpleTypes(collection)) { + return obj; } return handleCollection(collection, seen, depth, path); } if (clazz.isArray()) { + // Primitive arrays (int[], double[], etc.) are directly serializable by Kryo + if (clazz.getComponentType().isPrimitive()) { + return obj; + } return handleArray(obj, seen, depth, path); } @@ -255,6 +313,19 @@ public final class Serializer { } } + /** + * Check if a container type is known to round-trip safely through Kryo without verification. + * Only includes types registered with Kryo that are known to serialize/deserialize correctly. + */ + private static boolean isSafeContainerType(Class clazz) { + return clazz == ArrayList.class || + clazz == LinkedList.class || + clazz == HashMap.class || + clazz == LinkedHashMap.class || + clazz == HashSet.class || + clazz == LinkedHashSet.class; + } + /** * Check if a class is known to be unserializable. */ diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java index 28c2d2998..a9acfe855 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java @@ -12,6 +12,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; public final class TraceRecorder { @@ -23,6 +24,8 @@ public final class TraceRecorder { private final TraceWriter writer; private final ConcurrentHashMap functionCounts = new ConcurrentHashMap<>(); private final AtomicInteger droppedCaptures = new AtomicInteger(0); + private final AtomicLong totalOnEntryNs = new AtomicLong(0); + private final AtomicLong totalSerializationNs = new AtomicLong(0); private final int maxFunctionCount; private final ExecutorService serializerExecutor; @@ -31,7 +34,7 @@ public final class TraceRecorder { private TraceRecorder(TracerConfig config) { this.config = config; - this.writer = new TraceWriter(config.getDbPath()); + this.writer = new TraceWriter(config.getDbPath(), config.isInMemoryDb()); this.maxFunctionCount = config.getMaxFunctionCount(); this.serializerExecutor = Executors.newCachedThreadPool(r -> { Thread t = new Thread(r, "codeflash-serializer"); @@ -68,6 +71,8 @@ public final class TraceRecorder { private void onEntryImpl(String className, String methodName, String descriptor, int lineNumber, String sourceFile, Object[] args) { + long entryStart = System.nanoTime(); + String qualifiedName = className + "." + methodName + descriptor; // Check per-method count limit @@ -76,30 +81,38 @@ public final class TraceRecorder { return; } - // Serialize args with timeout to prevent deep object graph traversal from blocking + // Serialize args — try inline fast path first, fall back to async with timeout byte[] argsBlob; - Future future = serializerExecutor.submit(() -> Serializer.serialize(args)); - try { - argsBlob = future.get(SERIALIZATION_TIMEOUT_MS, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - future.cancel(true); - droppedCaptures.incrementAndGet(); - System.err.println("[codeflash-tracer] Serialization timed out for " + className + "." - + methodName); - return; - } catch (Exception e) { - Throwable cause = e.getCause() != null ? e.getCause() : e; - droppedCaptures.incrementAndGet(); - System.err.println("[codeflash-tracer] Serialization failed for " + className + "." - + methodName + ": " + cause.getClass().getSimpleName() + ": " + cause.getMessage()); - return; + long serStart = System.nanoTime(); + argsBlob = Serializer.serializeFast(args); + if (argsBlob == null) { + // Slow path: async serialization with timeout for complex/unknown types + Future future = serializerExecutor.submit(() -> Serializer.serialize(args)); + try { + argsBlob = future.get(SERIALIZATION_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + future.cancel(true); + droppedCaptures.incrementAndGet(); + System.err.println("[codeflash-tracer] Serialization timed out for " + className + "." + + methodName); + return; + } catch (Exception e) { + Throwable cause = e.getCause() != null ? e.getCause() : e; + droppedCaptures.incrementAndGet(); + System.err.println("[codeflash-tracer] Serialization failed for " + className + "." + + methodName + ": " + cause.getClass().getSimpleName() + ": " + cause.getMessage()); + return; + } } + totalSerializationNs.addAndGet(System.nanoTime() - serStart); long timeNs = System.nanoTime(); count.incrementAndGet(); writer.recordFunctionCall("call", methodName, className, sourceFile, lineNumber, descriptor, timeNs, argsBlob); + + totalOnEntryNs.addAndGet(System.nanoTime() - entryStart); } public void flush() { @@ -126,5 +139,16 @@ public final class TraceRecorder { System.err.println("[codeflash-tracer] Captured " + totalCaptures + " invocations across " + functionCounts.size() + " methods" + (dropped > 0 ? " (" + dropped + " dropped due to serialization timeout/failure)" : "")); + + // Timing summary + long onEntryMs = totalOnEntryNs.get() / 1_000_000; + long serMs = totalSerializationNs.get() / 1_000_000; + String writerSummary = writer.getTimingSummary(); + System.err.println("[codeflash-tracer] Timing: onEntry=" + onEntryMs + "ms" + + " (serialization=" + serMs + "ms)" + + (totalCaptures > 0 + ? " avg=" + String.format("%.2f", (double) onEntryMs / totalCaptures) + "ms/capture" + : "") + + " " + writerSummary); } } diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java index a9eeabf60..7bc5032cb 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java @@ -7,30 +7,49 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; public final class TraceWriter { + private static final int BATCH_SIZE = 256; + private static final int QUEUE_CAPACITY = 65536; + private final Connection connection; + private final Path diskPath; + private final boolean inMemory; private final BlockingQueue writeQueue; private final Thread writerThread; private final AtomicBoolean running; + private final AtomicLong totalWriteNs = new AtomicLong(0); + private final AtomicInteger batchCount = new AtomicInteger(0); + private final AtomicInteger taskCount = new AtomicInteger(0); + private volatile long dumpToFileMs = 0; private PreparedStatement insertFunctionCall; private PreparedStatement insertMetadata; - public TraceWriter(String dbPath) { - this.writeQueue = new LinkedBlockingQueue<>(); + public TraceWriter(String dbPath, boolean inMemory) { + this.diskPath = Paths.get(dbPath).toAbsolutePath(); + this.diskPath.getParent().toFile().mkdirs(); + this.inMemory = inMemory; + this.writeQueue = new ArrayBlockingQueue<>(QUEUE_CAPACITY); this.running = new AtomicBoolean(true); try { - Path path = Paths.get(dbPath).toAbsolutePath(); - path.getParent().toFile().mkdirs(); - this.connection = DriverManager.getConnection("jdbc:sqlite:" + path); + if (inMemory) { + // In-memory database for maximum write performance; flushed to disk via VACUUM INTO at close() + this.connection = DriverManager.getConnection("jdbc:sqlite::memory:"); + } else { + this.connection = DriverManager.getConnection("jdbc:sqlite:" + this.diskPath); + } initializeSchema(); prepareStatements(); @@ -45,8 +64,12 @@ public final class TraceWriter { private void initializeSchema() throws SQLException { try (Statement stmt = connection.createStatement()) { - stmt.execute("PRAGMA journal_mode=WAL"); - stmt.execute("PRAGMA synchronous=NORMAL"); + if (!inMemory) { + stmt.execute("PRAGMA journal_mode=WAL"); + stmt.execute("PRAGMA synchronous=NORMAL"); + stmt.execute("PRAGMA cache_size=-16000"); + stmt.execute("PRAGMA temp_store=MEMORY"); + } stmt.execute( "CREATE TABLE IF NOT EXISTS function_calls(" + @@ -69,6 +92,8 @@ public final class TraceWriter { stmt.execute("CREATE INDEX IF NOT EXISTS idx_fc_class_func ON function_calls(classname, function)"); } + // Keep autocommit off for writer performance — commit explicitly per batch + connection.setAutoCommit(false); } private void prepareStatements() throws SQLException { @@ -95,29 +120,65 @@ public final class TraceWriter { } private void writerLoop() { + List batch = new ArrayList<>(BATCH_SIZE); + while (running.get() || !writeQueue.isEmpty()) { try { WriteTask task = writeQueue.poll(100, TimeUnit.MILLISECONDS); - if (task != null) { - task.execute(this); + if (task == null) { + continue; } + batch.add(task); + writeQueue.drainTo(batch, BATCH_SIZE - 1); + executeBatch(batch); + batch.clear(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; - } catch (SQLException e) { - System.err.println("[codeflash-tracer] Write error: " + e.getMessage()); } } // Drain remaining - WriteTask task; - while ((task = writeQueue.poll()) != null) { + writeQueue.drainTo(batch); + if (!batch.isEmpty()) { + executeBatch(batch); + } + } + + private void executeBatch(List batch) { + if (batch.isEmpty()) { + return; + } + + long writeStart = System.nanoTime(); + boolean hasFunctionCalls = false; + try { + for (WriteTask task : batch) { + if (task instanceof FunctionCallTask) { + ((FunctionCallTask) task).bindParameters(this); + insertFunctionCall.addBatch(); + hasFunctionCalls = true; + } else { + task.execute(this); + } + } + + if (hasFunctionCalls) { + insertFunctionCall.executeBatch(); + } + + connection.commit(); + } catch (SQLException e) { + System.err.println("[codeflash-tracer] Batch write error (" + batch.size() + " tasks): " + e.getMessage()); try { - task.execute(this); - } catch (SQLException e) { - System.err.println("[codeflash-tracer] Write error: " + e.getMessage()); + connection.rollback(); + } catch (SQLException re) { + System.err.println("[codeflash-tracer] Rollback failed: " + re.getMessage()); } } + totalWriteNs.addAndGet(System.nanoTime() - writeStart); + batchCount.incrementAndGet(); + taskCount.addAndGet(batch.size()); } public void flush() { @@ -131,6 +192,15 @@ public final class TraceWriter { } } + public String getTimingSummary() { + long writeMs = totalWriteNs.get() / 1_000_000; + int batches = batchCount.get(); + int tasks = taskCount.get(); + return "writes=" + writeMs + "ms (" + tasks + " tasks in " + batches + " batches" + + (batches > 0 ? ", avg=" + String.format("%.1f", (double) tasks / batches) + " tasks/batch" : "") + + ") dump=" + dumpToFileMs + "ms"; + } + public void close() { running.set(false); try { @@ -139,9 +209,29 @@ public final class TraceWriter { Thread.currentThread().interrupt(); } + // Close prepared statements first — required before VACUUM try { if (insertFunctionCall != null) insertFunctionCall.close(); if (insertMetadata != null) insertMetadata.close(); + } catch (SQLException e) { + System.err.println("[codeflash-tracer] Error closing statements: " + e.getMessage()); + } + + if (inMemory) { + long dumpStart = System.nanoTime(); + try { + connection.commit(); + connection.setAutoCommit(true); + try (Statement stmt = connection.createStatement()) { + stmt.execute("VACUUM INTO '" + diskPath.toString().replace("'", "''") + "'"); + } + } catch (SQLException e) { + System.err.println("[codeflash-tracer] Failed to write trace DB to disk: " + e.getMessage()); + } + dumpToFileMs = (System.nanoTime() - dumpStart) / 1_000_000; + } + + try { if (connection != null) connection.close(); } catch (SQLException e) { System.err.println("[codeflash-tracer] Error closing TraceWriter: " + e.getMessage()); @@ -177,8 +267,7 @@ public final class TraceWriter { this.argsBlob = argsBlob; } - @Override - public void execute(TraceWriter writer) throws SQLException { + void bindParameters(TraceWriter writer) throws SQLException { writer.insertFunctionCall.setString(1, type); writer.insertFunctionCall.setString(2, function); writer.insertFunctionCall.setString(3, classname); @@ -187,6 +276,11 @@ public final class TraceWriter { writer.insertFunctionCall.setString(6, descriptor); writer.insertFunctionCall.setLong(7, timeNs); writer.insertFunctionCall.setBytes(8, argsBlob); + } + + @Override + public void execute(TraceWriter writer) throws SQLException { + bindParameters(writer); writer.insertFunctionCall.executeUpdate(); } } diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TracerConfig.java b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TracerConfig.java index 8fe799d2f..9e2675c00 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TracerConfig.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TracerConfig.java @@ -30,6 +30,9 @@ public final class TracerConfig { @SerializedName("projectRoot") private String projectRoot = ""; + @SerializedName("inMemoryDb") + private boolean inMemoryDb = false; + private static final Gson GSON = new Gson(); public static TracerConfig parse(String agentArgs) { @@ -89,6 +92,10 @@ public final class TracerConfig { return projectRoot; } + public boolean isInMemoryDb() { + return inMemoryDb; + } + public boolean shouldInstrumentClass(String internalClassName) { String dotName = internalClassName.replace('/', '.'); diff --git a/codeflash/languages/java/tracer.py b/codeflash/languages/java/tracer.py index 50506797e..8e8348681 100644 --- a/codeflash/languages/java/tracer.py +++ b/codeflash/languages/java/tracer.py @@ -6,6 +6,7 @@ import os import subprocess from typing import TYPE_CHECKING +from codeflash.code_utils.env_utils import is_ci from codeflash.languages.java.line_profiler import find_agent_jar from codeflash.languages.java.replay_test import generate_replay_tests @@ -114,6 +115,7 @@ class JavaTracer: "maxFunctionCount": max_function_count, "timeout": timeout, "projectRoot": str(project_root.resolve()) if project_root else "", + "inMemoryDb": is_ci(), } config_path = trace_db_path.with_suffix(".config.json") diff --git a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/ProfilingWorkload.java b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/ProfilingWorkload.java new file mode 100644 index 000000000..b7c48c625 --- /dev/null +++ b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/ProfilingWorkload.java @@ -0,0 +1,91 @@ +package com.example; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Profiling workload for benchmarking the codeflash tracing agent. + * Exercises different argument types to stress serialization paths. + */ +public class ProfilingWorkload { + + // 1. Primitives only — cheapest to serialize + public static int addInts(int a, int b) { + return a + b; + } + + // 2. String arguments — moderate serialization cost + public static String concatStrings(String a, String b) { + return a + b; + } + + // 3. Array argument — requires element-by-element serialization + public static int sumArray(int[] values) { + int sum = 0; + for (int v : values) { + sum += v; + } + return sum; + } + + // 4. Collection argument — triggers recursive Kryo processing + public static int sumList(List values) { + int sum = 0; + for (int v : values) { + sum += v; + } + return sum; + } + + // 5. Nested map — deep object graph, expensive serialization + public static int countMapEntries(Map> data) { + int count = 0; + for (List list : data.values()) { + count += list.size(); + } + return count; + } + + public static void main(String[] args) { + int iterations = 1000; + + // 1. Primitives + for (int i = 0; i < iterations; i++) { + addInts(i, i + 1); + } + + // 2. Strings + for (int i = 0; i < iterations; i++) { + concatStrings("hello-" + i, "-world"); + } + + // 3. Arrays + int[] arr = new int[100]; + for (int i = 0; i < arr.length; i++) arr[i] = i; + for (int i = 0; i < iterations; i++) { + sumArray(arr); + } + + // 4. Lists + List list = new ArrayList<>(100); + for (int i = 0; i < 100; i++) list.add(i); + for (int i = 0; i < iterations; i++) { + sumList(list); + } + + // 5. Nested maps + Map> map = new HashMap<>(); + for (int i = 0; i < 10; i++) { + List vals = new ArrayList<>(); + for (int j = 0; j < 10; j++) vals.add(j); + map.put("key-" + i, vals); + } + for (int i = 0; i < iterations; i++) { + countMapEntries(map); + } + + System.out.println("ProfilingWorkload complete."); + } +} diff --git a/tests/test_languages/test_java/test_java_tracer_e2e.py b/tests/test_languages/test_java/test_java_tracer_e2e.py index c7dce2379..2ea87de9c 100644 --- a/tests/test_languages/test_java/test_java_tracer_e2e.py +++ b/tests/test_languages/test_java/test_java_tracer_e2e.py @@ -196,7 +196,6 @@ class TestReplayTestGeneration: assert "import org.junit.jupiter.api.Test;" in content assert "ReplayHelper" in content assert "replay_computeSum_0" in content - assert "replay_repeatString_0" in content def test_metadata_parsing(self, compiled_workload: Path, trace_db: Path, tmp_path: Path) -> None: """Test that metadata comments are correctly parsed from generated tests.""" From e81f25f8256078acf657c124e587682fe39e6c66 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 05:05:17 -0500 Subject: [PATCH 095/147] fix: remove stale repeatString assertions from integration tests repeatString was removed from Workload.java in the E2E reduction. --- tests/test_languages/test_java/test_java_tracer_integration.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_languages/test_java/test_java_tracer_integration.py b/tests/test_languages/test_java/test_java_tracer_integration.py index f6ffefdf2..a8dbc5118 100644 --- a/tests/test_languages/test_java/test_java_tracer_integration.py +++ b/tests/test_languages/test_java/test_java_tracer_integration.py @@ -88,7 +88,6 @@ class TestFunctionDiscoveryFromReplayTests: assert func.file_path == file_path assert "computeSum" in all_func_names - assert "repeatString" in all_func_names def test_discover_tests_for_replay_tests(self, traced_workload: tuple) -> None: """Test that test discovery maps replay tests to source functions.""" @@ -112,7 +111,6 @@ class TestFunctionDiscoveryFromReplayTests: matched_func_names.add(func_name) assert "computeSum" in matched_func_names, f"computeSum not found in: {result.keys()}" - assert "repeatString" in matched_func_names, f"repeatString not found in: {result.keys()}" # Each function should have at least one test for func_name, test_infos in result.items(): From 01e22152c70500724b3f578877e47344f3083870 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 05:07:53 -0500 Subject: [PATCH 096/147] flexing --- .../src/main/java/com/example/Workload.java | 45 ++++++++++++++++++- .../test_java/test_java_tracer_e2e.py | 11 +++-- .../test_java/test_java_tracer_integration.py | 2 + 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java index ff0ae4d8a..7beb2a4ea 100644 --- a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java +++ b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java @@ -1,5 +1,8 @@ package com.example; +import java.util.ArrayList; +import java.util.List; + public class Workload { public static int computeSum(int n) { @@ -10,15 +13,53 @@ public class Workload { return sum; } + public static String repeatString(String s, int count) { + String result = ""; + for (int i = 0; i < count; i++) { + result = result + s; + } + return result; + } + + public static List filterEvens(List numbers) { + List result = new ArrayList<>(); + for (int n : numbers) { + if (n % 2 == 0) { + result.add(n); + } + } + return result; + } + + public int instanceMethod(int x, int y) { + return x * y + computeSum(x); + } + public static void main(String[] args) { - // Run with large inputs so JFR can capture CPU samples. + // Run methods with large inputs so JFR can capture CPU samples. // Small inputs finish too fast (<1ms) for JFR's 10ms sampling interval. - for (int round = 0; round < 100; round++) { + for (int round = 0; round < 1000; round++) { computeSum(100_000); + repeatString("hello world ", 1000); + + List nums = new ArrayList<>(); + for (int i = 1; i <= 10_000; i++) nums.add(i); + filterEvens(nums); + + Workload w = new Workload(); + w.instanceMethod(100_000, 42); } // Also call with small inputs for variety in traced args System.out.println("computeSum(100) = " + computeSum(100)); + System.out.println("repeatString(\"ab\", 3) = " + repeatString("ab", 3)); + + List small = new ArrayList<>(); + for (int i = 1; i <= 10; i++) small.add(i); + System.out.println("filterEvens(1..10) = " + filterEvens(small)); + + Workload w = new Workload(); + System.out.println("instanceMethod(5, 3) = " + w.instanceMethod(5, 3)); System.out.println("Workload complete."); } diff --git a/tests/test_languages/test_java/test_java_tracer_e2e.py b/tests/test_languages/test_java/test_java_tracer_e2e.py index 2ea87de9c..157f23eb6 100644 --- a/tests/test_languages/test_java/test_java_tracer_e2e.py +++ b/tests/test_languages/test_java/test_java_tracer_e2e.py @@ -81,11 +81,14 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: rows = conn.execute("SELECT function, classname, descriptor, length(args) FROM function_calls").fetchall() - assert len(rows) >= 2, f"Expected at least 2 captured invocations, got {len(rows)}" + assert len(rows) >= 5, f"Expected at least 5 captured invocations, got {len(rows)}" # Check that specific methods were captured functions = {row[0] for row in rows} assert "computeSum" in functions + assert "repeatString" in functions + assert "filterEvens" in functions + assert "instanceMethod" in functions # Verify all rows have non-empty args blobs for row in rows: @@ -94,7 +97,7 @@ class TestTracingAgent: # Verify metadata metadata = dict(conn.execute("SELECT key, value FROM metadata").fetchall()) assert "totalCaptures" in metadata - assert int(metadata["totalCaptures"]) >= 2 + assert int(metadata["totalCaptures"]) >= 5 finally: conn.close() @@ -133,7 +136,7 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: - # computeSum is called 2 times (direct calls in main) + # computeSum is called 4 times (2 direct + 2 from instanceMethod) compute_count = conn.execute( "SELECT COUNT(*) FROM function_calls WHERE function = 'computeSum'" ).fetchone()[0] @@ -196,6 +199,7 @@ class TestReplayTestGeneration: assert "import org.junit.jupiter.api.Test;" in content assert "ReplayHelper" in content assert "replay_computeSum_0" in content + assert "replay_repeatString_0" in content def test_metadata_parsing(self, compiled_workload: Path, trace_db: Path, tmp_path: Path) -> None: """Test that metadata comments are correctly parsed from generated tests.""" @@ -292,6 +296,7 @@ class TestJavaTracerOrchestration: assert len(workload_files) == 1 content = workload_files[0].read_text(encoding="utf-8") assert "replay_computeSum" in content + assert "replay_instanceMethod" in content def test_package_detection(self) -> None: """Test that package detection finds Java packages from source files.""" diff --git a/tests/test_languages/test_java/test_java_tracer_integration.py b/tests/test_languages/test_java/test_java_tracer_integration.py index a8dbc5118..f6ffefdf2 100644 --- a/tests/test_languages/test_java/test_java_tracer_integration.py +++ b/tests/test_languages/test_java/test_java_tracer_integration.py @@ -88,6 +88,7 @@ class TestFunctionDiscoveryFromReplayTests: assert func.file_path == file_path assert "computeSum" in all_func_names + assert "repeatString" in all_func_names def test_discover_tests_for_replay_tests(self, traced_workload: tuple) -> None: """Test that test discovery maps replay tests to source functions.""" @@ -111,6 +112,7 @@ class TestFunctionDiscoveryFromReplayTests: matched_func_names.add(func_name) assert "computeSum" in matched_func_names, f"computeSum not found in: {result.keys()}" + assert "repeatString" in matched_func_names, f"repeatString not found in: {result.keys()}" # Each function should have at least one test for func_name, test_infos in result.items(): From bfe6f3a828c8ca0c53272ce1d528c064d81b425a Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 05:16:49 -0500 Subject: [PATCH 097/147] Remove debug timing instrumentation from tracer Strip AtomicLong accumulators, System.nanoTime() timing, and getTimingSummary() that were added for profiling. No functional change. --- .../com/codeflash/tracer/TraceRecorder.java | 20 ------------------ .../com/codeflash/tracer/TraceWriter.java | 21 ------------------- 2 files changed, 41 deletions(-) diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java index a9acfe855..8596d3ee8 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceRecorder.java @@ -12,7 +12,6 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; public final class TraceRecorder { @@ -24,8 +23,6 @@ public final class TraceRecorder { private final TraceWriter writer; private final ConcurrentHashMap functionCounts = new ConcurrentHashMap<>(); private final AtomicInteger droppedCaptures = new AtomicInteger(0); - private final AtomicLong totalOnEntryNs = new AtomicLong(0); - private final AtomicLong totalSerializationNs = new AtomicLong(0); private final int maxFunctionCount; private final ExecutorService serializerExecutor; @@ -71,8 +68,6 @@ public final class TraceRecorder { private void onEntryImpl(String className, String methodName, String descriptor, int lineNumber, String sourceFile, Object[] args) { - long entryStart = System.nanoTime(); - String qualifiedName = className + "." + methodName + descriptor; // Check per-method count limit @@ -83,7 +78,6 @@ public final class TraceRecorder { // Serialize args — try inline fast path first, fall back to async with timeout byte[] argsBlob; - long serStart = System.nanoTime(); argsBlob = Serializer.serializeFast(args); if (argsBlob == null) { // Slow path: async serialization with timeout for complex/unknown types @@ -104,15 +98,12 @@ public final class TraceRecorder { return; } } - totalSerializationNs.addAndGet(System.nanoTime() - serStart); long timeNs = System.nanoTime(); count.incrementAndGet(); writer.recordFunctionCall("call", methodName, className, sourceFile, lineNumber, descriptor, timeNs, argsBlob); - - totalOnEntryNs.addAndGet(System.nanoTime() - entryStart); } public void flush() { @@ -139,16 +130,5 @@ public final class TraceRecorder { System.err.println("[codeflash-tracer] Captured " + totalCaptures + " invocations across " + functionCounts.size() + " methods" + (dropped > 0 ? " (" + dropped + " dropped due to serialization timeout/failure)" : "")); - - // Timing summary - long onEntryMs = totalOnEntryNs.get() / 1_000_000; - long serMs = totalSerializationNs.get() / 1_000_000; - String writerSummary = writer.getTimingSummary(); - System.err.println("[codeflash-tracer] Timing: onEntry=" + onEntryMs + "ms" - + " (serialization=" + serMs + "ms)" - + (totalCaptures > 0 - ? " avg=" + String.format("%.2f", (double) onEntryMs / totalCaptures) + "ms/capture" - : "") - + " " + writerSummary); } } diff --git a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java index 7bc5032cb..a75872089 100644 --- a/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java +++ b/codeflash-java-runtime/src/main/java/com/codeflash/tracer/TraceWriter.java @@ -14,8 +14,6 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; public final class TraceWriter { @@ -28,10 +26,6 @@ public final class TraceWriter { private final BlockingQueue writeQueue; private final Thread writerThread; private final AtomicBoolean running; - private final AtomicLong totalWriteNs = new AtomicLong(0); - private final AtomicInteger batchCount = new AtomicInteger(0); - private final AtomicInteger taskCount = new AtomicInteger(0); - private volatile long dumpToFileMs = 0; private PreparedStatement insertFunctionCall; private PreparedStatement insertMetadata; @@ -150,7 +144,6 @@ public final class TraceWriter { return; } - long writeStart = System.nanoTime(); boolean hasFunctionCalls = false; try { for (WriteTask task : batch) { @@ -176,9 +169,6 @@ public final class TraceWriter { System.err.println("[codeflash-tracer] Rollback failed: " + re.getMessage()); } } - totalWriteNs.addAndGet(System.nanoTime() - writeStart); - batchCount.incrementAndGet(); - taskCount.addAndGet(batch.size()); } public void flush() { @@ -192,15 +182,6 @@ public final class TraceWriter { } } - public String getTimingSummary() { - long writeMs = totalWriteNs.get() / 1_000_000; - int batches = batchCount.get(); - int tasks = taskCount.get(); - return "writes=" + writeMs + "ms (" + tasks + " tasks in " + batches + " batches" - + (batches > 0 ? ", avg=" + String.format("%.1f", (double) tasks / batches) + " tasks/batch" : "") - + ") dump=" + dumpToFileMs + "ms"; - } - public void close() { running.set(false); try { @@ -218,7 +199,6 @@ public final class TraceWriter { } if (inMemory) { - long dumpStart = System.nanoTime(); try { connection.commit(); connection.setAutoCommit(true); @@ -228,7 +208,6 @@ public final class TraceWriter { } catch (SQLException e) { System.err.println("[codeflash-tracer] Failed to write trace DB to disk: " + e.getMessage()); } - dumpToFileMs = (System.nanoTime() - dumpStart) / 1_000_000; } try { From fefccd5935ac4e8d758f999ea807733b3a0ffbcd Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 05:28:34 -0500 Subject: [PATCH 098/147] fix: drop JFR inline event config that breaks JDK 11 The jdk.ExecutionSample#period=1ms syntax in -XX:StartFlightRecording is only supported on JDK 13+. On JDK 11 (CI), it causes "Failure when starting JFR on_create_vm_2" and no JFR file is created. The settings=profile preset still provides 10ms CPU sampling. --- codeflash/languages/java/tracer.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/codeflash/languages/java/tracer.py b/codeflash/languages/java/tracer.py index 8e8348681..b971e5526 100644 --- a/codeflash/languages/java/tracer.py +++ b/codeflash/languages/java/tracer.py @@ -124,12 +124,7 @@ class JavaTracer: def build_jfr_env(self, jfr_file: Path) -> dict[str, str]: env = os.environ.copy() - # Use profile settings with increased sampling frequency (1ms instead of default 10ms) - # This captures more samples for short-running programs - jfr_opts = ( - f"-XX:StartFlightRecording=filename={jfr_file.resolve()},settings=profile,dumponexit=true" - ",jdk.ExecutionSample#period=1ms" - ) + jfr_opts = f"-XX:StartFlightRecording=filename={jfr_file.resolve()},settings=profile,dumponexit=true" existing = env.get("JAVA_TOOL_OPTIONS", "") env["JAVA_TOOL_OPTIONS"] = f"{existing} {jfr_opts}".strip() return env From e191f74aa6e4d0c133452325ff102e1a1ff64b90 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 06:16:39 -0500 Subject: [PATCH 099/147] chore: add diagnostic logging to compare_test_results Temporary instrumentation to debug flaky futurehouse E2E test. Logs matched/skipped/timed-out counts and did_all_timeout state. --- codeflash/verification/equivalence.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/codeflash/verification/equivalence.py b/codeflash/verification/equivalence.py index f660e35ea..630cec8b6 100644 --- a/codeflash/verification/equivalence.py +++ b/codeflash/verification/equivalence.py @@ -41,11 +41,17 @@ def compare_test_results( ) test_diffs: list[TestDiff] = [] did_all_timeout: bool = True + _matched_count = 0 + _skipped_cdd_only = 0 + _skipped_init_state = 0 + _skipped_none = 0 + _timed_out_count = 0 for test_id in test_ids_superset: original_test_result = original_results.get_by_unique_invocation_loop_id(test_id) cdd_test_result = candidate_results.get_by_unique_invocation_loop_id(test_id) if cdd_test_result is not None and original_test_result is None: + _skipped_cdd_only += 1 continue # If helper function instance_state verification is not present, that's ok. continue if ( @@ -53,11 +59,15 @@ def compare_test_results( and original_test_result.verification_type == VerificationType.INIT_STATE_HELPER and cdd_test_result is None ): + _skipped_init_state += 1 continue if original_test_result is None or cdd_test_result is None: + _skipped_none += 1 continue + _matched_count += 1 did_all_timeout = did_all_timeout and original_test_result.timed_out if original_test_result.timed_out: + _timed_out_count += 1 continue superset_obj = False if original_test_result.verification_type and ( @@ -148,6 +158,23 @@ def compare_test_results( ) sys.setrecursionlimit(original_recursion_limit) + logger.info( + f"[compare_test_results] superset={len(test_ids_superset)} matched={_matched_count} " + f"skipped(cdd_only={_skipped_cdd_only} init_state={_skipped_init_state} none={_skipped_none}) " + f"timed_out={_timed_out_count} did_all_timeout={did_all_timeout} diffs={len(test_diffs)} " + f"pass_fail_only={pass_fail_only} orig_len={len(original_results)} cand_len={len(candidate_results)}" + ) + if did_all_timeout and _matched_count > 0 and _matched_count <= 3: + # Log a few sample matched IDs for debugging + _sample_ids = [] + for test_id in test_ids_superset: + orig = original_results.get_by_unique_invocation_loop_id(test_id) + cand = candidate_results.get_by_unique_invocation_loop_id(test_id) + if orig is not None and cand is not None: + _sample_ids.append(f" id={test_id} orig_timed_out={orig.timed_out} orig_pass={orig.did_pass}") + if len(_sample_ids) >= 3: + break + logger.info(f"[compare_test_results] sample matched: {_sample_ids}") if did_all_timeout: return False, test_diffs return len(test_diffs) == 0, test_diffs From 986654b7e67d4b004af3cc98328251383cefd19a Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 06:38:08 -0500 Subject: [PATCH 100/147] fix: pin PYTHONHASHSEED=0 in test env and enhance diff diagnostics Set PYTHONHASHSEED=0 in test subprocess environments so original and candidate runs use identical hash behavior, eliminating a source of non-deterministic return-value comparisons. Also upgrade diff logging from debug to info level with actual types and repr values for DID_PASS, RETURN_VALUE, and STDOUT diffs. --- codeflash/languages/function_optimizer.py | 5 +++++ codeflash/verification/equivalence.py | 26 +++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/codeflash/languages/function_optimizer.py b/codeflash/languages/function_optimizer.py index d9b4918fd..9c42070ef 100644 --- a/codeflash/languages/function_optimizer.py +++ b/codeflash/languages/function_optimizer.py @@ -3253,6 +3253,11 @@ class FunctionOptimizer: test_env["CODEFLASH_TEST_ITERATION"] = str(codeflash_test_iteration) test_env["CODEFLASH_TRACER_DISABLE"] = str(codeflash_tracer_disable) test_env["CODEFLASH_LOOP_INDEX"] = str(codeflash_loop_index) + # Pin PYTHONHASHSEED so original and candidate test processes use the same hash seed. + # Without this, each subprocess gets a random seed, which can cause non-deterministic + # iteration order in sets/dicts and lead to flaky return-value comparisons. + if "PYTHONHASHSEED" not in test_env: + test_env["PYTHONHASHSEED"] = "0" return test_env def line_profiler_step( diff --git a/codeflash/verification/equivalence.py b/codeflash/verification/equivalence.py index 630cec8b6..68cf216de 100644 --- a/codeflash/verification/equivalence.py +++ b/codeflash/verification/equivalence.py @@ -111,6 +111,11 @@ def compare_test_results( original_pytest_error=original_pytest_error, ) ) + logger.info( + f"[DIFF] scope=DID_PASS test_id={test_id} " + f"orig_pass={original_test_result.did_pass} cand_pass={cdd_test_result.did_pass} " + f"test_type={original_test_result.test_type} cand_error={cdd_pytest_error[:200] if cdd_pytest_error else 'none'}" + ) elif not pass_fail_only and not comparator( original_test_result.return_value, cdd_test_result.return_value, superset_obj=superset_obj @@ -129,13 +134,15 @@ def compare_test_results( ) try: - logger.debug( - f"File Name: {original_test_result.file_name}\n" - f"Test Type: {original_test_result.test_type}\n" - f"Verification Type: {original_test_result.verification_type}\n" - f"Invocation ID: {original_test_result.id}\n" - f"Original return value: {original_test_result.return_value}\n" - f"Candidate return value: {cdd_test_result.return_value}\n" + _orig_rv = original_test_result.return_value + _cand_rv = cdd_test_result.return_value + logger.info( + f"[DIFF] scope=RETURN_VALUE test_id={test_id} " + f"orig_type={type(_orig_rv).__name__} cand_type={type(_cand_rv).__name__} " + f"orig_pass={original_test_result.did_pass} cand_pass={cdd_test_result.did_pass} " + f"test_type={original_test_result.test_type} " + f"orig_repr={safe_repr(_orig_rv)[:200]} " + f"cand_repr={safe_repr(_cand_rv)[:200]}" ) except Exception as e: logger.error(e) @@ -156,6 +163,11 @@ def compare_test_results( original_pytest_error=original_pytest_error, ) ) + logger.info( + f"[DIFF] scope=STDOUT test_id={test_id} " + f"orig_stdout={str(original_test_result.stdout)[:200]} " + f"cand_stdout={str(cdd_test_result.stdout)[:200]}" + ) sys.setrecursionlimit(original_recursion_limit) logger.info( From 82ec301fad6f78921dee84b9a98fcd22e76427c7 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 06:49:43 -0500 Subject: [PATCH 101/147] chore: remove diagnostic logging from compare_test_results --- codeflash/verification/equivalence.py | 53 ++++----------------------- 1 file changed, 7 insertions(+), 46 deletions(-) diff --git a/codeflash/verification/equivalence.py b/codeflash/verification/equivalence.py index 68cf216de..f660e35ea 100644 --- a/codeflash/verification/equivalence.py +++ b/codeflash/verification/equivalence.py @@ -41,17 +41,11 @@ def compare_test_results( ) test_diffs: list[TestDiff] = [] did_all_timeout: bool = True - _matched_count = 0 - _skipped_cdd_only = 0 - _skipped_init_state = 0 - _skipped_none = 0 - _timed_out_count = 0 for test_id in test_ids_superset: original_test_result = original_results.get_by_unique_invocation_loop_id(test_id) cdd_test_result = candidate_results.get_by_unique_invocation_loop_id(test_id) if cdd_test_result is not None and original_test_result is None: - _skipped_cdd_only += 1 continue # If helper function instance_state verification is not present, that's ok. continue if ( @@ -59,15 +53,11 @@ def compare_test_results( and original_test_result.verification_type == VerificationType.INIT_STATE_HELPER and cdd_test_result is None ): - _skipped_init_state += 1 continue if original_test_result is None or cdd_test_result is None: - _skipped_none += 1 continue - _matched_count += 1 did_all_timeout = did_all_timeout and original_test_result.timed_out if original_test_result.timed_out: - _timed_out_count += 1 continue superset_obj = False if original_test_result.verification_type and ( @@ -111,11 +101,6 @@ def compare_test_results( original_pytest_error=original_pytest_error, ) ) - logger.info( - f"[DIFF] scope=DID_PASS test_id={test_id} " - f"orig_pass={original_test_result.did_pass} cand_pass={cdd_test_result.did_pass} " - f"test_type={original_test_result.test_type} cand_error={cdd_pytest_error[:200] if cdd_pytest_error else 'none'}" - ) elif not pass_fail_only and not comparator( original_test_result.return_value, cdd_test_result.return_value, superset_obj=superset_obj @@ -134,15 +119,13 @@ def compare_test_results( ) try: - _orig_rv = original_test_result.return_value - _cand_rv = cdd_test_result.return_value - logger.info( - f"[DIFF] scope=RETURN_VALUE test_id={test_id} " - f"orig_type={type(_orig_rv).__name__} cand_type={type(_cand_rv).__name__} " - f"orig_pass={original_test_result.did_pass} cand_pass={cdd_test_result.did_pass} " - f"test_type={original_test_result.test_type} " - f"orig_repr={safe_repr(_orig_rv)[:200]} " - f"cand_repr={safe_repr(_cand_rv)[:200]}" + logger.debug( + f"File Name: {original_test_result.file_name}\n" + f"Test Type: {original_test_result.test_type}\n" + f"Verification Type: {original_test_result.verification_type}\n" + f"Invocation ID: {original_test_result.id}\n" + f"Original return value: {original_test_result.return_value}\n" + f"Candidate return value: {cdd_test_result.return_value}\n" ) except Exception as e: logger.error(e) @@ -163,30 +146,8 @@ def compare_test_results( original_pytest_error=original_pytest_error, ) ) - logger.info( - f"[DIFF] scope=STDOUT test_id={test_id} " - f"orig_stdout={str(original_test_result.stdout)[:200]} " - f"cand_stdout={str(cdd_test_result.stdout)[:200]}" - ) sys.setrecursionlimit(original_recursion_limit) - logger.info( - f"[compare_test_results] superset={len(test_ids_superset)} matched={_matched_count} " - f"skipped(cdd_only={_skipped_cdd_only} init_state={_skipped_init_state} none={_skipped_none}) " - f"timed_out={_timed_out_count} did_all_timeout={did_all_timeout} diffs={len(test_diffs)} " - f"pass_fail_only={pass_fail_only} orig_len={len(original_results)} cand_len={len(candidate_results)}" - ) - if did_all_timeout and _matched_count > 0 and _matched_count <= 3: - # Log a few sample matched IDs for debugging - _sample_ids = [] - for test_id in test_ids_superset: - orig = original_results.get_by_unique_invocation_loop_id(test_id) - cand = candidate_results.get_by_unique_invocation_loop_id(test_id) - if orig is not None and cand is not None: - _sample_ids.append(f" id={test_id} orig_timed_out={orig.timed_out} orig_pass={orig.did_pass}") - if len(_sample_ids) >= 3: - break - logger.info(f"[compare_test_results] sample matched: {_sample_ids}") if did_all_timeout: return False, test_diffs return len(test_diffs) == 0, test_diffs From 70260f22b351474110e5a6fa46b36f545c8adfa7 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 07:39:49 -0500 Subject: [PATCH 102/147] fix: ensure language_version is detected before optimization API calls JavaSupport.ensure_runtime_environment() was never called during the optimization flow, so _language_version stayed None and the backend received language_version=null. The LLM had no Java version constraint, causing it to generate Java 16+ APIs (e.g. Stream.toList()) for Java 11 projects. --- codeflash/languages/function_optimizer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/codeflash/languages/function_optimizer.py b/codeflash/languages/function_optimizer.py index 9c42070ef..71ad03b18 100644 --- a/codeflash/languages/function_optimizer.py +++ b/codeflash/languages/function_optimizer.py @@ -489,6 +489,7 @@ class FunctionOptimizer: else function_to_optimize.file_path.read_text(encoding="utf8") ) self.language_support = current_language_support() + self.language_support.ensure_runtime_environment(self.project_root) if not function_to_optimize_ast: self.function_to_optimize_ast = self._resolve_function_ast( self.function_to_optimize_source_code, function_to_optimize.function_name, function_to_optimize.parents From b05561ef9ecbcb55a46f6256be0eec2c6c198484 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 07:51:08 -0500 Subject: [PATCH 103/147] chore: replace console.print with logger.info for Java project detection --- codeflash/tracer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/codeflash/tracer.py b/codeflash/tracer.py index 48920be8c..4a7d24585 100644 --- a/codeflash/tracer.py +++ b/codeflash/tracer.py @@ -349,10 +349,10 @@ def _run_java_tracer(existing_args: Namespace | None = None) -> ArgumentParser: max_function_count = getattr(config, "max_function_count", 256) timeout = int(getattr(config, "timeout", None) or getattr(config, "tracer_timeout", 0) or 0) - console.print("[bold]Java project detected[/]") - console.print(f" Project root: {project_root}") - console.print(f" Module root: {getattr(config, 'module_root', '?')}") - console.print(f" Tests root: {getattr(config, 'tests_root', '?')}") + logger.info("Java project detected") + logger.info(" Project root: %s", project_root) + logger.info(" Module root: %s", getattr(config, "module_root", "?")) + logger.info(" Tests root: %s", getattr(config, "tests_root", "?")) from codeflash.code_utils.code_utils import get_run_tmp_file from codeflash.languages.java.tracer import JavaTracer, run_java_tracer From 151df774a4ca2764b2bad28475e61413614402fe Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 08:29:46 -0500 Subject: [PATCH 104/147] perf: use --effort low for java-tracer E2E to reduce CI time --- tests/scripts/end_to_end_test_java_tracer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/scripts/end_to_end_test_java_tracer.py b/tests/scripts/end_to_end_test_java_tracer.py index 0f9f8a2ff..5d92662ec 100644 --- a/tests/scripts/end_to_end_test_java_tracer.py +++ b/tests/scripts/end_to_end_test_java_tracer.py @@ -51,6 +51,8 @@ def run_test(expected_improvement_pct: int) -> bool: "-m", "codeflash.main", "--no-pr", + "--effort", + "low", "optimize", "java", "-cp", From ec14860d29e6e6f4d1655f67e6d0c89608696050 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 07:56:02 -0500 Subject: [PATCH 105/147] Move benchmarks to .codeflash/benchmarks/ and auto-discover Move codeflash's own benchmarks to .codeflash/benchmarks/. Add auto-discovery of .codeflash/benchmarks/ in codeflash compare and benchmark mode -- when benchmarks-root is not explicitly configured, the CLI checks for .codeflash/benchmarks/ before erroring. Backwards compatible: users with existing benchmarks-root config are unaffected. Docs continue to show tests/benchmarks as the example path. --- {tests => .codeflash}/benchmarks/__init__.py | 0 .../test_benchmark_code_extract_code_context.py | 0 .../benchmarks/test_benchmark_comparator.py | 0 .../benchmarks/test_benchmark_discover_unit_tests.py | 0 .../benchmarks/test_benchmark_libcst_multi_file.py | 0 .../benchmarks/test_benchmark_libcst_pipeline.py | 0 .../benchmarks/test_benchmark_merge_test_results.py | 0 codeflash.code-workspace | 2 +- codeflash/cli_cmds/cli.py | 9 ++++++++- codeflash/cli_cmds/cmd_compare.py | 10 ++++++++-- pyproject.toml | 2 +- 11 files changed, 18 insertions(+), 5 deletions(-) rename {tests => .codeflash}/benchmarks/__init__.py (100%) rename {tests => .codeflash}/benchmarks/test_benchmark_code_extract_code_context.py (100%) rename {tests => .codeflash}/benchmarks/test_benchmark_comparator.py (100%) rename {tests => .codeflash}/benchmarks/test_benchmark_discover_unit_tests.py (100%) rename {tests => .codeflash}/benchmarks/test_benchmark_libcst_multi_file.py (100%) rename {tests => .codeflash}/benchmarks/test_benchmark_libcst_pipeline.py (100%) rename {tests => .codeflash}/benchmarks/test_benchmark_merge_test_results.py (100%) diff --git a/tests/benchmarks/__init__.py b/.codeflash/benchmarks/__init__.py similarity index 100% rename from tests/benchmarks/__init__.py rename to .codeflash/benchmarks/__init__.py diff --git a/tests/benchmarks/test_benchmark_code_extract_code_context.py b/.codeflash/benchmarks/test_benchmark_code_extract_code_context.py similarity index 100% rename from tests/benchmarks/test_benchmark_code_extract_code_context.py rename to .codeflash/benchmarks/test_benchmark_code_extract_code_context.py diff --git a/tests/benchmarks/test_benchmark_comparator.py b/.codeflash/benchmarks/test_benchmark_comparator.py similarity index 100% rename from tests/benchmarks/test_benchmark_comparator.py rename to .codeflash/benchmarks/test_benchmark_comparator.py diff --git a/tests/benchmarks/test_benchmark_discover_unit_tests.py b/.codeflash/benchmarks/test_benchmark_discover_unit_tests.py similarity index 100% rename from tests/benchmarks/test_benchmark_discover_unit_tests.py rename to .codeflash/benchmarks/test_benchmark_discover_unit_tests.py diff --git a/tests/benchmarks/test_benchmark_libcst_multi_file.py b/.codeflash/benchmarks/test_benchmark_libcst_multi_file.py similarity index 100% rename from tests/benchmarks/test_benchmark_libcst_multi_file.py rename to .codeflash/benchmarks/test_benchmark_libcst_multi_file.py diff --git a/tests/benchmarks/test_benchmark_libcst_pipeline.py b/.codeflash/benchmarks/test_benchmark_libcst_pipeline.py similarity index 100% rename from tests/benchmarks/test_benchmark_libcst_pipeline.py rename to .codeflash/benchmarks/test_benchmark_libcst_pipeline.py diff --git a/tests/benchmarks/test_benchmark_merge_test_results.py b/.codeflash/benchmarks/test_benchmark_merge_test_results.py similarity index 100% rename from tests/benchmarks/test_benchmark_merge_test_results.py rename to .codeflash/benchmarks/test_benchmark_merge_test_results.py diff --git a/codeflash.code-workspace b/codeflash.code-workspace index 67f000d35..2c9a31e22 100644 --- a/codeflash.code-workspace +++ b/codeflash.code-workspace @@ -16,7 +16,7 @@ "tests/", "-vv", "--ignore", - "tests/benchmarks/" + ".codeflash/benchmarks/" ], }, "launch": { diff --git a/codeflash/cli_cmds/cli.py b/codeflash/cli_cmds/cli.py index 400403843..2db13efe8 100644 --- a/codeflash/cli_cmds/cli.py +++ b/codeflash/cli_cmds/cli.py @@ -156,7 +156,14 @@ def process_pyproject_config(args: Namespace) -> Namespace: raise AssertionError("--tests-root must be specified") assert Path(args.tests_root).is_dir(), f"--tests-root {args.tests_root} must be a valid directory" if args.benchmark: - assert args.benchmarks_root is not None, "--benchmarks-root must be specified when running with --benchmark" + if args.benchmarks_root is None: + # Auto-discover .codeflash/benchmarks/ convention + candidate = Path.cwd() / ".codeflash" / "benchmarks" + if candidate.is_dir(): + args.benchmarks_root = str(candidate) + else: + msg = "--benchmarks-root must be specified when running with --benchmark, or .codeflash/benchmarks/ must exist" + raise AssertionError(msg) assert Path(args.benchmarks_root).is_dir(), ( f"--benchmarks-root {args.benchmarks_root} must be a valid directory" ) diff --git a/codeflash/cli_cmds/cmd_compare.py b/codeflash/cli_cmds/cmd_compare.py index 87d659fdb..fab917502 100644 --- a/codeflash/cli_cmds/cmd_compare.py +++ b/codeflash/cli_cmds/cmd_compare.py @@ -87,8 +87,14 @@ def run_compare(args: Namespace) -> None: benchmarks_root_str = pyproject_config.get("benchmarks_root") if not benchmarks_root_str: - logger.error("benchmarks-root must be configured in [tool.codeflash] to use compare") - sys.exit(1) + # Auto-discover .codeflash/benchmarks/ if it exists + candidate = project_root / ".codeflash" / "benchmarks" + if candidate.is_dir(): + benchmarks_root_str = str(candidate) + logger.info(f"Auto-discovered benchmarks at {candidate}") + else: + logger.error("benchmarks-root must be configured in [tool.codeflash] or .codeflash/benchmarks/ must exist") + sys.exit(1) benchmarks_root = Path(benchmarks_root_str).resolve() if not benchmarks_root.is_dir(): diff --git a/pyproject.toml b/pyproject.toml index 38256ebfb..7701725ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -354,7 +354,7 @@ __version__ = "{version}" # All paths are relative to this pyproject.toml's directory. module-root = "codeflash" tests-root = "tests" -benchmarks-root = "tests/benchmarks" +benchmarks-root = ".codeflash/benchmarks" ignore-paths = [] formatter-cmds = [ "uvx ruff check --exit-zero --fix $file", From 8959ead2f9b87de633cf1fd16c4b23abdd00c96f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 08:51:10 -0500 Subject: [PATCH 106/147] fix: resolve Windows 8.3 short paths in get_run_tmp_file and fix ruff lint errors Add .resolve() to TemporaryDirectory path to expand Windows 8.3 short paths (e.g. RUNNER~1) to canonical long form, fixing test_pickle_patcher failures on Windows CI. Also add missing return type annotations and noqa suppressions for benchmark test file. --- .../benchmarks/test_benchmark_merge_test_results.py | 10 +++++----- codeflash/code_utils/code_utils.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.codeflash/benchmarks/test_benchmark_merge_test_results.py b/.codeflash/benchmarks/test_benchmark_merge_test_results.py index 9b4aaf2ca..355d1c2e8 100644 --- a/.codeflash/benchmarks/test_benchmark_merge_test_results.py +++ b/.codeflash/benchmarks/test_benchmark_merge_test_results.py @@ -2,7 +2,7 @@ from codeflash.models.models import FunctionTestInvocation, InvocationId, TestRe from codeflash.verification.parse_test_output import merge_test_results -def generate_test_invocations(count=100): +def generate_test_invocations(count: int = 100) -> tuple[TestResults, TestResults]: """Generate a set number of test invocations for benchmarking.""" test_results_xml = TestResults() test_results_bin = TestResults() @@ -21,7 +21,7 @@ def generate_test_invocations(count=100): function_getting_tested="sorter", iteration_id=iteration_id, ), - file_name="/tmp/tests/unittest/test_bubble_sort__perfinstrumented.py", + file_name="/tmp/tests/unittest/test_bubble_sort__perfinstrumented.py", # noqa: S108 did_pass=True, runtime=None if i % 3 == 0 else i * 100, # Vary runtime values test_framework="unittest", @@ -42,7 +42,7 @@ def generate_test_invocations(count=100): function_getting_tested="sorter", iteration_id=iteration_id, ), - file_name="/tmp/tests/unittest/test_bubble_sort__perfinstrumented.py", + file_name="/tmp/tests/unittest/test_bubble_sort__perfinstrumented.py", # noqa: S108 did_pass=True, runtime=500 + i * 20, # Generate varying runtime values test_framework="unittest", @@ -56,12 +56,12 @@ def generate_test_invocations(count=100): return test_results_xml, test_results_bin -def run_merge_benchmark(count=100): +def run_merge_benchmark(count: int = 100) -> None: test_results_xml, test_results_bin = generate_test_invocations(count) # Perform the merge operation that will be benchmarked merge_test_results(xml_test_results=test_results_xml, bin_test_results=test_results_bin, test_framework="unittest") -def test_benchmark_merge_test_results(benchmark): +def test_benchmark_merge_test_results(benchmark) -> None: benchmark(run_merge_benchmark, 1000) # Default to 100 test invocations diff --git a/codeflash/code_utils/code_utils.py b/codeflash/code_utils/code_utils.py index 0e374f16f..6f8b1bd85 100644 --- a/codeflash/code_utils/code_utils.py +++ b/codeflash/code_utils/code_utils.py @@ -423,7 +423,7 @@ def get_run_tmp_file(file_path: Path | str) -> Path: file_path = Path(file_path) if not hasattr(get_run_tmp_file, "tmpdir_path"): get_run_tmp_file.tmpdir = TemporaryDirectory(prefix="codeflash_") - get_run_tmp_file.tmpdir_path = Path(get_run_tmp_file.tmpdir.name) + get_run_tmp_file.tmpdir_path = Path(get_run_tmp_file.tmpdir.name).resolve() return get_run_tmp_file.tmpdir_path / file_path From ecf4e63eca4032217ea2db4eafd027ef8f0f66e1 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 09:02:45 -0500 Subject: [PATCH 107/147] perf: reduce Java E2E looping time to 5s and cache runtime JAR build Make TOTAL_LOOPING_TIME configurable via CODEFLASH_LOOPING_TIME env var (defaults to 10s). Set to 5s in Java E2E CI jobs to cut verification time per candidate. Also cache the codeflash-runtime JAR keyed on source hash to skip mvn install when unchanged. --- .github/workflows/ci.yaml | 9 +++++++++ codeflash/code_utils/config_consts.py | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 368459608..e6e55298b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -436,6 +436,7 @@ jobs: RETRY_DELAY: 5 EXPECTED_IMPROVEMENT_PCT: ${{ matrix.expected_improvement }} CODEFLASH_END_TO_END: 1 + CODEFLASH_LOOPING_TIME: 5 steps: - uses: actions/checkout@v6 with: @@ -469,7 +470,15 @@ jobs: - name: Install dependencies run: uv sync + - name: Cache codeflash-runtime JAR + id: runtime-jar-cache + uses: actions/cache@v4 + with: + path: ~/.m2/repository/io/codeflash + key: codeflash-runtime-${{ hashFiles('codeflash-java-runtime/pom.xml', 'codeflash-java-runtime/src/**') }} + - name: Build and install codeflash-runtime JAR + if: steps.runtime-jar-cache.outputs.cache-hit != 'true' run: | cd codeflash-java-runtime mvn install -q -DskipTests diff --git a/codeflash/code_utils/config_consts.py b/codeflash/code_utils/config_consts.py index ff6494d73..c8cb8d884 100644 --- a/codeflash/code_utils/config_consts.py +++ b/codeflash/code_utils/config_consts.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os from enum import Enum from typing import Any, Union @@ -17,7 +18,7 @@ MIN_CONCURRENCY_IMPROVEMENT_THRESHOLD = 0.20 # 20% concurrency ratio improvemen CONCURRENCY_FACTOR = 10 # Number of concurrent executions for concurrency benchmark MAX_TEST_FUNCTION_RUNS = 50 MAX_CUMULATIVE_TEST_RUNTIME_NANOSECONDS = 100e6 # 100ms -TOTAL_LOOPING_TIME = 10.0 # 10 second candidate benchmarking budget +TOTAL_LOOPING_TIME = float(os.getenv("CODEFLASH_LOOPING_TIME", "10.0")) # candidate benchmarking budget (seconds) COVERAGE_THRESHOLD = 60.0 MIN_TESTCASE_PASSED_THRESHOLD = 6 REPEAT_OPTIMIZATION_PROBABILITY = 0.1 From 0d928f2b49c7dccf18e3f28e43fd5d4616c7bb99 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 09:05:30 -0500 Subject: [PATCH 108/147] perf: merge Java tracer into single-pass JVM invocation Combine JFR profiling and argument capture agent into one JAVA_TOOL_OPTIONS string, running the target program once instead of twice. JFR and javaagent are orthogonal JVM features that coexist without conflict. Keeps build_jfr_env/build_agent_env for standalone use. --- codeflash/languages/java/tracer.py | 38 +++++++++++++++++++----------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/codeflash/languages/java/tracer.py b/codeflash/languages/java/tracer.py index b971e5526..bdeec34e0 100644 --- a/codeflash/languages/java/tracer.py +++ b/codeflash/languages/java/tracer.py @@ -61,7 +61,7 @@ ADD_OPENS_FLAGS = ( class JavaTracer: - """Orchestrates two-stage Java tracing: JFR profiling + argument capture.""" + """Orchestrates Java tracing: combined JFR profiling + argument capture in a single JVM invocation.""" def trace( self, @@ -72,29 +72,23 @@ class JavaTracer: max_function_count: int = 256, timeout: int = 0, ) -> tuple[Path, Path]: - """Run the Java program twice: once for profiling, once for arg capture. + """Run the Java program once with both JFR profiling and argument capture. Returns (trace_db_path, jfr_file_path). """ jfr_file = trace_db_path.with_suffix(".jfr") trace_db_path.parent.mkdir(parents=True, exist_ok=True) - # Stage 1: JFR Profiling - logger.info("Stage 1: Running JFR profiling...") - jfr_env = self.build_jfr_env(jfr_file) - _run_java_with_graceful_timeout(java_command, jfr_env, timeout, "JFR profiling") - - if not jfr_file.exists(): - logger.warning("JFR file was not created at %s", jfr_file) - - # Stage 2: Argument Capture via Tracing Agent - logger.info("Stage 2: Running argument capture...") config_path = self.create_tracer_config( trace_db_path, packages, project_root=project_root, max_function_count=max_function_count, timeout=timeout ) - agent_env = self.build_agent_env(config_path) - _run_java_with_graceful_timeout(java_command, agent_env, timeout, "Argument capture") + combined_env = self.build_combined_env(jfr_file, config_path) + logger.info("Running combined JFR profiling + argument capture...") + _run_java_with_graceful_timeout(java_command, combined_env, timeout, "Combined tracing") + + if not jfr_file.exists(): + logger.warning("JFR file was not created at %s", jfr_file) if not trace_db_path.exists(): logger.error("Trace database was not created at %s", trace_db_path) @@ -141,6 +135,22 @@ class JavaTracer: env["JAVA_TOOL_OPTIONS"] = f"{existing} {agent_opts}".strip() return env + def build_combined_env(self, jfr_file: Path, config_path: Path, classpath: str | None = None) -> dict[str, str]: + """Build env with both JFR recording and tracing agent in a single JAVA_TOOL_OPTIONS.""" + env = os.environ.copy() + jfr_opts = ( + f"-XX:StartFlightRecording=filename={jfr_file.resolve()},settings=profile,dumponexit=true" + ",jdk.ExecutionSample#period=1ms" + ) + agent_jar = find_agent_jar(classpath=classpath) + if agent_jar is None: + msg = "codeflash-runtime JAR not found, cannot run tracing agent" + raise FileNotFoundError(msg) + agent_opts = f"{ADD_OPENS_FLAGS} -javaagent:{agent_jar}=trace={config_path.resolve()}" + existing = env.get("JAVA_TOOL_OPTIONS", "") + env["JAVA_TOOL_OPTIONS"] = f"{existing} {jfr_opts} {agent_opts}".strip() + return env + @staticmethod def detect_packages_from_source(module_root: Path) -> list[str]: """Scan Java files for package declarations and return unique package prefixes.""" From 013c83f5e49659d8232a3cac512516b6fad14919 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 09:11:02 -0500 Subject: [PATCH 109/147] fix: drop jdk.ExecutionSample#period from combined JFR opts (unsupported on Java 11) --- codeflash/languages/java/tracer.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/codeflash/languages/java/tracer.py b/codeflash/languages/java/tracer.py index bdeec34e0..649369d97 100644 --- a/codeflash/languages/java/tracer.py +++ b/codeflash/languages/java/tracer.py @@ -138,10 +138,7 @@ class JavaTracer: def build_combined_env(self, jfr_file: Path, config_path: Path, classpath: str | None = None) -> dict[str, str]: """Build env with both JFR recording and tracing agent in a single JAVA_TOOL_OPTIONS.""" env = os.environ.copy() - jfr_opts = ( - f"-XX:StartFlightRecording=filename={jfr_file.resolve()},settings=profile,dumponexit=true" - ",jdk.ExecutionSample#period=1ms" - ) + jfr_opts = f"-XX:StartFlightRecording=filename={jfr_file.resolve()},settings=profile,dumponexit=true" agent_jar = find_agent_jar(classpath=classpath) if agent_jar is None: msg = "codeflash-runtime JAR not found, cannot run tracing agent" From cb87763a2d508b14bd9444ed570fbc63450d5b41 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 12:58:54 -0500 Subject: [PATCH 110/147] fix: skip environment approval gate for trusted users on workflow_dispatch --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e6e55298b..3b5b1c74c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -258,7 +258,7 @@ jobs: - name: init-optimization script: end_to_end_test_init_optimization.py expected_improvement: 10 - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + environment: ${{ ((github.event_name == 'workflow_dispatch' && github.actor != 'misrasaurabh1' && github.actor != 'KRRT7') || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: CODEFLASH_AIS_SERVER: prod @@ -345,7 +345,7 @@ jobs: script: end_to_end_test_js_ts_class.py js_project_dir: code_to_optimize/js/code_to_optimize_ts expected_improvement: 30 - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + environment: ${{ ((github.event_name == 'workflow_dispatch' && github.actor != 'misrasaurabh1' && github.actor != 'KRRT7') || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: CODEFLASH_AIS_SERVER: prod @@ -425,7 +425,7 @@ jobs: script: end_to_end_test_java_void_optimization.py expected_improvement: 70 remove_git: true - environment: ${{ (github.event_name == 'workflow_dispatch' || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} + environment: ${{ ((github.event_name == 'workflow_dispatch' && github.actor != 'misrasaurabh1' && github.actor != 'KRRT7') || (contains(toJSON(github.event.pull_request.files.*.filename), '.github/workflows/') && github.event.pull_request.user.login != 'misrasaurabh1' && github.event.pull_request.user.login != 'KRRT7')) && 'external-trusted-contributors' || '' }} runs-on: ubuntu-latest env: CODEFLASH_AIS_SERVER: prod From 40f16b565ab768578e53ae6e6be5d536312a0237 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 13:09:36 -0500 Subject: [PATCH 111/147] ci: add standalone Java E2E workflow for isolated testing --- .github/workflows/java-e2e.yaml | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .github/workflows/java-e2e.yaml diff --git a/.github/workflows/java-e2e.yaml b/.github/workflows/java-e2e.yaml new file mode 100644 index 000000000..0bfc979b6 --- /dev/null +++ b/.github/workflows/java-e2e.yaml @@ -0,0 +1,77 @@ +name: Java E2E Tests +on: + workflow_dispatch: + +jobs: + e2e-java: + strategy: + fail-fast: false + matrix: + include: + - name: java-fibonacci-nogit + script: end_to_end_test_java_fibonacci.py + expected_improvement: 70 + remove_git: true + - name: java-tracer + script: end_to_end_test_java_tracer.py + expected_improvement: 10 + - name: java-void-optimization-nogit + script: end_to_end_test_java_void_optimization.py + expected_improvement: 70 + remove_git: true + runs-on: ubuntu-latest + env: + CODEFLASH_AIS_SERVER: prod + POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} + CODEFLASH_API_KEY: ${{ secrets.CODEFLASH_API_KEY }} + COLUMNS: 110 + MAX_RETRIES: 3 + RETRY_DELAY: 5 + EXPECTED_IMPROVEMENT_PCT: ${{ matrix.expected_improvement }} + CODEFLASH_END_TO_END: 1 + CODEFLASH_LOOPING_TIME: 5 + steps: + - uses: actions/checkout@v6 + + - name: Set up JDK 11 + uses: actions/setup-java@v5 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: 3.11.6 + enable-cache: true + + - name: Install dependencies + run: uv sync + + - name: Cache codeflash-runtime JAR + id: runtime-jar-cache + uses: actions/cache@v4 + with: + path: ~/.m2/repository/io/codeflash + key: codeflash-runtime-${{ hashFiles('codeflash-java-runtime/pom.xml', 'codeflash-java-runtime/src/**') }} + + - name: Build and install codeflash-runtime JAR + if: steps.runtime-jar-cache.outputs.cache-hit != 'true' + run: | + cd codeflash-java-runtime + mvn install -q -DskipTests + + - name: Remove .git + if: matrix.remove_git + run: | + if [ -d ".git" ]; then + sudo rm -rf .git + echo ".git directory removed." + else + echo ".git directory does not exist." + exit 1 + fi + + - name: Run E2E test + run: uv run python tests/scripts/${{ matrix.script }} From 5c778dfad40d6473024ec6824b5d2f7d5a634887 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 15:08:03 -0500 Subject: [PATCH 112/147] perf: trim tracer E2E workload to single function (repeatString) Keep only repeatString which reliably produces 284% improvement. Drop computeSum (marginal 16%), filterEvens and instanceMethod (no optimization found). Reduces tracer E2E from ~1h27m to ~21m. --- .../src/main/java/com/example/Workload.java | 44 +------------------ 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java index 7beb2a4ea..7dfdad95f 100644 --- a/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java +++ b/tests/test_languages/fixtures/java_tracer_e2e/src/main/java/com/example/Workload.java @@ -1,18 +1,7 @@ package com.example; -import java.util.ArrayList; -import java.util.List; - public class Workload { - public static int computeSum(int n) { - int sum = 0; - for (int i = 0; i < n; i++) { - sum += i; - } - return sum; - } - public static String repeatString(String s, int count) { String result = ""; for (int i = 0; i < count; i++) { @@ -21,46 +10,15 @@ public class Workload { return result; } - public static List filterEvens(List numbers) { - List result = new ArrayList<>(); - for (int n : numbers) { - if (n % 2 == 0) { - result.add(n); - } - } - return result; - } - - public int instanceMethod(int x, int y) { - return x * y + computeSum(x); - } - public static void main(String[] args) { - // Run methods with large inputs so JFR can capture CPU samples. - // Small inputs finish too fast (<1ms) for JFR's 10ms sampling interval. + // Run with large inputs so JFR can capture CPU samples. for (int round = 0; round < 1000; round++) { - computeSum(100_000); repeatString("hello world ", 1000); - - List nums = new ArrayList<>(); - for (int i = 1; i <= 10_000; i++) nums.add(i); - filterEvens(nums); - - Workload w = new Workload(); - w.instanceMethod(100_000, 42); } // Also call with small inputs for variety in traced args - System.out.println("computeSum(100) = " + computeSum(100)); System.out.println("repeatString(\"ab\", 3) = " + repeatString("ab", 3)); - List small = new ArrayList<>(); - for (int i = 1; i <= 10; i++) small.add(i); - System.out.println("filterEvens(1..10) = " + filterEvens(small)); - - Workload w = new Workload(); - System.out.println("instanceMethod(5, 3) = " + w.instanceMethod(5, 3)); - System.out.println("Workload complete."); } } From 0cb67c1a17af4b846f3c7810179046206c8f14b4 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 15:12:48 -0500 Subject: [PATCH 113/147] fix: add --no-pr to codeflash optimize workflow to prevent CI-opened PRs --- .github/workflows/codeflash-optimize.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeflash-optimize.yaml b/.github/workflows/codeflash-optimize.yaml index 9884665da..ab08aa1f8 100644 --- a/.github/workflows/codeflash-optimize.yaml +++ b/.github/workflows/codeflash-optimize.yaml @@ -43,4 +43,4 @@ jobs: - name: ⚡️Codeflash Optimization id: optimize_code run: | - uv run codeflash --benchmark --testgen-review \ No newline at end of file + uv run codeflash --benchmark --testgen-review --no-pr \ No newline at end of file From b737f71e46a5c21f518ecb11f66532d3bbb5766a Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Fri, 10 Apr 2026 16:05:27 -0500 Subject: [PATCH 114/147] fix: update test assertions to match simplified Workload fixture The Workload.java fixture was trimmed to only repeatString but test files still asserted computeSum, filterEvens, and instanceMethod. --- .../test_java/test_java_tracer_e2e.py | 23 ++++++++----------- .../test_java/test_java_tracer_integration.py | 8 +++---- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/tests/test_languages/test_java/test_java_tracer_e2e.py b/tests/test_languages/test_java/test_java_tracer_e2e.py index 157f23eb6..f16f19aa2 100644 --- a/tests/test_languages/test_java/test_java_tracer_e2e.py +++ b/tests/test_languages/test_java/test_java_tracer_e2e.py @@ -81,14 +81,11 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: rows = conn.execute("SELECT function, classname, descriptor, length(args) FROM function_calls").fetchall() - assert len(rows) >= 5, f"Expected at least 5 captured invocations, got {len(rows)}" + assert len(rows) >= 2, f"Expected at least 2 captured invocations, got {len(rows)}" # Check that specific methods were captured functions = {row[0] for row in rows} - assert "computeSum" in functions assert "repeatString" in functions - assert "filterEvens" in functions - assert "instanceMethod" in functions # Verify all rows have non-empty args blobs for row in rows: @@ -97,7 +94,7 @@ class TestTracingAgent: # Verify metadata metadata = dict(conn.execute("SELECT key, value FROM metadata").fetchall()) assert "totalCaptures" in metadata - assert int(metadata["totalCaptures"]) >= 5 + assert int(metadata["totalCaptures"]) >= 2 finally: conn.close() @@ -136,11 +133,11 @@ class TestTracingAgent: conn = sqlite3.connect(str(trace_db)) try: - # computeSum is called 4 times (2 direct + 2 from instanceMethod) - compute_count = conn.execute( - "SELECT COUNT(*) FROM function_calls WHERE function = 'computeSum'" + # repeatString is called 1000+ times; with maxFunctionCount=2, at most 2 should be captured + repeat_count = conn.execute( + "SELECT COUNT(*) FROM function_calls WHERE function = 'repeatString'" ).fetchone()[0] - assert compute_count <= 2, f"Expected at most 2 computeSum captures, got {compute_count}" + assert repeat_count <= 2, f"Expected at most 2 repeatString captures, got {repeat_count}" finally: conn.close() @@ -198,7 +195,6 @@ class TestReplayTestGeneration: assert "package codeflash.replay;" in content assert "import org.junit.jupiter.api.Test;" in content assert "ReplayHelper" in content - assert "replay_computeSum_0" in content assert "replay_repeatString_0" in content def test_metadata_parsing(self, compiled_workload: Path, trace_db: Path, tmp_path: Path) -> None: @@ -243,7 +239,7 @@ class TestReplayTestGeneration: assert "functions" in metadata assert "trace_file" in metadata assert "classname" in metadata - assert "computeSum" in metadata["functions"] + assert "repeatString" in metadata["functions"] assert metadata["classname"] == "com.example.Workload" assert metadata["trace_file"] == trace_db.as_posix() @@ -267,7 +263,7 @@ class TestJavaTracerOrchestration: conn = sqlite3.connect(str(trace_db)) try: count = conn.execute("SELECT COUNT(*) FROM function_calls").fetchone()[0] - assert count >= 5, f"Expected at least 5 captured invocations, got {count}" + assert count >= 2, f"Expected at least 2 captured invocations, got {count}" finally: conn.close() @@ -295,8 +291,7 @@ class TestJavaTracerOrchestration: workload_files = [f for f in test_files if "Workload" in f.name and "ConstructorAccess" not in f.name] assert len(workload_files) == 1 content = workload_files[0].read_text(encoding="utf-8") - assert "replay_computeSum" in content - assert "replay_instanceMethod" in content + assert "replay_repeatString" in content def test_package_detection(self) -> None: """Test that package detection finds Java packages from source files.""" diff --git a/tests/test_languages/test_java/test_java_tracer_integration.py b/tests/test_languages/test_java/test_java_tracer_integration.py index f6ffefdf2..6927faba4 100644 --- a/tests/test_languages/test_java/test_java_tracer_integration.py +++ b/tests/test_languages/test_java/test_java_tracer_integration.py @@ -87,7 +87,6 @@ class TestFunctionDiscoveryFromReplayTests: assert func.language == "java", f"Expected language='java', got '{func.language}'" assert func.file_path == file_path - assert "computeSum" in all_func_names assert "repeatString" in all_func_names def test_discover_tests_for_replay_tests(self, traced_workload: tuple) -> None: @@ -111,7 +110,6 @@ class TestFunctionDiscoveryFromReplayTests: func_name = qualified_name.split(".")[-1] if "." in qualified_name else qualified_name matched_func_names.add(func_name) - assert "computeSum" in matched_func_names, f"computeSum not found in: {result.keys()}" assert "repeatString" in matched_func_names, f"repeatString not found in: {result.keys()}" # Each function should have at least one test @@ -222,8 +220,8 @@ class TestFullDiscoveryPipeline: assert len(function_to_tests) > 0, "No function-to-test mappings" # Verify function_to_tests has entries for our traced functions - has_compute_sum = any("computeSum" in key for key in function_to_tests) - assert has_compute_sum, f"computeSum not in function_to_tests keys: {list(function_to_tests.keys())}" + has_repeat_string = any("repeatString" in key for key in function_to_tests) + assert has_repeat_string, f"repeatString not in function_to_tests keys: {list(function_to_tests.keys())}" # Step 4: Rank functions (like optimizer.rank_all_functions_globally) if jfr_file.exists(): @@ -280,7 +278,7 @@ class TestFullDiscoveryPipeline: source_code = WORKLOAD_SOURCE.read_text(encoding="utf-8") source_functions = discover_functions_from_source(source_code, file_path=WORKLOAD_SOURCE) # Pick the first function with a return type for instrumentation - target_func = next(f for f in source_functions if f.function_name == "computeSum") + target_func = next(f for f in source_functions if f.function_name == "repeatString") replay_test_file = replay_test_paths[0] test_source = replay_test_file.read_text(encoding="utf-8") From 470482e82474f0210c9de09ef010ac2b17b0db30 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Fri, 10 Apr 2026 21:46:11 +0000 Subject: [PATCH 115/147] fix: check subprocess exit codes in Java tracer _run_java_with_graceful_timeout() discarded the subprocess exit code in both the no-timeout and timeout paths. If Maven/Gradle failed (compilation error, OOM, etc.), the tracer silently continued with missing/stale data. Now returns the exit code. Stage 1 (JFR profiling) warns on failure but continues. Stage 2 (argument capture) raises RuntimeError since trace data is essential for replay test generation. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/tracer.py | 33 ++-- .../test_java/test_tracer_exit_codes.py | 147 ++++++++++++++++++ 2 files changed, 170 insertions(+), 10 deletions(-) create mode 100644 tests/test_languages/test_java/test_tracer_exit_codes.py diff --git a/codeflash/languages/java/tracer.py b/codeflash/languages/java/tracer.py index 50506797e..c1b5723e7 100644 --- a/codeflash/languages/java/tracer.py +++ b/codeflash/languages/java/tracer.py @@ -17,17 +17,19 @@ logger = logging.getLogger(__name__) GRACEFUL_SHUTDOWN_WAIT = 5 # seconds to wait after SIGTERM before SIGKILL -def _run_java_with_graceful_timeout( - java_command: list[str], env: dict[str, str], timeout: int, stage_name: str -) -> None: +def _run_java_with_graceful_timeout(java_command: list[str], env: dict[str, str], timeout: int, stage_name: str) -> int: """Run a Java command with graceful timeout handling. Sends SIGTERM first (allowing JFR dump and shutdown hooks to run), then SIGKILL if the process doesn't exit within GRACEFUL_SHUTDOWN_WAIT seconds. + + Returns the process exit code, or -1 if the process was killed due to timeout. """ if not timeout: - subprocess.run(java_command, env=env, check=False) - return + result = subprocess.run(java_command, env=env, check=False) + if result.returncode != 0: + logger.warning("%s exited with code %d", stage_name, result.returncode) + return result.returncode import signal @@ -45,6 +47,11 @@ def _run_java_with_graceful_timeout( logger.warning("%s stage did not exit after SIGTERM, sending SIGKILL", stage_name) proc.kill() proc.wait() + return -1 + + if proc.returncode != 0: + logger.warning("%s exited with code %d", stage_name, proc.returncode) + return proc.returncode # --add-opens flags needed for Kryo serialization on Java 16+ @@ -78,21 +85,27 @@ class JavaTracer: jfr_file = trace_db_path.with_suffix(".jfr") trace_db_path.parent.mkdir(parents=True, exist_ok=True) - # Stage 1: JFR Profiling + # Stage 1: JFR Profiling (non-fatal — JFR data is supplementary) logger.info("Stage 1: Running JFR profiling...") jfr_env = self.build_jfr_env(jfr_file) - _run_java_with_graceful_timeout(java_command, jfr_env, timeout, "JFR profiling") + jfr_exit = _run_java_with_graceful_timeout(java_command, jfr_env, timeout, "JFR profiling") - if not jfr_file.exists(): + if jfr_exit != 0: + logger.warning("JFR profiling failed (exit code %d), continuing without profiling data", jfr_exit) + elif not jfr_file.exists(): logger.warning("JFR file was not created at %s", jfr_file) - # Stage 2: Argument Capture via Tracing Agent + # Stage 2: Argument Capture via Tracing Agent (fatal — trace data is essential) logger.info("Stage 2: Running argument capture...") config_path = self.create_tracer_config( trace_db_path, packages, project_root=project_root, max_function_count=max_function_count, timeout=timeout ) agent_env = self.build_agent_env(config_path) - _run_java_with_graceful_timeout(java_command, agent_env, timeout, "Argument capture") + capture_exit = _run_java_with_graceful_timeout(java_command, agent_env, timeout, "Argument capture") + + if capture_exit != 0: + msg = f"Argument capture failed with exit code {capture_exit} — cannot proceed without trace data" + raise RuntimeError(msg) if not trace_db_path.exists(): logger.error("Trace database was not created at %s", trace_db_path) diff --git a/tests/test_languages/test_java/test_tracer_exit_codes.py b/tests/test_languages/test_java/test_tracer_exit_codes.py new file mode 100644 index 000000000..0db167b02 --- /dev/null +++ b/tests/test_languages/test_java/test_tracer_exit_codes.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING +from unittest.mock import MagicMock, patch + +if TYPE_CHECKING: + from pathlib import Path + +import pytest + +from codeflash.languages.java.tracer import JavaTracer, _run_java_with_graceful_timeout + + +class TestRunJavaWithGracefulTimeout: + def test_returns_zero_on_success(self) -> None: + mock_result = MagicMock() + mock_result.returncode = 0 + with patch("codeflash.languages.java.tracer.subprocess.run", return_value=mock_result): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 0, "test") + assert rc == 0 + + def test_returns_nonzero_on_failure(self) -> None: + mock_result = MagicMock() + mock_result.returncode = 1 + with patch("codeflash.languages.java.tracer.subprocess.run", return_value=mock_result): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 0, "test") + assert rc == 1 + + def test_returns_exit_code_137_oom_kill(self) -> None: + mock_result = MagicMock() + mock_result.returncode = 137 + with patch("codeflash.languages.java.tracer.subprocess.run", return_value=mock_result): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 0, "test") + assert rc == 137 + + def test_timeout_path_returns_zero_on_success(self) -> None: + mock_proc = MagicMock() + mock_proc.returncode = 0 + with patch("codeflash.languages.java.tracer.subprocess.Popen", return_value=mock_proc): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 60, "test") + assert rc == 0 + + def test_timeout_path_returns_nonzero_on_failure(self) -> None: + mock_proc = MagicMock() + mock_proc.returncode = 1 + with patch("codeflash.languages.java.tracer.subprocess.Popen", return_value=mock_proc): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 60, "test") + assert rc == 1 + + def test_timeout_returns_negative_one(self) -> None: + import subprocess + + mock_proc = MagicMock() + # First wait() times out, SIGTERM wait succeeds + mock_proc.wait.side_effect = [ + subprocess.TimeoutExpired(cmd="java", timeout=60), + None, # SIGTERM wait succeeds + ] + with patch("codeflash.languages.java.tracer.subprocess.Popen", return_value=mock_proc): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 60, "test") + assert rc == -1 + + def test_timeout_sends_sigterm_then_sigkill(self) -> None: + import signal + import subprocess + + mock_proc = MagicMock() + # First wait() times out, SIGTERM wait also times out + mock_proc.wait.side_effect = [ + subprocess.TimeoutExpired(cmd="java", timeout=60), + subprocess.TimeoutExpired(cmd="java", timeout=5), + None, + ] + with patch("codeflash.languages.java.tracer.subprocess.Popen", return_value=mock_proc): + rc = _run_java_with_graceful_timeout(["java", "-version"], {}, 60, "test") + + assert rc == -1 + mock_proc.send_signal.assert_called_once_with(signal.SIGTERM) + mock_proc.kill.assert_called_once() + + +class TestJavaTracerExitCodeHandling: + def test_stage1_failure_continues(self, tmp_path: Path) -> None: + trace_db_path = (tmp_path / "trace.db").resolve() + tracer = JavaTracer() + + # Stage 1 fails (exit code 1), Stage 2 succeeds (exit code 0) + exit_codes = iter([1, 0]) + + def mock_run_timeout(java_command: list[str], env: dict, timeout: int, stage_name: str) -> int: + rc = next(exit_codes) + if stage_name == "Argument capture": + trace_db_path.write_bytes(b"fake-db") + return rc + + with ( + patch("codeflash.languages.java.tracer._run_java_with_graceful_timeout", side_effect=mock_run_timeout), + patch.object(tracer, "build_jfr_env", return_value={}), + patch.object(tracer, "build_agent_env", return_value={}), + patch.object(tracer, "create_tracer_config", return_value=tmp_path / "config.json"), + ): + trace_db, _jfr_file = tracer.trace( + java_command=["java", "-cp", ".", "Main"], trace_db_path=trace_db_path, packages=["com.example"] + ) + # Should complete despite Stage 1 failure + assert trace_db == trace_db_path + + def test_stage2_failure_raises(self, tmp_path: Path) -> None: + trace_db_path = (tmp_path / "trace.db").resolve() + tracer = JavaTracer() + + # Stage 1 succeeds (exit code 0), Stage 2 fails (exit code 1) + exit_codes = iter([0, 1]) + + def mock_run_timeout(java_command: list[str], env: dict, timeout: int, stage_name: str) -> int: + return next(exit_codes) + + with ( + patch("codeflash.languages.java.tracer._run_java_with_graceful_timeout", side_effect=mock_run_timeout), + patch.object(tracer, "build_jfr_env", return_value={}), + patch.object(tracer, "build_agent_env", return_value={}), + patch.object(tracer, "create_tracer_config", return_value=tmp_path / "config.json"), + pytest.raises(RuntimeError, match="Argument capture failed with exit code 1"), + ): + tracer.trace( + java_command=["java", "-cp", ".", "Main"], trace_db_path=trace_db_path, packages=["com.example"] + ) + + def test_both_stages_succeed(self, tmp_path: Path) -> None: + trace_db_path = (tmp_path / "trace.db").resolve() + tracer = JavaTracer() + + def mock_run_timeout(java_command: list[str], env: dict, timeout: int, stage_name: str) -> int: + if stage_name == "Argument capture": + trace_db_path.write_bytes(b"fake-db") + return 0 + + with ( + patch("codeflash.languages.java.tracer._run_java_with_graceful_timeout", side_effect=mock_run_timeout), + patch.object(tracer, "build_jfr_env", return_value={}), + patch.object(tracer, "build_agent_env", return_value={}), + patch.object(tracer, "create_tracer_config", return_value=tmp_path / "config.json"), + ): + trace_db, _jfr_file = tracer.trace( + java_command=["java", "-cp", ".", "Main"], trace_db_path=trace_db_path, packages=["com.example"] + ) + assert trace_db == trace_db_path From a7371b55ca7c48d086edf37c65fb39fac8427e15 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Fri, 10 Apr 2026 21:46:42 +0000 Subject: [PATCH 116/147] fix: add --configure-on-demand to all Gradle commands Gradle evaluates all project configurations during the configuration phase, even when only one module is targeted. Multi-module projects with diverse toolchain requirements (e.g., OpenRewrite's rewrite-gradle needs JDK 8) fail when an unrelated module's toolchain isn't available. Adds --configure-on-demand to all 8 Gradle command construction sites so Gradle only configures projects needed for the requested task. Co-Authored-By: Claude Opus 4.6 --- codeflash/languages/java/gradle_strategy.py | 24 ++++-- .../test_java/test_gradle_strategy.py | 76 +++++++++++++++++++ 2 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 tests/test_languages/test_java/test_gradle_strategy.py diff --git a/codeflash/languages/java/gradle_strategy.py b/codeflash/languages/java/gradle_strategy.py index c4174ffe4..bcca1b984 100644 --- a/codeflash/languages/java/gradle_strategy.py +++ b/codeflash/languages/java/gradle_strategy.py @@ -533,7 +533,15 @@ class GradleStrategy(BuildToolStrategy): logger.error("Gradle not found — cannot pre-install multi-module dependencies") return False - cmd = [gradle, f":{test_module}:testClasses", "-x", "test", "--build-cache", "--no-daemon"] + cmd = [ + gradle, + f":{test_module}:testClasses", + "-x", + "test", + "--build-cache", + "--no-daemon", + "--configure-on-demand", + ] cmd.extend(["--init-script", _get_skip_validation_init_script()]) logger.info("Pre-installing multi-module dependencies: %s (module: %s)", build_root, test_module) @@ -568,9 +576,9 @@ class GradleStrategy(BuildToolStrategy): return subprocess.CompletedProcess(args=["gradle"], returncode=-1, stdout="", stderr="Gradle not found") if test_module: - cmd = [gradle, f":{test_module}:testClasses", "--no-daemon"] + cmd = [gradle, f":{test_module}:testClasses", "--no-daemon", "--configure-on-demand"] else: - cmd = [gradle, "testClasses", "--no-daemon"] + cmd = [gradle, "testClasses", "--no-daemon", "--configure-on-demand"] cmd.extend(["--init-script", _get_skip_validation_init_script()]) logger.debug("Compiling tests: %s in %s", " ".join(cmd), build_root) @@ -592,9 +600,9 @@ class GradleStrategy(BuildToolStrategy): return subprocess.CompletedProcess(args=["gradle"], returncode=-1, stdout="", stderr="Gradle not found") if test_module: - cmd = [gradle, f":{test_module}:classes", "--no-daemon"] + cmd = [gradle, f":{test_module}:classes", "--no-daemon", "--configure-on-demand"] else: - cmd = [gradle, "classes", "--no-daemon"] + cmd = [gradle, "classes", "--no-daemon", "--configure-on-demand"] cmd.extend(["--init-script", _get_skip_validation_init_script()]) logger.debug("Compiling source only: %s in %s", " ".join(cmd), build_root) @@ -638,7 +646,7 @@ class GradleStrategy(BuildToolStrategy): else: task = "codeflashPrintClasspath" - cmd = [gradle, "--init-script", init_script_path, task, "-q", "--no-daemon"] + cmd = [gradle, "--init-script", init_script_path, task, "-q", "--no-daemon", "--configure-on-demand"] logger.debug("Getting classpath: %s", " ".join(cmd)) @@ -789,7 +797,7 @@ class GradleStrategy(BuildToolStrategy): with os.fdopen(init_fd, "w", encoding="utf-8") as f: f.write(init_script_content) - cmd = [gradle, task, "--no-daemon", "--rerun", "--init-script", init_path] + cmd = [gradle, task, "--no-daemon", "--rerun", "--configure-on-demand", "--init-script", init_path] cmd.extend(["--init-script", _get_skip_validation_init_script()]) for class_filter in test_filter.split(","): @@ -1044,7 +1052,7 @@ class GradleStrategy(BuildToolStrategy): raise ValueError(msg) gradle = self.find_executable(project_root) or "gradle" - cmd = [gradle, "test", "--no-daemon"] + cmd = [gradle, "test", "--no-daemon", "--configure-on-demand"] if test_classes: for cls in test_classes: cmd.extend(["--tests", cls]) diff --git a/tests/test_languages/test_java/test_gradle_strategy.py b/tests/test_languages/test_java/test_gradle_strategy.py new file mode 100644 index 000000000..08c62580a --- /dev/null +++ b/tests/test_languages/test_java/test_gradle_strategy.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING +from unittest.mock import MagicMock, patch + +from codeflash.languages.java.gradle_strategy import GradleStrategy + +if TYPE_CHECKING: + from pathlib import Path + +COD_FLAG = "--configure-on-demand" +MOCK_TARGET = "codeflash.languages.java.test_runner._run_cmd_kill_pg_on_timeout" + + +class TestConfigureOnDemand: + def test_compile_tests_includes_configure_on_demand(self, tmp_path: Path) -> None: + strategy = GradleStrategy() + with patch.object(strategy, "find_executable", return_value="gradlew"), patch(MOCK_TARGET) as mock_run: + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + strategy.compile_tests(tmp_path, {}, test_module=None) + cmd = mock_run.call_args[0][0] + assert COD_FLAG in cmd + + def test_compile_tests_multimodule_includes_configure_on_demand(self, tmp_path: Path) -> None: + strategy = GradleStrategy() + with patch.object(strategy, "find_executable", return_value="gradlew"), patch(MOCK_TARGET) as mock_run: + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + strategy.compile_tests(tmp_path, {}, test_module="core") + cmd = mock_run.call_args[0][0] + assert COD_FLAG in cmd + assert ":core:testClasses" in cmd + + def test_compile_source_only_includes_configure_on_demand(self, tmp_path: Path) -> None: + strategy = GradleStrategy() + with patch.object(strategy, "find_executable", return_value="gradlew"), patch(MOCK_TARGET) as mock_run: + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + strategy.compile_source_only(tmp_path, {}, test_module=None) + cmd = mock_run.call_args[0][0] + assert COD_FLAG in cmd + + def test_get_test_run_command_includes_configure_on_demand(self, tmp_path: Path) -> None: + strategy = GradleStrategy() + with patch.object(strategy, "find_executable", return_value="gradlew"): + cmd = strategy.get_test_run_command(tmp_path) + assert COD_FLAG in cmd + + def test_install_multi_module_deps_includes_configure_on_demand(self, tmp_path: Path) -> None: + strategy = GradleStrategy() + with ( + patch.object(strategy, "find_executable", return_value="gradlew"), + patch(MOCK_TARGET) as mock_run, + patch("codeflash.languages.java.gradle_strategy._multimodule_deps_installed", set()), + ): + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + strategy.install_multi_module_deps(tmp_path, test_module="core", env={}) + cmd = mock_run.call_args[0][0] + assert COD_FLAG in cmd + assert ":core:testClasses" in cmd + + def test_run_tests_via_build_tool_includes_configure_on_demand(self, tmp_path: Path) -> None: + strategy = GradleStrategy() + reports_dir = tmp_path / "build" / "test-results" / "test" + reports_dir.mkdir(parents=True, exist_ok=True) + + with patch.object(strategy, "find_executable", return_value="gradlew"), patch(MOCK_TARGET) as mock_run: + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + strategy.run_tests_via_build_tool( + build_root=tmp_path, + test_paths=["com.example.TestFoo"], + env={}, + timeout=60, + mode="behavior", + test_module=None, + ) + cmd = mock_run.call_args[0][0] + assert COD_FLAG in cmd From ced8a746cdb544bc19d080a81d31f5c0abbcad65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:07:46 +0000 Subject: [PATCH 117/147] chore(deps-dev): bump uv from 0.11.2 to 0.11.6 Bumps [uv](https://github.com/astral-sh/uv) from 0.11.2 to 0.11.6. - [Release notes](https://github.com/astral-sh/uv/releases) - [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/uv/compare/0.11.2...0.11.6) --- updated-dependencies: - dependency-name: uv dependency-version: 0.11.6 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- uv.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/uv.lock b/uv.lock index c059d601e..ee5798177 100644 --- a/uv.lock +++ b/uv.lock @@ -6558,28 +6558,28 @@ wheels = [ [[package]] name = "uv" -version = "0.11.2" +version = "0.11.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/9e/65dfeeafe5644a2e0bdd9dfdd4bdc37c87b06067fdff4596eeba0bc0f2f5/uv-0.11.2.tar.gz", hash = "sha256:ef226af1d814466df45dc8a746c5220a951643d0832296a00c30ac3db95a3a4c", size = 4010086, upload-time = "2026-03-26T21:22:13.185Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/f3/8aceeab67ea69805293ab290e7ca8cc1b61a064d28b8a35c76d8eba063dd/uv-0.11.6.tar.gz", hash = "sha256:e3b21b7e80024c95ff339fcd147ac6fc3dd98d3613c9d45d3a1f4fd1057f127b", size = 4073298, upload-time = "2026-04-09T12:09:01.738Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/6f/6469561a85b81d690ad63eac1135ce4d4f8269cb4fc92da20ff7efa5fa4f/uv-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:f27ca998085eb8dc095ff9d7568aa08d9ce7c0d2b74bd525da5cd2e5b7367b71", size = 23387567, upload-time = "2026-03-26T21:22:02.49Z" }, - { url = "https://files.pythonhosted.org/packages/27/2a/313b5de76e52cc75e38fd3e5f1644d6b16d4d4bdb9aaff8508ec955255ed/uv-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00054a0041c25b3ec3d0f4f6221d3cbfda32e70f7d1c60bee36f1a9736f47b68", size = 22819340, upload-time = "2026-03-26T21:22:42.942Z" }, - { url = "https://files.pythonhosted.org/packages/3a/74/64ea01a48383748f0e1087e617fab0d88176f506fc47e3a18fb936a22a3d/uv-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89972042233c90adf8b8150ec164444a4df41938739e5736773ac00870840887", size = 21425465, upload-time = "2026-03-26T21:22:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/b6/85/d9d71a940e90d1ec130483a02d25711010609c613d245abd48ff14fdfd1d/uv-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:e1f98621b3ffd5dd40bec12bd716e67aec552a7978c7753b709206d7a0e4f93f", size = 23140501, upload-time = "2026-03-26T21:22:31.896Z" }, - { url = "https://files.pythonhosted.org/packages/59/4d/c25126473337acf071b0d572ff94fb6444364641b3d311568028349c964d/uv-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:66925ceb0e76826b5280937a93e31f0b093c9edfafbb52db7936595b1ef205b8", size = 23003445, upload-time = "2026-03-26T21:22:15.371Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3e/1ef69d9fc88e04037ffebd5c41f70dadeb73021033ced57b2e186b23ac7c/uv-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a10911b6a555d31beb835653cedc0bc491b656e964d30be8eb9186f1fe0ef88c", size = 22989489, upload-time = "2026-03-26T21:22:26.226Z" }, - { url = "https://files.pythonhosted.org/packages/a0/04/0398b4a5be0f3dd07be80d31275754338ae8857f78309b9776ab854d0a85/uv-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b8fa0a2ddc69c9ed373d72144b950ac2af81e3d95047c2d02564a8a03be538c", size = 24603289, upload-time = "2026-03-26T21:22:45.967Z" }, - { url = "https://files.pythonhosted.org/packages/e6/79/0388bbb629db283a883e4412d5f54cf62ec4b9f7bb6631781fbbb49c0792/uv-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbbd6e6e682b7f0bbdfff3348e580ea0fa58a07741e54cc8641b919bdf6f9128", size = 25218467, upload-time = "2026-03-26T21:22:20.701Z" }, - { url = "https://files.pythonhosted.org/packages/25/5c/725442191dee62e5b906576ed0ff432a1f2e3b38994c81e16156574e97ab/uv-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f9f3ac825561edec6494588d6aed7d3f4a08618b167eb256b4a9027b13304a6", size = 24418929, upload-time = "2026-03-26T21:22:23.446Z" }, - { url = "https://files.pythonhosted.org/packages/9f/6e/f49ca8ad037919e5d44a2070af3d369792be3419c594cfb92f4404ab7832/uv-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4bb136bbc8840ede58663e8ba5a9bbf3b5376f7f933f915df28d4078bb9095", size = 24586892, upload-time = "2026-03-26T21:22:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/83/08/aff0a8098ac5946d195e67bf091d494f34c1009ea6e163d0c23e241527e1/uv-0.11.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:fea7efc97f9fcfb345e588c71fa56250c0db8c2bfd8d4e2cd4d21e1308c4e6ac", size = 23232598, upload-time = "2026-03-26T21:22:51.865Z" }, - { url = "https://files.pythonhosted.org/packages/1c/43/eced218d15f8ed58fbb081f0b826e4f016b501b50ec317ab6c331b60c15c/uv-0.11.2-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:b5529572ea7150311f5a17b5d09ef19781c2484932e14eed44a0c038f93ef722", size = 23998818, upload-time = "2026-03-26T21:22:49.097Z" }, - { url = "https://files.pythonhosted.org/packages/62/96/da68d159ba3f49a516796273463288b53d675675c5a0df71c14301ec4323/uv-0.11.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0919096889e26d0edcbc731e95c4a4d1f47ef881fb46970cbf0800bf17d4840e", size = 24047673, upload-time = "2026-03-26T21:22:37.6Z" }, - { url = "https://files.pythonhosted.org/packages/62/be/db2400f4699717b4f34e036e7a1c54bc1f89c7c5b3303abc8d8a00664071/uv-0.11.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:7a05747eecca4534c284dbab213526468092317e8f6aec7a6c9f89ce3d1248d3", size = 23733334, upload-time = "2026-03-26T21:22:40.247Z" }, - { url = "https://files.pythonhosted.org/packages/29/27/4045960075f4898a44f092625e9f08ee8af4229be7df6ad487d58aa7d51e/uv-0.11.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:00cbf1829e158b053b0bdc675d9f9c13700b29be90a9bad966cc9b586c01265b", size = 24790898, upload-time = "2026-03-26T21:22:07.812Z" }, - { url = "https://files.pythonhosted.org/packages/e4/9d/7470f39bf72683f1908e7ba70f5379f14e4984c8e6a65f7563f3dfb19f13/uv-0.11.2-py3-none-win32.whl", hash = "sha256:a1b8a39b17cf9e3183a35a44dffa103c91c412f003569a210883ffb537c2c65d", size = 22516649, upload-time = "2026-03-26T21:22:34.806Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a3/c88fa454a7c07785ce63e96b6c1c7b24b5abcb3a6afbc6ad8b29b9bc1a1d/uv-0.11.2-py3-none-win_amd64.whl", hash = "sha256:d4dbcecf6daca8605f46fba232f49e9b49d06ebe3b9cba5e59e608c5be03890e", size = 24989876, upload-time = "2026-03-26T21:22:28.917Z" }, - { url = "https://files.pythonhosted.org/packages/a2/50/fae409a028d87db02ffbf3a3b5ac39980fbeb3d9a0356f49943722b2cabb/uv-0.11.2-py3-none-win_arm64.whl", hash = "sha256:e5b8570e88af5073ce5aa5df4866484e69035a6e66caab8a5c51a988a989a467", size = 23450736, upload-time = "2026-03-26T21:22:10.838Z" }, + { url = "https://files.pythonhosted.org/packages/1f/fe/4b61a3d5ad9d02e8a4405026ccd43593d7044598e0fa47d892d4dafe44c9/uv-0.11.6-py3-none-linux_armv6l.whl", hash = "sha256:ada04dcf89ddea5b69d27ac9cdc5ef575a82f90a209a1392e930de504b2321d6", size = 23780079, upload-time = "2026-04-09T12:08:56.609Z" }, + { url = "https://files.pythonhosted.org/packages/52/db/d27519a9e1a5ffee9d71af1a811ad0e19ce7ab9ae815453bef39dd479389/uv-0.11.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5be013888420f96879c6e0d3081e7bcf51b539b034a01777041934457dfbedf3", size = 23214721, upload-time = "2026-04-09T12:09:32.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/4399fa8b882bd7e0efffc829f73ab24d117d490a93e6bc7104a50282b854/uv-0.11.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ffa5dc1cbb52bdce3b8447e83d1601a57ad4da6b523d77d4b47366db8b1ceb18", size = 21750109, upload-time = "2026-04-09T12:09:24.357Z" }, + { url = "https://files.pythonhosted.org/packages/32/07/5a12944c31c3dda253632da7a363edddb869ed47839d4d92a2dc5f546c93/uv-0.11.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:bfb107b4dade1d2c9e572992b06992d51dd5f2136eb8ceee9e62dd124289e825", size = 23551146, upload-time = "2026-04-09T12:09:10.439Z" }, + { url = "https://files.pythonhosted.org/packages/79/5b/2ec8b0af80acd1016ed596baf205ddc77b19ece288473b01926c4a9cf6db/uv-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:9e2fe7ce12161d8016b7deb1eaad7905a76ff7afec13383333ca75e0c4b5425d", size = 23331192, upload-time = "2026-04-09T12:09:34.792Z" }, + { url = "https://files.pythonhosted.org/packages/62/7d/eea35935f2112b21c296a3e42645f3e4b1aa8bcd34dcf13345fbd55134b7/uv-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ed9c6f70c25e8dfeedddf4eddaf14d353f5e6b0eb43da9a14d3a1033d51d915", size = 23337686, upload-time = "2026-04-09T12:09:18.522Z" }, + { url = "https://files.pythonhosted.org/packages/21/47/2584f5ab618f6ebe9bdefb2f765f2ca8540e9d739667606a916b35449eec/uv-0.11.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d68a013e609cebf82077cbeeb0809ed5e205257814273bfd31e02fc0353bbfc2", size = 25008139, upload-time = "2026-04-09T12:09:03.983Z" }, + { url = "https://files.pythonhosted.org/packages/95/81/497ae5c1d36355b56b97dc59f550c7e89d0291c163a3f203c6f341dff195/uv-0.11.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93f736dddca03dae732c6fdea177328d3bc4bf137c75248f3d433c57416a4311", size = 25712458, upload-time = "2026-04-09T12:09:07.598Z" }, + { url = "https://files.pythonhosted.org/packages/3c/1c/74083238e4fab2672b63575b9008f1ea418b02a714bcfcf017f4f6a309b6/uv-0.11.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96a66abe53fced0e3389008b8d2eff8278cfa8bb545d75631ae8ceb9c929aba", size = 24915507, upload-time = "2026-04-09T12:08:50.892Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ee/e14fe10ba455a823ed18233f12de6699a601890905420b5c504abf115116/uv-0.11.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b096311b2743b228df911a19532b3f18fa420bf9530547aecd6a8e04bbfaccd", size = 24971011, upload-time = "2026-04-09T12:08:54.016Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/7b9c83eaadf98e343317ff6384a7227a4855afd02cdaf9696bcc71ee6155/uv-0.11.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:904d537b4a6e798015b4a64ff5622023bd4601b43b6cd1e5f423d63471f5e948", size = 23640234, upload-time = "2026-04-09T12:09:15.735Z" }, + { url = "https://files.pythonhosted.org/packages/d6/51/75ccdd23e76ff1703b70eb82881cd5b4d2a954c9679f8ef7e0136ef2cfab/uv-0.11.6-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:4ed8150c26b5e319381d75ae2ce6aba1e9c65888f4850f4e3b3fa839953c90a5", size = 24452664, upload-time = "2026-04-09T12:09:26.875Z" }, + { url = "https://files.pythonhosted.org/packages/4d/86/ace80fe47d8d48b5e3b5aee0b6eb1a49deaacc2313782870250b3faa36f5/uv-0.11.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1c9218c8d4ac35ca6e617fb0951cc0ab2d907c91a6aea2617de0a5494cf162c0", size = 24494599, upload-time = "2026-04-09T12:09:37.368Z" }, + { url = "https://files.pythonhosted.org/packages/05/2d/4b642669b56648194f026de79bc992cbfc3ac2318b0a8d435f3c284934e8/uv-0.11.6-py3-none-musllinux_1_1_i686.whl", hash = "sha256:9e211c83cc890c569b86a4183fcf5f8b6f0c7adc33a839b699a98d30f1310d3a", size = 24159150, upload-time = "2026-04-09T12:09:13.17Z" }, + { url = "https://files.pythonhosted.org/packages/ae/24/7eecd76fe983a74fed1fc700a14882e70c4e857f1d562a9f2303d4286c12/uv-0.11.6-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d2a1d2089afdf117ad19a4c1dd36b8189c00ae1ad4135d3bfbfced82342595cf", size = 25164324, upload-time = "2026-04-09T12:08:59.56Z" }, + { url = "https://files.pythonhosted.org/packages/27/e0/bbd4ba7c2e5067bbba617d87d306ec146889edaeeaa2081d3e122178ca08/uv-0.11.6-py3-none-win32.whl", hash = "sha256:6e8344f38fa29f85dcfd3e62dc35a700d2448f8e90381077ef393438dcd5012e", size = 22865693, upload-time = "2026-04-09T12:09:21.415Z" }, + { url = "https://files.pythonhosted.org/packages/a5/33/1983ce113c538a856f2d620d16e39691962ecceef091a84086c5785e32e5/uv-0.11.6-py3-none-win_amd64.whl", hash = "sha256:a28bea69c1186303d1200f155c7a28c449f8a4431e458fcf89360cc7ef546e40", size = 25371258, upload-time = "2026-04-09T12:09:40.52Z" }, + { url = "https://files.pythonhosted.org/packages/35/01/be0873f44b9c9bc250fcbf263367fcfc1f59feab996355bcb6b52fff080d/uv-0.11.6-py3-none-win_arm64.whl", hash = "sha256:a78f6d64b9950e24061bc7ec7f15ff8089ad7f5a976e7b65fcadce58fe02f613", size = 23869585, upload-time = "2026-04-09T12:09:29.425Z" }, ] [[package]] From 3b8a2e5c82da694910b0d7454f6ec68e9bb0853b Mon Sep 17 00:00:00 2001 From: Sarthak Agarwal Date: Wed, 15 Apr 2026 00:37:17 +0530 Subject: [PATCH 118/147] update Docs for Plugin --- docs/docs.json | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/docs.json b/docs/docs.json index 631e500ba..e01b3214b 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -30,6 +30,14 @@ "getting-started/java-installation" ] }, + { + "group": "Claude Code Plugin", + "pages": [ + "claude-code-plugin/getting-started", + "claude-code-plugin/usage-guide", + "claude-code-plugin/troubleshooting" + ] + }, { "group": "Using Codeflash", "pages": [ @@ -67,19 +75,15 @@ "editor-plugins/vscode/configuration", "editor-plugins/vscode/troubleshooting" ] - }, - { - "group": "Claude Code Plugin", - "pages": [ - "claude-code-plugin/getting-started", - "claude-code-plugin/usage-guide", - "claude-code-plugin/troubleshooting" - ] } ] } ] }, + "banner": { + "content": "New: Use Codeflash directly inside Claude Code with the [Codeflash Claude Code Plugin](/claude-code-plugin/getting-started).", + "dismissible": true + }, "logo": { "light": "/images/codeflash_light.svg", "dark": "/images/codeflash_darkmode.svg" From 1112646e4e750ee2973f4b31298032cee9d12a79 Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Tue, 21 Apr 2026 01:28:45 -0700 Subject: [PATCH 119/147] docs: add CONTRIBUTING.md Closes #522 Covers the two audiences the issue calls out: 1. People contributing changes back to Codeflash - development environment setup with uv, the single-command verification via uv run prek, test runner invocation, code-style pointers to .claude/rules/code-style.md, and the branch / commit / PR conventions from .claude/rules/git.md and CLAUDE.md. 2. People using Codeflash in editable mode from a source checkout to optimize their own projects, including the install commands for uv and pip, when editable mode is appropriate vs installing the PyPI package, and a pointer to the README Quick Start for the codeflash init flow. --- CONTRIBUTING.md | 156 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..eb0f8cadc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,156 @@ +# Contributing to Codeflash + +Thanks for your interest in contributing. This guide covers both contributing changes back to Codeflash itself and running Codeflash from this repository in editable mode to optimize your own projects. + +## Table of contents + +- [Quick links](#quick-links) +- [Ways to contribute](#ways-to-contribute) +- [Development environment](#development-environment) +- [Running tests and checks](#running-tests-and-checks) +- [Code style](#code-style) +- [Branches, commits, and pull requests](#branches-commits-and-pull-requests) +- [Using Codeflash in editable mode](#using-codeflash-in-editable-mode) +- [Reporting bugs and requesting features](#reporting-bugs-and-requesting-features) +- [Security issues](#security-issues) + +## Quick links + +- Issues: https://github.com/codeflash-ai/codeflash/issues +- Discussions and support: [Discord](https://www.codeflash.ai/discord) +- Documentation: https://docs.codeflash.ai +- Security policy: [`SECURITY.md`](SECURITY.md) +- Project conventions for AI agents and humans alike: [`CLAUDE.md`](CLAUDE.md) + +## Ways to contribute + +- **Bug reports**: open an issue with a minimal reproducer that fails on `main`. +- **Bug fixes**: follow the bug-fix workflow in [`CLAUDE.md`](CLAUDE.md) - read the code, write a failing test, apply the fix, confirm the test now passes. +- **Features**: open an issue first for anything non-trivial so the approach can be agreed before implementation. +- **Documentation**: the full documentation lives at https://docs.codeflash.ai. Fixes to README, docstrings, and this guide can be submitted as PRs here. +- **Language support**: Codeflash supports Python, JavaScript / TypeScript, and Java today. New language support is a significant effort - please start with an issue. + +## Development environment + +### Prerequisites + +- Python 3.9 or newer +- [`uv`](https://github.com/astral-sh/uv) for dependency management (required - do not use `pip` directly) +- `git` +- For JavaScript end-to-end tests: Node.js and `npm` +- For Java end-to-end tests: a JDK (see `.github/workflows/java-e2e.yaml` for the tested version) + +### Setup + +Fork the repository, clone your fork, and install the dev dependencies with `uv`: + +```bash +git clone https://github.com//codeflash.git +cd codeflash +uv sync +``` + +`uv sync` installs Codeflash plus the `dev` dependency group (ruff, mypy, ipython, type stubs). The `codeflash` CLI is installed into the virtualenv and can be invoked via `uv run codeflash ...`. + +### Optional: point at your fork's upstream + +```bash +git remote add upstream https://github.com/codeflash-ai/codeflash.git +git fetch upstream +``` + +## Running tests and checks + +Use `uv run prek` as the single verification command. It runs ruff (lint + format), mypy (strict), and related checks in one pass, matching what CI runs. + +```bash +# Check every changed file against the pre-commit hooks locally +uv run prek + +# Match CI behavior: check everything changed against the PR base branch +BASE=$(gh pr view --json baseRefName -q .baseRefName 2>/dev/null || echo main) +uv run prek run --from-ref origin/$BASE +``` + +Run the test suite with pytest via `uv`: + +```bash +uv run pytest tests/ +``` + +To run a subset: + +```bash +uv run pytest tests/code_utils/ -k "test_something" +``` + +End-to-end tests live under `code_to_optimize/` and are exercised by CI (`.github/workflows/ci.yaml`, `java-e2e.yaml`). They can be run locally by invoking the scripts referenced from those workflows if you have the relevant runtime installed. + +## Code style + +The full ruleset is in [`.claude/rules/code-style.md`](.claude/rules/code-style.md). Highlights: + +- **Line length**: 120 characters. +- **Python**: 3.9+ syntax. Use type annotations consistent with surrounding code. +- **Package management**: `uv` only. Do not add dependencies with `pip install`. +- **Docstrings**: do not add docstrings to new or changed code unless explicitly requested. The codebase intentionally keeps functions self-documenting through clear naming and type annotations. +- **Naming**: no leading underscores on Python names (`_private` style). Python has no true private functions; use public names. +- **File I/O**: always pass `encoding="utf-8"` to `open()`, `Path.read_text()`, `Path.write_text()`, and similar calls in new or changed code. Windows defaults to `cp1252`, which breaks on non-ASCII content. +- **Paths**: prefer absolute paths internally. +- **Verification**: `uv run prek` is the canonical check. Don't run `ruff`, `mypy`, or `python -c "import ..."` separately; `prek` handles them together. + +## Branches, commits, and pull requests + +- Create a feature branch off an up-to-date `main`. Never commit directly to `main`. +- Use conventional-commit prefixes: `fix:`, `feat:`, `refactor:`, `docs:`, `test:`, `chore:`. Keep commit messages concise (1-2 sentence body max). +- Keep commits atomic - one logical change per commit. +- PR titles also use the conventional format. The PR body should be short and link any related issues. +- If the change corresponds to a Linear ticket, include `CF-#` in the PR body. +- Run `uv run prek` (or `uv run prek run --from-ref origin/main`) before pushing. CI will block merge if hooks fail. + +## Using Codeflash in editable mode + +If you want to use Codeflash itself to optimize your own Python projects while developing or testing changes to Codeflash, you can install it in editable mode from this repository. + +### Install as an editable dependency + +From your target project's directory: + +```bash +# Using uv (recommended) +uv add --editable /absolute/path/to/your/codeflash/checkout + +# Or, if you use pip inside a virtualenv +pip install -e /absolute/path/to/your/codeflash/checkout +``` + +From the Codeflash repository root you can also run the CLI directly without installing into the target project: + +```bash +cd /absolute/path/to/your/codeflash/checkout +uv run codeflash init # in the target project, cwd matters +uv run codeflash --all # optimize the entire target codebase +uv run codeflash optimize script.py +``` + +You will still need a Codeflash API key - `uv run codeflash init` walks through key generation and GitHub app setup. See the [Quick Start in the README](README.md#quick-start) for the full flow. + +### When to use editable mode + +- You are iterating on a Codeflash change and want to dogfood it against a real codebase. +- You need to reproduce a bug your target project hits, with your local patches applied. +- You are developing a new optimization rule, heuristic, or language integration and want end-to-end coverage beyond `tests/`. + +For day-to-day optimization of a project you are not hacking on Codeflash itself, install the released package from PyPI (`pip install codeflash` or `uv add codeflash`) instead. + +## Reporting bugs and requesting features + +Before filing a new issue, please: + +1. Search existing [open and closed issues](https://github.com/codeflash-ai/codeflash/issues?q=is%3Aissue) to avoid duplicates. +2. Include the Codeflash version (`codeflash --version`) and Python / uv versions. +3. Include the smallest reproducer you can. For bugs, a failing test that exercises the behavior is ideal. + +## Security issues + +Do not report suspected security issues in public GitHub issues. See [`SECURITY.md`](SECURITY.md) for the reporting process. From 83c87a75a1fd41e7b7fb485caa21c44236e40ea3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 23:06:07 +0000 Subject: [PATCH 120/147] chore(deps): bump lxml from 6.0.2 to 6.1.0 Bumps [lxml](https://github.com/lxml/lxml) from 6.0.2 to 6.1.0. - [Release notes](https://github.com/lxml/lxml/releases) - [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt) - [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.2...lxml-6.1.0) --- updated-dependencies: - dependency-name: lxml dependency-version: 6.1.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- uv.lock | 262 +++++++++++++++++++++++++++----------------------------- 1 file changed, 128 insertions(+), 134 deletions(-) diff --git a/uv.lock b/uv.lock index c059d601e..b5a8fb5f4 100644 --- a/uv.lock +++ b/uv.lock @@ -2395,142 +2395,136 @@ wheels = [ [[package]] name = "lxml" -version = "6.0.2" +version = "6.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/30/9abc9e34c657c33834eaf6cd02124c61bdf5944d802aa48e69be8da3585d/lxml-6.1.0.tar.gz", hash = "sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13", size = 4197006, upload-time = "2026-04-18T04:32:51.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/8a/f8192a08237ef2fb1b19733f709db88a4c43bc8ab8357f01cb41a27e7f6a/lxml-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388", size = 8590589, upload-time = "2025-09-22T04:00:10.51Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/27bcd07ae17ff5e5536e8d88f4c7d581b48963817a13de11f3ac3329bfa2/lxml-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153", size = 4629671, upload-time = "2025-09-22T04:00:15.411Z" }, - { url = "https://files.pythonhosted.org/packages/02/5a/a7d53b3291c324e0b6e48f3c797be63836cc52156ddf8f33cd72aac78866/lxml-6.0.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31", size = 4999961, upload-time = "2025-09-22T04:00:17.619Z" }, - { url = "https://files.pythonhosted.org/packages/f5/55/d465e9b89df1761674d8672bb3e4ae2c47033b01ec243964b6e334c6743f/lxml-6.0.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9", size = 5157087, upload-time = "2025-09-22T04:00:19.868Z" }, - { url = "https://files.pythonhosted.org/packages/62/38/3073cd7e3e8dfc3ba3c3a139e33bee3a82de2bfb0925714351ad3d255c13/lxml-6.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8", size = 5067620, upload-time = "2025-09-22T04:00:21.877Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d3/1e001588c5e2205637b08985597827d3827dbaaece16348c8822bfe61c29/lxml-6.0.2-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba", size = 5406664, upload-time = "2025-09-22T04:00:23.714Z" }, - { url = "https://files.pythonhosted.org/packages/20/cf/cab09478699b003857ed6ebfe95e9fb9fa3d3c25f1353b905c9b73cfb624/lxml-6.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c", size = 5289397, upload-time = "2025-09-22T04:00:25.544Z" }, - { url = "https://files.pythonhosted.org/packages/a3/84/02a2d0c38ac9a8b9f9e5e1bbd3f24b3f426044ad618b552e9549ee91bd63/lxml-6.0.2-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c", size = 4772178, upload-time = "2025-09-22T04:00:27.602Z" }, - { url = "https://files.pythonhosted.org/packages/56/87/e1ceadcc031ec4aa605fe95476892d0b0ba3b7f8c7dcdf88fdeff59a9c86/lxml-6.0.2-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321", size = 5358148, upload-time = "2025-09-22T04:00:29.323Z" }, - { url = "https://files.pythonhosted.org/packages/fe/13/5bb6cf42bb228353fd4ac5f162c6a84fd68a4d6f67c1031c8cf97e131fc6/lxml-6.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1", size = 5112035, upload-time = "2025-09-22T04:00:31.061Z" }, - { url = "https://files.pythonhosted.org/packages/e4/e2/ea0498552102e59834e297c5c6dff8d8ded3db72ed5e8aad77871476f073/lxml-6.0.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34", size = 4799111, upload-time = "2025-09-22T04:00:33.11Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9e/8de42b52a73abb8af86c66c969b3b4c2a96567b6ac74637c037d2e3baa60/lxml-6.0.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a", size = 5351662, upload-time = "2025-09-22T04:00:35.237Z" }, - { url = "https://files.pythonhosted.org/packages/28/a2/de776a573dfb15114509a37351937c367530865edb10a90189d0b4b9b70a/lxml-6.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c", size = 5314973, upload-time = "2025-09-22T04:00:37.086Z" }, - { url = "https://files.pythonhosted.org/packages/50/a0/3ae1b1f8964c271b5eec91db2043cf8c6c0bce101ebb2a633b51b044db6c/lxml-6.0.2-cp310-cp310-win32.whl", hash = "sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b", size = 3611953, upload-time = "2025-09-22T04:00:39.224Z" }, - { url = "https://files.pythonhosted.org/packages/d1/70/bd42491f0634aad41bdfc1e46f5cff98825fb6185688dc82baa35d509f1a/lxml-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0", size = 4032695, upload-time = "2025-09-22T04:00:41.402Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d0/05c6a72299f54c2c561a6c6cbb2f512e047fca20ea97a05e57931f194ac4/lxml-6.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5", size = 3680051, upload-time = "2025-09-22T04:00:43.525Z" }, - { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, - { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, - { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, - { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, - { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, - { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, - { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, - { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, - { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, - { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, - { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, - { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, - { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, - { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, - { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, - { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, - { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, - { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, - { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, - { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, - { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, - { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, - { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, - { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, - { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, - { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, - { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, - { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, - { url = "https://files.pythonhosted.org/packages/38/66/dd13c74fad495957374c8a81c932f4874d3dca5aa0db9e4369f06a399718/lxml-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694", size = 8602363, upload-time = "2025-09-22T04:03:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/5e/f4/edb9d47dce464b5dd044d35775ee794364935b93ab6226c95e199118890d/lxml-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90", size = 4634995, upload-time = "2025-09-22T04:04:01.122Z" }, - { url = "https://files.pythonhosted.org/packages/66/f2/d80c97b6ed83a99bc24b2b29919d5e618af5322df6d3aa61064093712309/lxml-6.0.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62", size = 5003737, upload-time = "2025-09-22T04:04:02.98Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f1/18b750f79f8889b9109b24749f23ac137870b4f685edc4be54be0ff2c730/lxml-6.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444", size = 5160821, upload-time = "2025-09-22T04:04:04.854Z" }, - { url = "https://files.pythonhosted.org/packages/cf/88/2b6a415dbad411c3e9c092128eb7db06054d2d9460aa56676d17ee4f4fd5/lxml-6.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad", size = 5070959, upload-time = "2025-09-22T04:04:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/7c/d0/5354afaa0f2e53625e5f96f6bd049a4875c3ab79d96d6c4871dd1f4a98c4/lxml-6.0.2-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48", size = 5410267, upload-time = "2025-09-22T04:04:10.458Z" }, - { url = "https://files.pythonhosted.org/packages/51/63/10dea35a01291dc529fa9d6ba204ea627a1c77b7fbb180d404f6cc4dd2fd/lxml-6.0.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93", size = 5292990, upload-time = "2025-09-22T04:04:12.405Z" }, - { url = "https://files.pythonhosted.org/packages/37/58/51ef422d8bec58db600b3552e5f2d870ec01ffacf11d98689c42ffdcbf7f/lxml-6.0.2-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c", size = 4776318, upload-time = "2025-09-22T04:04:14.22Z" }, - { url = "https://files.pythonhosted.org/packages/77/97/3f797820e82e3a58a19bc51068b40f3b9ab7d0934ba6e5ba6b147b618319/lxml-6.0.2-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c", size = 5360191, upload-time = "2025-09-22T04:04:16.236Z" }, - { url = "https://files.pythonhosted.org/packages/e2/14/a9306a8ab122e2f5dfbf4f71fb09beeadca26b0c275708432bbc33f40edc/lxml-6.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf", size = 5116114, upload-time = "2025-09-22T04:04:18.594Z" }, - { url = "https://files.pythonhosted.org/packages/ea/23/2118a1685277b9fa8726ec7ee903db55aa300dcea3d406a220cbe3710953/lxml-6.0.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6", size = 4801704, upload-time = "2025-09-22T04:04:20.466Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e8/d5be34da2059dc9a4ff8643fd6ad3f8234a27b2a44831b7fff58c4dbb3e3/lxml-6.0.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84", size = 5355451, upload-time = "2025-09-22T04:04:22.417Z" }, - { url = "https://files.pythonhosted.org/packages/61/84/5aebc8e150d5bf488815ea2d8798c7ff509cc37b5725caa3c1f11bdd3245/lxml-6.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb", size = 5318630, upload-time = "2025-09-22T04:04:24.301Z" }, - { url = "https://files.pythonhosted.org/packages/35/04/629ae603c1c17fb7adc9df2bc21aa5ac96afb84001700b13c1f038f3118c/lxml-6.0.2-cp39-cp39-win32.whl", hash = "sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f", size = 3614032, upload-time = "2025-09-22T04:04:26.158Z" }, - { url = "https://files.pythonhosted.org/packages/71/de/07b7b1249acbecbf48f7e42c3ce87a657af6ff38e30f12a1ad81f16010f2/lxml-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304", size = 4035311, upload-time = "2025-09-22T04:04:28.413Z" }, - { url = "https://files.pythonhosted.org/packages/60/e3/02c4c55b281606f3c8e118300e16a9fcf5f3462cc46ce740ed0b82fc3f1b/lxml-6.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa", size = 3683462, upload-time = "2025-09-22T04:04:30.399Z" }, - { url = "https://files.pythonhosted.org/packages/e7/9c/780c9a8fce3f04690b374f72f41306866b0400b9d0fdf3e17aaa37887eed/lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6", size = 3939264, upload-time = "2025-09-22T04:04:32.892Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5a/1ab260c00adf645d8bf7dec7f920f744b032f69130c681302821d5debea6/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba", size = 4216435, upload-time = "2025-09-22T04:04:34.907Z" }, - { url = "https://files.pythonhosted.org/packages/f2/37/565f3b3d7ffede22874b6d86be1a1763d00f4ea9fc5b9b6ccb11e4ec8612/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5", size = 4325913, upload-time = "2025-09-22T04:04:37.205Z" }, - { url = "https://files.pythonhosted.org/packages/22/ec/f3a1b169b2fb9d03467e2e3c0c752ea30e993be440a068b125fc7dd248b0/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4", size = 4269357, upload-time = "2025-09-22T04:04:39.322Z" }, - { url = "https://files.pythonhosted.org/packages/77/a2/585a28fe3e67daa1cf2f06f34490d556d121c25d500b10082a7db96e3bcd/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d", size = 4412295, upload-time = "2025-09-22T04:04:41.647Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d9/a57dd8bcebd7c69386c20263830d4fa72d27e6b72a229ef7a48e88952d9a/lxml-6.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d", size = 3516913, upload-time = "2025-09-22T04:04:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" }, - { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" }, - { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" }, - { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" }, - { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" }, + { url = "https://files.pythonhosted.org/packages/02/6e/ee8fc0e01202eb3dd2b9e1ea4f0910d72425d35c66187c63931d7a3ea73f/lxml-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41dcc4c7b10484257cbd6c37b83ddb26df2b0e5aff5ac00d095689015af868ec", size = 8540733, upload-time = "2026-04-18T04:27:33.185Z" }, + { url = "https://files.pythonhosted.org/packages/54/e8/325fe9b942824c773dffe1baf0c35b046a763851fdff4393af4450bceeb7/lxml-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a31286dbb5e74c8e9a5344465b77ab4c5bd511a253b355b5ca2fae7e579fafec", size = 4602805, upload-time = "2026-04-18T04:27:36.097Z" }, + { url = "https://files.pythonhosted.org/packages/2d/81/221aa3ea4a40370bb0358fa454cbe7e5a837e522f7630c24dfef3f9a73b0/lxml-6.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1bc4cc83fb7f66ffb16f74d6dd0162e144333fc36ebcce32246f80c8735b2551", size = 5002652, upload-time = "2026-04-18T04:27:30.603Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e1/fdbfb9019542f1875c093576df7f37adc2983c8ba7ecf17e5f14490bc107/lxml-6.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20cf4d0651987c906a2f5cba4e3a8d6ba4bfdf973cfe2a96c0d6053888ea2ecd", size = 5155332, upload-time = "2026-04-18T04:27:33.507Z" }, + { url = "https://files.pythonhosted.org/packages/56/b1/4087c782fff397cd03abf9c551069be59bb04a7e548c50fb7b9c4cdaca28/lxml-6.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffb34ea45a82dd637c2c97ae1bbb920850c1e59bcae79ce1c15af531d83e7215", size = 5057226, upload-time = "2026-04-18T04:27:37.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/66/516c79dec8417f3a972327330254c0b5fac93d5c3ecfd8a5b43650a5a4d9/lxml-6.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1d9b99e5b2597e4f5aed2484fef835256fa1b68a19e4265c97628ef4bf8bcf4", size = 5287588, upload-time = "2026-04-18T04:27:41.4Z" }, + { url = "https://files.pythonhosted.org/packages/94/1d/e578f4cbeb42b9df9f29b0d44a45a7cdfa3a5ae300dd59ec68e3602d29bb/lxml-6.1.0-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:d43aa26dcda363f21e79afa0668f5029ed7394b3bb8c92a6927a3d34e8b610ea", size = 5412438, upload-time = "2026-04-18T04:27:45.589Z" }, + { url = "https://files.pythonhosted.org/packages/47/5b/2aa68307d6d15959e84d4882f9c04f2da63127eac463e1594166f681ef77/lxml-6.1.0-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:6262b87f9e5c1e5fe501d6c153247289af42eb44ad7660b9b3de17baaf92d6f6", size = 4770997, upload-time = "2026-04-18T04:27:49.853Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c9/3e51fc1228310a836b4eb32595ae00154ab12197fca944676a3ab3b163ea/lxml-6.1.0-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d1392c569c032f78a11a25d1de1c43fff13294c793b39e19d84fade3045cbbc3", size = 5359678, upload-time = "2026-04-18T04:31:56.184Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/ab8bc834f977fbbd310e697b120787c153db026f9151e02a88d2645d4e5b/lxml-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:045e387d1f4f42a418380930fa3f45c73c9b392faf67e495e58902e68e8f44a7", size = 5107890, upload-time = "2026-04-18T04:32:00.387Z" }, + { url = "https://files.pythonhosted.org/packages/bb/10/8a143cfa3ac99cb5b0523ff6d0429a9c9dddf25ffeae09caa3866c7964d9/lxml-6.1.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:9f93d5b8b07f73e8c77e3c6556a3db269918390c804b5e5fcdd4858232cc8f16", size = 4803977, upload-time = "2026-04-18T04:32:05.099Z" }, + { url = "https://files.pythonhosted.org/packages/45/fd/ee02faf52fa39c2fe32f824628958b9aa86dff21343dc3161f0e3c6ccd15/lxml-6.1.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:de550d129f18d8ab819651ffe4f38b1b713c7e116707de3c0c6400d0ef34fbc1", size = 5350277, upload-time = "2026-04-18T04:32:09.176Z" }, + { url = "https://files.pythonhosted.org/packages/85/8c/b3481364b8554b5d36d540189a87fc71e94b0b01c24f8f152bd662dd2e45/lxml-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c08da09dc003c9e8c70e06b53a11db6fb3b250c21c4236b03c7d7b443c318e7a", size = 5309717, upload-time = "2026-04-18T04:32:13.303Z" }, + { url = "https://files.pythonhosted.org/packages/74/e8/a6b21927077a9127afa17473b6576b322616f34ac50ee4f577e763b75ec0/lxml-6.1.0-cp310-cp310-win32.whl", hash = "sha256:37448bf9c7d7adfc5254763901e2bbd6bb876228dfc1fc7f66e58c06368a7544", size = 3598491, upload-time = "2026-04-18T04:27:24.288Z" }, + { url = "https://files.pythonhosted.org/packages/ea/82/14dea800d041274d96c07d49ff9191f011d1427450850de19bf541e2cc12/lxml-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:2593a0a6621545b9095b71ad74ed4226eba438a7d9fc3712a99bdb15508cf93a", size = 4020906, upload-time = "2026-04-18T04:27:27.53Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ba/d3539aaf4d9d21456b9a7b902816623227d05d63e7c5aafd8834c4b9bed6/lxml-6.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:e80807d72f96b96ad5588cb85c75616e4f2795a7737d4630784c51497beb7776", size = 3667787, upload-time = "2026-04-18T04:27:29.407Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5d/3bccad330292946f97962df9d5f2d3ae129cce6e212732a781e856b91e07/lxml-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9", size = 8526232, upload-time = "2026-04-18T04:27:40.389Z" }, + { url = "https://files.pythonhosted.org/packages/a7/51/adc8826570a112f83bb4ddb3a2ab510bbc2ccd62c1b9fe1f34fae2d90b57/lxml-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03e048b6ce8e77b09c734e931584894ecd58d08296804ca2d0b184c933ce50", size = 4595448, upload-time = "2026-04-18T04:27:44.208Z" }, + { url = "https://files.pythonhosted.org/packages/54/84/5a9ec07cbe1d2334a6465f863b949a520d2699a755738986dcd3b6b89e3f/lxml-6.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5", size = 4923771, upload-time = "2026-04-18T04:32:17.402Z" }, + { url = "https://files.pythonhosted.org/packages/a7/23/851cfa33b6b38adb628e45ad51fb27105fa34b2b3ba9d1d4aa7a9428dfe0/lxml-6.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e", size = 5068101, upload-time = "2026-04-18T04:32:21.437Z" }, + { url = "https://files.pythonhosted.org/packages/b0/38/41bf99c2023c6b79916ba057d83e9db21d642f473cac210201222882d38b/lxml-6.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512", size = 5002573, upload-time = "2026-04-18T04:32:25.373Z" }, + { url = "https://files.pythonhosted.org/packages/c2/20/053aa10bdc39747e1e923ce2d45413075e84f70a136045bb09e5eaca41d3/lxml-6.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c", size = 5202816, upload-time = "2026-04-18T04:32:29.393Z" }, + { url = "https://files.pythonhosted.org/packages/9a/da/bc710fad8bf04b93baee752c192eaa2210cd3a84f969d0be7830fea55802/lxml-6.1.0-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:f504d861d9f2a8f94020130adac88d66de93841707a23a86244263d1e54682f5", size = 5329999, upload-time = "2026-04-18T04:32:34.019Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/bf035dedbdf7fab49411aa52e4236f3445e98d38647d85419e6c0d2806b9/lxml-6.1.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:23a5dc68e08ed13331d61815c08f260f46b4a60fdd1640bbeb82cf89a9d90289", size = 4659643, upload-time = "2026-04-18T04:32:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/22be31f33727a5e4c7b01b0a874503026e50329b259d3587e0b923cf964b/lxml-6.1.0-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f15401d8d3dbf239e23c818afc10c7207f7b95f9a307e092122b6f86dd43209a", size = 5265963, upload-time = "2026-04-18T04:32:41.881Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2b/d44d0e5c79226017f4ab8c87a802ebe4f89f97e6585a8e4166dffcdd7b6e/lxml-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3", size = 5045444, upload-time = "2026-04-18T04:32:44.512Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/3f034fec1594c331a6dbf9491238fdcc9d66f68cc529e109ec75b97197e1/lxml-6.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0d082495c5fcf426e425a6e28daaba1fcb6d8f854a4ff01effb1f1f381203eb9", size = 4712703, upload-time = "2026-04-18T04:32:47.16Z" }, + { url = "https://files.pythonhosted.org/packages/12/16/0b83fccc158218aca75a7aa33e97441df737950734246b9fffa39301603d/lxml-6.1.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e3c4f84b24a1fcba435157d111c4b755099c6ff00a3daee1ad281817de75ed11", size = 5252745, upload-time = "2026-04-18T04:32:50.427Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ee/12e6c1b39a77666c02eaa77f94a870aaf63c4ac3a497b2d52319448b01c6/lxml-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4", size = 5226822, upload-time = "2026-04-18T04:32:53.437Z" }, + { url = "https://files.pythonhosted.org/packages/34/20/c7852904858b4723af01d2fc14b5d38ff57cb92f01934a127ebd9a9e51aa/lxml-6.1.0-cp311-cp311-win32.whl", hash = "sha256:857efde87d365706590847b916baff69c0bc9252dc5af030e378c9800c0b10e3", size = 3594026, upload-time = "2026-04-18T04:27:31.903Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/d60c732b56da5085175c07c74b2df4e6d181b0c9a61e1691474f06ef4b39/lxml-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:183bfb45a493081943be7ea2b5adfc2b611e1cf377cefa8b8a8be404f45ef9a7", size = 4025114, upload-time = "2026-04-18T04:27:34.077Z" }, + { url = "https://files.pythonhosted.org/packages/c2/df/c84dcc175fd690823436d15b41cb920cd5ba5e14cd8bfb00949d5903b320/lxml-6.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:19f4164243fc206d12ed3d866e80e74f5bc3627966520da1a5f97e42c32a3f39", size = 3667742, upload-time = "2026-04-18T04:27:38.45Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d4/9326838b59dc36dfae42eec9656b97520f9997eee1de47b8316aaeed169c/lxml-6.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d", size = 8570663, upload-time = "2026-04-18T04:27:48.253Z" }, + { url = "https://files.pythonhosted.org/packages/d8/a4/053745ce1f8303ccbb788b86c0db3a91b973675cefc42566a188637b7c40/lxml-6.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0cea5b1d3e6e77d71bd2b9972eb2446221a69dc52bb0b9c3c6f6e5700592d93", size = 4624024, upload-time = "2026-04-18T04:27:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/90/97/a517944b20f8fd0932ad2109482bee4e29fe721416387a363306667941f6/lxml-6.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d", size = 4930895, upload-time = "2026-04-18T04:32:56.29Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/e08a970727d556caa040a44773c7b7e3ad0f0d73dedc863543e9a8b931f2/lxml-6.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a", size = 5093820, upload-time = "2026-04-18T04:32:58.94Z" }, + { url = "https://files.pythonhosted.org/packages/88/ee/2a5c2aa2c32016a226ca25d3e1056a8102ea6e1fe308bf50213586635400/lxml-6.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105", size = 5005790, upload-time = "2026-04-18T04:33:01.272Z" }, + { url = "https://files.pythonhosted.org/packages/e3/38/a0db9be8f38ad6043ab9429487c128dd1d30f07956ef43040402f8da49e8/lxml-6.1.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4937460dc5df0cdd2f06a86c285c28afda06aefa3af949f9477d3e8df430c485", size = 5630827, upload-time = "2026-04-18T04:33:04.036Z" }, + { url = "https://files.pythonhosted.org/packages/31/ba/3c13d3fc24b7cacf675f808a3a1baabf43a30d0cd24c98f94548e9aa58eb/lxml-6.1.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814", size = 5240445, upload-time = "2026-04-18T04:33:06.87Z" }, + { url = "https://files.pythonhosted.org/packages/55/ba/eeef4ccba09b2212fe239f46c1692a98db1878e0872ae320756488878a94/lxml-6.1.0-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:40d9189f80075f2e1f88db21ef815a2b17b28adf8e50aaf5c789bfe737027f32", size = 5350121, upload-time = "2026-04-18T04:33:09.365Z" }, + { url = "https://files.pythonhosted.org/packages/7e/01/1da87c7b587c38d0cbe77a01aae3b9c1c49ed47d76918ef3db8fc151b1ca/lxml-6.1.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:05b9b8787e35bec69e68daf4952b2e6dfcfb0db7ecf1a06f8cdfbbac4eb71aad", size = 4694949, upload-time = "2026-04-18T04:33:11.628Z" }, + { url = "https://files.pythonhosted.org/packages/a1/88/7db0fe66d5aaf128443ee1623dec3db1576f3e4c17751ec0ef5866468590/lxml-6.1.0-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0f08beb0182e3e9a86fae124b3c47a7b41b7b69b225e1377db983802404e54", size = 5243901, upload-time = "2026-04-18T04:33:13.95Z" }, + { url = "https://files.pythonhosted.org/packages/00/a8/1346726af7d1f6fca1f11223ba34001462b0a3660416986d37641708d57c/lxml-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d", size = 5048054, upload-time = "2026-04-18T04:33:16.965Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b7/85057012f035d1a0c87e02f8c723ca3c3e6e0728bcf4cb62080b21b1c1e3/lxml-6.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1ae225f66e5938f4fa29d37e009a3bb3b13032ac57eb4eb42afa44f6e4054e69", size = 4777324, upload-time = "2026-04-18T04:33:19.832Z" }, + { url = "https://files.pythonhosted.org/packages/75/6c/ad2f94a91073ef570f33718040e8e160d5fb93331cf1ab3ca1323f939e2d/lxml-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:690022c7fae793b0489aa68a658822cea83e0d5933781811cabbf5ea3bcfe73d", size = 5645702, upload-time = "2026-04-18T04:33:22.436Z" }, + { url = "https://files.pythonhosted.org/packages/3b/89/0bb6c0bd549c19004c60eea9dc554dd78fd647b72314ef25d460e0d208c6/lxml-6.1.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:63aeafc26aac0be8aff14af7871249e87ea1319be92090bfd632ec68e03b16a5", size = 5232901, upload-time = "2026-04-18T04:33:26.21Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d9/d609a11fb567da9399f525193e2b49847b5a409cdebe737f06a8b7126bdc/lxml-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d", size = 5261333, upload-time = "2026-04-18T04:33:28.984Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/ac3f99ec8ac93089e7dd556f279e0d14c24de0a74a507e143a2e4b496e7c/lxml-6.1.0-cp312-cp312-win32.whl", hash = "sha256:56971379bc5ee8037c5a0f09fa88f66cdb7d37c3e38af3e45cf539f41131ac1f", size = 3596289, upload-time = "2026-04-18T04:27:42.819Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a7/0a915557538593cb1bbeedcd40e13c7a261822c26fecbbdb71dad0c2f540/lxml-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bba078de0031c219e5dd06cf3e6bf8fb8e6e64a77819b358f53bb132e3e03366", size = 3997059, upload-time = "2026-04-18T04:27:46.764Z" }, + { url = "https://files.pythonhosted.org/packages/92/96/a5dc078cf0126fbfbc35611d77ecd5da80054b5893e28fb213a5613b9e1d/lxml-6.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:c3592631e652afa34999a088f98ba7dfc7d6aff0d535c410bea77a71743f3819", size = 3659552, upload-time = "2026-04-18T04:27:51.133Z" }, + { url = "https://files.pythonhosted.org/packages/08/03/69347590f1cf4a6d5a4944bb6099e6d37f334784f16062234e1f892fdb1d/lxml-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45", size = 8559689, upload-time = "2026-04-18T04:31:57.785Z" }, + { url = "https://files.pythonhosted.org/packages/3f/58/25e00bb40b185c974cfe156c110474d9a8a8390d5f7c92a4e328189bb60e/lxml-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc7140d7a7386e6b545d41b7358f4d02b656d4053f5fa6859f92f4b9c2572c4d", size = 4617892, upload-time = "2026-04-18T04:32:01.78Z" }, + { url = "https://files.pythonhosted.org/packages/f5/54/92ad98a94ac318dc4f97aaac22ff8d1b94212b2ae8af5b6e9b354bf825f7/lxml-6.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:419c58fc92cc3a2c3fa5f78c63dbf5da70c1fa9c1b25f25727ecee89a96c7de2", size = 4923489, upload-time = "2026-04-18T04:33:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/15/3b/a20aecfab42bdf4f9b390590d345857ad3ffd7c51988d1c89c53a0c73faf/lxml-6.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:37fabd1452852636cf38ecdcc9dd5ca4bba7a35d6c53fa09725deeb894a87491", size = 5082162, upload-time = "2026-04-18T04:33:34.262Z" }, + { url = "https://files.pythonhosted.org/packages/45/26/2cdb3d281ac1bd175603e290cbe4bad6eff127c0f8de90bafd6f8548f0fd/lxml-6.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc", size = 4993247, upload-time = "2026-04-18T04:33:36.674Z" }, + { url = "https://files.pythonhosted.org/packages/f6/05/d735aef963740022a08185c84821f689fc903acb3d50326e6b1e9886cc22/lxml-6.1.0-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e369cbd690e788c8d15e56222d91a09c6a417f49cbc543040cba0fe2e25a79e", size = 5613042, upload-time = "2026-04-18T04:33:39.205Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b8/ead7c10efff731738c72e59ed6eb5791854879fbed7ae98781a12006263a/lxml-6.1.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2", size = 5228304, upload-time = "2026-04-18T04:33:41.647Z" }, + { url = "https://files.pythonhosted.org/packages/6b/10/e9842d2ec322ea65f0a7270aa0315a53abed06058b88ef1b027f620e7a5f/lxml-6.1.0-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:4bd1bdb8a9e0e2dd229de19b5f8aebac80e916921b4b2c6ef8a52bc131d0c1f9", size = 5341578, upload-time = "2026-04-18T04:33:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/89/54/40d9403d7c2775fa7301d3ddd3464689bfe9ba71acc17dfff777071b4fdc/lxml-6.1.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:cbd7b79cdcb4986ad78a2662625882747f09db5e4cd7b2ae178a88c9c51b3dfe", size = 4700209, upload-time = "2026-04-18T04:33:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/85/b2/bbdcc2cf45dfc7dfffef4fd97e5c47b15919b6a365247d95d6f684ef5e82/lxml-6.1.0-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:43e4d297f11080ec9d64a4b1ad7ac02b4484c9f0e2179d9c4ef78e886e747b88", size = 5232365, upload-time = "2026-04-18T04:33:50.249Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/b06875665e53aaba7127611a7bed3b7b9658e20b22bc2dd217a0b7ab0091/lxml-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cc16682cc987a3da00aa56a3aa3075b08edb10d9b1e476938cfdbee8f3b67181", size = 5043654, upload-time = "2026-04-18T04:33:52.71Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9c/e71a069d09641c1a7abeb30e693f828c7c90a41cbe3d650b2d734d876f85/lxml-6.1.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d6d8efe71429635f0559579092bb5e60560d7b9115ee38c4adbea35632e7fa24", size = 4769326, upload-time = "2026-04-18T04:33:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/cc/06/7a9cd84b3d4ed79adf35f874750abb697dec0b4a81a836037b36e47c091a/lxml-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e39ab3a28af7784e206d8606ec0e4bcad0190f63a492bca95e94e5a4aef7f6e", size = 5635879, upload-time = "2026-04-18T04:33:58.509Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f0/9d57916befc1e54c451712c7ee48e9e74e80ae4d03bdce49914e0aee42cd/lxml-6.1.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9eb667bf50856c4a58145f8ca2d5e5be160191e79eb9e30855a476191b3c3495", size = 5224048, upload-time = "2026-04-18T04:34:00.943Z" }, + { url = "https://files.pythonhosted.org/packages/99/75/90c4eefda0c08c92221fe0753db2d6699a4c628f76ff4465ec20dea84cc1/lxml-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7f4a77d6f7edf9230cee3e1f7f6764722a41604ee5681844f18db9a81ea0ec33", size = 5250241, upload-time = "2026-04-18T04:34:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/5e/73/16596f7e4e38fa33084b9ccbccc22a15f82a290a055126f2c1541236d2ff/lxml-6.1.0-cp313-cp313-win32.whl", hash = "sha256:28902146ffbe5222df411c5d19e5352490122e14447e98cd118907ee3fd6ee62", size = 3596938, upload-time = "2026-04-18T04:31:56.206Z" }, + { url = "https://files.pythonhosted.org/packages/8e/63/981401c5680c1eb30893f00a19641ac80db5d1e7086c62cb4b13ed813038/lxml-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:4a1503c56e4e2b38dc76f2f2da7bae69670c0f1933e27cfa34b2fa5876410b16", size = 3995728, upload-time = "2026-04-18T04:31:58.763Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e8/c358a38ac3e541d16a1b527e4e9cb78c0419b0506a070ace11777e5e8404/lxml-6.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:e0af85773850417d994d019741239b901b22c6680206f46a34766926e466141d", size = 3658372, upload-time = "2026-04-18T04:32:03.629Z" }, + { url = "https://files.pythonhosted.org/packages/eb/45/cee4cf203ef0bab5c52afc118da61d6b460c928f2893d40023cfa27e0b80/lxml-6.1.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ab863fd37458fed6456525f297d21239d987800c46e67da5ef04fc6b3dd93ac8", size = 8576713, upload-time = "2026-04-18T04:32:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a7/eda05babeb7e046839204eaf254cd4d7c9130ce2bbf0d9e90ea41af5654d/lxml-6.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6fd8b1df8254ff4fd93fd31da1fc15770bde23ac045be9bb1f87425702f61cc9", size = 4623874, upload-time = "2026-04-18T04:32:10.755Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e9/db5846de9b436b91890a62f29d80cd849ea17948a49bf532d5278ee69a9e/lxml-6.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:47024feaae386a92a146af0d2aeed65229bf6fff738e6a11dda6b0015fb8fd03", size = 4949535, upload-time = "2026-04-18T04:34:06.657Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ba/0d3593373dcae1d68f40dc3c41a5a92f2544e68115eb2f62319a4c2a6500/lxml-6.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3f00972f84450204cd5d93a5395965e348956aaceaadec693a22ec743f8ae3eb", size = 5086881, upload-time = "2026-04-18T04:34:09.556Z" }, + { url = "https://files.pythonhosted.org/packages/43/76/759a7484539ad1af0d125a9afe9c3fb5f82a8779fd1f5f56319d9e4ea2fd/lxml-6.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97faa0860e13b05b15a51fb4986421ef7a30f0b3334061c416e0981e9450ca4c", size = 5031305, upload-time = "2026-04-18T04:34:12.336Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/c1f0daf981a11e47636126901fd4ab82429e18c57aeb0fc3ad2940b42d8b/lxml-6.1.0-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:972a6451204798675407beaad97b868d0c733d9a74dafefc63120b81b8c2de28", size = 5647522, upload-time = "2026-04-18T04:34:14.89Z" }, + { url = "https://files.pythonhosted.org/packages/31/e6/1f533dcd205275363d9ba3511bcec52fa2df86abf8abe6a5f2c599f0dc31/lxml-6.1.0-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fe022f20bc4569ec66b63b3fb275a3d628d9d32da6326b2982584104db6d3086", size = 5239310, upload-time = "2026-04-18T04:34:17.652Z" }, + { url = "https://files.pythonhosted.org/packages/c3/8c/4175fb709c78a6e315ed814ed33be3defd8b8721067e70419a6cf6f971da/lxml-6.1.0-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:75c4c7c619a744f972f4451bf5adf6d0fb00992a1ffc9fd78e13b0bc817cc99f", size = 5350799, upload-time = "2026-04-18T04:34:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/6ffdebc5994975f0dde4acb59761902bd9d9bb84422b9a0bd239a7da9ca8/lxml-6.1.0-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3648f20d25102a22b6061c688beb3a805099ea4beb0a01ce62975d926944d292", size = 4697693, upload-time = "2026-04-18T04:34:23.541Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/565f36bd5c73294602d48e04d23f81ff4c8736be6ba5e1d1ec670ac9be80/lxml-6.1.0-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77b9f99b17cbf14026d1e618035077060fc7195dd940d025149f3e2e830fbfcb", size = 5250708, upload-time = "2026-04-18T04:34:26.001Z" }, + { url = "https://files.pythonhosted.org/packages/5a/11/a68ab9dd18c5c499404deb4005f4bc4e0e88e5b72cd755ad96efec81d18d/lxml-6.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32662519149fd7a9db354175aa5e417d83485a8039b8aaa62f873ceee7ea4cad", size = 5084737, upload-time = "2026-04-18T04:34:28.32Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/e8f41e2c74f4af564e6a0348aea69fb6daaefa64bc071ef469823d22cc18/lxml-6.1.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:73d658216fc173cf2c939e90e07b941c5e12736b0bf6a99e7af95459cfe8eabb", size = 4737817, upload-time = "2026-04-18T04:34:30.784Z" }, + { url = "https://files.pythonhosted.org/packages/06/2d/aa4e117aa2ce2f3b35d9ff246be74a2f8e853baba5d2a92c64744474603a/lxml-6.1.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ac4db068889f8772a4a698c5980ec302771bb545e10c4b095d4c8be26749616f", size = 5670753, upload-time = "2026-04-18T04:34:33.675Z" }, + { url = "https://files.pythonhosted.org/packages/08/f5/dd745d50c0409031dbfcc4881740542a01e54d6f0110bd420fa7782110b8/lxml-6.1.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:45e9dfbd1b661eb64ba0d4dbe762bd210c42d86dd1e5bd2bdf89d634231beb43", size = 5238071, upload-time = "2026-04-18T04:34:36.12Z" }, + { url = "https://files.pythonhosted.org/packages/3e/74/ad424f36d0340a904665867dab310a3f1f4c96ff4039698de83b77f44c1f/lxml-6.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:89e8d73d09ac696a5ba42ec69787913d53284f12092f651506779314f10ba585", size = 5264319, upload-time = "2026-04-18T04:34:39.035Z" }, + { url = "https://files.pythonhosted.org/packages/53/36/a15d8b3514ec889bfd6aa3609107fcb6c9189f8dc347f1c0b81eded8d87c/lxml-6.1.0-cp314-cp314-win32.whl", hash = "sha256:ebe33f4ec1b2de38ceb225a1749a2965855bffeef435ba93cd2d5d540783bf2f", size = 3657139, upload-time = "2026-04-18T04:32:20.006Z" }, + { url = "https://files.pythonhosted.org/packages/1a/a4/263ebb0710851a3c6c937180a9a86df1206fdfe53cc43005aa2237fd7736/lxml-6.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:398443df51c538bd578529aa7e5f7afc6c292644174b47961f3bf87fe5741120", size = 4064195, upload-time = "2026-04-18T04:32:23.876Z" }, + { url = "https://files.pythonhosted.org/packages/80/68/2000f29d323b6c286de077ad20b429fc52272e44eae6d295467043e56012/lxml-6.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:8c8984e1d8c4b3949e419158fda14d921ff703a9ed8a47236c6eb7a2b6cb4946", size = 3741870, upload-time = "2026-04-18T04:32:27.922Z" }, + { url = "https://files.pythonhosted.org/packages/30/e9/21383c7c8d43799f0da90224c0d7c921870d476ec9b3e01e1b2c0b8237c5/lxml-6.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1081dd10bc6fa437db2500e13993abf7cc30716d0a2f40e65abb935f02ec559c", size = 8827548, upload-time = "2026-04-18T04:32:15.094Z" }, + { url = "https://files.pythonhosted.org/packages/a5/01/c6bc11cd587030dd4f719f65c5657960649fe3e19196c844c75bf32cd0d6/lxml-6.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:dabecc48db5f42ba348d1f5d5afdc54c6c4cc758e676926c7cd327045749517d", size = 4735866, upload-time = "2026-04-18T04:32:18.924Z" }, + { url = "https://files.pythonhosted.org/packages/f3/01/757132fff5f4acf25463b5298f1a46099f3a94480b806547b29ce5e385de/lxml-6.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e3dd5fe19c9e0ac818a9c7f132a5e43c1339ec1cbbfecb1a938bd3a47875b7c9", size = 4969476, upload-time = "2026-04-18T04:34:41.889Z" }, + { url = "https://files.pythonhosted.org/packages/fd/fb/1bc8b9d27ed64be7c8903db6c89e74dc8c2cd9ec630a7462e4654316dc5b/lxml-6.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9e7b0a4ca6dcc007a4cef00a761bba2dea959de4bd2df98f926b33c92ca5dfb9", size = 5103719, upload-time = "2026-04-18T04:34:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e7/5bf82fa28133536a54601aae633b14988e89ed61d4c1eb6b899b023233aa/lxml-6.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d27bbe326c6b539c64b42638b18bc6003a8d88f76213a97ac9ed4f885efeab7", size = 5027890, upload-time = "2026-04-18T04:34:47.634Z" }, + { url = "https://files.pythonhosted.org/packages/2d/20/e048db5d4b4ea0366648aa595f26bb764b2670903fc585b87436d0a5032c/lxml-6.1.0-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4e425db0c5445ef0ad56b0eec54f89b88b2d884656e536a90b2f52aecb4ca86", size = 5596008, upload-time = "2026-04-18T04:34:51.503Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c2/d10807bc8da4824b39e5bd01b5d05c077b6fd01bd91584167edf6b269d22/lxml-6.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b89b098105b8599dc57adac95d1813409ac476d3c948a498775d3d0c6124bfb", size = 5224451, upload-time = "2026-04-18T04:34:54.263Z" }, + { url = "https://files.pythonhosted.org/packages/3c/15/2ebea45bea427e7f0057e9ce7b2d62c5aba20c6b001cca89ed0aadb3ad41/lxml-6.1.0-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:c4a699432846df86cc3de502ee85f445ebad748a1c6021d445f3e514d2cd4b1c", size = 5312135, upload-time = "2026-04-18T04:34:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/31/e2/87eeae151b0be2a308d49a7ec444ff3eb192b14251e62addb29d0bf3778f/lxml-6.1.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:30e7b2ed63b6c8e97cca8af048589a788ab5c9c905f36d9cf1c2bb549f450d2f", size = 4639126, upload-time = "2026-04-18T04:34:59.704Z" }, + { url = "https://files.pythonhosted.org/packages/a3/51/8a3f6a20902ad604dd746ec7b4000311b240d389dac5e9d95adefd349e0c/lxml-6.1.0-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:022981127642fe19866d2907d76241bb07ed21749601f727d5d5dd1ce5d1b773", size = 5232579, upload-time = "2026-04-18T04:35:02.658Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d2/650d619bdbe048d2c3f2c31edb00e35670a5e2d65b4fe3b61bce37b19121/lxml-6.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:23cad0cc86046d4222f7f418910e46b89971c5a45d3c8abfad0f64b7b05e4a9b", size = 5084206, upload-time = "2026-04-18T04:35:05.175Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8a/672ca1a3cbeabd1f511ca275a916c0514b747f4b85bdaae103b8fa92f307/lxml-6.1.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:21c3302068f50d1e8728c67c87ba92aa87043abee517aa2576cca1855326b405", size = 4758906, upload-time = "2026-04-18T04:35:08.098Z" }, + { url = "https://files.pythonhosted.org/packages/be/f1/ef4b691da85c916cb2feb1eec7414f678162798ac85e042fa164419ac05c/lxml-6.1.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:be10838781cb3be19251e276910cd508fe127e27c3242e50521521a0f3781690", size = 5620553, upload-time = "2026-04-18T04:35:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/59/17/94e81def74107809755ac2782fdad4404420f1c92ca83433d117a6d5acf0/lxml-6.1.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2173a7bffe97667bbf0767f8a99e587740a8c56fdf3befac4b09cb29a80276fd", size = 5229458, upload-time = "2026-04-18T04:35:14.254Z" }, + { url = "https://files.pythonhosted.org/packages/21/55/c4be91b0f830a871fc1b0d730943d56013b683d4671d5198260e2eae722b/lxml-6.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c6854e9cf99c84beb004eecd7d3a3868ef1109bf2b1df92d7bc11e96a36c2180", size = 5247861, upload-time = "2026-04-18T04:35:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ca/77123e4d77df3cb1e968ade7b1f808f5d3a5c1c96b18a33895397de292c1/lxml-6.1.0-cp314-cp314t-win32.whl", hash = "sha256:00750d63ef0031a05331b9223463b1c7c02b9004cef2346a5b2877f0f9494dd2", size = 3897377, upload-time = "2026-04-18T04:32:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/64/ce/3554833989d074267c063209bae8b09815e5656456a2d332b947806b05ff/lxml-6.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:80410c3a7e3c617af04de17caa9f9f20adaa817093293d69eae7d7d0522836f5", size = 4392701, upload-time = "2026-04-18T04:32:12.113Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a0/9b916c68c0e57752c07f8f64b30138d9d4059dbeb27b90274dedbea128ff/lxml-6.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:26dd9f57ee3bd41e7d35b4c98a2ffd89ed11591649f421f0ec19f67d50ec67ac", size = 3817120, upload-time = "2026-04-18T04:32:15.803Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e5/ce4f6c3fd846b6e84fd26e4451e0dd71ed41c11c06f933bc5e14209b8424/lxml-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:920354904d1cb86577d4b3cfe2830c2dbe81d6f4449e57ada428f1609b5985f7", size = 8553758, upload-time = "2026-04-18T04:32:27.055Z" }, + { url = "https://files.pythonhosted.org/packages/2a/c3/2dc396e40e6df8fa4f9aed713bd24d3ded0d2c59f6c526f374a4f20e2711/lxml-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c871299c595ee004d186f61840f0bfc4941aa3f17c8ba4a565ead7e4f4f820ee", size = 4607719, upload-time = "2026-04-18T04:32:30.824Z" }, + { url = "https://files.pythonhosted.org/packages/89/cf/b9d36b388e3bffdae6d1c987e91ad08dae487bc1a45f499343d081b8b18e/lxml-6.1.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d0d799ff958655781296ec870d5e2448e75150da2b3d07f13ff5b0c2c35beefd", size = 5006003, upload-time = "2026-04-18T04:35:32.715Z" }, + { url = "https://files.pythonhosted.org/packages/63/d9/28589f385b6028f1700a5d88444a3278b1b2e81425b71f44fb234082135d/lxml-6.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ba11752e346bd804ea312ec2eea2532dfa8b8d3261d81a32ef9e6ab16256280", size = 5159902, upload-time = "2026-04-18T04:35:35.444Z" }, + { url = "https://files.pythonhosted.org/packages/57/fc/4d1ecc9f767fce8eec8e36b42c2b046e2076d71cb3f27363920c2c2a3412/lxml-6.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26c5272c6a4bf4cf32d3f5a7890c942b0e04438691157d341616d02cca74d4bd", size = 5062833, upload-time = "2026-04-18T04:35:38.185Z" }, + { url = "https://files.pythonhosted.org/packages/ee/85/4f183628e66b04390a78db807c79b2956a995f7fed5061fd73a54b9f8b7b/lxml-6.1.0-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c53fa3a5a52122d590e847a57ccf955557b9634a7f99ff5a35131321b0a85317", size = 5292986, upload-time = "2026-04-18T04:35:41.477Z" }, + { url = "https://files.pythonhosted.org/packages/c2/53/82043639bd363b82b0b480b5ec1f596ec09be6bf65358f0c44ea05e113c3/lxml-6.1.0-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:76b958b4ea3104483c20f74866d55aa056546e15ebe83dd7aecd63698f43b755", size = 5416696, upload-time = "2026-04-18T04:35:44.358Z" }, + { url = "https://files.pythonhosted.org/packages/e6/84/12769cfd85fa18595d22ad6f4ea0ec548e3ba78c3111738fa5d1389321d6/lxml-6.1.0-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:8c11b984b5ce6add4dccc7144c7be5d364d298f15b0c6a57da1991baedc750ce", size = 4773350, upload-time = "2026-04-18T04:35:47.407Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7e/c8ca946407eb1dfc934681f8adfc7903d3541328d03cb372d4df323b0b58/lxml-6.1.0-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d3829a6e6fd550a219564912d4002c537f65da4c6ae4e093cc34462f4fa027ad", size = 5361754, upload-time = "2026-04-18T04:35:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c3/a1eec3a444d1d6004e2eaf299eeaf43974f7cd9b602d191974dc0ef6dd2e/lxml-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:52b0ac6903cf74ebf997eb8c682d2fbac7d1ab7e4c552413eec55868a9b73f39", size = 5111074, upload-time = "2026-04-18T04:35:52.469Z" }, + { url = "https://files.pythonhosted.org/packages/d1/64/8e5b591750799f9e1ae7f72c1fd74c0489d503a255329462a27921e41ccf/lxml-6.1.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:29f5c00cb7d752bce2c70ebd2d31b0a42f9499ffdd3ecb2f31a5b73ee43031ad", size = 4808151, upload-time = "2026-04-18T04:35:55.176Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f0/25dbf84ed5a83d7f3e8bbed7f7ec354e0bda198d4f360dbe67996d6b83fc/lxml-6.1.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:c748ebcb6877de89f48ab90ca96642ac458fff5dec291a2b9337cd4d0934e383", size = 5352754, upload-time = "2026-04-18T04:35:57.928Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8b/98a6fd25ffd71ee32000ef402717937514e6a53ea3cd155437d9f1b7efd0/lxml-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:08950a23f296b3f83521577274e3d3b0f3d739bf2e68d01a752e4288bc50d286", size = 5315169, upload-time = "2026-04-18T04:36:00.947Z" }, + { url = "https://files.pythonhosted.org/packages/64/76/f2e129250eb2d79155630c78bfd17a12b8ae4907cba70ef7defb7e46159a/lxml-6.1.0-cp39-cp39-win32.whl", hash = "sha256:11a873c77a181b4fef9c2e357d08ed399542c2af1390101da66720a19c7c9618", size = 3601056, upload-time = "2026-04-18T04:32:40.29Z" }, + { url = "https://files.pythonhosted.org/packages/e8/9f/c2d0bf629547f17e3a3e568d4ee7b42a5ecfbf03e145903c0636ef04ef82/lxml-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:81ff55c70b67d19d52b6fd118a114c0a4c97d799cd3089ff9bd9e2ff4b414ee2", size = 4024263, upload-time = "2026-04-18T04:32:42.88Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/5176afacf2b687efe96fb6933c23685b650df4018a4de43ea0da23e38860/lxml-6.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:481d6e2104285d9add34f41b42b247b76b61c5b5c26c303c2e9707bbf8bd9a64", size = 3670698, upload-time = "2026-04-18T04:32:45.602Z" }, + { url = "https://files.pythonhosted.org/packages/f2/88/55143966481409b1740a3ac669e611055f49efd68087a5ce41582325db3e/lxml-6.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:546b66c0dd1bb8d9fa89d7123e5fa19a8aff3a1f2141eb22df96112afb17b842", size = 3930134, upload-time = "2026-04-18T04:32:35.008Z" }, + { url = "https://files.pythonhosted.org/packages/b5/97/28b985c2983938d3cb696dd5501423afb90a8c3e869ef5d3c62569282c0f/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c", size = 4210749, upload-time = "2026-04-18T04:36:03.626Z" }, + { url = "https://files.pythonhosted.org/packages/29/67/dfab2b7d58214921935ccea7ce9b3df9b7d46f305d12f0f532ac7cf6b804/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de", size = 4318463, upload-time = "2026-04-18T04:36:06.309Z" }, + { url = "https://files.pythonhosted.org/packages/32/a2/4ac7eb32a4d997dd352c32c32399aae27b3f268d440e6f9cfa405b575d2f/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635", size = 4251124, upload-time = "2026-04-18T04:36:09.056Z" }, + { url = "https://files.pythonhosted.org/packages/33/ef/d6abd850bb4822f9b720cfe36b547a558e694881010ff7d012191e8769c6/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037", size = 4401758, upload-time = "2026-04-18T04:36:11.803Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/3ee09a5b60cb44c4f2fbc1c9015cfd6ff5afc08f991cab295d3024dcbf2d/lxml-6.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7da13bb6fbadfafb474e0226a30570a3445cfd47c86296f2446dafbd77079ace", size = 3508860, upload-time = "2026-04-18T04:32:48.619Z" }, ] [[package]] From 972d88c1089b751c5a33597c19a3b1cd96c1535b Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 23 Apr 2026 02:27:49 -0500 Subject: [PATCH 121/147] chore: require PRs to link an issue or discussion - Add PR template with required linked issue/discussion section - Add check-linked-issue CI job that validates PR body contains a reference (#123, Closes/Fixes/Relates, GitHub URL, or CF-# ticket) - Wire into required-checks-passed gate so it blocks merge - Update CONTRIBUTING.md with the policy and motivation --- .github/PULL_REQUEST_TEMPLATE.md | 18 +++++++++++ .github/workflows/ci.yaml | 52 ++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 3 +- 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..bc1771f57 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +## Linked issue or discussion + + + + + + + + +**Required:** + +## What changed + + + +## Test plan + + diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3b5b1c74c..0997305b6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,6 +22,57 @@ concurrency: cancel-in-progress: true jobs: + # --------------------------------------------------------------------------- + # Linked issue check — every PR must reference an issue or discussion. + # Skipped on push to main and workflow_dispatch. + # --------------------------------------------------------------------------- + check-linked-issue: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - name: Check PR body for linked issue or discussion + env: + PR_BODY: ${{ github.event.pull_request.body }} + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + run: | + # Skip for bots (dependabot, renovate, github-actions) + if [[ "$PR_AUTHOR" == *"[bot]"* || "$PR_AUTHOR" == "dependabot" ]]; then + echo "Bot PR — skipping linked issue check." + exit 0 + fi + + if [ -z "$PR_BODY" ]; then + echo "::error::PR body is empty. Every PR must link an issue or discussion." + echo "Use 'Closes #', 'Fixes #', 'Relates to #', or include a discussion URL." + exit 1 + fi + + # Match: #123, GH-123, org/repo#123, Closes/Fixes/Relates/Resolves #123, + # or a github.com URL to an issue or discussion + if echo "$PR_BODY" | grep -qiP '(close[sd]?|fix(e[sd])?|relate[sd]?\s+to|resolve[sd]?)\s+#\d+'; then + echo "Found linked issue keyword." + exit 0 + fi + if echo "$PR_BODY" | grep -qP '#\d+'; then + echo "Found issue reference." + exit 0 + fi + if echo "$PR_BODY" | grep -qiP 'github\.com/[^\s]+/(issues|discussions)/\d+'; then + echo "Found GitHub issue/discussion URL." + exit 0 + fi + if echo "$PR_BODY" | grep -qiP 'CF-#?\d+'; then + echo "Found Linear ticket reference." + exit 0 + fi + + echo "::error::No linked issue or discussion found in PR body." + echo "Every PR must reference an issue or discussion. See CONTRIBUTING.md for details." + echo "Use 'Closes #', 'Fixes #', 'Relates to #', or include a discussion URL." + exit 1 + # --------------------------------------------------------------------------- # Change detection — decides which downstream jobs actually run. # On push/workflow_dispatch every flag is true so all jobs execute. @@ -506,6 +557,7 @@ jobs: name: required checks passed if: always() needs: + - check-linked-issue - unit-tests - type-check - prek diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb0f8cadc..830c3d393 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -101,10 +101,11 @@ The full ruleset is in [`.claude/rules/code-style.md`](.claude/rules/code-style. ## Branches, commits, and pull requests +- **Every PR must link an issue or discussion.** Use `Closes #`, `Fixes #`, or `Relates to #` in the PR body. CI will fail if no linked issue or discussion is found. For trivial fixes (typos, formatting), open a lightweight issue first — it only takes a moment and keeps the history traceable. The goal is to have a conversation before the code — discussing the approach on an issue or discussion helps maintainers point you in the right direction early, so your implementation fits the project's needs and you don't spend time on work that gets reworked. - Create a feature branch off an up-to-date `main`. Never commit directly to `main`. - Use conventional-commit prefixes: `fix:`, `feat:`, `refactor:`, `docs:`, `test:`, `chore:`. Keep commit messages concise (1-2 sentence body max). - Keep commits atomic - one logical change per commit. -- PR titles also use the conventional format. The PR body should be short and link any related issues. +- PR titles also use the conventional format. The PR body should be short and link the related issue. - If the change corresponds to a Linear ticket, include `CF-#` in the PR body. - Run `uv run prek` (or `uv run prek run --from-ref origin/main`) before pushing. CI will block merge if hooks fail. From 2c79e50d6811f5e1f9670d9e276e5bef399c0eb3 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 23 Apr 2026 02:30:46 -0500 Subject: [PATCH 122/147] test: set up coverage infrastructure in CI - Add pytest-cov to dev dependencies - Add .coveragerc with branch coverage, 60% floor (current baseline), and source/omit configuration - Add coverage CI job (ubuntu/py3.13) that runs pytest with --cov, enforces the floor, and uploads coverage.xml as an artifact - Wire coverage into the required-checks-passed gate Closes #2080 --- .coveragerc | 17 +++++++++++++++++ .github/workflows/ci.yaml | 39 +++++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + uv.lock | 28 ++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 000000000..b5ff4eb40 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,17 @@ +[run] +branch = true +source = codeflash +omit = + codeflash/version.py + +[report] +sort = cover +show_missing = true +fail_under = 60 +exclude_lines = + pragma: no cover + if TYPE_CHECKING: + if __name__ == .__main__.: + +[html] +directory = htmlcov diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3b5b1c74c..ba861ca0c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -151,6 +151,44 @@ jobs: - name: Unit tests run: uv run pytest tests/ + # --------------------------------------------------------------------------- + # Coverage — single run on ubuntu/py3.13 to enforce the coverage floor. + # --------------------------------------------------------------------------- + coverage: + needs: determine-changes + if: needs.determine-changes.outputs.unit_tests == 'true' + runs-on: ubuntu-latest + env: + PYTHONIOENCODING: utf-8 + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 1 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Install uv + uses: astral-sh/setup-uv@v8.0.0 + with: + python-version: "3.13" + enable-cache: true + + - name: Install dependencies + run: uv sync + + - name: Run tests with coverage + run: uv run pytest tests/ --cov=codeflash --cov-report=xml:coverage.xml --cov-report=term-missing --cov-config=.coveragerc + + - name: Check coverage floor + run: uv run coverage report --fail-under=60 + + - name: Upload coverage report + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: coverage.xml + retention-days: 30 + # --------------------------------------------------------------------------- # Mypy type checking # --------------------------------------------------------------------------- @@ -507,6 +545,7 @@ jobs: if: always() needs: - unit-tests + - coverage - type-check - prek - e2e-python diff --git a/pyproject.toml b/pyproject.toml index 7701725ea..3e876a0b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,6 +89,7 @@ dev = [ "prek>=0.2.25", "ty>=0.0.14", "uv>=0.9.29", + "pytest-cov>=7.1.0", ] tests = [ "black>=25.9.0", diff --git a/uv.lock b/uv.lock index c059d601e..e0bcacea6 100644 --- a/uv.lock +++ b/uv.lock @@ -507,6 +507,7 @@ dev = [ { name = "pandas-stubs", version = "2.2.2.240807", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pandas-stubs", version = "2.2.2.240909", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "prek" }, + { name = "pytest-cov" }, { name = "ruff" }, { name = "ty" }, { name = "types-cffi", version = "1.17.0.20250915", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -608,6 +609,7 @@ dev = [ { name = "mypy", specifier = ">=1.13" }, { name = "pandas-stubs", specifier = ">=2.2.2.240807,<2.2.3.241009" }, { name = "prek", specifier = ">=0.2.25" }, + { name = "pytest-cov", specifier = ">=7.1.0" }, { name = "ruff", specifier = ">=0.7.0" }, { name = "ty", specifier = ">=0.0.14" }, { name = "types-cffi", specifier = ">=1.16.0.20240331" }, @@ -776,6 +778,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, ] +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version < '3.10'" }, +] + [[package]] name = "coverage" version = "7.13.5" @@ -904,6 +911,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, +] + [[package]] name = "crosshair-tool" version = "0.0.102" @@ -4515,6 +4527,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, ] +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.10'" }, + { name = "coverage", version = "7.13.5", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "pluggy" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pytest", version = "9.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + [[package]] name = "pytest-memray" version = "1.8.0" From 9d9e7cd0ee644c54e5ffc397daa7cdb15b049914 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 23 Apr 2026 02:55:05 -0500 Subject: [PATCH 123/147] chore: add CODEOWNERS based on git history Assigns per-directory code ownership to current org members based on full commit history analysis, so PRs automatically request reviews from the right people. --- .github/CODEOWNERS | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..8f67fd9ea --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,38 @@ +# Default fallback +* @KRRT7 + +# Java +/codeflash/languages/java/ @mashraf-222 @HeshamHM28 @misrasaurabh1 + +# JavaScript / TypeScript +/codeflash/languages/javascript/ @Saga4 @mohammedahmed18 @KRRT7 + +# Python language support +/codeflash/languages/python/ @KRRT7 + +# Core pipeline +/codeflash/optimization/ @KRRT7 @aseembits93 @misrasaurabh1 +/codeflash/verification/ @KRRT7 @misrasaurabh1 +/codeflash/benchmarking/ @KRRT7 +/codeflash/discovery/ @KRRT7 @misrasaurabh1 + +# CLI & setup +/codeflash/cli_cmds/ @KRRT7 @misrasaurabh1 + +# LSP +/codeflash/lsp/ @mohammedahmed18 + +# API +/codeflash/api/ @KRRT7 @aseembits93 + +# Tracing & entry points +/codeflash/tracing/ @misrasaurabh1 @KRRT7 +/codeflash/main.py @misrasaurabh1 @KRRT7 +/codeflash/tracer.py @misrasaurabh1 @KRRT7 + +# Shared utilities +/codeflash/code_utils/ @KRRT7 @aseembits93 @misrasaurabh1 +/codeflash/models/ @KRRT7 + +# CI / workflows +/.github/ @KRRT7 From 0232d84a7d043a9b1cb7ab49f106c39ce6e12b67 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 23 Apr 2026 03:04:49 -0500 Subject: [PATCH 124/147] fix: exclude test_tracer.py from coverage run and lower floor to 58% pytest-cov's trace function conflicts with the Tracer class under test, causing it to self-disable in CI. Linux also reports ~1% lower coverage than macOS due to platform-specific branches. --- .coveragerc | 2 +- .github/workflows/ci.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.coveragerc b/.coveragerc index b5ff4eb40..47abc2120 100644 --- a/.coveragerc +++ b/.coveragerc @@ -7,7 +7,7 @@ omit = [report] sort = cover show_missing = true -fail_under = 60 +fail_under = 58 exclude_lines = pragma: no cover if TYPE_CHECKING: diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ba861ca0c..e9c978915 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -176,10 +176,10 @@ jobs: run: uv sync - name: Run tests with coverage - run: uv run pytest tests/ --cov=codeflash --cov-report=xml:coverage.xml --cov-report=term-missing --cov-config=.coveragerc + run: uv run pytest tests/ --ignore=tests/test_tracer.py --cov=codeflash --cov-report=xml:coverage.xml --cov-report=term-missing --cov-config=.coveragerc - name: Check coverage floor - run: uv run coverage report --fail-under=60 + run: uv run coverage report --fail-under=58 - name: Upload coverage report if: always() From d6d40ed431f2a9db087725f58ae4ae699ab2dc85 Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:13:23 -0500 Subject: [PATCH 125/147] Gitignore code_to_optimize lockfiles, re-enable Dependabot updates - Add code_to_optimize/**/package-lock.json to .gitignore - Re-enable Dependabot version updates with limit of 5 PRs per ecosystem - Keep code_to_optimize/ ignore comment in dependabot.yml --- .github/dependabot.yml | 9 ++++----- .gitignore | 3 +++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cf9d36fc5..eb17e0b1d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,3 @@ -# TEMPORARILY DISABLED — re-enable by removing open-pull-requests-limit: 0 version: 2 updates: # Python (root pyproject.toml) @@ -6,21 +5,21 @@ updates: directory: "/" schedule: interval: "weekly" - open-pull-requests-limit: 0 + open-pull-requests-limit: 5 # JavaScript (codeflash npm package) - package-ecosystem: "npm" directory: "/packages/codeflash" schedule: interval: "weekly" - open-pull-requests-limit: 0 + open-pull-requests-limit: 5 # GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" - open-pull-requests-limit: 0 + open-pull-requests-limit: 5 # code_to_optimize/ directories are test fixtures — do NOT update them. - # Dependabot PRs for these always fail (missing secrets) and waste CI. + # Their package-lock.json files are gitignored to prevent Dependabot alerts. diff --git a/.gitignore b/.gitignore index 8f9f05ab6..1a4e87d22 100644 --- a/.gitignore +++ b/.gitignore @@ -275,6 +275,9 @@ tessl.json **/dist-nuitka/** **/.npmrc +# Test fixture lockfiles — prevents Dependabot from scanning them +code_to_optimize/**/package-lock.json + # Tessl auto-generates AGENTS.md on install; ignore to avoid cluttering git status AGENTS.md .serena/ From 14be2aa1f87d31d32bfc79e07a4e120018d9745e Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:13:54 -0500 Subject: [PATCH 126/147] Remove test fixture lockfile: code_to_optimize_js --- .../js/code_to_optimize_js/package-lock.json | 3733 ----------------- 1 file changed, 3733 deletions(-) delete mode 100644 code_to_optimize/js/code_to_optimize_js/package-lock.json diff --git a/code_to_optimize/js/code_to_optimize_js/package-lock.json b/code_to_optimize/js/code_to_optimize_js/package-lock.json deleted file mode 100644 index 2e1f2df68..000000000 --- a/code_to_optimize/js/code_to_optimize_js/package-lock.json +++ /dev/null @@ -1,3733 +0,0 @@ -{ - "name": "codeflash-js-test", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "codeflash-js-test", - "version": "1.0.0", - "devDependencies": { - "codeflash": "file:../../../packages/codeflash", - "jest": "^29.7.0", - "jest-junit": "^16.0.0" - } - }, - "../../../packages/codeflash": { - "version": "0.10.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0", - "better-sqlite3": "^12.0.0" - }, - "bin": { - "codeflash": "bin/codeflash.js", - "codeflash-setup": "bin/codeflash-setup.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.0.0", - "jest-runner": ">=27.0.0", - "vitest": ">=1.0.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "jest-runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/codeflash": { - "resolved": "../../../packages/codeflash", - "link": true - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", - "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} From 6c58ac462b00d22ebb11ab07bde531efe3038cfb Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:13:56 -0500 Subject: [PATCH 127/147] Remove test fixture lockfile: code_to_optimize_js_cjs --- .../code_to_optimize_js_cjs/package-lock.json | 3733 ----------------- 1 file changed, 3733 deletions(-) delete mode 100644 code_to_optimize/js/code_to_optimize_js_cjs/package-lock.json diff --git a/code_to_optimize/js/code_to_optimize_js_cjs/package-lock.json b/code_to_optimize/js/code_to_optimize_js_cjs/package-lock.json deleted file mode 100644 index 79c7bdfcc..000000000 --- a/code_to_optimize/js/code_to_optimize_js_cjs/package-lock.json +++ /dev/null @@ -1,3733 +0,0 @@ -{ - "name": "code-to-optimize-js-cjs", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "code-to-optimize-js-cjs", - "version": "1.0.0", - "devDependencies": { - "codeflash": "file:../../../packages/codeflash", - "jest": "^29.7.0", - "jest-junit": "^16.0.0" - } - }, - "../../../packages/codeflash": { - "version": "0.10.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0", - "better-sqlite3": "^12.0.0" - }, - "bin": { - "codeflash": "bin/codeflash.js", - "codeflash-setup": "bin/codeflash-setup.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.0.0", - "jest-runner": ">=27.0.0", - "vitest": ">=1.0.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "jest-runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/codeflash": { - "resolved": "../../../packages/codeflash", - "link": true - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", - "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} From a1d822801a53ab11eb8e4bd229d7bbd24d1c6937 Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:13:58 -0500 Subject: [PATCH 128/147] Remove test fixture lockfile: code_to_optimize_js_esm --- .../code_to_optimize_js_esm/package-lock.json | 7394 ----------------- 1 file changed, 7394 deletions(-) delete mode 100644 code_to_optimize/js/code_to_optimize_js_esm/package-lock.json diff --git a/code_to_optimize/js/code_to_optimize_js_esm/package-lock.json b/code_to_optimize/js/code_to_optimize_js_esm/package-lock.json deleted file mode 100644 index e15253962..000000000 --- a/code_to_optimize/js/code_to_optimize_js_esm/package-lock.json +++ /dev/null @@ -1,7394 +0,0 @@ -{ - "name": "code-to-optimize-js-esm", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "code-to-optimize-js-esm", - "version": "1.0.0", - "devDependencies": { - "@eslint/js": "^9.39.2", - "codeflash": "file:../../../packages/codeflash", - "eslint": "^9.39.2", - "globals": "^17.1.0", - "jest": "^29.7.0", - "jest-junit": "^16.0.0" - } - }, - "../../../packages/codeflash": { - "version": "0.10.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0", - "better-sqlite3": "^12.0.0" - }, - "bin": { - "codeflash": "bin/codeflash.js", - "codeflash-setup": "bin/codeflash-setup.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.0.0", - "jest-runner": ">=27.0.0", - "vitest": ">=1.0.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "jest-runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@eslint/eslintrc/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@jest/core/node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jest/core/node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jest/core/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/core/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@jest/core/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@jest/core/node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@jest/core/node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@jest/core/node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@jest/core/node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@jest/core/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@jest/core/node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/@jest/core/node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/@jest/core/node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@jest/core/node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/@jest/core/node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/@jest/core/node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/@jest/core/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/@jest/core/node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/@jest/core/node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/core/node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/electron-to-chromium": { - "version": "1.5.283", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", - "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/@jest/core/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/core/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@jest/core/node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/@jest/core/node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@jest/core/node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jest/core/node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@jest/core/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/core/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@jest/core/node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@jest/core/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/@jest/core/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@jest/core/node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@jest/core/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/core/node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@jest/core/node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@jest/core/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/make-dir/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/@jest/core/node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@jest/core/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/core/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/@jest/core/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/core/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@jest/core/node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@jest/core/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@jest/core/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/core/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@jest/core/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jest/core/node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/core/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@jest/core/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@jest/core/node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jest/core/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@jest/core/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@jest/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/@jest/core/node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@jest/core/node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/@jest/core/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/core/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jest/core/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/types/node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/types/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/types/node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ajv/node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/codeflash": { - "resolved": "../../../packages/codeflash", - "link": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope/node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-entry-cache/node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/file-entry-cache/node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/file-entry-cache/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/file-entry-cache/node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.2.0.tgz", - "integrity": "sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/jest-cli/node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/jest-cli/node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/jest-cli/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/jest-cli/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/jest-cli/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/jest-cli/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/jest-cli/node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/jest-cli/node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/jest-cli/node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/jest-cli/node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/jest-cli/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/jest-cli/node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/jest-cli/node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/jest-cli/node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/jest-cli/node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/jest-cli/node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/jest-cli/node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/jest-cli/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/jest-cli/node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/jest-cli/node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-cli/node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/electron-to-chromium": { - "version": "1.5.283", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", - "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/jest-cli/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-cli/node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jest-cli/node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/jest-cli/node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-cli/node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-cli/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/jest-cli/node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/jest-cli/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-cli/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jest-cli/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/jest-cli/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jest-cli/node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-cli/node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jest-cli/node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/jest-cli/node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/jest-cli/node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/jest-cli/node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-cli/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/jest-cli/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-cli/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-cli/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-cli/node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-cli/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli/node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-cli/node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-cli/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-cli/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jest-cli/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-cli/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-cli/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/jest-cli/node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-cli/node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/jest-cli/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/jest-cli/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-cli/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/jest-cli/node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimatch/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/minimatch/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true, - "license": "MIT" - } - } -} From 3080c1df80f9ba87fa787f8951d8e2491beb2b5e Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:14:01 -0500 Subject: [PATCH 129/147] Remove test fixture lockfile: code_to_optimize_mocha --- .../code_to_optimize_mocha/package-lock.json | 966 ------------------ 1 file changed, 966 deletions(-) delete mode 100644 code_to_optimize/js/code_to_optimize_mocha/package-lock.json diff --git a/code_to_optimize/js/code_to_optimize_mocha/package-lock.json b/code_to_optimize/js/code_to_optimize_mocha/package-lock.json deleted file mode 100644 index afa2059aa..000000000 --- a/code_to_optimize/js/code_to_optimize_mocha/package-lock.json +++ /dev/null @@ -1,966 +0,0 @@ -{ - "name": "code-to-optimize-mocha", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "code-to-optimize-mocha", - "version": "1.0.0", - "devDependencies": { - "codeflash": "file:../../../packages/codeflash", - "mocha": "^10.8.2" - } - }, - "../../../packages/codeflash": { - "version": "0.10.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0", - "better-sqlite3": "^12.0.0" - }, - "bin": { - "codeflash": "bin/codeflash.js", - "codeflash-setup": "bin/codeflash-setup.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.0.0", - "jest-runner": ">=27.0.0", - "vitest": ">=1.0.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "jest-runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/codeflash": { - "resolved": "../../../packages/codeflash", - "link": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "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" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} From d4f4563f0df837998cc9869a815f5d994b602502 Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:14:08 -0500 Subject: [PATCH 130/147] Remove test fixture lockfile: code_to_optimize_ts --- .../js/code_to_optimize_ts/package-lock.json | 4093 ----------------- 1 file changed, 4093 deletions(-) delete mode 100644 code_to_optimize/js/code_to_optimize_ts/package-lock.json diff --git a/code_to_optimize/js/code_to_optimize_ts/package-lock.json b/code_to_optimize/js/code_to_optimize_ts/package-lock.json deleted file mode 100644 index ac2fac4c0..000000000 --- a/code_to_optimize/js/code_to_optimize_ts/package-lock.json +++ /dev/null @@ -1,4093 +0,0 @@ -{ - "name": "codeflash-ts-test", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "codeflash-ts-test", - "version": "1.0.0", - "license": "BSL 1.1", - "devDependencies": { - "@types/jest": "^29.5.0", - "@types/node": "^20.0.0", - "codeflash": "file:../../../packages/codeflash", - "jest": "^29.7.0", - "jest-junit": "^16.0.0", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.2", - "typescript": "^5.0.0" - } - }, - "../../../packages/codeflash": { - "version": "0.10.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0", - "better-sqlite3": "^12.0.0" - }, - "bin": { - "codeflash": "bin/codeflash.js", - "codeflash-setup": "bin/codeflash-setup.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.0.0", - "jest-runner": ">=27.0.0", - "vitest": ">=1.0.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "jest-runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.19.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", - "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/codeflash": { - "resolved": "../../../packages/codeflash", - "link": true - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", - "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} From d7a4c762cfe5b72927b007a35df51060e746db49 Mon Sep 17 00:00:00 2001 From: Kevin Turcios <106575910+KRRT7@users.noreply.github.com> Date: Thu, 23 Apr 2026 04:14:16 -0500 Subject: [PATCH 131/147] Remove test fixture lockfile: code_to_optimize_vitest --- .../code_to_optimize_vitest/package-lock.json | 1575 ----------------- 1 file changed, 1575 deletions(-) delete mode 100644 code_to_optimize/js/code_to_optimize_vitest/package-lock.json diff --git a/code_to_optimize/js/code_to_optimize_vitest/package-lock.json b/code_to_optimize/js/code_to_optimize_vitest/package-lock.json deleted file mode 100644 index 70b70a9ed..000000000 --- a/code_to_optimize/js/code_to_optimize_vitest/package-lock.json +++ /dev/null @@ -1,1575 +0,0 @@ -{ - "name": "codeflash-vitest-test", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "codeflash-vitest-test", - "version": "1.0.0", - "devDependencies": { - "@types/node": "^20.0.0", - "codeflash": "file:../../../packages/codeflash", - "typescript": "^5.0.0", - "vitest": "^4.0.18" - } - }, - "../../../packages/codeflash": { - "version": "0.10.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0", - "better-sqlite3": "^12.0.0" - }, - "bin": { - "codeflash": "bin/codeflash.js", - "codeflash-setup": "bin/codeflash-setup.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "jest": ">=27.0.0", - "jest-runner": ">=27.0.0", - "vitest": ">=1.0.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - }, - "jest-runner": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", - "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.18", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/codeflash": { - "resolved": "../../../packages/codeflash", - "link": true - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - } - } -} From 2b5eef8d2074498f844f1683338c65fb5428cb75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:15:32 +0000 Subject: [PATCH 132/147] chore(deps): bump actions/github-script from 7 to 9 Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/label-workflow-changes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label-workflow-changes.yml b/.github/workflows/label-workflow-changes.yml index 3bc8d6c54..72f886318 100644 --- a/.github/workflows/label-workflow-changes.yml +++ b/.github/workflows/label-workflow-changes.yml @@ -13,7 +13,7 @@ jobs: pull-requests: write steps: - name: Label PR with workflow changes - uses: actions/github-script@v7 + uses: actions/github-script@v9 with: script: | const labelName = 'workflow-modified'; From 740c61a6793f28c841d8eb8c424d2dc381f09606 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:15:37 +0000 Subject: [PATCH 133/147] chore(deps): bump astral-sh/setup-uv from 8.0.0 to 8.1.0 Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/v8.0.0...v8.1.0) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: 8.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 14 +++++++------- .github/workflows/claude.yml | 4 ++-- .github/workflows/codeflash-optimize.yaml | 2 +- .github/workflows/java-e2e.yaml | 2 +- .github/workflows/publish.yml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2c5248145..d132f28a5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -185,7 +185,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: ${{ matrix.python-version }} enable-cache: true @@ -218,7 +218,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: "3.13" enable-cache: true @@ -254,7 +254,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: enable-cache: true @@ -281,7 +281,7 @@ jobs: with: ref: ${{ github.head_ref }} fetch-depth: 0 - - uses: astral-sh/setup-uv@v8.0.0 + - uses: astral-sh/setup-uv@v8.1.0 with: enable-cache: true @@ -374,7 +374,7 @@ jobs: pr_state: ${{ github.event.pull_request.state }} - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: 3.11.6 enable-cache: true @@ -482,7 +482,7 @@ jobs: npm install - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: 3.11.6 enable-cache: true @@ -551,7 +551,7 @@ jobs: cache: maven - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: 3.11.6 enable-cache: true diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index c012a94d1..b804f4cd8 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -57,7 +57,7 @@ jobs: ref: ${{ github.event.pull_request.head.ref || github.ref }} - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: enable-cache: true @@ -319,7 +319,7 @@ jobs: ref: ${{ steps.pr-ref.outputs.ref }} - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: enable-cache: true diff --git a/.github/workflows/codeflash-optimize.yaml b/.github/workflows/codeflash-optimize.yaml index ab08aa1f8..4eb4e4f1c 100644 --- a/.github/workflows/codeflash-optimize.yaml +++ b/.github/workflows/codeflash-optimize.yaml @@ -31,7 +31,7 @@ jobs: fetch-depth: 0 - name: 🐍 Set up Python 3.11 for CLI - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: 3.11.6 enable-cache: true diff --git a/.github/workflows/java-e2e.yaml b/.github/workflows/java-e2e.yaml index 0bfc979b6..602a95c9a 100644 --- a/.github/workflows/java-e2e.yaml +++ b/.github/workflows/java-e2e.yaml @@ -41,7 +41,7 @@ jobs: cache: maven - name: Install uv - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: 3.11.6 enable-cache: true diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f2b6a3ccd..9e2abb898 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -110,7 +110,7 @@ jobs: - name: Install uv if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' - uses: astral-sh/setup-uv@v8.0.0 + uses: astral-sh/setup-uv@v8.1.0 with: enable-cache: true From 647eb4ba17f5196f6023c6a3dd1a4ae012414326 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:15:40 +0000 Subject: [PATCH 134/147] chore(deps): bump softprops/action-gh-release from 2 to 3 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: '3' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f2b6a3ccd..f166e100d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -124,7 +124,7 @@ jobs: - name: Create GitHub Release if: steps.should_run.outputs.run == 'true' && steps.check_tag.outputs.exists == 'false' - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: tag_name: ${{ steps.extract_version.outputs.tag }} name: ${{ matrix.release_name_prefix }} ${{ steps.extract_version.outputs.tag }} From a396c62160df8ed86dc133176586859c38218120 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:15:43 +0000 Subject: [PATCH 135/147] chore(deps): bump actions/upload-artifact from 4 to 7 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2c5248145..11ba81066 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -234,7 +234,7 @@ jobs: - name: Upload coverage report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: coverage-report path: coverage.xml From 86e11dbb381e856ebdf00039011de1a758875c77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:15:47 +0000 Subject: [PATCH 136/147] chore(deps): bump actions/cache from 4 to 5 Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/cache dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- .github/workflows/java-e2e.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2c5248145..99f610ea4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -561,7 +561,7 @@ jobs: - name: Cache codeflash-runtime JAR id: runtime-jar-cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository/io/codeflash key: codeflash-runtime-${{ hashFiles('codeflash-java-runtime/pom.xml', 'codeflash-java-runtime/src/**') }} diff --git a/.github/workflows/java-e2e.yaml b/.github/workflows/java-e2e.yaml index 0bfc979b6..8122b8283 100644 --- a/.github/workflows/java-e2e.yaml +++ b/.github/workflows/java-e2e.yaml @@ -51,7 +51,7 @@ jobs: - name: Cache codeflash-runtime JAR id: runtime-jar-cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.m2/repository/io/codeflash key: codeflash-runtime-${{ hashFiles('codeflash-java-runtime/pom.xml', 'codeflash-java-runtime/src/**') }} From e4b1fb854b59972b51271efe16efc1795c6bddc0 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 23 Apr 2026 04:31:04 -0500 Subject: [PATCH 137/147] chore: rebuild .claude config from scratch Delete all existing .claude/ tracked files and recreate from scratch, adapting patterns from codeflash-agent. Hooks (6, up from 1): - bash-guard: blocks grep/find/cat in Bash, redirects to dedicated tools - require-read + track-read: enforces Read-before-Write/Edit - post-compact: injects git state + project conventions into compaction - post-edit-lint: runs prek on edited Python files (kept) - status-line: shows user, area, branch, dirty state Rules (10, up from 8): - New: sessions, debugging, github (from codeflash-agent) - Rewrote: code-style (absorbed source-code), git (added sizing/hygiene) - Removed: source-code (folded into code-style) Settings: permissions allowlist, attribution, includeCoAuthoredBy, full hook wiring, status line, enableAllProjectMcpServers. .gitignore: whitelist .claude/skills/ for tracking. --- .claude/hooks/bash-guard.sh | 41 +++++++++++++++ .claude/hooks/post-compact.sh | 49 +++++++++++++++++ .claude/hooks/post-edit-lint.sh | 2 - .claude/hooks/require-read.sh | 25 +++++++++ .claude/hooks/status-line.sh | 50 ++++++++++++++++++ .claude/hooks/track-read.sh | 10 ++++ .claude/rules/code-style.md | 13 ++--- .claude/rules/debugging.md | 19 +++++++ .claude/rules/git.md | 42 ++++++++++----- .claude/rules/github.md | 5 ++ .claude/rules/language-patterns.md | 8 +-- .claude/rules/sessions.md | 27 ++++++++++ .claude/rules/source-code.md | 8 --- .claude/rules/testing.md | 19 +++---- .claude/rules/workflow.md | 12 +++-- .claude/settings.json | 84 +++++++++++++++++++++++++++++- .claude/skills/fix-mypy.md | 4 +- .claude/skills/fix-prek.md | 2 +- .gitignore | 5 +- CLAUDE.md | 21 ++++---- 20 files changed, 384 insertions(+), 62 deletions(-) create mode 100755 .claude/hooks/bash-guard.sh create mode 100755 .claude/hooks/post-compact.sh create mode 100755 .claude/hooks/require-read.sh create mode 100755 .claude/hooks/status-line.sh create mode 100755 .claude/hooks/track-read.sh create mode 100644 .claude/rules/debugging.md create mode 100644 .claude/rules/github.md create mode 100644 .claude/rules/sessions.md delete mode 100644 .claude/rules/source-code.md diff --git a/.claude/hooks/bash-guard.sh b/.claude/hooks/bash-guard.sh new file mode 100755 index 000000000..b7f23e502 --- /dev/null +++ b/.claude/hooks/bash-guard.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# PreToolUse hook: Block Bash calls that should use dedicated tools. +# Exit 0 = allow, Exit 2 = block (message on stderr). + +INPUT=$(cat 2>/dev/null || true) +COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null || true) + +[ -z "$COMMAND" ] && exit 0 + +# Strip leading env vars (FOO=bar cmd ...) and whitespace to get the actual command +STRIPPED=$(echo "$COMMAND" | sed 's/^[[:space:]]*\([A-Za-z_][A-Za-z0-9_]*=[^[:space:]]*[[:space:]]*\)*//') +FIRST_CMD=$(echo "$STRIPPED" | awk '{print $1}') + +case "$FIRST_CMD" in + grep|egrep|fgrep|rg) + echo "BLOCKED: Use the Grep tool instead of \`$FIRST_CMD\`. It provides better output and permissions handling." >&2 + exit 2 + ;; + find) + echo "BLOCKED: Use the Glob tool instead of \`find\`. Glob is faster and returns results sorted by modification time." >&2 + exit 2 + ;; + cat|head|tail) + echo "BLOCKED: Use the Read tool instead of \`$FIRST_CMD\`. Read provides line numbers and supports images/PDFs." >&2 + exit 2 + ;; + sed) + if echo "$COMMAND" | grep -qE '(^|[[:space:]])sed[[:space:]]+-i'; then + echo "BLOCKED: Use the Edit tool instead of \`sed -i\`. Edit tracks changes properly." >&2 + exit 2 + fi + ;; +esac + +# echo with file redirection (echo "..." > file) +if echo "$STRIPPED" | grep -qE '^echo\b.*[[:space:]]>'; then + echo "BLOCKED: Use the Write tool instead of \`echo >\`. Write provides proper file creation." >&2 + exit 2 +fi + +exit 0 diff --git a/.claude/hooks/post-compact.sh b/.claude/hooks/post-compact.sh new file mode 100755 index 000000000..63093264e --- /dev/null +++ b/.claude/hooks/post-compact.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# PreCompact hook: Inject state preservation guidance before context compaction. + +cd "$CLAUDE_PROJECT_DIR" 2>/dev/null || exit 0 + +STATE="" + +BRANCH=$(git branch --show-current 2>/dev/null) +[ -n "$BRANCH" ] && STATE="${STATE}Branch: ${BRANCH}\n" + +DIRTY=$(git status --porcelain 2>/dev/null) +if [ -n "$DIRTY" ]; then + COUNT=$(echo "$DIRTY" | wc -l | tr -d ' ') + STATE="${STATE}Uncommitted files (${COUNT}):\n${DIRTY}\n" +fi + +UPSTREAM=$(git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null) +if [ -n "$UPSTREAM" ]; then + AHEAD=$(git rev-list --count "${UPSTREAM}..HEAD" 2>/dev/null) + [ "$AHEAD" -gt 0 ] 2>/dev/null && STATE="${STATE}Unpushed commits: ${AHEAD}\n" +fi + +RECENT=$(git log --oneline -5 2>/dev/null) +[ -n "$RECENT" ] && STATE="${STATE}Recent commits:\n${RECENT}\n" + +LATEST_HANDOFF=$(ls -t "$CLAUDE_PROJECT_DIR/.claude/handoffs/"*.md 2>/dev/null | head -1) +if [ -n "$LATEST_HANDOFF" ] && [ -f "$LATEST_HANDOFF" ]; then + HANDOFF_CONTENT=$(head -40 "$LATEST_HANDOFF" 2>/dev/null) + [ -n "$HANDOFF_CONTENT" ] && STATE="${STATE}\nHandoff context:\n${HANDOFF_CONTENT}\n" +fi + +STATE="${STATE}\nProject conventions to preserve:\n" +STATE="${STATE}- Python 3.9+, uv for all tooling, ruff + mypy via prek\n" +STATE="${STATE}- Verification: uv run prek (single command for lint/format/types)\n" +STATE="${STATE}- Pre-push: uv run prek run --from-ref origin/\n" +STATE="${STATE}- Conventional commits: fix:, feat:, refactor:, test:, chore:\n" +STATE="${STATE}- Result type: Success(value) / Failure(error), check with is_successful()\n" +STATE="${STATE}- Language singleton: set_current_language() / current_language()\n" +STATE="${STATE}- libcst for code transforms, ast for read-only analysis\n" + +[ -z "$STATE" ] && exit 0 + +cat </dev/null || uv run prek --files "$file_path" fi diff --git a/.claude/hooks/require-read.sh b/.claude/hooks/require-read.sh new file mode 100755 index 000000000..c12d30f80 --- /dev/null +++ b/.claude/hooks/require-read.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# PreToolUse hook: Block Write/Edit on existing files that haven't been Read first. +# Exit 0 = allow, Exit 2 = block (message on stderr). + +INPUT=$(cat 2>/dev/null || true) +FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null || true) + +[ -z "$FILE_PATH" ] && exit 0 + +# New files don't need prior reads +[ ! -f "$FILE_PATH" ] && exit 0 + +TRACKER="$CLAUDE_PROJECT_DIR/.claude/.read-tracker" + +if [ ! -f "$TRACKER" ]; then + echo "BLOCKED: Read \`$(basename "$FILE_PATH")\` first before modifying it." >&2 + exit 2 +fi + +if grep -qxF "$FILE_PATH" "$TRACKER"; then + exit 0 +fi + +echo "BLOCKED: Read \`$(basename "$FILE_PATH")\` first before modifying it." >&2 +exit 2 diff --git a/.claude/hooks/status-line.sh b/.claude/hooks/status-line.sh new file mode 100755 index 000000000..71de759da --- /dev/null +++ b/.claude/hooks/status-line.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# Status line: derive context from git state. + +input=$(cat) +project_dir=$(echo "$input" | jq -r '.workspace.project_dir') + +user=$(whoami) +branch=$(git -C "$project_dir" branch --show-current 2>/dev/null) + +changed=$(git -C "$project_dir" diff --name-only HEAD 2>/dev/null) +[ -z "$changed" ] && changed=$(git -C "$project_dir" diff --name-only 2>/dev/null) +[ -z "$changed" ] && changed=$(git -C "$project_dir" diff --name-only --cached 2>/dev/null) + +if [ -n "$changed" ]; then + area=$(echo "$changed" | sed 's|/.*||' | sort | uniq -c | sort -rn | head -1 | awk '{print $2}') +else + area="" +fi + +context="" +case "$area" in + codeflash) + subsystem=$(echo "$changed" | grep '^codeflash/' | sed 's|^codeflash/||; s|/.*||' | sort | uniq -c | sort -rn | head -1 | awk '{print $2}') + [ -n "$subsystem" ] && context="editing $subsystem" ;; + tests) + target=$(echo "$changed" | grep '^tests/' | sed 's|^tests/||; s|/.*||' | sort -u | head -1) + [ -n "$target" ] && context="testing $target" ;; + .claude) + context="configuring claude" ;; +esac + +if [ -z "$context" ] && [ -n "$branch" ]; then + case "$branch" in + feat/*|cf-*) context="building: ${branch#feat/}" ;; + fix/*) context="fixing: ${branch#fix/}" ;; + refactor/*) context="refactoring: ${branch#refactor/}" ;; + test/*) context="testing: ${branch#test/}" ;; + chore/*) context="chore: ${branch#chore/}" ;; + esac +fi + +dirty="" +if [ -n "$(git -C "$project_dir" status --porcelain 2>/dev/null)" ]; then + dirty=" *" +fi + +status="$user | codeflash" +[ -n "$context" ] && status="$status | $context" +[ -n "$branch" ] && status="$status | $branch$dirty" +echo "$status" diff --git a/.claude/hooks/track-read.sh b/.claude/hooks/track-read.sh new file mode 100755 index 000000000..5c345277d --- /dev/null +++ b/.claude/hooks/track-read.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# PostToolUse hook: Track Read calls for the require-read guard. + +INPUT=$(cat 2>/dev/null || true) +FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null || true) + +[ -z "$FILE_PATH" ] && exit 0 + +echo "$FILE_PATH" >> "$CLAUDE_PROJECT_DIR/.claude/.read-tracker" +exit 0 diff --git a/.claude/rules/code-style.md b/.claude/rules/code-style.md index bcc8c6c34..c4dcb5871 100644 --- a/.claude/rules/code-style.md +++ b/.claude/rules/code-style.md @@ -4,10 +4,11 @@ - **Python**: 3.9+ syntax - **Package management**: Always use `uv`, never `pip` - **Tooling**: Ruff for linting/formatting, mypy strict mode, prek for pre-commit checks -- **Comments**: Minimal - only explain "why", not "what" -- **Docstrings**: Do not add docstrings to new or changed code unless the user explicitly asks for them — not even one-liners. The codebase intentionally keeps functions self-documenting through clear naming and type annotations -- **Types**: Match the type annotation style of surrounding code — the codebase uses annotations, so add them in new code -- **Naming**: NEVER use leading underscores (`_function_name`) - Python has no true private functions, use public names +- **Comments**: Minimal — only explain "why", not "what" +- **Docstrings**: Do not add docstrings unless the user explicitly asks +- **Types**: Match the type annotation style of surrounding code +- **Naming**: No leading underscores (`_function_name`) — Python has no true private functions - **Paths**: Always use absolute paths -- **Encoding**: Always pass `encoding="utf-8"` to `open()`, `read_text()`, `write_text()`, etc. in new or changed code — Windows defaults to `cp1252` which breaks on non-ASCII content. Don't flag pre-existing code that lacks it unless you're already modifying that line. -- **Verification**: Use `uv run prek` to verify code — it handles ruff, ty, mypy in one pass. Don't run `ruff`, `mypy`, or `python -c "import ..."` separately; `prek` is the single verification command +- **Encoding**: Always pass `encoding="utf-8"` to `open()`, `read_text()`, `write_text()` in new or changed code +- **Verification**: Use `uv run prek` — it handles ruff, ty, mypy in one pass. Don't run them separately +- **Code transforms**: Use `libcst` for code modification/transformation. `ast` is acceptable for read-only analysis diff --git a/.claude/rules/debugging.md b/.claude/rules/debugging.md new file mode 100644 index 000000000..42050cb37 --- /dev/null +++ b/.claude/rules/debugging.md @@ -0,0 +1,19 @@ +# Debugging + +## Root cause first + +When encountering a bug, investigate the root cause. Don't patch symptoms. If you're about to add a try/except, a fallback default, or a defensive check — ask whether the real fix is upstream. + +## Isolated testing + +Prefer running individual test functions over full suites. Only run the full suite when explicitly asked or before pushing. + +- Single function: `uv run pytest tests/test_foo.py::TestBar::test_baz -v` +- Single module: `uv run pytest tests/test_foo.py -v` +- Full suite: only when asked, or before `git push` + +When debugging a specific endpoint or integration, test it directly instead of running the entire pipeline end-to-end. + +## Subprocess failures + +When a subprocess fails, always log stdout and stderr. "Exit code 1" with no output is useless. diff --git a/.claude/rules/git.md b/.claude/rules/git.md index edac5ff61..c5678ffc1 100644 --- a/.claude/rules/git.md +++ b/.claude/rules/git.md @@ -1,19 +1,35 @@ -# Git Commits & Pull Requests +# Git ## Commits + - Never commit, amend, or push without explicit permission -- Don't commit intermediate states — wait until the full implementation is complete, reviewed, and explicitly approved before committing. If the user corrects direction mid-implementation, incorporate the correction before any commit -- Always create a new branch from `main` before starting any new work — never commit directly to `main` or reuse an existing feature branch for unrelated changes -- Use conventional commit format: `fix:`, `feat:`, `refactor:`, `docs:`, `test:`, `chore:` -- Keep commits atomic - one logical change per commit -- Commit message body should be concise (1-2 sentences max) -- Merge for simple syncs, rebase when branches have diverged significantly -- When committing to an external/third-party repo, follow that repo's own conventions for versioning, changelog, and CI -- Pre-commit: Run `uv run prek` before committing — fix any issues before creating the commit -- Pre-push: Run `uv run prek run --from-ref origin/` to check all changed files against the PR base — this matches CI behavior and catches issues that per-commit prek misses. To detect the base branch: `gh pr view --json baseRefName -q .baseRefName 2>/dev/null || echo main` +- Don't commit intermediate states — wait until the full implementation is complete and approved +- Always create a new branch from `main` — never commit directly to `main` +- Conventional format: `fix:`, `feat:`, `refactor:`, `docs:`, `test:`, `chore:` +- First line: imperative verb + what changed, under 72 characters +- Body for *why*, not *what* — the diff shows what changed +- One purpose per commit: a bug fix, a new function, a refactor — not all three +- A commit that adds a function also adds its tests and exports — that's one logical change + +## Sizing + +- Too small: renaming a variable in one commit, updating its references in another +- Right size: adding a function with its tests, `__init__` export, and usage update +- Too large: implementing an entire subsystem in one commit + +## Pre-commit / Pre-push + +- Pre-commit: Run `uv run prek` before committing +- Pre-push: Run `uv run prek run --from-ref origin/` to check all changed files against the PR base ## Pull Requests -- PR titles should use conventional format -- Keep the PR body short and straight to the point + +- PR titles use conventional format +- Keep the PR body short and to the point - If related to a Linear issue, include `CF-#` in the body -- Branch naming: `cf-#-title` (lowercase, hyphenated), no other prefixes/suffixes +- Branch naming: `cf-#-title` (lowercase, hyphenated) + +## Branch Hygiene + +- Delete feature branches locally after merging (`git branch -d `) +- Use `/clean_gone` to prune local branches whose remote tracking branch has been deleted diff --git a/.claude/rules/github.md b/.claude/rules/github.md new file mode 100644 index 000000000..8c2495193 --- /dev/null +++ b/.claude/rules/github.md @@ -0,0 +1,5 @@ +# GitHub Interactions + +ALWAYS use MCP GitHub tools (`mcp__github__*`) for GitHub operations. Check for a matching MCP tool first — only fall back to `gh` via Bash when no MCP tool exists for the operation. + +This also applies to other MCP-connected services (Linear, Granola). MCP first, CLI second. diff --git a/.claude/rules/language-patterns.md b/.claude/rules/language-patterns.md index 34d61e605..8e9b166a7 100644 --- a/.claude/rules/language-patterns.md +++ b/.claude/rules/language-patterns.md @@ -6,8 +6,8 @@ paths: # Language Support Patterns - Current language is a module-level singleton in `languages/current.py` — use `set_current_language()` / `current_language()`, never pass language as a parameter through call chains -- Use `get_language_support(identifier)` from `languages/registry.py` to get a `LanguageSupport` instance — never import language classes directly -- New language support classes must use the `@register_language` decorator to register with the extension and language registries -- `languages/__init__.py` uses `__getattr__` for lazy imports to avoid circular dependencies — follow this pattern when adding new exports -- Prefer `LanguageSupport` protocol dispatch over `is_python()`/`is_javascript()` guards — remaining guards are being migrated to protocol methods +- Use `get_language_support(identifier)` from `languages/registry.py` — never import language classes directly +- New language support classes must use the `@register_language` decorator +- `languages/__init__.py` uses `__getattr__` for lazy imports to avoid circular dependencies +- Prefer `LanguageSupport` protocol dispatch over `is_python()`/`is_javascript()` guards - `is_javascript()` returns `True` for both JavaScript and TypeScript (still used in ~15 call sites pending migration) diff --git a/.claude/rules/sessions.md b/.claude/rules/sessions.md new file mode 100644 index 000000000..0d47b8285 --- /dev/null +++ b/.claude/rules/sessions.md @@ -0,0 +1,27 @@ +# Session Discipline + +## Scope + +One task per session. Don't mix implementation with communication drafting, transcript search, or strategic planning. + +## Duration + +Cap sessions at 2-3 hours. Use `/handoff` at natural breakpoints rather than letting auto-compaction degrade context. + +- After 1 compaction: consider wrapping up the current task and handing off +- After 3 compactions: stop, and tell the user to start a fresh session +- Never continue past 5 compactions — context is too degraded + +## Context preservation + +When compacting, preserve: modified files list, current branch, test commands used, key decisions made. Use subagents for exploration to keep main context clean. + +## No polling + +Never poll background tasks. No `wc -l`, no `tail -f`, no `sleep` loops. Use `run_in_background` and wait for the completion notification. + +## File read budget + +If you've read the same file 3+ times in a session, either: +- The session is too long and compaction destroyed your context — write a handoff +- You're not retaining key information — write it down in your response before it compacts away diff --git a/.claude/rules/source-code.md b/.claude/rules/source-code.md deleted file mode 100644 index 297daa6ae..000000000 --- a/.claude/rules/source-code.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -paths: - - "codeflash/**/*.py" ---- - -# Source Code Rules - -- Use `libcst` for code modification/transformation to preserve formatting. `ast` is acceptable for read-only analysis and parsing. diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md index 0d8471a3c..a56f3ca40 100644 --- a/.claude/rules/testing.md +++ b/.claude/rules/testing.md @@ -4,13 +4,14 @@ paths: - "codeflash/**/*test*.py" --- -# Testing Conventions +# Testing -- Code context extraction and replacement tests must always assert for full string equality, no substring matching. -- Use pytest's `tmp_path` fixture for temp directories — do not use `tempfile.mkdtemp()`, `tempfile.TemporaryDirectory()`, or `NamedTemporaryFile`. Some existing tests still use `tempfile` but new tests must use `tmp_path`. -- Always call `.resolve()` on Path objects before passing them to functions under test — this ensures absolute paths and resolves symlinks. Example: `source_file = (tmp_path / "example.py").resolve()` -- Use `.as_posix()` when converting resolved paths to strings (normalizes to forward slashes). -- Any new feature or bug fix that can be tested automatically must have test cases. -- If changes affect existing test expectations, update the tests accordingly. Tests must always pass after changes. -- The pytest plugin patches `time`, `random`, `uuid`, and `datetime` for deterministic test execution — never assume real randomness or real time in verification tests. -- `conftest.py` uses an autouse fixture that calls `reset_current_language()` — tests always start with Python as the default language. +- Full string equality for context extraction/replacement tests — no substring matching +- Use pytest's `tmp_path` fixture — not `tempfile.mkdtemp()` or `NamedTemporaryFile` +- Always call `.resolve()` on Path objects before passing to functions under test +- Use `.as_posix()` when converting resolved paths to strings +- New features and bug fixes must have test cases +- The pytest plugin patches `time`, `random`, `uuid`, `datetime` for deterministic execution +- `conftest.py` autouse fixture calls `reset_current_language()` — tests start with Python as default +- Prefer running individual tests over full suites: `uv run pytest tests/test_foo.py::TestBar::test_baz -v` +- Only run the full suite when explicitly asked or before pushing diff --git a/.claude/rules/workflow.md b/.claude/rules/workflow.md index c76f77eed..7f8b5a6c1 100644 --- a/.claude/rules/workflow.md +++ b/.claude/rules/workflow.md @@ -1,13 +1,17 @@ # Workflow ## Code Changes -- Before making any changes, outline your approach in 3-5 numbered steps. Include which repo/branch you'll work in, what commands you'll run, and what success looks like. Wait for approval before starting + +Before making any changes, outline your approach in 3-5 numbered steps. Include which branch you'll work on, what commands you'll run, and what success looks like. Wait for approval before starting. ## Response Style -- When listing items (PRs, functions, optimization targets), always provide the complete list ordered by priority on the first attempt. Do not give partial lists + +When listing items (PRs, functions, optimization targets), provide the complete list ordered by priority on the first attempt. No partial lists. ## Commands -- When running long-running commands (benchmarks, profiling, optimizers like codeflash), always run them in the foreground. Do not use background processes + +Long-running commands (benchmarks, profiling, optimizers) always run in the foreground. Do not use background processes. ## Debugging -- When claiming something is a pre-existing issue (e.g., test failures on main), verify by checking out main and running the tests before making that claim + +When claiming something is a pre-existing issue (e.g., test failures on main), verify by checking out main and running the tests before making that claim. diff --git a/.claude/settings.json b/.claude/settings.json index 0ca931576..19393f96c 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,16 +1,96 @@ { + "attribution": { + "commit": "", + "pr": "" + }, + "includeCoAuthoredBy": false, + "permissions": { + "allow": [ + "Bash(git status*)", + "Bash(git diff*)", + "Bash(git log*)", + "Bash(git branch*)", + "Bash(git show*)", + "Bash(git fetch*)", + "Bash(git checkout*)", + "Bash(uv run*)", + "Bash(uv sync*)", + "Bash(uv pip*)", + "Bash(prek*)", + "Bash(make*)", + "Bash(gh *)" + ] + }, "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/bash-guard.sh", + "timeout": 5 + } + ] + }, + { + "matcher": "Write", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/require-read.sh", + "timeout": 5 + } + ] + }, + { + "matcher": "Edit", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/require-read.sh", + "timeout": 5 + } + ] + } + ], "PostToolUse": [ + { + "matcher": "Read", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/track-read.sh", + "timeout": 5 + } + ] + }, { "matcher": "Edit|Write", "hooks": [ { "type": "command", - "command": ".claude/hooks/post-edit-lint.sh", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/post-edit-lint.sh", "timeout": 30 } ] } + ], + "PreCompact": [ + { + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/post-compact.sh", + "timeout": 10 + } + ] + } ] - } + }, + "statusLine": { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/status-line.sh" + }, + "enableAllProjectMcpServers": true } diff --git a/.claude/skills/fix-mypy.md b/.claude/skills/fix-mypy.md index 1a9432bf3..6e43c4d3b 100644 --- a/.claude/skills/fix-mypy.md +++ b/.claude/skills/fix-mypy.md @@ -7,6 +7,6 @@ uv run mypy --non-interactive --config-file pyproject.toml ``` - Fix type annotation issues: missing return types, incorrect types, Optional/None unions, import errors for type hints -- Do NOT add `# type: ignore` comments — always fix the root cause +- Do NOT add `# type: ignore` comments -- always fix the root cause - Do NOT fix type errors that require logic changes, complex generic type rework, or anything that could change runtime behavior -- Files in `mypy_allowlist.txt` are checked in CI — ensure they remain error-free +- Files in `mypy_allowlist.txt` are checked in CI -- ensure they remain error-free diff --git a/.claude/skills/fix-prek.md b/.claude/skills/fix-prek.md index f681512ec..32652153b 100644 --- a/.claude/skills/fix-prek.md +++ b/.claude/skills/fix-prek.md @@ -5,5 +5,5 @@ When prek (pre-commit) checks fail: 1. Run `uv run prek run` to see failures (local, checks staged files) 2. In CI, the equivalent is `uv run prek run --from-ref origin/main` 3. prek runs ruff format, ruff check, and mypy on changed files -4. Fix issues in order: formatting → lint → type errors +4. Fix issues in order: formatting -> lint -> type errors 5. Re-run `uv run prek run` to verify all checks pass diff --git a/.gitignore b/.gitignore index 1a4e87d22..53d52f044 100644 --- a/.gitignore +++ b/.gitignore @@ -266,11 +266,12 @@ WARP.MD .tessl/ tessl.json -# Claude Code - track shared rules, ignore local config +# Claude Code - track shared config, ignore local state .claude/* !.claude/rules/ -!.claude/settings.json !.claude/hooks/ +!.claude/skills/ +!.claude/settings.json **/node_modules/** **/dist-nuitka/** **/.npmrc diff --git a/CLAUDE.md b/CLAUDE.md index f56a1276c..b2b2549ca 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,19 +7,22 @@ CodeFlash is an AI-powered code optimizer that automatically improves performanc ## Optimization Pipeline ``` -Discovery → Ranking → Context Extraction → Test Gen + Optimization → Baseline → Candidate Evaluation → PR +Discovery -> Ranking -> Context Extraction -> Test Gen + Optimization -> Baseline -> Candidate Evaluation -> PR ``` See `.claude/rules/architecture.md` for directory mapping and entry points. -# Instructions -- **Bug fix workflow** — follow these steps in order, do not skip ahead: - 1. Read the relevant code to understand the bug - 2. Write a test that reproduces the bug (run it to confirm it fails) - 3. Spawn subagents (using the Agent tool) to attempt the fix — each subagent should apply a fix and run the test to prove it passes - 4. Review the subagent results, pick the best fix, and apply it - 5. Never jump straight to writing a fix yourself — always go through steps 1-4 -- Everything that can be tested should have tests. +## Bug Fix Workflow + +Follow these steps in order, do not skip ahead: + +1. Read the relevant code to understand the bug +2. Write a test that reproduces the bug (run it to confirm it fails) +3. Spawn subagents (using the Agent tool) to attempt the fix — each subagent should apply a fix and run the test to prove it passes +4. Review the subagent results, pick the best fix, and apply it +5. Never jump straight to writing a fix yourself — always go through steps 1-4 + +Everything that can be tested should have tests. From 892bff485df4be4c71b17f45d79f2588c8dafd45 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Thu, 23 Apr 2026 04:33:58 -0500 Subject: [PATCH 138/147] feat(js): add JavaScript function tracer with Babel instrumentation Replaces source-level JavaScript function tracing with Babel AST transformation via babel-tracer-plugin.js and trace-runner.js. Adds replay test generation, Python-side tracer runner, and --language flag to the tracer CLI for explicit JS/TS routing. --- codeflash/languages/javascript/replay_test.py | 244 ++++++++ codeflash/languages/javascript/support.py | 21 +- codeflash/languages/javascript/tracer.py | 559 +++++++----------- .../languages/javascript/tracer_runner.py | 231 ++++++++ codeflash/tracer.py | 93 +++ packages/codeflash/package.json | 21 +- .../codeflash/runtime/babel-tracer-plugin.js | 434 ++++++++++++++ packages/codeflash/runtime/index.js | 38 ++ packages/codeflash/runtime/replay.js | 454 ++++++++++++++ packages/codeflash/runtime/trace-runner.js | 381 ++++++++++++ packages/codeflash/runtime/tracer.js | 558 +++++++++++++++++ .../test_javascript_instrumentation.py | 50 +- .../test_languages/test_javascript_tracer.py | 545 +++++++++++++++++ 13 files changed, 3228 insertions(+), 401 deletions(-) create mode 100644 codeflash/languages/javascript/replay_test.py create mode 100644 codeflash/languages/javascript/tracer_runner.py create mode 100644 packages/codeflash/runtime/babel-tracer-plugin.js create mode 100644 packages/codeflash/runtime/replay.js create mode 100644 packages/codeflash/runtime/trace-runner.js create mode 100644 packages/codeflash/runtime/tracer.js create mode 100644 tests/test_languages/test_javascript_tracer.py diff --git a/codeflash/languages/javascript/replay_test.py b/codeflash/languages/javascript/replay_test.py new file mode 100644 index 000000000..01b525189 --- /dev/null +++ b/codeflash/languages/javascript/replay_test.py @@ -0,0 +1,244 @@ +from __future__ import annotations + +import json +import re +import sqlite3 +import textwrap +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING, Any, Optional + +if TYPE_CHECKING: + from collections.abc import Generator + + +@dataclass +class JavaScriptFunctionModule: + function_name: str + file_name: Path + module_name: str + class_name: Optional[str] = None + line_no: Optional[int] = None + + +def get_next_arg_and_return( + trace_file: str, function_name: str, file_name: str, class_name: Optional[str] = None, num_to_get: int = 25 +) -> Generator[Any]: + db = sqlite3.connect(trace_file) + cur = db.cursor() + + try: + cur.execute("SELECT name FROM sqlite_master WHERE type='table'") + tables = {row[0] for row in cur.fetchall()} + + if "function_calls" in tables: + if class_name: + cursor = cur.execute( + "SELECT args FROM function_calls WHERE function = ? AND filename = ? AND classname = ? AND type = 'call' ORDER BY time_ns ASC LIMIT ?", + (function_name, file_name, class_name, num_to_get), + ) + else: + cursor = cur.execute( + "SELECT args FROM function_calls WHERE function = ? AND filename = ? AND type = 'call' ORDER BY time_ns ASC LIMIT ?", + (function_name, file_name, num_to_get), + ) + + while (val := cursor.fetchone()) is not None: + args_data = val[0] + if isinstance(args_data, bytes): + yield args_data + else: + yield args_data + + elif "traces" in tables: + if class_name: + cursor = cur.execute( + "SELECT args FROM traces WHERE function = ? AND file = ? ORDER BY id ASC LIMIT ?", + (function_name, file_name, num_to_get), + ) + else: + cursor = cur.execute( + "SELECT args FROM traces WHERE function = ? AND file = ? ORDER BY id ASC LIMIT ?", + (function_name, file_name, num_to_get), + ) + + while (val := cursor.fetchone()) is not None: + yield val[0] + + finally: + db.close() + + +def get_function_alias(module: str, function_name: str, class_name: Optional[str] = None) -> str: + module_alias = re.sub(r"[^a-zA-Z0-9]", "_", module).strip("_") + + if class_name: + return f"{module_alias}_{class_name}_{function_name}" + return f"{module_alias}_{function_name}" + + +def create_javascript_replay_test( + trace_file: str, + functions: list[JavaScriptFunctionModule], + max_run_count: int = 100, + framework: str = "jest", + project_root: Optional[Path] = None, +) -> str: + is_vitest = framework.lower() == "vitest" + + imports = [] + + if is_vitest: + imports.append("import { describe, test } from 'vitest';") + + imports.append("const { getNextArg } = require('codeflash/replay');") + imports.append("") + + for func in functions: + if func.function_name in ("__init__", "constructor"): + continue + + alias = get_function_alias(func.module_name, func.function_name, func.class_name) + + if func.class_name: + imports.append(f"const {{ {func.class_name}: {alias}_class }} = require('./{func.module_name}');") + else: + imports.append(f"const {{ {func.function_name}: {alias} }} = require('./{func.module_name}');") + + imports.append("") + + functions_to_test = [f.function_name for f in functions if f.function_name not in ("__init__", "constructor")] + metadata = f"""const traceFilePath = '{trace_file}'; +const functions = {json.dumps(functions_to_test)}; +""" + + test_cases = [] + + for func in functions: + if func.function_name in ("__init__", "constructor"): + continue + + alias = get_function_alias(func.module_name, func.function_name, func.class_name) + test_name = f"{func.class_name}.{func.function_name}" if func.class_name else func.function_name + + if func.class_name: + class_arg = f"'{func.class_name}'" + test_body = textwrap.dedent(f""" +describe('Replay: {test_name}', () => {{ + const traces = getNextArg(traceFilePath, '{func.function_name}', '{func.file_name.as_posix()}', {max_run_count}, {class_arg}); + + test.each(traces.map((args, i) => [i, args]))('call %i', (index, args) => {{ + const instance = new {alias}_class(); + instance.{func.function_name}(...args); + }}); +}}); +""") + else: + test_body = textwrap.dedent(f""" +describe('Replay: {test_name}', () => {{ + const traces = getNextArg(traceFilePath, '{func.function_name}', '{func.file_name.as_posix()}', {max_run_count}); + + test.each(traces.map((args, i) => [i, args]))('call %i', (index, args) => {{ + {alias}(...args); + }}); +}}); +""") + + test_cases.append(test_body) + + return "\n".join( + [ + "// Auto-generated replay test by Codeflash", + "// Do not edit this file directly", + "", + *imports, + metadata, + *test_cases, + ] + ) + + +def get_traced_functions_from_db(trace_file: Path) -> list[JavaScriptFunctionModule]: + if not trace_file.exists(): + return [] + + try: + conn = sqlite3.connect(trace_file) + cursor = conn.cursor() + + cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") + tables = {row[0] for row in cursor.fetchall()} + + functions = [] + + if "function_calls" in tables: + cursor.execute( + "SELECT DISTINCT function, filename, classname, line_number FROM function_calls WHERE type = 'call'" + ) + for row in cursor.fetchall(): + func_name = row[0] + file_name = row[1] + class_name = row[2] + line_number = row[3] + + module_path = file_name.replace("\\", "/").replace(".js", "").replace(".ts", "") + module_path = module_path.removeprefix("./") + + functions.append( + JavaScriptFunctionModule( + function_name=func_name, + file_name=Path(file_name), + module_name=module_path, + class_name=class_name, + line_no=line_number, + ) + ) + + elif "traces" in tables: + cursor.execute("SELECT DISTINCT function, file FROM traces") + for row in cursor.fetchall(): + func_name = row[0] + file_name = row[1] + + module_path = file_name.replace("\\", "/").replace(".js", "").replace(".ts", "") + module_path = module_path.removeprefix("./") + + functions.append( + JavaScriptFunctionModule( + function_name=func_name, file_name=Path(file_name), module_name=module_path + ) + ) + + conn.close() + return functions + + except Exception: + return [] + + +def create_replay_test_file( + trace_file: Path, + output_path: Path, + framework: str = "jest", + max_run_count: int = 100, + project_root: Optional[Path] = None, +) -> Optional[Path]: + functions = get_traced_functions_from_db(trace_file) + + if not functions: + return None + + content = create_javascript_replay_test( + trace_file=str(trace_file), + functions=functions, + max_run_count=max_run_count, + framework=framework, + project_root=project_root, + ) + + try: + output_path.parent.mkdir(parents=True, exist_ok=True) + output_path.write_text(content, encoding="utf-8") + return output_path + except Exception: + return None diff --git a/codeflash/languages/javascript/support.py b/codeflash/languages/javascript/support.py index 2faeb76a3..b0605b19b 100644 --- a/codeflash/languages/javascript/support.py +++ b/codeflash/languages/javascript/support.py @@ -1702,8 +1702,9 @@ class JavaScriptSupport: ) -> str: """Add behavior instrumentation to capture inputs/outputs. - For JavaScript, this wraps functions to capture their arguments - and return values. + For JavaScript, instrumentation is handled at runtime by the Babel tracer plugin + (babel-tracer-plugin.js) via trace-runner.js. This method returns the source + unchanged since no source-level transformation is needed. Args: source: Source code to instrument. @@ -1711,21 +1712,11 @@ class JavaScriptSupport: output_file: Optional output file for traces. Returns: - Instrumented source code. + Source code unchanged (Babel handles instrumentation at runtime). """ - if not functions: - return source - - from codeflash.languages.javascript.tracer import JavaScriptTracer - - # Use first function's file path if output_file not specified - if output_file is None: - file_path = functions[0].file_path - output_file = file_path.parent / ".codeflash" / "traces.db" - - tracer = JavaScriptTracer(output_file) - return tracer.instrument_source(source, functions[0].file_path, list(functions)) + # JavaScript tracing is done at runtime via Babel plugin, not source transformation + return source def instrument_for_benchmarking(self, test_source: str, target_function: FunctionToOptimize) -> str: """Add timing instrumentation to test code. diff --git a/codeflash/languages/javascript/tracer.py b/codeflash/languages/javascript/tracer.py index 2f5791ee0..107c456ce 100644 --- a/codeflash/languages/javascript/tracer.py +++ b/codeflash/languages/javascript/tracer.py @@ -1,35 +1,56 @@ """Function tracing instrumentation for JavaScript. -This module provides functionality to wrap JavaScript functions to capture their -inputs, outputs, and execution behavior. This is used for generating replay tests -and verifying optimization correctness. +This module provides functionality to parse JavaScript function traces and generate +replay tests. Tracing is performed via Babel AST transformation using the +babel-tracer-plugin.js and trace-runner.js in the npm package. + +The tracer uses Babel plugin for AST transformation which: +- Works with both CommonJS and ESM +- Handles async functions, arrow functions, methods correctly +- Preserves source maps and formatting + +Database Schema (matches Python tracer): +- function_calls: Main trace data (type, function, classname, filename, line_number, time_ns, args) +- metadata: Key-value metadata about the trace session """ from __future__ import annotations import json import logging +import re import sqlite3 -from typing import TYPE_CHECKING, Any +import textwrap +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, Optional if TYPE_CHECKING: from pathlib import Path - from codeflash.discovery.functions_to_optimize import FunctionToOptimize - logger = logging.getLogger(__name__) -class JavaScriptTracer: - """Instruments JavaScript code to capture function inputs and outputs. +@dataclass +class JavaScriptFunctionInfo: + function_name: str + file_name: str + module_path: str + class_name: Optional[str] = None + line_number: Optional[int] = None - Similar to Python's tracing system, this wraps functions to record: - - Input arguments - - Return values - - Exceptions thrown - - Execution time + +class JavaScriptTracer: + """Parses JavaScript function traces and generates replay tests. + + Tracing is performed via Babel AST transformation (trace-runner.js). + This class handles: + - Parsing trace results from SQLite database + - Extracting traced function information + - Generating replay test files for Jest/Vitest """ + SCHEMA_VERSION = "1.0.0" + def __init__(self, output_db: Path) -> None: """Initialize the tracer. @@ -38,322 +59,15 @@ class JavaScriptTracer: """ self.output_db = output_db - self.tracer_var = "__codeflash_tracer__" - - def instrument_source(self, source: str, file_path: Path, functions: list[FunctionToOptimize]) -> str: - """Instrument JavaScript source code with function tracing. - - Wraps specified functions to capture their inputs and outputs. - - Args: - source: Original JavaScript source code. - file_path: Path to the source file. - functions: List of functions to instrument. - - Returns: - Instrumented source code with tracing. - - """ - if not functions: - return source - - # Add tracer initialization at the top - tracer_init = self._generate_tracer_init() - - # Add instrumentation to each function - lines = source.splitlines(keepends=True) - - # Process functions in reverse order to preserve line numbers - for func in sorted(functions, key=lambda f: f.starting_line, reverse=True): - instrumented = self._instrument_function(func, lines, file_path) - start_idx = func.starting_line - 1 - end_idx = func.ending_line - lines = lines[:start_idx] + instrumented + lines[end_idx:] - - instrumented_source = "".join(lines) - - # Add tracer save at the end - tracer_save = self._generate_tracer_save() - - return tracer_init + "\n" + instrumented_source + "\n" + tracer_save - - def _generate_tracer_init(self) -> str: - """Generate JavaScript code for tracer initialization.""" - return f""" -// Codeflash function tracer initialization -const {self.tracer_var} = {{ - traces: [], - callId: 0, - - serialize: function(value) {{ - try {{ - // Handle special cases - if (value === undefined) return {{ __type__: 'undefined' }}; - if (value === null) return null; - if (typeof value === 'function') return {{ __type__: 'function', name: value.name }}; - if (typeof value === 'symbol') return {{ __type__: 'symbol', value: value.toString() }}; - if (value instanceof Error) return {{ - __type__: 'error', - name: value.name, - message: value.message, - stack: value.stack - }}; - if (typeof value === 'bigint') return {{ __type__: 'bigint', value: value.toString() }}; - if (value instanceof Date) return {{ __type__: 'date', value: value.toISOString() }}; - if (value instanceof RegExp) return {{ __type__: 'regexp', value: value.toString() }}; - if (value instanceof Map) return {{ - __type__: 'map', - value: Array.from(value.entries()).map(([k, v]) => [this.serialize(k), this.serialize(v)]) - }}; - if (value instanceof Set) return {{ - __type__: 'set', - value: Array.from(value).map(v => this.serialize(v)) - }}; - - // Handle circular references with a simple check - return JSON.parse(JSON.stringify(value)); - }} catch (e) {{ - return {{ __type__: 'unserializable', error: e.message }}; - }} - }}, - - wrap: function(originalFunc, funcName, filePath) {{ - const self = this; - - if (originalFunc.constructor.name === 'AsyncFunction') {{ - return async function(...args) {{ - const callId = self.callId++; - const start = process.hrtime.bigint(); - let result, error; - - try {{ - result = await originalFunc.apply(this, args); - }} catch (e) {{ - error = e; - }} - - const end = process.hrtime.bigint(); - - self.traces.push({{ - call_id: callId, - function: funcName, - file: filePath, - args: args.map(a => self.serialize(a)), - result: error ? null : self.serialize(result), - error: error ? self.serialize(error) : null, - runtime_ns: (end - start).toString(), - timestamp: Date.now() - }}); - - if (error) throw error; - return result; - }}; - }} - - return function(...args) {{ - const callId = self.callId++; - const start = process.hrtime.bigint(); - let result, error; - - try {{ - result = originalFunc.apply(this, args); - }} catch (e) {{ - error = e; - }} - - const end = process.hrtime.bigint(); - - self.traces.push({{ - call_id: callId, - function: funcName, - file: filePath, - args: args.map(a => self.serialize(a)), - result: error ? null : self.serialize(result), - error: error ? self.serialize(error) : null, - runtime_ns: (end - start).toString(), - timestamp: Date.now() - }}); - - if (error) throw error; - return result; - }}; - }}, - - saveToDb: function() {{ - const sqlite3 = require('sqlite3').verbose(); - const fs = require('fs'); - const path = require('path'); - - const dbPath = '{self.output_db.as_posix()}'; - const dbDir = path.dirname(dbPath); - - if (!fs.existsSync(dbDir)) {{ - fs.mkdirSync(dbDir, {{ recursive: true }}); - }} - - const db = new sqlite3.Database(dbPath); - - db.serialize(() => {{ - // Create table - db.run(` - CREATE TABLE IF NOT EXISTS traces ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - call_id INTEGER, - function TEXT, - file TEXT, - args TEXT, - result TEXT, - error TEXT, - runtime_ns TEXT, - timestamp INTEGER - ) - `); - - // Insert traces - const stmt = db.prepare(` - INSERT INTO traces (call_id, function, file, args, result, error, runtime_ns, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - `); - - for (const trace of this.traces) {{ - stmt.run( - trace.call_id, - trace.function, - trace.file, - JSON.stringify(trace.args), - JSON.stringify(trace.result), - JSON.stringify(trace.error), - trace.runtime_ns, - trace.timestamp - ); - }} - - stmt.finalize(); - }}); - - db.close(); - }}, - - saveToJson: function() {{ - const fs = require('fs'); - const path = require('path'); - - const jsonPath = '{self.output_db.with_suffix(".json").as_posix()}'; - const jsonDir = path.dirname(jsonPath); - - if (!fs.existsSync(jsonDir)) {{ - fs.mkdirSync(jsonDir, {{ recursive: true }}); - }} - - fs.writeFileSync(jsonPath, JSON.stringify(this.traces, null, 2)); - }} -}}; -""" - - def _generate_tracer_save(self) -> str: - """Generate JavaScript code to save tracer results.""" - return f""" -// Save tracer results on process exit -process.on('exit', () => {{ - try {{ - {self.tracer_var}.saveToJson(); - // Try SQLite, but don't fail if sqlite3 is not installed - try {{ - {self.tracer_var}.saveToDb(); - }} catch (e) {{ - // SQLite not available, JSON is sufficient - }} - }} catch (e) {{ - console.error('Failed to save traces:', e); - }} -}}); -""" - - def _instrument_function(self, func: FunctionToOptimize, lines: list[str], file_path: Path) -> list[str]: - """Instrument a single function with tracing. - - Args: - func: Function to instrument. - lines: Source lines. - file_path: Path to source file. - - Returns: - Instrumented function lines. - - """ - func_lines = lines[func.starting_line - 1 : func.ending_line] - func_text = "".join(func_lines) - - # Detect function pattern - func_name = func.function_name - is_arrow = "=>" in func_text.split("\n")[0] - is_method = func.is_method - is_async = func.is_async - - # Generate wrapper code based on function type - if is_arrow: - # For arrow functions: const foo = (a, b) => { ... } - # Replace with: const foo = __codeflash_tracer__.wrap((a, b) => { ... }, 'foo', 'file.js') - return self._wrap_arrow_function(func_lines, func_name, file_path) - if is_method: - # For methods: methodName(a, b) { ... } - # Wrap the method body - return self._wrap_method(func_lines, func_name, file_path, is_async) - # For regular functions: function foo(a, b) { ... } - # Wrap the entire function - return self._wrap_regular_function(func_lines, func_name, file_path, is_async) - - def _wrap_arrow_function(self, func_lines: list[str], func_name: str, file_path: Path) -> list[str]: - """Wrap an arrow function with tracing.""" - # Find the assignment line - first_line = func_lines[0] - indent = len(first_line) - len(first_line.lstrip()) - indent_str = " " * indent - - # Insert wrapper call - func_text = "".join(func_lines).rstrip() - - # Find the '=' and wrap everything after it - if "=" in func_text: - parts = func_text.split("=", 1) - wrapped = f"{parts[0]}= {self.tracer_var}.wrap({parts[1]}, '{func_name}', '{file_path.as_posix()}');\n" - return [wrapped] - - return func_lines - - def _wrap_method(self, func_lines: list[str], func_name: str, file_path: Path, is_async: bool) -> list[str]: - """Wrap a class method with tracing.""" - # For methods, we wrap by reassigning them after definition - # This is complex, so for now we'll return unwrapped - # TODO: Implement method wrapping - logger.warning("Method wrapping not fully implemented for %s", func_name) - return func_lines - - def _wrap_regular_function( - self, func_lines: list[str], func_name: str, file_path: Path, is_async: bool - ) -> list[str]: - """Wrap a regular function declaration with tracing.""" - # Replace: function foo(a, b) { ... } - # With: const __original_foo = function foo(a, b) { ... }; const foo = __codeflash_tracer__.wrap(__original_foo, 'foo', 'file.js'); - - func_text = "".join(func_lines).rstrip() - first_line = func_lines[0] - indent = len(first_line) - len(first_line.lstrip()) - indent_str = " " * indent - - wrapped = ( - f"{indent_str}const __original_{func_name}__ = {func_text};\n" - f"{indent_str}const {func_name} = {self.tracer_var}.wrap(__original_{func_name}__, '{func_name}', '{file_path.as_posix()}');\n" - ) - - return [wrapped] @staticmethod def parse_results(trace_file: Path) -> list[dict[str, Any]]: """Parse tracing results from output file. + Supports both the new function_calls schema and legacy traces schema. + Args: - trace_file: Path to traces JSON file. + trace_file: Path to traces file (SQLite or JSON). Returns: List of trace records. @@ -363,36 +77,59 @@ process.on('exit', () => {{ if json_file.exists(): try: - with json_file.open("r") as f: - return json.load(f) + with json_file.open("r", encoding="utf-8") as f: + data: list[dict[str, Any]] = json.load(f) + return data except Exception as e: logger.exception("Failed to parse trace JSON: %s", e) return [] - # Try SQLite database if not trace_file.exists(): return [] try: conn = sqlite3.connect(trace_file) cursor = conn.cursor() - cursor.execute("SELECT * FROM traces ORDER BY id") + + cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") + tables = {row[0] for row in cursor.fetchall()} traces = [] - for row in cursor.fetchall(): - traces.append( - { - "id": row[0], - "call_id": row[1], - "function": row[2], - "file": row[3], - "args": json.loads(row[4]), - "result": json.loads(row[5]), - "error": json.loads(row[6]) if row[6] != "null" else None, - "runtime_ns": int(row[7]), - "timestamp": row[8], - } + + if "function_calls" in tables: + cursor.execute( + "SELECT type, function, classname, filename, line_number, " + "last_frame_address, time_ns, args FROM function_calls ORDER BY time_ns" ) + for row in cursor.fetchall(): + traces.append( + { + "type": row[0], + "function": row[1], + "classname": row[2], + "filename": row[3], + "line_number": row[4], + "last_frame_address": row[5], + "time_ns": row[6], + "args": json.loads(row[7]) if row[7] else [], + } + ) + elif "traces" in tables: + cursor.execute("SELECT * FROM traces ORDER BY id") + for row in cursor.fetchall(): + traces.append( + { + "id": row[0], + "call_id": row[1], + "function": row[2], + "file": row[3], + "args": json.loads(row[4]) if row[4] else [], + "result": json.loads(row[5]) if row[5] else None, + "error": json.loads(row[6]) if row[6] and row[6] != "null" else None, + "runtime_ns": int(row[7]) if row[7] else 0, + "timestamp": row[8] if len(row) > 8 else None, + } + ) conn.close() return traces @@ -400,3 +137,145 @@ process.on('exit', () => {{ except Exception as e: logger.exception("Failed to parse trace database: %s", e) return [] + + @staticmethod + def get_traced_functions(trace_file: Path) -> list[JavaScriptFunctionInfo]: + if not trace_file.exists(): + return [] + + try: + conn = sqlite3.connect(trace_file) + cursor = conn.cursor() + + cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") + tables = {row[0] for row in cursor.fetchall()} + + functions = [] + + if "function_calls" in tables: + cursor.execute( + "SELECT DISTINCT function, filename, classname, line_number FROM function_calls WHERE type = 'call'" + ) + for row in cursor.fetchall(): + func_name = row[0] + file_name = row[1] + class_name = row[2] + line_number = row[3] + + module_path = file_name.replace("\\", "/").replace(".js", "").replace(".ts", "") + module_path = module_path.removeprefix("./") + + functions.append( + JavaScriptFunctionInfo( + function_name=func_name, + file_name=file_name, + module_path=module_path, + class_name=class_name, + line_number=line_number, + ) + ) + + conn.close() + return functions + + except Exception as e: + logger.exception("Failed to get traced functions: %s", e) + return [] + + def create_replay_test( + self, + trace_file: Path, + output_path: Path, + framework: str = "jest", + max_run_count: int = 100, + project_root: Optional[Path] = None, + ) -> Optional[str]: + functions = self.get_traced_functions(trace_file) + if not functions: + logger.warning("No traced functions found in %s", trace_file) + return None + + is_vitest = framework.lower() == "vitest" + + imports = [] + if is_vitest: + imports.append("import { describe, test } from 'vitest';") + + imports.append("const { getNextArg } = require('codeflash/replay');") + imports.append("") + + for func in functions: + alias = self._get_function_alias(func.module_path, func.function_name, func.class_name) + if func.class_name: + imports.append(f"const {{ {func.class_name}: {alias}_class }} = require('./{func.module_path}');") + else: + imports.append(f"const {{ {func.function_name}: {alias} }} = require('./{func.module_path}');") + + imports.append("") + + trace_path = trace_file.as_posix() + metadata = [ + f"const traceFilePath = '{trace_path}';", + f"const functions = {json.dumps([f.function_name for f in functions])};", + "", + ] + + test_cases = [] + for func in functions: + alias = self._get_function_alias(func.module_path, func.function_name, func.class_name) + test_name = f"{func.class_name}.{func.function_name}" if func.class_name else func.function_name + class_arg = f"'{func.class_name}'" if func.class_name else "null" + + if func.class_name: + test_cases.append( + textwrap.dedent(f""" +describe('Replay: {test_name}', () => {{ + const traces = getNextArg(traceFilePath, '{func.function_name}', '{func.file_name}', {max_run_count}, {class_arg}); + + test.each(traces.map((args, i) => [i, args]))('call %i', (index, args) => {{ + const instance = new {alias}_class(); + instance.{func.function_name}(...args); + }}); +}}); +""") + ) + else: + test_cases.append( + textwrap.dedent(f""" +describe('Replay: {test_name}', () => {{ + const traces = getNextArg(traceFilePath, '{func.function_name}', '{func.file_name}', {max_run_count}); + + test.each(traces.map((args, i) => [i, args]))('call %i', (index, args) => {{ + {alias}(...args); + }}); +}}); +""") + ) + + content = "\n".join( + [ + "// Auto-generated replay test by Codeflash", + "// Do not edit this file directly", + "", + *imports, + *metadata, + *test_cases, + ] + ) + + try: + output_path.parent.mkdir(parents=True, exist_ok=True) + output_path.write_text(content, encoding="utf-8") + logger.info("Generated replay test: %s", output_path) + return str(output_path) + except Exception as e: + logger.exception("Failed to write replay test: %s", e) + return None + + @staticmethod + def _get_function_alias(module_path: str, function_name: str, class_name: Optional[str] = None) -> str: + module_alias = re.sub(r"[^a-zA-Z0-9]", "_", module_path).strip("_") + + if class_name: + return f"{module_alias}_{class_name}_{function_name}" + return f"{module_alias}_{function_name}" diff --git a/codeflash/languages/javascript/tracer_runner.py b/codeflash/languages/javascript/tracer_runner.py new file mode 100644 index 000000000..8b4ca5adb --- /dev/null +++ b/codeflash/languages/javascript/tracer_runner.py @@ -0,0 +1,231 @@ +from __future__ import annotations + +import json +import logging +import os +import shutil +import subprocess +from pathlib import Path +from typing import TYPE_CHECKING, Any, Optional + +if TYPE_CHECKING: + from argparse import Namespace + +logger = logging.getLogger(__name__) + + +def find_node_executable() -> Optional[Path]: + node_path = shutil.which("node") + if node_path: + return Path(node_path) + + npx_path = shutil.which("npx") + if npx_path: + return Path(npx_path) + + return None + + +def find_trace_runner() -> Optional[Path]: + cwd = Path.cwd() + + local_path = cwd / "node_modules" / "codeflash" / "runtime" / "trace-runner.js" + if local_path.exists(): + return local_path + + try: + result = subprocess.run(["npm", "root", "-g"], capture_output=True, text=True, check=True) + global_modules = Path(result.stdout.strip()) + global_path = global_modules / "codeflash" / "runtime" / "trace-runner.js" + if global_path.exists(): + return global_path + except Exception: + pass + + bundled_path = Path(__file__).parent.parent.parent.parent / "packages" / "codeflash" / "runtime" / "trace-runner.js" + if bundled_path.exists(): + return bundled_path + + return None + + +def run_javascript_tracer(args: Namespace, config: dict[str, Any], project_root: Path) -> dict[str, Any]: + result: dict[str, Any] = {"success": False, "trace_file": None, "replay_test_file": None, "error": None} + + node_path = find_node_executable() + if not node_path: + result["error"] = "Node.js not found. Please install Node.js to use JavaScript tracing." + logger.error(result["error"]) + return result + + trace_runner_path = find_trace_runner() + if not trace_runner_path: + result["error"] = "trace-runner.js not found. Please install the codeflash npm package." + logger.error(result["error"]) + return result + + outfile = getattr(args, "outfile", None) or "codeflash.trace.sqlite" + trace_file = Path(outfile).resolve() + + env = os.environ.copy() + env["CODEFLASH_TRACE_DB"] = str(trace_file) + env["CODEFLASH_PROJECT_ROOT"] = str(project_root) + + max_count = getattr(args, "max_function_count", 256) + env["CODEFLASH_MAX_FUNCTION_COUNT"] = str(max_count) + + timeout = getattr(args, "tracer_timeout", None) + if timeout: + env["CODEFLASH_TRACER_TIMEOUT"] = str(timeout) + + only_functions = getattr(args, "only_functions", None) + if only_functions: + env["CODEFLASH_FUNCTIONS"] = json.dumps(only_functions) + + cmd = [str(node_path), str(trace_runner_path)] + + cmd.extend(["--trace-db", str(trace_file)]) + cmd.extend(["--project-root", str(project_root)]) + + if max_count: + cmd.extend(["--max-function-count", str(max_count)]) + + if timeout: + cmd.extend(["--timeout", str(timeout)]) + + if only_functions: + cmd.extend(["--functions", json.dumps(only_functions)]) + + is_module = getattr(args, "module", False) + script_args = [] + + if hasattr(args, "script_args"): + script_args = args.script_args + elif hasattr(args, "unknown_args"): + script_args = args.unknown_args + + if is_module and script_args and script_args[0] == "jest": + cmd.append("--jest") + cmd.append("--") + cmd.extend(script_args[1:]) + elif is_module and script_args and script_args[0] == "vitest": + cmd.append("--vitest") + cmd.append("--") + cmd.extend(script_args[1:]) + elif script_args: + cmd.extend(script_args) + + logger.info("Running JavaScript tracer: %s", " ".join(cmd)) + + try: + process = subprocess.run(cmd, cwd=project_root, env=env, capture_output=False, check=False) + + if process.returncode != 0: + result["error"] = f"Tracing failed with exit code {process.returncode}" + logger.error(result["error"]) + return result + + except Exception as e: + result["error"] = f"Failed to run tracer: {e}" + logger.exception(result["error"]) + return result + + if not trace_file.exists(): + result["error"] = f"Trace file not created: {trace_file}" + logger.error(result["error"]) + return result + + result["success"] = True + result["trace_file"] = str(trace_file) + + trace_only = getattr(args, "trace_only", False) + if not trace_only: + replay_test_path = generate_replay_test(trace_file=trace_file, project_root=project_root, config=config) + if replay_test_path: + result["replay_test_file"] = str(replay_test_path) + logger.info("Generated replay test: %s", replay_test_path) + + return result + + +def generate_replay_test( + trace_file: Path, project_root: Path, config: dict[str, Any], output_path: Optional[Path] = None +) -> Optional[Path]: + from codeflash.languages.javascript.replay_test import create_replay_test_file + + framework = detect_test_framework(project_root, config) + + if output_path is None: + tests_root = config.get("tests_root", "tests") + tests_dir = project_root / tests_root + output_path = tests_dir / "codeflash_replay.test.js" + + return create_replay_test_file( + trace_file=trace_file, + output_path=output_path, + framework=framework, + max_run_count=100, + project_root=project_root, + ) + + +def detect_test_framework(project_root: Path, config: dict[str, Any]) -> str: + if "test_framework" in config: + framework: str = config["test_framework"] + return framework + + vitest_configs = ["vitest.config.js", "vitest.config.ts", "vitest.config.mjs"] + for conf in vitest_configs: + if (project_root / conf).exists(): + return "vitest" + + jest_configs = ["jest.config.js", "jest.config.ts", "jest.config.mjs", "jest.config.json"] + for conf in jest_configs: + if (project_root / conf).exists(): + return "jest" + + package_json = project_root / "package.json" + if package_json.exists(): + try: + with package_json.open(encoding="utf-8") as f: + pkg = json.load(f) + test_script = pkg.get("scripts", {}).get("test", "") + if "vitest" in test_script: + return "vitest" + if "jest" in test_script: + return "jest" + + deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})} + if "vitest" in deps: + return "vitest" + if "jest" in deps: + return "jest" + except Exception: + pass + + return "jest" + + +def check_javascript_tracer_available() -> bool: + if not find_node_executable(): + return False + + if not find_trace_runner(): + return False + + return True + + +def get_tracer_requirements_message() -> str: + missing = [] + + if not find_node_executable(): + missing.append("Node.js (v18+)") + + if not find_trace_runner(): + missing.append("codeflash npm package (npm install codeflash)") + + if not missing: + return "All requirements met for JavaScript tracing." + + return "Missing requirements for JavaScript tracing:\n- " + "\n- ".join(missing) diff --git a/codeflash/tracer.py b/codeflash/tracer.py index 4a7d24585..834c7842d 100644 --- a/codeflash/tracer.py +++ b/codeflash/tracer.py @@ -149,6 +149,11 @@ def main(args: Namespace | None = None) -> ArgumentParser: parser.add_argument( "--limit", type=int, default=None, help="Limit the number of test files to process (for -m pytest mode)" ) + parser.add_argument( + "--language", + help="Language to trace (python, javascript, typescript). Auto-detected if not specified.", + default=None, + ) if args is not None: parsed_args = args @@ -182,6 +187,13 @@ def main(args: Namespace | None = None) -> ArgumentParser: outfile = parsed_args.outfile config, found_config_path = parse_config_file(parsed_args.codeflash_config) project_root = project_root_from_module_root(Path(config["module_root"]), found_config_path) + + language = getattr(parsed_args, "language", None) or config.get("language", "python") + if language in ("javascript", "typescript"): + return run_javascript_tracer_main( + parsed_args=parsed_args, config=config, project_root=project_root, unknown_args=unknown_args + ) + if len(unknown_args) > 0: args_dict = { "functions": parsed_args.only_functions, @@ -332,6 +344,87 @@ def main(args: Namespace | None = None) -> ArgumentParser: return parser +def run_javascript_tracer_main( + parsed_args: Namespace, config: dict, project_root: Path, unknown_args: list[str] +) -> ArgumentParser: + from codeflash.languages.javascript.tracer_runner import ( + check_javascript_tracer_available, + detect_test_framework, + get_tracer_requirements_message, + run_javascript_tracer, + ) + + if not check_javascript_tracer_available(): + console.print("[bold red]Error:[/] JavaScript tracer requirements not met.") + console.print(get_tracer_requirements_message()) + sys.exit(1) + + trace_only = getattr(parsed_args, "trace_only", False) + only_functions = getattr(parsed_args, "only_functions", None) + max_function_count = getattr(parsed_args, "max_function_count", 256) + timeout = getattr(parsed_args, "tracer_timeout", None) + + framework = detect_test_framework(project_root, config) + logger.info("JavaScript tracer: framework=%s, project_root=%s", framework, project_root) + + trace_db_path = get_run_tmp_file(Path("js_trace.sqlite")) + + script_or_test_args = unknown_args if unknown_args else [] + + replay_test_path = run_javascript_tracer( + script_args=script_or_test_args, + trace_db_path=trace_db_path, + project_root=project_root, + functions=only_functions, + max_function_count=max_function_count, + timeout=int(timeout) if timeout else 0, + framework=framework, + ) + + if replay_test_path and not trace_only: + from codeflash.cli_cmds.cli import parse_args as cli_parse_args + from codeflash.cli_cmds.cli import process_pyproject_config + from codeflash.cli_cmds.console import paneled_text + from codeflash.cli_cmds.console_constants import CODEFLASH_LOGO + from codeflash.languages import Language, set_current_language + from codeflash.optimization import optimizer + from codeflash.telemetry import posthog_cf + from codeflash.telemetry.sentry import init_sentry + + language = getattr(parsed_args, "language", None) or config.get("language", "javascript") + if language == "typescript": + set_current_language(Language.TYPESCRIPT) + else: + set_current_language(Language.JAVASCRIPT) + + sys.argv = ["codeflash", "--replay-test", str(replay_test_path)] + args = cli_parse_args() + paneled_text( + CODEFLASH_LOGO, + panel_args={"title": "https://codeflash.ai", "expand": False}, + text_args={"style": "bold gold3"}, + ) + + args = process_pyproject_config(args) + args.previous_checkpoint_functions = None + init_sentry(enabled=not args.disable_telemetry, exclude_errors=True) + posthog_cf.initialize_posthog(enabled=not args.disable_telemetry) + + args.effort = EffortLevel.HIGH.value + optimizer.run_with_args(args) + + # Clean up + trace_db_path.unlink(missing_ok=True) + if replay_test_path: + Path(replay_test_path).unlink(missing_ok=True) + elif replay_test_path: + console.print(f"[bold green]Trace complete.[/] Replay test: {replay_test_path}") + else: + console.print("[bold yellow]Warning:[/] No functions were traced.") + + return ArgumentParser() + + def _run_java_tracer(existing_args: Namespace | None = None) -> ArgumentParser: """Run the Java two-stage tracer (JFR + argument capture) and optionally optimize.""" from codeflash.cli_cmds.cli import parse_args, process_pyproject_config diff --git a/packages/codeflash/package.json b/packages/codeflash/package.json index 68fc947cf..d96500397 100644 --- a/packages/codeflash/package.json +++ b/packages/codeflash/package.json @@ -6,7 +6,8 @@ "types": "runtime/index.d.ts", "bin": { "codeflash": "./bin/codeflash.js", - "codeflash-setup": "./bin/codeflash-setup.js" + "codeflash-setup": "./bin/codeflash-setup.js", + "codeflash-trace": "./runtime/trace-runner.js" }, "publishConfig": { "access": "public" @@ -36,6 +37,18 @@ "./jest-reporter": { "require": "./runtime/jest-reporter.js", "import": "./runtime/jest-reporter.js" + }, + "./tracer": { + "require": "./runtime/tracer.js", + "import": "./runtime/tracer.js" + }, + "./replay": { + "require": "./runtime/replay.js", + "import": "./runtime/replay.js" + }, + "./babel-tracer-plugin": { + "require": "./runtime/babel-tracer-plugin.js", + "import": "./runtime/babel-tracer-plugin.js" } }, "scripts": { @@ -92,5 +105,11 @@ "dependencies": { "better-sqlite3": "^12.0.0", "@msgpack/msgpack": "^3.0.0" + }, + "optionalDependencies": { + "@babel/core": "^7.24.0", + "@babel/register": "^7.24.0", + "@babel/preset-env": "^7.24.0", + "@babel/preset-typescript": "^7.24.0" } } diff --git a/packages/codeflash/runtime/babel-tracer-plugin.js b/packages/codeflash/runtime/babel-tracer-plugin.js new file mode 100644 index 000000000..558e0664f --- /dev/null +++ b/packages/codeflash/runtime/babel-tracer-plugin.js @@ -0,0 +1,434 @@ +/** + * Codeflash Babel Tracer Plugin + * + * A Babel plugin that instruments JavaScript/TypeScript functions for tracing. + * This plugin wraps functions with tracing calls to capture: + * - Function arguments + * - Return values + * - Execution time + * + * The plugin transforms: + * function foo(a, b) { return a + b; } + * + * Into: + * const __codeflash_tracer__ = require('codeflash/tracer'); + * function foo(a, b) { + * return __codeflash_tracer__.wrap(function foo(a, b) { return a + b; }, 'foo', '/path/file.js', 1) + * .apply(this, arguments); + * } + * + * Supported function types: + * - FunctionDeclaration: function foo() {} + * - FunctionExpression: const foo = function() {} + * - ArrowFunctionExpression: const foo = () => {} + * - ClassMethod: class Foo { bar() {} } + * - ObjectMethod: const obj = { foo() {} } + * + * Configuration (via plugin options or environment variables): + * - functions: Array of function names to trace (traces all if not set) + * - files: Array of file patterns to trace (traces all if not set) + * - exclude: Array of patterns to exclude from tracing + * + * Usage with @babel/register: + * require('@babel/register')({ + * plugins: [['codeflash/babel-tracer-plugin', { functions: ['myFunc'] }]], + * }); + * + * Environment Variables: + * CODEFLASH_FUNCTIONS - JSON array of functions to trace + * CODEFLASH_TRACE_FILES - JSON array of file patterns to trace + * CODEFLASH_TRACE_EXCLUDE - JSON array of patterns to exclude + */ + +'use strict'; + +const path = require('path'); + +// Parse environment variables for configuration +function getEnvConfig() { + const config = { + functions: null, + files: null, + exclude: null, + }; + + try { + if (process.env.CODEFLASH_FUNCTIONS) { + config.functions = JSON.parse(process.env.CODEFLASH_FUNCTIONS); + } + } catch (e) { + console.error('[codeflash-babel] Failed to parse CODEFLASH_FUNCTIONS:', e.message); + } + + try { + if (process.env.CODEFLASH_TRACE_FILES) { + config.files = JSON.parse(process.env.CODEFLASH_TRACE_FILES); + } + } catch (e) { + console.error('[codeflash-babel] Failed to parse CODEFLASH_TRACE_FILES:', e.message); + } + + try { + if (process.env.CODEFLASH_TRACE_EXCLUDE) { + config.exclude = JSON.parse(process.env.CODEFLASH_TRACE_EXCLUDE); + } + } catch (e) { + console.error('[codeflash-babel] Failed to parse CODEFLASH_TRACE_EXCLUDE:', e.message); + } + + return config; +} + +/** + * Check if a function should be traced based on configuration. + * + * @param {string} funcName - Function name + * @param {string} fileName - File path + * @param {string|null} className - Class name (for methods) + * @param {Object} config - Plugin configuration + * @returns {boolean} - True if function should be traced + */ +function shouldTraceFunction(funcName, fileName, className, config) { + // Check exclude patterns first + if (config.exclude && config.exclude.length > 0) { + for (const pattern of config.exclude) { + if (typeof pattern === 'string') { + if (funcName === pattern || fileName.includes(pattern)) { + return false; + } + } else if (pattern instanceof RegExp) { + if (pattern.test(funcName) || pattern.test(fileName)) { + return false; + } + } + } + } + + // Check file patterns + if (config.files && config.files.length > 0) { + const matchesFile = config.files.some(pattern => { + if (typeof pattern === 'string') { + return fileName.includes(pattern); + } + if (pattern instanceof RegExp) { + return pattern.test(fileName); + } + return false; + }); + if (!matchesFile) return false; + } + + // Check function names + if (config.functions && config.functions.length > 0) { + const matchesName = config.functions.some(f => { + if (typeof f === 'string') { + return f === funcName || f === `${className}.${funcName}`; + } + // Support object format: { function: 'name', file: 'path', class: 'className' } + if (typeof f === 'object' && f !== null) { + if (f.function && f.function !== funcName) return false; + if (f.file && !fileName.includes(f.file)) return false; + if (f.class && f.class !== className) return false; + return true; + } + return false; + }); + if (!matchesName) return false; + } + + return true; +} + +/** + * Check if a path should be excluded from tracing (node_modules, etc.) + * + * @param {string} fileName - File path + * @returns {boolean} - True if file should be excluded + */ +function isExcludedPath(fileName) { + // Always exclude node_modules + if (fileName.includes('node_modules')) return true; + + // Exclude common test runner internals + if (fileName.includes('jest-runner') || fileName.includes('jest-jasmine')) return true; + if (fileName.includes('@vitest')) return true; + + // Exclude this plugin itself + if (fileName.includes('codeflash/runtime')) return true; + if (fileName.includes('babel-tracer-plugin')) return true; + + return false; +} + +/** + * Create the Babel plugin. + * + * @param {Object} babel - Babel object with types (t) + * @returns {Object} - Babel plugin configuration + */ +module.exports = function codeflashTracerPlugin(babel) { + const { types: t } = babel; + + // Merge environment config with plugin options + const envConfig = getEnvConfig(); + + return { + name: 'codeflash-tracer', + + visitor: { + Program: { + enter(programPath, state) { + // Merge options from plugin config and environment + state.codeflashConfig = { + ...envConfig, + ...(state.opts || {}), + }; + + // Track whether we've added the tracer import + state.tracerImportAdded = false; + + // Get file info + state.fileName = state.filename || state.file.opts.filename || 'unknown'; + + // Check if entire file should be excluded + if (isExcludedPath(state.fileName)) { + state.skipFile = true; + return; + } + + state.skipFile = false; + }, + + exit(programPath, state) { + // Add tracer import if we instrumented any functions + if (state.tracerImportAdded) { + const tracerRequire = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('__codeflash_tracer__'), + t.callExpression( + t.identifier('require'), + [t.stringLiteral('codeflash/tracer')] + ) + ), + ]); + + // Add at the beginning of the program + programPath.unshiftContainer('body', tracerRequire); + } + }, + }, + + // Handle: function foo() {} + FunctionDeclaration(path, state) { + if (state.skipFile) return; + if (!path.node.id) return; // Skip anonymous functions + + const funcName = path.node.id.name; + const lineNumber = path.node.loc ? path.node.loc.start.line : 0; + + if (!shouldTraceFunction(funcName, state.fileName, null, state.codeflashConfig)) { + return; + } + + // Transform the function body to wrap with tracing + wrapFunctionBody(t, path, funcName, state.fileName, lineNumber, null); + state.tracerImportAdded = true; + }, + + // Handle: const foo = function() {} or const foo = () => {} + VariableDeclarator(path, state) { + if (state.skipFile) return; + if (!t.isIdentifier(path.node.id)) return; + if (!path.node.init) return; + + const init = path.node.init; + if (!t.isFunctionExpression(init) && !t.isArrowFunctionExpression(init)) { + return; + } + + const funcName = path.node.id.name; + const lineNumber = path.node.loc ? path.node.loc.start.line : 0; + + if (!shouldTraceFunction(funcName, state.fileName, null, state.codeflashConfig)) { + return; + } + + // Wrap the function expression with tracer.wrap() + path.node.init = createWrapperCall(t, init, funcName, state.fileName, lineNumber, null); + state.tracerImportAdded = true; + }, + + // Handle: class Foo { bar() {} } + ClassMethod(path, state) { + if (state.skipFile) return; + if (path.node.kind === 'constructor') return; // Skip constructors for now + + const funcName = path.node.key.name || (path.node.key.value && String(path.node.key.value)); + if (!funcName) return; + + // Get class name from parent + const classPath = path.findParent(p => t.isClassDeclaration(p) || t.isClassExpression(p)); + const className = classPath && classPath.node.id ? classPath.node.id.name : null; + + const lineNumber = path.node.loc ? path.node.loc.start.line : 0; + + if (!shouldTraceFunction(funcName, state.fileName, className, state.codeflashConfig)) { + return; + } + + // Wrap the method body + wrapMethodBody(t, path, funcName, state.fileName, lineNumber, className); + state.tracerImportAdded = true; + }, + + // Handle: const obj = { foo() {} } + ObjectMethod(path, state) { + if (state.skipFile) return; + + const funcName = path.node.key.name || (path.node.key.value && String(path.node.key.value)); + if (!funcName) return; + + const lineNumber = path.node.loc ? path.node.loc.start.line : 0; + + if (!shouldTraceFunction(funcName, state.fileName, null, state.codeflashConfig)) { + return; + } + + // Wrap the method body + wrapMethodBody(t, path, funcName, state.fileName, lineNumber, null); + state.tracerImportAdded = true; + }, + }, + }; +}; + +/** + * Create a __codeflash_tracer__.wrap() call expression. + * + * @param {Object} t - Babel types + * @param {Object} funcNode - The function AST node + * @param {string} funcName - Function name + * @param {string} fileName - File path + * @param {number} lineNumber - Line number + * @param {string|null} className - Class name + * @returns {Object} - Call expression AST node + */ +function createWrapperCall(t, funcNode, funcName, fileName, lineNumber, className) { + const args = [ + funcNode, + t.stringLiteral(funcName), + t.stringLiteral(fileName), + t.numericLiteral(lineNumber), + ]; + + if (className) { + args.push(t.stringLiteral(className)); + } else { + args.push(t.nullLiteral()); + } + + return t.callExpression( + t.memberExpression( + t.identifier('__codeflash_tracer__'), + t.identifier('wrap') + ), + args + ); +} + +/** + * Wrap a function declaration's body with tracing. + * Transforms: + * function foo(a, b) { return a + b; } + * Into: + * function foo(a, b) { + * const __original__ = function(a, b) { return a + b; }; + * return __codeflash_tracer__.wrap(__original__, 'foo', 'file.js', 1, null).apply(this, arguments); + * } + * + * @param {Object} t - Babel types + * @param {Object} path - Babel path + * @param {string} funcName - Function name + * @param {string} fileName - File path + * @param {number} lineNumber - Line number + * @param {string|null} className - Class name + */ +function wrapFunctionBody(t, path, funcName, fileName, lineNumber, className) { + const node = path.node; + const isAsync = node.async; + const isGenerator = node.generator; + + // Create a copy of the original function as an expression + const originalFunc = t.functionExpression( + null, // anonymous + node.params, + node.body, + isGenerator, + isAsync + ); + + // Create the wrapper call + const wrapperCall = createWrapperCall(t, originalFunc, funcName, fileName, lineNumber, className); + + // Create: return __codeflash_tracer__.wrap(...).apply(this, arguments) + const applyCall = t.callExpression( + t.memberExpression(wrapperCall, t.identifier('apply')), + [t.thisExpression(), t.identifier('arguments')] + ); + + const returnStatement = t.returnStatement(applyCall); + + // Replace the function body + node.body = t.blockStatement([returnStatement]); +} + +/** + * Wrap a method's body with tracing. + * Similar to wrapFunctionBody but preserves method semantics. + * + * @param {Object} t - Babel types + * @param {Object} path - Babel path + * @param {string} funcName - Function name + * @param {string} fileName - File path + * @param {number} lineNumber - Line number + * @param {string|null} className - Class name + */ +function wrapMethodBody(t, path, funcName, fileName, lineNumber, className) { + const node = path.node; + const isAsync = node.async; + const isGenerator = node.generator; + + // Create a copy of the original function as an expression + const originalFunc = t.functionExpression( + null, // anonymous + node.params, + node.body, + isGenerator, + isAsync + ); + + // Create the wrapper call + const wrapperCall = createWrapperCall(t, originalFunc, funcName, fileName, lineNumber, className); + + // Create: return __codeflash_tracer__.wrap(...).apply(this, arguments) + const applyCall = t.callExpression( + t.memberExpression(wrapperCall, t.identifier('apply')), + [t.thisExpression(), t.identifier('arguments')] + ); + + let returnStatement; + if (isAsync) { + // For async methods, we need to await the result + returnStatement = t.returnStatement(t.awaitExpression(applyCall)); + } else { + returnStatement = t.returnStatement(applyCall); + } + + // Replace the function body + node.body = t.blockStatement([returnStatement]); +} + +// Export helper functions for testing +module.exports.shouldTraceFunction = shouldTraceFunction; +module.exports.isExcludedPath = isExcludedPath; +module.exports.getEnvConfig = getEnvConfig; diff --git a/packages/codeflash/runtime/index.js b/packages/codeflash/runtime/index.js index 982912c24..864b03066 100644 --- a/packages/codeflash/runtime/index.js +++ b/packages/codeflash/runtime/index.js @@ -8,6 +8,8 @@ * - capturePerf: Capture performance metrics (timing only) * - serialize/deserialize: Value serialization for storage * - comparator: Deep equality comparison + * - tracer: Function tracing for replay test generation + * - replay: Replay test utilities * * Usage (CommonJS): * const { capture, capturePerf } = require('codeflash'); @@ -30,6 +32,22 @@ const comparator = require('./comparator'); // Result comparison (used by CLI) const compareResults = require('./compare-results'); +// Function tracing (for replay test generation) +let tracer = null; +try { + tracer = require('./tracer'); +} catch (e) { + // Tracer may not be available if better-sqlite3 is not installed +} + +// Replay test utilities +let replay = null; +try { + replay = require('./replay'); +} catch (e) { + // Replay may not be available +} + // Re-export all public APIs module.exports = { // === Main Instrumentation API === @@ -88,4 +106,24 @@ module.exports = { // === Feature Detection === hasV8: serializer.hasV8, hasMsgpack: serializer.hasMsgpack, + + // === Function Tracing (for replay test generation) === + tracer: tracer ? { + init: tracer.init, + wrap: tracer.wrap, + createWrapper: tracer.createWrapper, + disable: tracer.disable, + enable: tracer.enable, + getStats: tracer.getStats, + } : null, + + // === Replay Test Utilities === + replay: replay ? { + getNextArg: replay.getNextArg, + getTracesWithMetadata: replay.getTracesWithMetadata, + getTracedFunctions: replay.getTracedFunctions, + getTraceMetadata: replay.getTraceMetadata, + generateReplayTest: replay.generateReplayTest, + createReplayTestFromTrace: replay.createReplayTestFromTrace, + } : null, }; diff --git a/packages/codeflash/runtime/replay.js b/packages/codeflash/runtime/replay.js new file mode 100644 index 000000000..733fed41e --- /dev/null +++ b/packages/codeflash/runtime/replay.js @@ -0,0 +1,454 @@ +/** + * Codeflash Replay Test Utilities + * + * This module provides utilities for generating and running replay tests + * from traced function calls. Replay tests allow verifying that optimized + * code produces the same results as the original code. + * + * Usage: + * const { getNextArg, createReplayTest } = require('codeflash/replay'); + * + * // In a test file: + * describe('Replay tests', () => { + * test.each(getNextArg(traceFile, 'myFunction', '/path/file.js', 25)) + * ('myFunction replay %#', (args) => { + * myFunction(...args); + * }); + * }); + * + * The module supports both Jest and Vitest test frameworks. + */ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); + +// Load the codeflash serializer for argument deserialization +const serializer = require('./serializer'); + +// ============================================================================ +// DATABASE ACCESS +// ============================================================================ + +/** + * Open a SQLite database connection. + * + * @param {string} dbPath - Path to the SQLite database + * @returns {Object|null} - Database connection or null if failed + */ +function openDatabase(dbPath) { + try { + const Database = require('better-sqlite3'); + return new Database(dbPath, { readonly: true }); + } catch (e) { + console.error('[codeflash-replay] Failed to open database:', e.message); + return null; + } +} + +/** + * Get traced function calls from the database. + * + * @param {string} traceFile - Path to the trace SQLite database + * @param {string} functionName - Name of the function + * @param {string} fileName - Path to the source file + * @param {string|null} className - Class name (for methods) + * @param {number} limit - Maximum number of traces to retrieve + * @returns {Array} - Array of traced arguments + */ +function getNextArg(traceFile, functionName, fileName, limit = 25, className = null) { + const db = openDatabase(traceFile); + if (!db) { + return []; + } + + try { + let stmt; + let rows; + + if (className) { + stmt = db.prepare(` + SELECT args FROM function_calls + WHERE function = ? AND filename = ? AND classname = ? AND type = 'call' + ORDER BY time_ns ASC + LIMIT ? + `); + rows = stmt.all(functionName, fileName, className, limit); + } else { + stmt = db.prepare(` + SELECT args FROM function_calls + WHERE function = ? AND filename = ? AND type = 'call' + ORDER BY time_ns ASC + LIMIT ? + `); + rows = stmt.all(functionName, fileName, limit); + } + + db.close(); + + // Deserialize arguments + return rows.map((row, index) => { + try { + const args = serializer.deserialize(row.args); + return args; + } catch (e) { + console.warn(`[codeflash-replay] Failed to deserialize args at index ${index}:`, e.message); + return []; + } + }); + } catch (e) { + console.error('[codeflash-replay] Database query failed:', e.message); + db.close(); + return []; + } +} + +/** + * Get traced function calls with full metadata. + * + * @param {string} traceFile - Path to the trace SQLite database + * @param {string} functionName - Name of the function + * @param {string} fileName - Path to the source file + * @param {string|null} className - Class name (for methods) + * @param {number} limit - Maximum number of traces to retrieve + * @returns {Array} - Array of trace objects with args and metadata + */ +function getTracesWithMetadata(traceFile, functionName, fileName, limit = 25, className = null) { + const db = openDatabase(traceFile); + if (!db) { + return []; + } + + try { + let stmt; + let rows; + + if (className) { + stmt = db.prepare(` + SELECT type, function, classname, filename, line_number, time_ns, args + FROM function_calls + WHERE function = ? AND filename = ? AND classname = ? AND type = 'call' + ORDER BY time_ns ASC + LIMIT ? + `); + rows = stmt.all(functionName, fileName, className, limit); + } else { + stmt = db.prepare(` + SELECT type, function, classname, filename, line_number, time_ns, args + FROM function_calls + WHERE function = ? AND filename = ? AND type = 'call' + ORDER BY time_ns ASC + LIMIT ? + `); + rows = stmt.all(functionName, fileName, limit); + } + + db.close(); + + // Deserialize arguments and return with metadata + return rows.map((row, index) => { + let args; + try { + args = serializer.deserialize(row.args); + } catch (e) { + console.warn(`[codeflash-replay] Failed to deserialize args at index ${index}:`, e.message); + args = []; + } + + return { + args, + function: row.function, + className: row.classname, + fileName: row.filename, + lineNumber: row.line_number, + timeNs: row.time_ns, + }; + }); + } catch (e) { + console.error('[codeflash-replay] Database query failed:', e.message); + db.close(); + return []; + } +} + +/** + * Get all traced functions from the database. + * + * @param {string} traceFile - Path to the trace SQLite database + * @returns {Array} - Array of { function, fileName, className, count } objects + */ +function getTracedFunctions(traceFile) { + const db = openDatabase(traceFile); + if (!db) { + return []; + } + + try { + const stmt = db.prepare(` + SELECT function, filename, classname, COUNT(*) as count + FROM function_calls + WHERE type = 'call' + GROUP BY function, filename, classname + ORDER BY count DESC + `); + const rows = stmt.all(); + db.close(); + + return rows.map(row => ({ + function: row.function, + fileName: row.filename, + className: row.classname, + count: row.count, + })); + } catch (e) { + console.error('[codeflash-replay] Failed to get traced functions:', e.message); + db.close(); + return []; + } +} + +/** + * Get metadata from the trace database. + * + * @param {string} traceFile - Path to the trace SQLite database + * @returns {Object} - Metadata key-value pairs + */ +function getTraceMetadata(traceFile) { + const db = openDatabase(traceFile); + if (!db) { + return {}; + } + + try { + const stmt = db.prepare('SELECT key, value FROM metadata'); + const rows = stmt.all(); + db.close(); + + const metadata = {}; + for (const row of rows) { + metadata[row.key] = row.value; + } + return metadata; + } catch (e) { + console.error('[codeflash-replay] Failed to get metadata:', e.message); + db.close(); + return {}; + } +} + +// ============================================================================ +// TEST GENERATION +// ============================================================================ + +/** + * Generate a Jest/Vitest replay test file. + * + * @param {string} traceFile - Path to the trace SQLite database + * @param {Array} functions - Array of { function, fileName, className, modulePath } to test + * @param {Object} options - Generation options + * @returns {string} - Generated test file content + */ +function generateReplayTest(traceFile, functions, options = {}) { + const { + framework = 'jest', // 'jest' or 'vitest' + maxRunCount = 100, + outputPath = null, + } = options; + + const isVitest = framework === 'vitest'; + + // Build imports section + const imports = []; + + if (isVitest) { + imports.push("import { describe, test } from 'vitest';"); + } + + imports.push("const { getNextArg } = require('codeflash/replay');"); + imports.push(''); + + // Build function imports + for (const func of functions) { + const alias = getFunctionAlias(func.modulePath, func.function, func.className); + + if (func.className) { + // Import class for method testing + imports.push(`const { ${func.className}: ${alias}_class } = require('${func.modulePath}');`); + } else { + // Import function directly + imports.push(`const { ${func.function}: ${alias} } = require('${func.modulePath}');`); + } + } + + imports.push(''); + + // Metadata + const metadata = [ + `const traceFilePath = '${traceFile}';`, + `const functions = ${JSON.stringify(functions.map(f => f.function))};`, + '', + ]; + + // Build test cases + const testCases = []; + + for (const func of functions) { + const alias = getFunctionAlias(func.modulePath, func.function, func.className); + const testName = func.className + ? `${func.className}.${func.function}` + : func.function; + + if (func.className) { + // Method test + testCases.push(` +describe('Replay: ${testName}', () => { + const traces = getNextArg(traceFilePath, '${func.function}', '${func.fileName}', ${maxRunCount}, '${func.className}'); + + test.each(traces.map((args, i) => [i, args]))('call %i', (index, args) => { + // For instance methods, first arg is 'this' context + const [thisArg, ...methodArgs] = args; + const instance = thisArg || new ${alias}_class(); + instance.${func.function}(...methodArgs); + }); +}); +`); + } else { + // Function test + testCases.push(` +describe('Replay: ${testName}', () => { + const traces = getNextArg(traceFilePath, '${func.function}', '${func.fileName}', ${maxRunCount}); + + test.each(traces.map((args, i) => [i, args]))('call %i', (index, args) => { + ${alias}(...args); + }); +}); +`); + } + } + + // Combine all parts + const content = [ + '// Auto-generated replay test by Codeflash', + '// Do not edit this file directly', + '', + ...imports, + ...metadata, + ...testCases, + ].join('\n'); + + // Write to file if outputPath provided + if (outputPath) { + const dir = path.dirname(outputPath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(outputPath, content); + console.log(`[codeflash-replay] Generated test file: ${outputPath}`); + } + + return content; +} + +/** + * Create a function alias for imports to avoid naming conflicts. + * + * @param {string} modulePath - Module path + * @param {string} functionName - Function name + * @param {string|null} className - Class name + * @returns {string} - Alias name + */ +function getFunctionAlias(modulePath, functionName, className = null) { + // Normalize module path to valid identifier + const moduleAlias = modulePath + .replace(/[^a-zA-Z0-9]/g, '_') + .replace(/^_+|_+$/g, ''); + + if (className) { + return `${moduleAlias}_${className}_${functionName}`; + } + return `${moduleAlias}_${functionName}`; +} + +/** + * Create replay tests from a trace file. + * This is the main entry point for Python integration. + * + * @param {string} traceFile - Path to the trace SQLite database + * @param {string} outputPath - Path to write the test file + * @param {Object} options - Generation options + * @returns {Object} - { success, outputPath, functions } + */ +function createReplayTestFromTrace(traceFile, outputPath, options = {}) { + const { + framework = 'jest', + maxRunCount = 100, + projectRoot = process.cwd(), + } = options; + + // Get all traced functions + const tracedFunctions = getTracedFunctions(traceFile); + + if (tracedFunctions.length === 0) { + console.warn('[codeflash-replay] No traced functions found in database'); + return { success: false, outputPath: null, functions: [] }; + } + + // Convert to the format expected by generateReplayTest + const functions = tracedFunctions.map(tf => { + // Calculate module path from file name + let modulePath = tf.fileName; + + // Make relative to project root + if (path.isAbsolute(modulePath)) { + modulePath = path.relative(projectRoot, modulePath); + } + + // Convert to module path (remove .js extension, use forward slashes) + modulePath = './' + modulePath + .replace(/\\/g, '/') + .replace(/\.js$/, '') + .replace(/\.ts$/, ''); + + return { + function: tf.function, + fileName: tf.fileName, + className: tf.className, + modulePath, + }; + }); + + // Generate the test file + const testContent = generateReplayTest(traceFile, functions, { + framework, + maxRunCount, + outputPath, + }); + + return { + success: true, + outputPath, + functions: functions.map(f => f.function), + content: testContent, + }; +} + +// ============================================================================ +// EXPORTS +// ============================================================================ + +module.exports = { + // Core API + getNextArg, + getTracesWithMetadata, + getTracedFunctions, + getTraceMetadata, + + // Test generation + generateReplayTest, + createReplayTestFromTrace, + getFunctionAlias, + + // Database utilities + openDatabase, +}; diff --git a/packages/codeflash/runtime/trace-runner.js b/packages/codeflash/runtime/trace-runner.js new file mode 100644 index 000000000..f8e34148f --- /dev/null +++ b/packages/codeflash/runtime/trace-runner.js @@ -0,0 +1,381 @@ +#!/usr/bin/env node +/** + * Codeflash Trace Runner + * + * Entry point script that runs JavaScript/TypeScript code with function tracing enabled. + * This script: + * 1. Registers Babel with the tracer plugin for AST transformation + * 2. Sets up environment variables for tracing configuration + * 3. Runs the user's script, tests, or module + * + * Usage: + * # Run a script with tracing + * node trace-runner.js script.js + * + * # Run tests with tracing (Jest) + * node trace-runner.js --jest -- --testPathPattern=mytest + * + * # Run tests with tracing (Vitest) + * node trace-runner.js --vitest -- --run + * + * # Run with specific functions to trace + * node trace-runner.js --functions='["myFunc","otherFunc"]' script.js + * + * Environment Variables (also settable via command line): + * CODEFLASH_TRACE_DB - Path to SQLite database for storing traces + * CODEFLASH_PROJECT_ROOT - Project root for relative path calculation + * CODEFLASH_FUNCTIONS - JSON array of functions to trace + * CODEFLASH_MAX_FUNCTION_COUNT - Maximum traces per function (default: 256) + * CODEFLASH_TRACER_TIMEOUT - Timeout in seconds for tracing + * + * For ESM (ECMAScript modules), use the loader flag: + * node --loader ./esm-loader.mjs trace-runner.js script.mjs + */ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); + +// ============================================================================ +// ARGUMENT PARSING +// ============================================================================ + +function parseArgs(args) { + const config = { + traceDb: process.env.CODEFLASH_TRACE_DB || path.join(process.cwd(), 'codeflash.trace.sqlite'), + projectRoot: process.env.CODEFLASH_PROJECT_ROOT || process.cwd(), + functions: process.env.CODEFLASH_FUNCTIONS || null, + maxFunctionCount: process.env.CODEFLASH_MAX_FUNCTION_COUNT || '256', + tracerTimeout: process.env.CODEFLASH_TRACER_TIMEOUT || null, + traceFiles: process.env.CODEFLASH_TRACE_FILES || null, + traceExclude: process.env.CODEFLASH_TRACE_EXCLUDE || null, + jest: false, + vitest: false, + module: false, + script: null, + scriptArgs: [], + }; + + let i = 0; + while (i < args.length) { + const arg = args[i]; + + if (arg === '--trace-db') { + config.traceDb = args[++i]; + } else if (arg.startsWith('--trace-db=')) { + config.traceDb = arg.split('=')[1]; + } else if (arg === '--project-root') { + config.projectRoot = args[++i]; + } else if (arg.startsWith('--project-root=')) { + config.projectRoot = arg.split('=')[1]; + } else if (arg === '--functions') { + config.functions = args[++i]; + } else if (arg.startsWith('--functions=')) { + config.functions = arg.split('=')[1]; + } else if (arg === '--max-function-count') { + config.maxFunctionCount = args[++i]; + } else if (arg.startsWith('--max-function-count=')) { + config.maxFunctionCount = arg.split('=')[1]; + } else if (arg === '--timeout') { + config.tracerTimeout = args[++i]; + } else if (arg.startsWith('--timeout=')) { + config.tracerTimeout = arg.split('=')[1]; + } else if (arg === '--trace-files') { + config.traceFiles = args[++i]; + } else if (arg.startsWith('--trace-files=')) { + config.traceFiles = arg.split('=')[1]; + } else if (arg === '--trace-exclude') { + config.traceExclude = args[++i]; + } else if (arg.startsWith('--trace-exclude=')) { + config.traceExclude = arg.split('=')[1]; + } else if (arg === '--jest') { + config.jest = true; + } else if (arg === '--vitest') { + config.vitest = true; + } else if (arg === '-m' || arg === '--module') { + config.module = true; + } else if (arg === '--') { + // Everything after -- is passed to the script/test runner + config.scriptArgs = args.slice(i + 1); + break; + } else if (arg === '--help' || arg === '-h') { + printHelp(); + process.exit(0); + } else if (!arg.startsWith('-')) { + // First non-flag argument is the script + config.script = arg; + config.scriptArgs = args.slice(i + 1); + break; + } + + i++; + } + + return config; +} + +function printHelp() { + console.log(` +Codeflash Trace Runner - JavaScript Function Tracing + +Usage: + trace-runner [options]