From 37c26da28ee63fd8f3aafd813bce9dad48a75110 Mon Sep 17 00:00:00 2001 From: aq Date: Tue, 24 Dec 2024 11:34:49 +0400 Subject: [PATCH 01/10] feat: implement string representation for TypeBuilder - Add Display implementation for TypeBuilder and related structs - Add Python bindings for string representation - Add comprehensive test cases for both Rust and Python - Add detailed documentation for string formatting --- engine/baml-lib/baml-types/src/lib.rs | 9 + engine/baml-runtime/src/type_builder/mod.rs | 329 ++++++++++++++++-- .../python_src/baml_py/type_builder.py | 45 ++- .../src/types/type_builder.rs | 17 + integ-tests/python/test_type_builder_str.py | 78 +++++ 5 files changed, 442 insertions(+), 36 deletions(-) create mode 100644 integ-tests/python/test_type_builder_str.py diff --git a/engine/baml-lib/baml-types/src/lib.rs b/engine/baml-lib/baml-types/src/lib.rs index 2b56a7935..84b7d982e 100644 --- a/engine/baml-lib/baml-types/src/lib.rs +++ b/engine/baml-lib/baml-types/src/lib.rs @@ -16,3 +16,12 @@ pub use map::Map as BamlMap; pub use media::{BamlMedia, BamlMediaContent, BamlMediaType, MediaBase64, MediaUrl}; pub use minijinja::JinjaExpression; pub use value_expr::{EvaluationContext, GetEnvVar, ResolvedValue, StringOr, UnresolvedValue}; + +impl BamlValue { + pub fn as_string(&self) -> Option<&str> { + match self { + BamlValue::String(s) => Some(s), + _ => None, + } + } +} diff --git a/engine/baml-runtime/src/type_builder/mod.rs b/engine/baml-runtime/src/type_builder/mod.rs index 72fabece2..badc404dd 100644 --- a/engine/baml-runtime/src/type_builder/mod.rs +++ b/engine/baml-runtime/src/type_builder/mod.rs @@ -1,4 +1,5 @@ use std::sync::{Arc, Mutex}; +use std::fmt; use baml_types::{BamlValue, FieldType}; use indexmap::IndexMap; @@ -133,39 +134,150 @@ impl EnumBuilder { } } -impl std::fmt::Debug for TypeBuilder { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - // Start the debug printout with the struct name - writeln!(f, "TypeBuilder {{")?; - - // Safely attempt to acquire the lock and print classes - write!(f, " classes: ")?; - match self.classes.lock() { - Ok(classes) => { - // We iterate through the keys only to avoid deadlocks and because we might not be able to print the values - // safely without deep control over locking mechanisms - let keys: Vec<_> = classes.keys().collect(); - writeln!(f, "{:?},", keys)? +impl fmt::Display for ClassPropertyBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let meta = self.meta.lock().unwrap(); + let alias = meta.get("alias").and_then(|v| v.as_string()); + let desc = meta.get("description").and_then(|v| v.as_string()); + + write!(f, "{}", self.r#type.lock().unwrap().as_ref().map_or("unset", |_| "set"))?; + if let Some(alias) = alias { + write!(f, " (alias='{}'", alias)?; + if let Some(desc) = desc { + write!(f, ", desc='{}'", desc)?; } - Err(_) => writeln!(f, "Cannot acquire lock,")?, + write!(f, ")")?; + } else if let Some(desc) = desc { + write!(f, " (desc='{}')", desc)?; } + Ok(()) + } +} - // Safely attempt to acquire the lock and print enums - write!(f, " enums: ")?; - match self.enums.lock() { - Ok(enums) => { - // Similarly, print only the keys - let keys: Vec<_> = enums.keys().collect(); - writeln!(f, "{:?}", keys)? +impl fmt::Display for ClassBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let properties = self.properties.lock().unwrap(); + write!(f, "{{")?; + if !properties.is_empty() { + write!(f, " ")?; + for (i, (name, prop)) in properties.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{} {}", name, prop.lock().unwrap())?; } - Err(_) => writeln!(f, "Cannot acquire lock,")?, + write!(f, " ")?; } + write!(f, "}}") + } +} + +impl fmt::Display for EnumValueBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let meta = self.meta.lock().unwrap(); + let alias = meta.get("alias").and_then(|v| v.as_string()); + let desc = meta.get("description").and_then(|v| v.as_string()); + + if let Some(alias) = alias { + write!(f, " (alias='{}'", alias)?; + if let Some(desc) = desc { + write!(f, ", desc='{}'", desc)?; + } + write!(f, ")")?; + } else if let Some(desc) = desc { + write!(f, " (desc='{}')", desc)?; + } + Ok(()) + } +} - // Close the struct printout +impl fmt::Display for EnumBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let values = self.values.lock().unwrap(); + write!(f, "{{")?; + if !values.is_empty() { + write!(f, " ")?; + for (i, (name, value)) in values.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{}{}", name, value.lock().unwrap())?; + } + write!(f, " ")?; + } write!(f, "}}") } } +/// implements a string representation for typebuilder. +/// +/// this implementation provides a clear, hierarchical view of the typebuilder's structure, +/// making it easy to understand the defined types and their metadata at a glance. +/// +/// # Format +/// ```text +/// TypeBuilder( +/// Classes: [ +/// ClassName { +/// property_name type (alias='custom_name', desc='property description'), +/// another_property type (desc='another description'), +/// simple_property type +/// }, +/// EmptyClass { } +/// ], +/// Enums: [ +/// EnumName { +/// VALUE (alias='custom_value', desc='value description'), +/// ANOTHER_VALUE (alias='custom'), +/// SIMPLE_VALUE +/// }, +/// EmptyEnum { } +/// ] +/// ) +/// ``` +/// +/// # properties shown +/// - class and property names +/// - property types (set/unset) +/// - property metadata (aliases, descriptions) +/// - enum values and their metadata +/// - empty classes and enums +impl fmt::Display for TypeBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let classes = self.classes.lock().unwrap(); + let enums = self.enums.lock().unwrap(); + + write!(f, "TypeBuilder(")?; + + if !classes.is_empty() { + write!(f, "Classes: [")?; + for (i, (name, cls)) in classes.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{} {}", name, cls.lock().unwrap())?; + } + write!(f, "]")?; + } + + if !enums.is_empty() { + if !classes.is_empty() { + write!(f, ", ")?; + } + write!(f, "Enums: [")?; + for (i, (name, e)) in enums.iter().enumerate() { + if i > 0 { + write!(f, ", ")?; + } + write!(f, "{} {}", name, e.lock().unwrap())?; + } + write!(f, "]")?; + } + + write!(f, ")") + } +} + #[derive(Clone)] pub struct TypeBuilder { classes: Arc>>>>, @@ -299,15 +411,166 @@ mod tests { #[test] fn test_type_builder() { let builder = TypeBuilder::new(); - let cls = builder.class("Person"); - let property = cls.lock().unwrap().property("name"); - property.lock().unwrap().r#type(FieldType::string()); - cls.lock() - .unwrap() - .property("age") - .lock() - .unwrap() - .r#type(FieldType::int()) - .with_meta("alias", BamlValue::String("years".to_string())); + + // Add a class with properties and metadata + let cls = builder.class("User"); + { + let cls = cls.lock().unwrap(); + // Add name property with alias and description + cls.property("name") + .lock() + .unwrap() + .r#type(FieldType::string()) + .with_meta("alias", BamlValue::String("username".to_string())) + .with_meta("description", BamlValue::String("The user's full name".to_string())); + + // Add age property with description only + cls.property("age") + .lock() + .unwrap() + .r#type(FieldType::int()) + .with_meta("description", BamlValue::String("User's age in years".to_string())); + + // Add email property with no metadata + cls.property("email") + .lock() + .unwrap() + .r#type(FieldType::string()); + } + + // Add an enum with values and metadata + let enm = builder.r#enum("Status"); + { + let enm = enm.lock().unwrap(); + // Add ACTIVE value with alias and description + enm.value("ACTIVE") + .lock() + .unwrap() + .with_meta("alias", BamlValue::String("active".to_string())) + .with_meta("description", BamlValue::String("User is active".to_string())); + + // Add INACTIVE value with alias only + enm.value("INACTIVE") + .lock() + .unwrap() + .with_meta("alias", BamlValue::String("inactive".to_string())); + + // Add PENDING value with no metadata + enm.value("PENDING"); + } + + // Convert to string and verify the format + let output = builder.to_string(); + assert_eq!( + output, + "TypeBuilder(Classes: [User { name set (alias='username', desc='The user\'s full name'), age set (desc='User\'s age in years'), email set }], Enums: [Status { ACTIVE (alias='active', desc='User is active'), INACTIVE (alias='inactive'), PENDING }])" + ); + } + + +// my paranoia kicked in, so tis test is to ensure that the string representation is correct +// and that the to_overrides method is working as expected + + #[test] + fn test_type_builder_advanced() { + let builder = TypeBuilder::new(); + + // 1. Complex class with nested types and all field types + let address = builder.class("Address"); + { + let address = address.lock().unwrap(); + // String with all metadata + address.property("street") + .lock() + .unwrap() + .r#type(FieldType::string()) + .with_meta("alias", BamlValue::String("streetAddress".to_string())) + .with_meta("description", BamlValue::String("Street address including number".to_string())); + + // Optional int with description + address.property("unit") + .lock() + .unwrap() + .r#type(FieldType::int().as_optional()) + .with_meta("description", BamlValue::String("Apartment/unit number if applicable".to_string())); + + // List of strings with alias + address.property("tags") + .lock() + .unwrap() + .r#type(FieldType::string().as_list()) + .with_meta("alias", BamlValue::String("labels".to_string())); + + // Boolean with no metadata + address.property("is_primary") + .lock() + .unwrap() + .r#type(FieldType::bool()); + + // Float with skip metadata + address.property("coordinates") + .lock() + .unwrap() + .r#type(FieldType::float()) + .with_meta("skip", BamlValue::Bool(true)); + } + + // 2. Empty class + builder.class("EmptyClass"); + + // 3. Complex enum with various metadata combinations + let priority = builder.r#enum("Priority"); + { + let priority = priority.lock().unwrap(); + // All metadata + priority.value("HIGH") + .lock() + .unwrap() + .with_meta("alias", BamlValue::String("urgent".to_string())) + .with_meta("description", BamlValue::String("Needs immediate attention".to_string())) + .with_meta("skip", BamlValue::Bool(false)); + + // Only description + priority.value("MEDIUM") + .lock() + .unwrap() + .with_meta("description", BamlValue::String("Standard priority".to_string())); + + // Only skip + priority.value("LOW") + .lock() + .unwrap() + .with_meta("skip", BamlValue::Bool(true)); + + // No metadata + priority.value("NONE"); + } + + // 4. Empty enum + builder.r#enum("EmptyEnum"); + + // Test string representation + let output = builder.to_string(); + assert_eq!( + output, + "TypeBuilder(Classes: [Address { street set (alias='streetAddress', desc='Street address including number'), unit set (desc='Apartment/unit number if applicable'), tags set (alias='labels'), is_primary set, coordinates set }, EmptyClass {}], Enums: [Priority { HIGH (alias='urgent', desc='Needs immediate attention'), MEDIUM (desc='Standard priority'), LOW, NONE }, EmptyEnum {}])" + ); + + // Test to_overrides() + let (classes, enums) = builder.to_overrides(); + + // Verify class overrides + assert_eq!(classes.len(), 2); + let address_override = classes.get("Address").unwrap(); + assert_eq!(address_override.new_fields.len(), 5); // All fields are new + assert!(address_override.new_fields.get("street").unwrap().1.alias.is_some()); + assert!(address_override.new_fields.get("coordinates").unwrap().1.skip.unwrap()); + + // Verify enum overrides + assert_eq!(enums.len(), 2); + let priority_override = enums.get("Priority").unwrap(); + assert_eq!(priority_override.values.len(), 4); + assert!(priority_override.values.get("HIGH").unwrap().alias.is_some()); + assert!(priority_override.values.get("LOW").unwrap().skip.unwrap()); } } diff --git a/engine/language_client_python/python_src/baml_py/type_builder.py b/engine/language_client_python/python_src/baml_py/type_builder.py index ff293a76e..d59476d38 100644 --- a/engine/language_client_python/python_src/baml_py/type_builder.py +++ b/engine/language_client_python/python_src/baml_py/type_builder.py @@ -15,19 +15,58 @@ def __init__(self, classes: typing.Set[str], enums: typing.Set[str]): self.__enums = enums self.__tb = _TypeBuilder() + def __str__(self) -> str: + """ + returns a comprehensive string representation of the typebuilder. + + this method provides a detailed view of the entire type hierarchy, + using the rust implementation to ensure compatibility. + + Format: + TypeBuilder( + Classes: [ + ClassName { + property_name type (alias='custom_name', desc='property description'), + another_property type (desc='another description'), + simple_property type + }, + EmptyClass { } + ], + Enums: [ + EnumName { + VALUE (alias='custom_value', desc='value description'), + ANOTHER_VALUE (alias='custom'), + SIMPLE_VALUE + }, + EmptyEnum { } + ] + ) + + the representation includes: + - complete class hierarchy with properties + - property types and their metadata (aliases, descriptions) + - full enum definitions with values + - enum value metadata (aliases, descriptions) + - empty classes and enums are shown explicitly + + returns: + str: the formatted string representation of the typebuilder + """ + return str(self._tb) + @property def _tb(self) -> _TypeBuilder: return self.__tb def string(self): return self._tb.string() - + def literal_string(self, value: str): return self._tb.literal_string(value) - + def literal_int(self, value: int): return self._tb.literal_int(value) - + def literal_bool(self, value: bool): return self._tb.literal_bool(value) diff --git a/engine/language_client_python/src/types/type_builder.rs b/engine/language_client_python/src/types/type_builder.rs index 4e9d698a3..60d6dc8b1 100644 --- a/engine/language_client_python/src/types/type_builder.rs +++ b/engine/language_client_python/src/types/type_builder.rs @@ -35,6 +35,23 @@ impl TypeBuilder { type_builder::TypeBuilder::new().into() } + /// provides a detailed string representation of the typebuilder for python users. + /// + /// this method exposes the rust-implemented string formatting to python, ensuring + /// consistent and professional output across both languages. the representation + /// includes a complete view of: + /// + /// * all defined classes with their properties + /// * all defined enums with their values + /// * metadata such as aliases and descriptions + /// * type information for properties + /// + /// the output format is carefully structured for readability, making it quite easy :D + /// to understand the complete type hierarchy at a glance. + pub fn __str__(&self) -> String { + self.inner.to_string() + } + pub fn r#enum(&self, name: &str) -> EnumBuilder { EnumBuilder { inner: self.inner.r#enum(name), diff --git a/integ-tests/python/test_type_builder_str.py b/integ-tests/python/test_type_builder_str.py new file mode 100644 index 000000000..fa93b8924 --- /dev/null +++ b/integ-tests/python/test_type_builder_str.py @@ -0,0 +1,78 @@ +import pytest +from baml_client.type_builder import TypeBuilder + +def test_type_builder_str(): + """ + test for typebuilder's string representation functionality. + + this test verifies that the typebuilder correctly represents its structure + in string format, ensuring proper exposure of the rust implementation to python. + + test coverage: + ------------- + 1. class representation: + - class names and structure + - property definitions with types + - property metadata: + * aliases for alternative naming + * descriptions for documentation + + 2. enum representation: + - enum names and structure + - value definitions + - value metadata: + * aliases for alternative naming + * descriptions for documentation + + 3. cross-language integration: + - verifies that the rust string representation is correctly + exposed through the python bindings + - ensures consistent formatting across language boundaries + """ + # Create a new TypeBuilder + tb = TypeBuilder() + + # Add a class with properties and metadata + user = tb.class_("User") + name_prop = user.property("name") + name_prop.type(tb.string()) + name_prop.with_meta("alias", "username") + name_prop.with_meta("description", "The user's full name") + + age_prop = user.property("age") + age_prop.type(tb.int()) + age_prop.with_meta("description", "User's age in years") + + email_prop = user.property("email") + email_prop.type(tb.string()) + + # Add an enum with values and metadata + status = tb.enum("Status") + active = status.value("ACTIVE") + active.with_meta("alias", "active") + active.with_meta("description", "User is active") + + inactive = status.value("INACTIVE") + inactive.with_meta("alias", "inactive") + + status.value("PENDING") + + # Convert to string and verify the format + output = str(tb) + print(f"TypeBuilder string representation:\n{output}") + + # Verify the expected format + assert "User" in output + assert "name" in output + assert "username" in output + assert "The user's full name" in output + assert "age" in output + assert "User's age in years" in output + assert "email" in output + assert "Status" in output + assert "ACTIVE" in output + assert "active" in output + assert "User is active" in output + assert "INACTIVE" in output + assert "inactive" in output + assert "PENDING" in output \ No newline at end of file From bbc3a1783b871633bebc290005297543e81daa3f Mon Sep 17 00:00:00 2001 From: aq Date: Wed, 25 Dec 2024 04:30:39 +0400 Subject: [PATCH 02/10] feat(typebuilder): add typescript wrapper and tests for type builder --- .../__test__/type_builder.test.ts | 69 +++++++++++++++++++ .../language_client_typescript/jest.config.js | 23 +++++++ engine/language_client_typescript/native.d.ts | 1 + .../language_client_typescript/package.json | 19 ++++- .../src/types/type_builder.rs | 42 +++++++++++ .../src/types/type_builder.ts | 43 ++++++++++++ 6 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 engine/language_client_typescript/__test__/type_builder.test.ts create mode 100644 engine/language_client_typescript/jest.config.js create mode 100644 engine/language_client_typescript/src/types/type_builder.ts diff --git a/engine/language_client_typescript/__test__/type_builder.test.ts b/engine/language_client_typescript/__test__/type_builder.test.ts new file mode 100644 index 000000000..b8fd34666 --- /dev/null +++ b/engine/language_client_typescript/__test__/type_builder.test.ts @@ -0,0 +1,69 @@ +// import the typescript wrapper for the type builder that provides a clean interface +// over the native rust implementation +import { TypeBuilder } from '../src/types/type_builder'; + +describe('TypeBuilder', () => { + // test that we can create classes with properties and add metadata like aliases and descriptions + it('should provide string representation for classes with properties and metadata', () => { + // create a fresh type builder instance to work with + const builder = new TypeBuilder(); + + // get a reference to a class named 'user', creating it if needed + const userClass = builder.getClass('User'); + + // add properties to the user class with helpful metadata + // the name property has both an alias and description + userClass.property('name') + .alias('username') // allows referencing the property as 'username' + .description('the user\'s full name'); // explains what this property represents + + // age property just has a description + userClass.property('age') + .description('user\'s age in years'); // clarifies the age units + + // email is a basic property with no extra metadata + userClass.property('email'); // simple email field + + // convert all the type definitions to a readable string + const output = builder.toString(); + + // make sure the output has the expected class structure + expect(output).toContain('TypeBuilder(Classes: [User {'); + // verify each property appears with its metadata + expect(output).toContain('name unset (alias=\'username\', desc=\'the user\'s full name\')'); + expect(output).toContain('age unset (desc=\'user\'s age in years\')'); + expect(output).toContain('email unset'); + }); + + // test that we can create enums with values and add metadata like aliases and descriptions + it('should provide string representation for enums with values and metadata', () => { + // create a fresh type builder instance to work with + const builder = new TypeBuilder(); + + // get a reference to an enum named 'status', creating it if needed + const statusEnum = builder.getEnum('Status'); + + // add possible values to the status enum with helpful metadata + // active state has both an alias and description + statusEnum.value('ACTIVE') + .alias('active') // allows using lowercase 'active' + .description('user is active'); // explains what active means + + // inactive state just has an alias + statusEnum.value('INACTIVE') + .alias('inactive'); // allows using lowercase 'inactive' + + // pending is a basic value with no extra metadata + statusEnum.value('PENDING'); // simple pending state + + // convert all the type definitions to a readable string + const output = builder.toString(); + + // make sure the output has the expected enum structure + expect(output).toContain('TypeBuilder(Enums: [Status {'); + // verify each value appears with its metadata + expect(output).toContain('ACTIVE (alias=\'active\', desc=\'user is active\')'); + expect(output).toContain('INACTIVE (alias=\'inactive\')'); + expect(output).toContain('PENDING'); + }); +}); \ No newline at end of file diff --git a/engine/language_client_typescript/jest.config.js b/engine/language_client_typescript/jest.config.js new file mode 100644 index 000000000..f637b5c99 --- /dev/null +++ b/engine/language_client_typescript/jest.config.js @@ -0,0 +1,23 @@ +/** + * this is our jest configuration for running typescript tests + * we use ts-jest to handle typescript compilation and testing + * @type {import('ts-jest').JestConfigWithTsJest} + */ +module.exports = { + // use the ts-jest preset which handles typescript files + preset: 'ts-jest', + + // run tests in a node environment rather than jsdom + testEnvironment: 'node', + + // look for both typescript and javascript files + moduleFileExtensions: ['ts', 'js'], + + // use ts-jest to transform typescript files before running tests + transform: { + '^.+\\.ts$': 'ts-jest', + }, + + // look for test files in __test__ directories that end in .test.ts + testMatch: ['**/__test__/**/*.test.ts'], +}; \ No newline at end of file diff --git a/engine/language_client_typescript/native.d.ts b/engine/language_client_typescript/native.d.ts index 5b34ee358..e937708ac 100644 --- a/engine/language_client_typescript/native.d.ts +++ b/engine/language_client_typescript/native.d.ts @@ -113,6 +113,7 @@ export declare class TypeBuilder { null(): FieldType map(key: FieldType, value: FieldType): FieldType union(types: Array): FieldType + toString(): string } export interface BamlLogEvent { diff --git a/engine/language_client_typescript/package.json b/engine/language_client_typescript/package.json index ce111573d..3baf21671 100644 --- a/engine/language_client_typescript/package.json +++ b/engine/language_client_typescript/package.json @@ -64,14 +64,17 @@ "format:biome": "biome --write .", "format:rs": "cargo fmt", "prepublishOnly": "napi prepublish --no-gh-release", - "test": "echo no tests implemented", + "test": "jest --config jest.config.js", "version": "napi version" }, "devDependencies": { "@biomejs/biome": "^1.7.3", "@napi-rs/cli": "3.0.0-alpha.62", + "@types/jest": "^29.5.14", "@types/node": "^20.12.11", + "jest": "^29.7.0", "npm-run-all2": "^6.1.2", + "ts-jest": "^29.1.1", "ts-node": "^10.9.2", "typescript": "^5.4.5" }, @@ -83,5 +86,19 @@ "author": "", "dependencies": { "@scarf/scarf": "^1.3.0" + }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node", + "moduleFileExtensions": [ + "ts", + "js" + ], + "transform": { + "^.+\\.ts$": "ts-jest" + }, + "testMatch": [ + "**/__test__/**/*.test.ts" + ] } } diff --git a/engine/language_client_typescript/src/types/type_builder.rs b/engine/language_client_typescript/src/types/type_builder.rs index 2074f62c1..7dad78977 100644 --- a/engine/language_client_typescript/src/types/type_builder.rs +++ b/engine/language_client_typescript/src/types/type_builder.rs @@ -1,28 +1,65 @@ +// This file provides the native bindings between our Rust implementation and TypeScript +// We use NAPI-RS to expose Rust functionality to JavaScript/TypeScript use baml_runtime::type_builder::{self, WithMeta}; use baml_types::BamlValue; use napi_derive::napi; +// Create TypeScript-compatible wrappers for our Rust types +// These macros generate the necessary code for TypeScript interop crate::lang_wrapper!(TypeBuilder, type_builder::TypeBuilder); + +// Thread-safe wrapper for EnumBuilder with name tracking +// The sync_thread_safe attribute ensures safe concurrent access from TypeScript crate::lang_wrapper!(EnumBuilder, type_builder::EnumBuilder, sync_thread_safe, name: String); + +// Thread-safe wrapper for ClassBuilder with name tracking +// Enables safe TypeScript interop with class definitions crate::lang_wrapper!(ClassBuilder, type_builder::ClassBuilder, sync_thread_safe, name: String); + +// Thread-safe wrapper for EnumValueBuilder +// Ensures enum value definitions can be safely accessed across threads crate::lang_wrapper!( EnumValueBuilder, type_builder::EnumValueBuilder, sync_thread_safe ); + +// Thread-safe wrapper for ClassPropertyBuilder +// Enables concurrent access to class property definitions crate::lang_wrapper!( ClassPropertyBuilder, type_builder::ClassPropertyBuilder, sync_thread_safe ); + +// Thread-safe wrapper for FieldType +// Core type system representation with thread-safety guarantees crate::lang_wrapper!(FieldType, baml_types::FieldType, sync_thread_safe); +// Implement Default for TypeBuilder to allow easy instantiation +// This enables idiomatic Rust usage while maintaining TypeScript compatibility impl Default for TypeBuilder { fn default() -> Self { Self::new() } } + +// note: you may notice a rust-analyzer warning in vs code when working with this file. +// the warning "did not find struct napitypebuilder parsed before expand #[napi] for impl" +// is a known false positive that occurs due to how rust-analyzer processes macro state. +// +// don't worry - the code compiles and works correctly! the warning is yet to be addressed by napi maintainers. +// +// if you'd like to hide this warning in vs code, you can add this to your settings.json: +// "rust-analyzer.diagnostics.disabled": ["macro-error"] +// +// ref: +// https://github.com/napi-rs/napi-rs/issues/1630 + + + + #[napi] impl TypeBuilder { #[napi(constructor)] @@ -115,6 +152,11 @@ impl TypeBuilder { ) .into() } + + #[napi] + pub fn to_string(&self) -> String { + self.inner.to_string() + } } #[napi] diff --git a/engine/language_client_typescript/src/types/type_builder.ts b/engine/language_client_typescript/src/types/type_builder.ts new file mode 100644 index 000000000..eee6c70b1 --- /dev/null +++ b/engine/language_client_typescript/src/types/type_builder.ts @@ -0,0 +1,43 @@ +// import the native typebuilder that was compiled from rust code using napi-rs +// this provides the core functionality that our typescript wrapper will use +import { TypeBuilder as NativeTypeBuilder } from '../../native'; + +export class TypeBuilder { + // holds the instance of the native rust implementation + // the native instance handles all the actual type building logic + // we just provide a nice typescript interface on top + private native: NativeTypeBuilder; + + constructor() { + // instantiate a new native typebuilder when this wrapper is created + // this sets up the underlying rust state that we'll delegate to + this.native = new NativeTypeBuilder(); + } + + // creates a new class definition or returns an existing one with the given name + // we renamed this from addclass/class_ to getclass to better match what the native api expects + // this is used to define the structure and properties of classes in the type system + getClass(name: string) { + // pass the class creation request through to the native rust implementation + // the rust code handles all the details of managing the class definition + return this.native.getClass(name); + } + + // creates a new enum definition or returns an existing one with the given name + // we renamed this from addenum/enum to getenum to better match what the native api expects + // this is used to define enums with their possible values and metadata + getEnum(name: string) { + // delegate enum creation to the native rust implementation + // the rust code manages the enum definition and its allowed values + return this.native.getEnum(name); + } + + // converts the entire type definition to a human-readable string representation + // useful for debugging and seeing the full structure of defined types + toString(): string { + // let the native rust code generate the string representation + // it will include all classes and enums with their properties, values and metadata + // formatted in a consistent way for easy reading + return this.native.toString(); + } +} \ No newline at end of file From add9fc0345dbf494f919d080b52d31bc55a0ff02 Mon Sep 17 00:00:00 2001 From: aq Date: Wed, 25 Dec 2024 14:32:10 +0400 Subject: [PATCH 03/10] docs(ruby): add detailed comments to typebuilder rust and ruby test files --- .../ext/ruby_ffi/src/types/type_builder.rs | 10 +++ .../test/type_builder_test.rb | 81 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 engine/language_client_ruby/test/type_builder_test.rb diff --git a/engine/language_client_ruby/ext/ruby_ffi/src/types/type_builder.rs b/engine/language_client_ruby/ext/ruby_ffi/src/types/type_builder.rs index 1bbd8a429..2905fd1d6 100644 --- a/engine/language_client_ruby/ext/ruby_ffi/src/types/type_builder.rs +++ b/engine/language_client_ruby/ext/ruby_ffi/src/types/type_builder.rs @@ -113,10 +113,20 @@ impl TypeBuilder { .into()) } + // this implements ruby's friendly to_s method for converting objects to strings + // when someone calls .to_s on a typebuilder in ruby, this method gets called + // under the hood, it uses rust's display trait to format everything nicely + // by using the same display logic across languages, we keep things consistent + // this helps make debugging and logging work the same way everywhere :D + pub fn to_s(&self) -> String { + self.inner.to_string() + } + pub fn define_in_ruby(module: &RModule) -> Result<()> { let cls = module.define_class("TypeBuilder", class::object())?; cls.define_singleton_method("new", function!(TypeBuilder::new, 0))?; + cls.define_method("to_s", method!(TypeBuilder::to_s, 0))?; cls.define_method("enum", method!(TypeBuilder::r#enum, 1))?; // "class" is used by Kernel: https://ruby-doc.org/core-3.0.2/Kernel.html#method-i-class cls.define_method("class_", method!(TypeBuilder::class, 1))?; diff --git a/engine/language_client_ruby/test/type_builder_test.rb b/engine/language_client_ruby/test/type_builder_test.rb new file mode 100644 index 000000000..3c75dff04 --- /dev/null +++ b/engine/language_client_ruby/test/type_builder_test.rb @@ -0,0 +1,81 @@ +require 'test/unit' +require 'baml' + +# this test suite verifies that our type builder system correctly handles +# string representations of complex types like classes and enums. this is +# important for debugging and logging purposes, as it helps +# understand the structure of their type definitions at runtime. +class TypeBuilderTest < Test::Unit::TestCase + + # tests that class definitions are properly stringified with all their + # properties and metadata intact. this helps ensure our type system + # maintains semantic meaning when displayed to users. + def test_class_string_representation + # start with a fresh type builder - this is our main interface + # for constructing type definitions programmatically + builder = Baml::Ffi::TypeBuilder.new + + # create a new user class - this represents a person in our system + # with various attributes that describe them + user_class = builder.class_('User') + + # define the core properties that make up a user profile + # we use aliases and descriptions to make the api more human-friendly + user_class.property('name') + .alias('username') # allows 'username' as an alternative way to reference this + .description('The user\'s full name') # helps explain the purpose + + user_class.property('age') + .description('User\'s age in years') # clarifies the expected format + + user_class.property('email') # sometimes a property name is self-explanatory + + # convert our type definition to a human-readable string + # this is invaluable for debugging and documentation + output = builder.to_s + puts "\nClass output:\n#{output}\n" + + # verify that the string output matches our expectations + # we check for key structural elements and metadata + assert_match(/TypeBuilder\(Classes: \[User \{/, output) + assert_match(/name unset \(alias='username', desc='The user's full name'\)/, output) + assert_match(/age unset \(desc='User's age in years'\)/, output) + assert_match(/email unset/, output) + end + + # tests that enum definitions are correctly stringified with their + # values and associated metadata. enums help us model fixed sets + # of options in a type-safe way. + def test_enum_string_representation + # create a fresh builder for our enum definition + builder = Baml::Ffi::TypeBuilder.new + + # define a status enum to track user account states + # this gives us a type-safe way to handle different user situations + status_enum = builder.enum('Status') + + # add the possible status values with helpful metadata + # active users are currently using the system + status_enum.value('ACTIVE') + .alias('active') # lowercase alias for more natural usage + .description('User is active') # explains the meaning + + # inactive users have temporarily stopped using the system + status_enum.value('INACTIVE') + .alias('inactive') + + # pending users are in a transitional state + status_enum.value('PENDING') + + # generate a readable version of our enum definition + output = builder.to_s + puts "\nEnum output:\n#{output}\n" + + # verify the string representation includes all our carefully + # defined values and their metadata + assert_match(/TypeBuilder\(Enums: \[Status \{/, output) + assert_match(/ACTIVE \(alias='active', desc='User is active'\)/, output) + assert_match(/INACTIVE \(alias='inactive'\)/, output) + assert_match(/PENDING/, output) + end +end \ No newline at end of file From 03d61bae14304e08be301dde0ab6343f74cd404d Mon Sep 17 00:00:00 2001 From: aq Date: Wed, 25 Dec 2024 14:36:17 +0400 Subject: [PATCH 04/10] feat(typebuilder): display all metadata fields in string representation --- engine/baml-runtime/src/type_builder/mod.rs | 54 ++++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/engine/baml-runtime/src/type_builder/mod.rs b/engine/baml-runtime/src/type_builder/mod.rs index badc404dd..da5f1b3da 100644 --- a/engine/baml-runtime/src/type_builder/mod.rs +++ b/engine/baml-runtime/src/type_builder/mod.rs @@ -172,20 +172,58 @@ impl fmt::Display for ClassBuilder { } } +/// formats enum value builders into a string representation +/// +/// each enum value's metadata is formatted in a consistent way: +/// - all metadata fields are included in the output +/// - metadata appears in parentheses after the enum value name +/// - fields are comma-separated and follow key=value format +/// - string values are single-quoted +/// - numbers, booleans and null values are unquoted +/// +/// example outputs: +/// +/// an enum value with no metadata: +/// ```text +/// PENDING +/// ``` +/// +/// an enum value with various metadata types: +/// ```text +/// ACTIVE (alias='active', skip=false, priority=1, weight=0.5) +/// ``` +/// +/// an enum value with null metadata: +/// ```text +/// INACTIVE (description=null, enabled=false) +/// ``` impl fmt::Display for EnumValueBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let meta = self.meta.lock().unwrap(); - let alias = meta.get("alias").and_then(|v| v.as_string()); - let desc = meta.get("description").and_then(|v| v.as_string()); - if let Some(alias) = alias { - write!(f, " (alias='{}'", alias)?; - if let Some(desc) = desc { - write!(f, ", desc='{}'", desc)?; + // only include metadata section if we have metadata to display + if !meta.is_empty() { + write!(f, " (")?; + + // format each metadata entry with appropriate type handling + for (i, (key, value)) in meta.iter().enumerate() { + // add comma separator between metadata entries + if i > 0 { + write!(f, ", ")?; + } + + // format each value type appropriately for clean display + match value { + BamlValue::String(s) => write!(f, "{}='{}'", key, s)?, // quoted strings + BamlValue::Bool(b) => write!(f, "{}={}", key, b)?, // true/false + BamlValue::Int(n) => write!(f, "{}={}", key, n)?, // plain numbers + BamlValue::Float(x) => write!(f, "{}={}", key, x)?, // decimal numbers + BamlValue::Null => write!(f, "{}=null", key)?, // explicit null + _ => write!(f, "{}={:?}", key, value)?, // debug format fallback + } } + write!(f, ")")?; - } else if let Some(desc) = desc { - write!(f, " (desc='{}')", desc)?; } Ok(()) } From f75139f157b97f28eb01187ed71fbf7d8f4a4897 Mon Sep 17 00:00:00 2001 From: aq Date: Wed, 25 Dec 2024 14:54:14 +0400 Subject: [PATCH 05/10] feat(typebuilder): improve string representation formatting and display all metadata fields --- engine/baml-runtime/src/type_builder/mod.rs | 266 +++++++++++--------- 1 file changed, 149 insertions(+), 117 deletions(-) diff --git a/engine/baml-runtime/src/type_builder/mod.rs b/engine/baml-runtime/src/type_builder/mod.rs index da5f1b3da..9ab933862 100644 --- a/engine/baml-runtime/src/type_builder/mod.rs +++ b/engine/baml-runtime/src/type_builder/mod.rs @@ -134,185 +134,218 @@ impl EnumBuilder { } } +// displays a class property along with its current state and metadata +// the format shows three key pieces of information: +// 1. the property name as defined in the class +// 2. the type status: either 'set' (type defined) or 'unset' (type pending) +// 3. any metadata attached to the property in parentheses +// +// metadata is shown in key=value format, with values formatted according to their type +// multiple metadata entries are separated by commas for readability +// +// examples of the output format: +// name set (alias='username', description='full name') +// - shows a property with both alias and description metadata +// age unset +// - shows a property without a defined type or metadata +// email set (required=true, format='email') +// - shows a property with multiple metadata values of different types impl fmt::Display for ClassPropertyBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let meta = self.meta.lock().unwrap(); - let alias = meta.get("alias").and_then(|v| v.as_string()); - let desc = meta.get("description").and_then(|v| v.as_string()); - write!(f, "{}", self.r#type.lock().unwrap().as_ref().map_or("unset", |_| "set"))?; - if let Some(alias) = alias { - write!(f, " (alias='{}'", alias)?; - if let Some(desc) = desc { - write!(f, ", desc='{}'", desc)?; - } - write!(f, ")")?; - } else if let Some(desc) = desc { - write!(f, " (desc='{}')", desc)?; - } - Ok(()) - } -} -impl fmt::Display for ClassBuilder { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let properties = self.properties.lock().unwrap(); - write!(f, "{{")?; - if !properties.is_empty() { - write!(f, " ")?; - for (i, (name, prop)) in properties.iter().enumerate() { + if !meta.is_empty() { + write!(f, " (")?; + for (i, (key, value)) in meta.iter().enumerate() { if i > 0 { write!(f, ", ")?; } - write!(f, "{} {}", name, prop.lock().unwrap())?; + write!(f, "{}={}", key, value)?; } - write!(f, " ")?; + write!(f, ")")?; } - write!(f, "}}") + Ok(()) } } -/// formats enum value builders into a string representation -/// -/// each enum value's metadata is formatted in a consistent way: -/// - all metadata fields are included in the output -/// - metadata appears in parentheses after the enum value name -/// - fields are comma-separated and follow key=value format -/// - string values are single-quoted -/// - numbers, booleans and null values are unquoted -/// -/// example outputs: -/// -/// an enum value with no metadata: -/// ```text -/// PENDING -/// ``` -/// -/// an enum value with various metadata types: -/// ```text -/// ACTIVE (alias='active', skip=false, priority=1, weight=0.5) -/// ``` -/// -/// an enum value with null metadata: -/// ```text -/// INACTIVE (description=null, enabled=false) -/// ``` +// displays an enum value and its associated metadata +// the format focuses on clarity and completeness: +// 1. the enum value name in uppercase (following enum conventions) +// 2. any metadata in parentheses, showing all attached information +// +// metadata is displayed in a consistent key=value format: +// - each piece of metadata is separated by commas +// - values are formatted based on their type (quotes for strings, etc.) +// - all metadata is shown, not just common fields like alias +// +// examples of the output format: +// ACTIVE (alias='active', priority=1, enabled=true) +// - shows an enum value with multiple metadata types +// PENDING +// - shows a simple enum value with no metadata +// INACTIVE (description='not currently in use', status=null) +// - shows how null values and longer descriptions are formatted impl fmt::Display for EnumValueBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let meta = self.meta.lock().unwrap(); - // only include metadata section if we have metadata to display if !meta.is_empty() { write!(f, " (")?; - - // format each metadata entry with appropriate type handling for (i, (key, value)) in meta.iter().enumerate() { - // add comma separator between metadata entries if i > 0 { write!(f, ", ")?; } - - // format each value type appropriately for clean display - match value { - BamlValue::String(s) => write!(f, "{}='{}'", key, s)?, // quoted strings - BamlValue::Bool(b) => write!(f, "{}={}", key, b)?, // true/false - BamlValue::Int(n) => write!(f, "{}={}", key, n)?, // plain numbers - BamlValue::Float(x) => write!(f, "{}={}", key, x)?, // decimal numbers - BamlValue::Null => write!(f, "{}=null", key)?, // explicit null - _ => write!(f, "{}={:?}", key, value)?, // debug format fallback - } + write!(f, "{}={}", key, value)?; } - write!(f, ")")?; } Ok(()) } } +// displays a complete class definition with all its properties +// the format provides a clear hierarchical structure: +// 1. class name followed by an opening brace +// 2. indented list of properties, each on its own line +// 3. closing brace aligned with the class name +// +// properties are displayed with consistent indentation and formatting: +// - each property starts on a new line with proper indentation +// - properties are separated by commas for valid syntax +// - the last property doesn't have a trailing comma +// +// example of the complete format: +// User { +// name set (alias='username', description='user's full name'), +// age set (type='integer', min=0), +// email set (format='email', required=true), +// status unset +// } +impl fmt::Display for ClassBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let properties = self.properties.lock().unwrap(); + write!(f, "{{")?; + if !properties.is_empty() { + for (i, (name, prop)) in properties.iter().enumerate() { + if i > 0 { + write!(f, ",")?; + } + write!(f, "\n {} {}", name, prop.lock().unwrap())?; + } + write!(f, "\n ")?; + } + write!(f, "}}") + } +} + +// displays a complete enum definition with all its values +// the format creates a clear and readable structure: +// 1. enum name followed by an opening brace +// 2. indented list of enum values, each on its own line +// 3. closing brace aligned with the enum name +// +// values are displayed with consistent formatting: +// - each value starts on a new line with proper indentation +// - values are separated by commas for valid syntax +// - metadata is shown in parentheses when present +// - empty enums are shown with empty braces +// +// example of the complete format: +// Status { +// ACTIVE (alias='active', weight=1.0), +// PENDING (description='awaiting processing'), +// INACTIVE (enabled=false), +// ARCHIVED +// } impl fmt::Display for EnumBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let values = self.values.lock().unwrap(); write!(f, "{{")?; if !values.is_empty() { - write!(f, " ")?; for (i, (name, value)) in values.iter().enumerate() { if i > 0 { - write!(f, ", ")?; + write!(f, ",")?; } - write!(f, "{}{}", name, value.lock().unwrap())?; + write!(f, "\n {}{}", name, value.lock().unwrap())?; } - write!(f, " ")?; + write!(f, "\n ")?; } write!(f, "}}") } } -/// implements a string representation for typebuilder. -/// -/// this implementation provides a clear, hierarchical view of the typebuilder's structure, -/// making it easy to understand the defined types and their metadata at a glance. -/// -/// # Format -/// ```text -/// TypeBuilder( -/// Classes: [ -/// ClassName { -/// property_name type (alias='custom_name', desc='property description'), -/// another_property type (desc='another description'), -/// simple_property type -/// }, -/// EmptyClass { } -/// ], -/// Enums: [ -/// EnumName { -/// VALUE (alias='custom_value', desc='value description'), -/// ANOTHER_VALUE (alias='custom'), -/// SIMPLE_VALUE -/// }, -/// EmptyEnum { } -/// ] -/// ) -/// ``` -/// -/// # properties shown -/// - class and property names -/// - property types (set/unset) -/// - property metadata (aliases, descriptions) -/// - enum values and their metadata -/// - empty classes and enums +// displays the complete type builder state in a clear, hierarchical format +// this is the top-level representation that shows all defined types +// +// +// 1. starts with "TypeBuilder(" to identify the structure +// 2. contains two main sections: Classes and Enums +// 3. each section is properly indented and bracketed +// 4. empty sections are omitted for conciseness +// +// the structure maintains consistent formatting: +// - each class and enum starts on a new line +// - proper indentation shows the hierarchy +// - commas separate multiple items +// - empty classes/enums are shown with empty braces +// +// example of the complete format: +// TypeBuilder( +// Classes: [ +// User { +// name set (alias='username'), +// email set (required=true) +// }, +// Address { } +// ], +// Enums: [ +// Status { +// ACTIVE (alias='active'), +// PENDING, +// INACTIVE (enabled=false) +// } +// ] +// ) +// +// this format makes it easy to: +// - understand the overall structure of defined types +// - see relationships between classes and their properties +// - identify enum values and their metadata +// - spot any missing or incomplete definitions impl fmt::Display for TypeBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let classes = self.classes.lock().unwrap(); let enums = self.enums.lock().unwrap(); - write!(f, "TypeBuilder(")?; + writeln!(f, "TypeBuilder(")?; if !classes.is_empty() { - write!(f, "Classes: [")?; + write!(f, " Classes: [")?; for (i, (name, cls)) in classes.iter().enumerate() { if i > 0 { - write!(f, ", ")?; + write!(f, ",")?; } - write!(f, "{} {}", name, cls.lock().unwrap())?; + write!(f, "\n {} {}", name, cls.lock().unwrap())?; } - write!(f, "]")?; + write!(f, "\n ]")?; } if !enums.is_empty() { if !classes.is_empty() { - write!(f, ", ")?; + write!(f, ",")?; } - write!(f, "Enums: [")?; + write!(f, "\n Enums: [")?; for (i, (name, e)) in enums.iter().enumerate() { if i > 0 { - write!(f, ", ")?; + write!(f, ",")?; } - write!(f, "{} {}", name, e.lock().unwrap())?; + write!(f, "\n {} {}", name, e.lock().unwrap())?; } - write!(f, "]")?; + write!(f, "\n ]")?; } - write!(f, ")") + write!(f, "\n)") } } @@ -501,12 +534,11 @@ mod tests { let output = builder.to_string(); assert_eq!( output, - "TypeBuilder(Classes: [User { name set (alias='username', desc='The user\'s full name'), age set (desc='User\'s age in years'), email set }], Enums: [Status { ACTIVE (alias='active', desc='User is active'), INACTIVE (alias='inactive'), PENDING }])" + "TypeBuilder(\n Classes: [\n User {\n name set (alias='username', description='The user's full name'),\n age set (description='User's age in years'),\n email set\n }\n ],\n Enums: [\n Status {\n ACTIVE (alias='active', description='User is active'),\n INACTIVE (alias='inactive'),\n PENDING\n }\n ]\n)" ); } - -// my paranoia kicked in, so tis test is to ensure that the string representation is correct +// my paranoia kicked in, so this test is to ensure that the string representation is correct // and that the to_overrides method is working as expected #[test] @@ -591,7 +623,7 @@ mod tests { let output = builder.to_string(); assert_eq!( output, - "TypeBuilder(Classes: [Address { street set (alias='streetAddress', desc='Street address including number'), unit set (desc='Apartment/unit number if applicable'), tags set (alias='labels'), is_primary set, coordinates set }, EmptyClass {}], Enums: [Priority { HIGH (alias='urgent', desc='Needs immediate attention'), MEDIUM (desc='Standard priority'), LOW, NONE }, EmptyEnum {}])" + "TypeBuilder(\n Classes: [\n Address {\n street set (alias='streetAddress', description='Street address including number'),\n unit set (description='Apartment/unit number if applicable'),\n tags set (alias='labels'),\n is_primary set,\n coordinates set (skip=true)\n },\n EmptyClass {}\n ],\n Enums: [\n Priority {\n HIGH (alias='urgent', description='Needs immediate attention', skip=false),\n MEDIUM (description='Standard priority'),\n LOW (skip=true),\n NONE\n },\n EmptyEnum {}\n ]\n)" ); // Test to_overrides() From ef56a22e6d4c8a8a637733f289fe4c2bc42689eb Mon Sep 17 00:00:00 2001 From: hellovai Date: Wed, 22 Jan 2025 11:25:24 -0800 Subject: [PATCH 06/10] update tests --- engine/baml-runtime/src/type_builder/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/baml-runtime/src/type_builder/mod.rs b/engine/baml-runtime/src/type_builder/mod.rs index 9ab933862..3ade41353 100644 --- a/engine/baml-runtime/src/type_builder/mod.rs +++ b/engine/baml-runtime/src/type_builder/mod.rs @@ -534,7 +534,7 @@ mod tests { let output = builder.to_string(); assert_eq!( output, - "TypeBuilder(\n Classes: [\n User {\n name set (alias='username', description='The user's full name'),\n age set (description='User's age in years'),\n email set\n }\n ],\n Enums: [\n Status {\n ACTIVE (alias='active', description='User is active'),\n INACTIVE (alias='inactive'),\n PENDING\n }\n ]\n)" + "TypeBuilder(\n Classes: [\n User {\n name set (alias=String(\"username\"), description=String(\"The user's full name\")),\n age set (description=String(\"User's age in years\")),\n email set\n }\n ],\n Enums: [\n Status {\n ACTIVE (alias=String(\"active\"), description=String(\"User is active\")),\n INACTIVE (alias=String(\"inactive\")),\n PENDING\n }\n ]\n)" ); } @@ -623,7 +623,7 @@ mod tests { let output = builder.to_string(); assert_eq!( output, - "TypeBuilder(\n Classes: [\n Address {\n street set (alias='streetAddress', description='Street address including number'),\n unit set (description='Apartment/unit number if applicable'),\n tags set (alias='labels'),\n is_primary set,\n coordinates set (skip=true)\n },\n EmptyClass {}\n ],\n Enums: [\n Priority {\n HIGH (alias='urgent', description='Needs immediate attention', skip=false),\n MEDIUM (description='Standard priority'),\n LOW (skip=true),\n NONE\n },\n EmptyEnum {}\n ]\n)" + "TypeBuilder(\n Classes: [\n Address {\n street set (alias=String(\"streetAddress\"), description=String(\"Street address including number\")),\n unit set (description=String(\"Apartment/unit number if applicable\")),\n tags set (alias=String(\"labels\")),\n is_primary set,\n coordinates set (skip=Bool(true))\n },\n EmptyClass {}\n ],\n Enums: [\n Priority {\n HIGH (alias=String(\"urgent\"), description=String(\"Needs immediate attention\"), skip=Bool(false)),\n MEDIUM (description=String(\"Standard priority\")),\n LOW (skip=Bool(true)),\n NONE\n },\n EmptyEnum {}\n ]\n)" ); // Test to_overrides() From dbd820322c0e52d69d2ff54227f8a2d9aee9f598 Mon Sep 17 00:00:00 2001 From: hellovai Date: Wed, 22 Jan 2025 11:27:51 -0800 Subject: [PATCH 07/10] udpate lock file --- .../language_client_typescript/pnpm-lock.yaml | 3416 ++++++++++++++--- 1 file changed, 2903 insertions(+), 513 deletions(-) diff --git a/engine/language_client_typescript/pnpm-lock.yaml b/engine/language_client_typescript/pnpm-lock.yaml index 65a8fe965..641a248b5 100644 --- a/engine/language_client_typescript/pnpm-lock.yaml +++ b/engine/language_client_typescript/pnpm-lock.yaml @@ -18,12 +18,21 @@ importers: '@napi-rs/cli': specifier: 3.0.0-alpha.62 version: 3.0.0-alpha.62(@emnapi/runtime@1.1.1) + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 '@types/node': specifier: ^20.12.11 version: 20.12.11 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) npm-run-all2: specifier: ^6.1.2 version: 6.1.2 + ts-jest: + specifier: ^29.1.1 + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(typescript@5.4.5) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) @@ -33,9 +42,175 @@ importers: packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@biomejs/biome@1.7.3': resolution: {integrity: sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==} engines: {node: '>=14.21.3'} + hasBin: true '@biomejs/cli-darwin-arm64@1.7.3': resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} @@ -155,13 +330,98 @@ packages: resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} engines: {node: '>=18'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + 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 + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + 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 + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -514,6 +774,15 @@ packages: '@scarf/scarf@1.3.0': resolution: {integrity: sha512-lHKK8M5CTcpFj2hZDB3wIjb0KAbEOgDmiJGDv1WBRfQgRm/a8/XMEkG/N1iM01xgbUDsPQwi42D+dFo1XPAKew==} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -529,6 +798,33 @@ packages: '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} @@ -538,9 +834,18 @@ packages: '@types/node@22.7.4': resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -548,6 +853,7 @@ packages: acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} + hasBin: true ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} @@ -561,28 +867,119 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} before-after-hook@3.0.2: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001695: + resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -592,6 +989,17 @@ packages: peerDependencies: typanion: '*' + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -602,6 +1010,17 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -618,756 +1037,2515 @@ packages: supports-color: optional: true + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.84: + resolution: {integrity: sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - inquirer@10.2.2: - resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} - engines: {node: '>=18'} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - npm-run-all2@6.1.2: - resolution: {integrity: sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==} - engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} + hasBin: true - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inflight@1.0.6: + resolution: {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. - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + inquirer@10.2.2: + resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} + engines: {node: '>=18'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + 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 + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-all2@6.1.2: + resolution: {integrity: sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.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 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + 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 + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + typanion@3.14.0: + resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + wasm-sjlj@1.0.5: + resolution: {integrity: sha512-Z/MHJeOkAvJJVWnGX3/YZGYldGaawZbYHX4ldYG9kLhcdB8H31F5x66M7Zc4BP/7pg0aLsusQj1629m2B3Rilg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.5': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + + '@babel/traverse@7.26.5': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.7.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.7.3 + '@biomejs/cli-darwin-x64': 1.7.3 + '@biomejs/cli-linux-arm64': 1.7.3 + '@biomejs/cli-linux-arm64-musl': 1.7.3 + '@biomejs/cli-linux-x64': 1.7.3 + '@biomejs/cli-linux-x64-musl': 1.7.3 + '@biomejs/cli-win32-arm64': 1.7.3 + '@biomejs/cli-win32-x64': 1.7.3 + + '@biomejs/cli-darwin-arm64@1.7.3': + optional: true + + '@biomejs/cli-darwin-x64@1.7.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.7.3': + optional: true + + '@biomejs/cli-linux-arm64@1.7.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.7.3': + optional: true + + '@biomejs/cli-linux-x64@1.7.3': + optional: true + + '@biomejs/cli-win32-arm64@1.7.3': + optional: true + + '@biomejs/cli-win32-x64@1.7.3': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/core@1.1.1': + dependencies: + tslib: 2.6.2 + optional: true + + '@emnapi/runtime@1.1.1': + dependencies: + tslib: 2.6.2 + optional: true + + '@inquirer/checkbox@2.5.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.6 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/confirm@3.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.6 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.7.4 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/editor@2.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + external-editor: 3.1.0 + + '@inquirer/expand@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.6': {} + + '@inquirer/input@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/number@1.1.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/password@2.2.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@5.5.0': + dependencies: + '@inquirer/checkbox': 2.5.0 + '@inquirer/confirm': 3.2.0 + '@inquirer/editor': 2.2.0 + '@inquirer/expand': 2.3.0 + '@inquirer/input': 2.3.0 + '@inquirer/number': 1.1.0 + '@inquirer/password': 2.2.0 + '@inquirer/rawlist': 2.3.0 + '@inquirer/search': 1.1.0 + '@inquirer/select': 2.5.0 + + '@inquirer/rawlist@2.3.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@1.1.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.6 + '@inquirer/type': 1.5.5 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@2.5.0': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.6 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5))': + 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': 20.12.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + 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.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.12.11 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + 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.25 + '@types/node': 20.12.11 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.26.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.11 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@napi-rs/cli@3.0.0-alpha.62(@emnapi/runtime@1.1.1)': + dependencies: + '@napi-rs/cross-toolchain': 0.0.16 + '@napi-rs/wasm-tools': 0.0.2 + '@octokit/rest': 21.0.1 + clipanion: 3.2.1(typanion@3.14.0) + colorette: 2.0.20 + debug: 4.3.4 + inquirer: 10.2.2 + js-yaml: 4.1.0 + lodash-es: 4.17.21 + semver: 7.6.2 + toml: 3.0.0 + typanion: 3.14.0 + wasm-sjlj: 1.0.5 + optionalDependencies: + '@emnapi/runtime': 1.1.1 + transitivePeerDependencies: + - '@napi-rs/cross-toolchain-arm64-target-aarch64' + - '@napi-rs/cross-toolchain-arm64-target-armv7' + - '@napi-rs/cross-toolchain-arm64-target-x86_64' + - '@napi-rs/cross-toolchain-x64-target-aarch64' + - '@napi-rs/cross-toolchain-x64-target-armv7' + - '@napi-rs/cross-toolchain-x64-target-x86_64' + - supports-color + + '@napi-rs/cross-toolchain@0.0.16': + dependencies: + '@napi-rs/lzma': 1.3.1 + '@napi-rs/tar': 0.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + '@napi-rs/lzma-android-arm-eabi@1.3.1': + optional: true + + '@napi-rs/lzma-android-arm64@1.3.1': + optional: true + + '@napi-rs/lzma-darwin-arm64@1.3.1': + optional: true + + '@napi-rs/lzma-darwin-x64@1.3.1': + optional: true + + '@napi-rs/lzma-freebsd-x64@1.3.1': + optional: true + + '@napi-rs/lzma-linux-arm-gnueabihf@1.3.1': + optional: true + + '@napi-rs/lzma-linux-arm64-gnu@1.3.1': + optional: true + + '@napi-rs/lzma-linux-arm64-musl@1.3.1': + optional: true + + '@napi-rs/lzma-linux-x64-gnu@1.3.1': + optional: true + + '@napi-rs/lzma-linux-x64-musl@1.3.1': + optional: true + + '@napi-rs/lzma-wasm32-wasi@1.3.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.3 + optional: true + + '@napi-rs/lzma-win32-arm64-msvc@1.3.1': + optional: true + + '@napi-rs/lzma-win32-ia32-msvc@1.3.1': + optional: true + + '@napi-rs/lzma-win32-x64-msvc@1.3.1': + optional: true + + '@napi-rs/lzma@1.3.1': + optionalDependencies: + '@napi-rs/lzma-android-arm-eabi': 1.3.1 + '@napi-rs/lzma-android-arm64': 1.3.1 + '@napi-rs/lzma-darwin-arm64': 1.3.1 + '@napi-rs/lzma-darwin-x64': 1.3.1 + '@napi-rs/lzma-freebsd-x64': 1.3.1 + '@napi-rs/lzma-linux-arm-gnueabihf': 1.3.1 + '@napi-rs/lzma-linux-arm64-gnu': 1.3.1 + '@napi-rs/lzma-linux-arm64-musl': 1.3.1 + '@napi-rs/lzma-linux-x64-gnu': 1.3.1 + '@napi-rs/lzma-linux-x64-musl': 1.3.1 + '@napi-rs/lzma-wasm32-wasi': 1.3.1 + '@napi-rs/lzma-win32-arm64-msvc': 1.3.1 + '@napi-rs/lzma-win32-ia32-msvc': 1.3.1 + '@napi-rs/lzma-win32-x64-msvc': 1.3.1 + + '@napi-rs/tar-android-arm-eabi@0.1.1': + optional: true + + '@napi-rs/tar-android-arm64@0.1.1': + optional: true + + '@napi-rs/tar-darwin-arm64@0.1.1': + optional: true + + '@napi-rs/tar-darwin-x64@0.1.1': + optional: true + + '@napi-rs/tar-freebsd-x64@0.1.1': + optional: true + + '@napi-rs/tar-linux-arm-gnueabihf@0.1.1': + optional: true + + '@napi-rs/tar-linux-arm64-gnu@0.1.1': + optional: true + + '@napi-rs/tar-linux-arm64-musl@0.1.1': + optional: true + + '@napi-rs/tar-linux-x64-gnu@0.1.1': + optional: true + + '@napi-rs/tar-linux-x64-musl@0.1.1': + optional: true + + '@napi-rs/tar-wasm32-wasi@0.1.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.3 + optional: true + + '@napi-rs/tar-win32-arm64-msvc@0.1.1': + optional: true + + '@napi-rs/tar-win32-ia32-msvc@0.1.1': + optional: true + + '@napi-rs/tar-win32-x64-msvc@0.1.1': + optional: true + + '@napi-rs/tar@0.1.1': + optionalDependencies: + '@napi-rs/tar-android-arm-eabi': 0.1.1 + '@napi-rs/tar-android-arm64': 0.1.1 + '@napi-rs/tar-darwin-arm64': 0.1.1 + '@napi-rs/tar-darwin-x64': 0.1.1 + '@napi-rs/tar-freebsd-x64': 0.1.1 + '@napi-rs/tar-linux-arm-gnueabihf': 0.1.1 + '@napi-rs/tar-linux-arm64-gnu': 0.1.1 + '@napi-rs/tar-linux-arm64-musl': 0.1.1 + '@napi-rs/tar-linux-x64-gnu': 0.1.1 + '@napi-rs/tar-linux-x64-musl': 0.1.1 + '@napi-rs/tar-wasm32-wasi': 0.1.1 + '@napi-rs/tar-win32-arm64-msvc': 0.1.1 + '@napi-rs/tar-win32-ia32-msvc': 0.1.1 + '@napi-rs/tar-win32-x64-msvc': 0.1.1 + + '@napi-rs/wasm-runtime@0.2.3': + dependencies: + '@emnapi/core': 1.1.1 + '@emnapi/runtime': 1.1.1 + '@tybys/wasm-util': 0.8.3 + optional: true + + '@napi-rs/wasm-tools-android-arm-eabi@0.0.2': + optional: true + + '@napi-rs/wasm-tools-android-arm64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-darwin-arm64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-darwin-x64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-freebsd-x64@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-arm64-musl@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-x64-gnu@0.0.2': + optional: true + + '@napi-rs/wasm-tools-linux-x64-musl@0.0.2': + optional: true + + '@napi-rs/wasm-tools-wasm32-wasi@0.0.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.3 + optional: true + + '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.2': + optional: true + + '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.2': + optional: true + + '@napi-rs/wasm-tools-win32-x64-msvc@0.0.2': + optional: true + + '@napi-rs/wasm-tools@0.0.2': + optionalDependencies: + '@napi-rs/wasm-tools-android-arm-eabi': 0.0.2 + '@napi-rs/wasm-tools-android-arm64': 0.0.2 + '@napi-rs/wasm-tools-darwin-arm64': 0.0.2 + '@napi-rs/wasm-tools-darwin-x64': 0.0.2 + '@napi-rs/wasm-tools-freebsd-x64': 0.0.2 + '@napi-rs/wasm-tools-linux-arm64-gnu': 0.0.2 + '@napi-rs/wasm-tools-linux-arm64-musl': 0.0.2 + '@napi-rs/wasm-tools-linux-x64-gnu': 0.0.2 + '@napi-rs/wasm-tools-linux-x64-musl': 0.0.2 + '@napi-rs/wasm-tools-wasm32-wasi': 0.0.2 + '@napi-rs/wasm-tools-win32-arm64-msvc': 0.0.2 + '@napi-rs/wasm-tools-win32-ia32-msvc': 0.0.2 + '@napi-rs/wasm-tools-win32-x64-msvc': 0.0.2 + + '@octokit/auth-token@5.1.1': {} + + '@octokit/core@6.1.2': + dependencies: + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.1 + '@octokit/request': 9.1.3 + '@octokit/request-error': 6.1.4 + '@octokit/types': 13.5.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.1': + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + + '@octokit/graphql@8.1.1': + dependencies: + '@octokit/request': 9.1.3 + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + + '@octokit/openapi-types@22.2.0': {} + + '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@6.1.2)': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/types': 13.5.0 + + '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.2)': + dependencies: + '@octokit/core': 6.1.2 - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@6.1.2)': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/types': 13.5.0 - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + '@octokit/request-error@6.1.4': + dependencies: + '@octokit/types': 13.5.0 - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + '@octokit/request@9.1.3': + dependencies: + '@octokit/endpoint': 10.1.1 + '@octokit/request-error': 6.1.4 + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + '@octokit/rest@21.0.1': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@6.1.2) + '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.2) + '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@6.1.2) - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - 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 + '@octokit/types@13.5.0': + dependencies: + '@octokit/openapi-types': 22.2.0 - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + '@scarf/scarf@1.3.0': {} - typanion@3.14.0: - resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} + '@sinclair/typebox@0.27.8': {} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + '@tsconfig/node10@1.0.11': {} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + '@tsconfig/node12@1.0.11': {} - universal-user-agent@7.0.2: - resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + '@tsconfig/node14@1.0.3': {} - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + '@tsconfig/node16@1.0.4': {} - wasm-sjlj@1.0.5: - resolution: {integrity: sha512-Z/MHJeOkAvJJVWnGX3/YZGYldGaawZbYHX4ldYG9kLhcdB8H31F5x66M7Zc4BP/7pg0aLsusQj1629m2B3Rilg==} + '@tybys/wasm-util@0.8.3': + dependencies: + tslib: 2.6.2 + optional: true - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.5 - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} - engines: {node: '>=18'} + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.5 -snapshots: + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.12.11 - '@biomejs/biome@1.7.3': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.7.3 - '@biomejs/cli-darwin-x64': 1.7.3 - '@biomejs/cli-linux-arm64': 1.7.3 - '@biomejs/cli-linux-arm64-musl': 1.7.3 - '@biomejs/cli-linux-x64': 1.7.3 - '@biomejs/cli-linux-x64-musl': 1.7.3 - '@biomejs/cli-win32-arm64': 1.7.3 - '@biomejs/cli-win32-x64': 1.7.3 + '@types/istanbul-lib-coverage@2.0.6': {} - '@biomejs/cli-darwin-arm64@1.7.3': - optional: true + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 - '@biomejs/cli-darwin-x64@1.7.3': - optional: true + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 - '@biomejs/cli-linux-arm64-musl@1.7.3': - optional: true + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 - '@biomejs/cli-linux-arm64@1.7.3': - optional: true + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.12.11 - '@biomejs/cli-linux-x64-musl@1.7.3': - optional: true + '@types/node@20.12.11': + dependencies: + undici-types: 5.26.5 - '@biomejs/cli-linux-x64@1.7.3': - optional: true + '@types/node@22.7.4': + dependencies: + undici-types: 6.19.8 - '@biomejs/cli-win32-arm64@1.7.3': - optional: true + '@types/stack-utils@2.0.3': {} - '@biomejs/cli-win32-x64@1.7.3': - optional: true + '@types/wrap-ansi@3.0.0': {} - '@cspotcode/source-map-support@0.8.1': + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@types/yargs-parser': 21.0.3 - '@emnapi/core@1.1.1': + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + ansi-escapes@4.3.2: dependencies: - tslib: 2.6.2 - optional: true + type-fest: 0.21.3 - '@emnapi/runtime@1.1.1': + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: dependencies: - tslib: 2.6.2 - optional: true + color-convert: 2.0.1 - '@inquirer/checkbox@2.5.0': + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.6 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + normalize-path: 3.0.0 + picomatch: 2.3.1 - '@inquirer/confirm@3.2.0': + arg@4.1.3: {} + + argparse@1.0.10: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 + sprintf-js: 1.0.3 - '@inquirer/core@9.2.1': + argparse@2.0.1: {} + + async@3.2.6: {} + + babel-jest@29.7.0(@babel/core@7.26.0): dependencies: - '@inquirer/figures': 1.0.6 - '@inquirer/type': 2.0.0 - '@types/mute-stream': 0.0.4 - '@types/node': 22.7.4 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color - '@inquirer/editor@2.2.0': + babel-plugin-istanbul@6.1.1: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - external-editor: 3.1.0 + '@babel/helper-plugin-utils': 7.26.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color - '@inquirer/expand@2.3.0': + babel-plugin-jest-hoist@29.6.3: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 - '@inquirer/figures@1.0.6': {} + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-jest@29.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) - '@inquirer/input@2.3.0': + balanced-match@1.0.2: {} + + before-after-hook@3.0.2: {} + + brace-expansion@1.1.11: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 + balanced-match: 1.0.2 + concat-map: 0.0.1 - '@inquirer/number@1.1.0': + brace-expansion@2.0.1: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 + balanced-match: 1.0.2 - '@inquirer/password@2.2.0': + braces@3.0.3: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 + fill-range: 7.1.1 - '@inquirer/prompts@5.5.0': + browserslist@4.24.4: dependencies: - '@inquirer/checkbox': 2.5.0 - '@inquirer/confirm': 3.2.0 - '@inquirer/editor': 2.2.0 - '@inquirer/expand': 2.3.0 - '@inquirer/input': 2.3.0 - '@inquirer/number': 1.1.0 - '@inquirer/password': 2.2.0 - '@inquirer/rawlist': 2.3.0 - '@inquirer/search': 1.1.0 - '@inquirer/select': 2.5.0 + caniuse-lite: 1.0.30001695 + electron-to-chromium: 1.5.84 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) - '@inquirer/rawlist@2.3.0': + bs-logger@0.2.6: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 + fast-json-stable-stringify: 2.1.0 - '@inquirer/search@1.1.0': + bser@2.1.1: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.6 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001695: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + chardet@0.7.0: {} + + ci-info@3.9.0: {} - '@inquirer/select@2.5.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.6 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + cjs-module-lexer@1.4.1: {} - '@inquirer/type@1.5.5': + cli-width@4.1.0: {} + + clipanion@3.2.1(typanion@3.14.0): dependencies: - mute-stream: 1.0.0 + typanion: 3.14.0 - '@inquirer/type@2.0.0': + cliui@8.0.1: dependencies: - mute-stream: 1.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - '@jridgewell/resolve-uri@3.1.2': {} + co@4.6.0: {} - '@jridgewell/sourcemap-codec@1.4.15': {} + collect-v8-coverage@1.0.2: {} - '@jridgewell/trace-mapping@0.3.9': + color-convert@2.0.1: dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + color-name: 1.1.4 - '@napi-rs/cli@3.0.0-alpha.62(@emnapi/runtime@1.1.1)': + color-name@1.1.4: {} + + colorette@2.0.20: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + create-jest@29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): dependencies: - '@napi-rs/cross-toolchain': 0.0.16 - '@napi-rs/wasm-tools': 0.0.2 - '@octokit/rest': 21.0.1 - clipanion: 3.2.1(typanion@3.14.0) - colorette: 2.0.20 - debug: 4.3.4 - inquirer: 10.2.2 - js-yaml: 4.1.0 - lodash-es: 4.17.21 - semver: 7.6.2 - toml: 3.0.0 - typanion: 3.14.0 - wasm-sjlj: 1.0.5 - optionalDependencies: - '@emnapi/runtime': 1.1.1 + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + jest-util: 29.7.0 + prompts: 2.4.2 transitivePeerDependencies: - - '@napi-rs/cross-toolchain-arm64-target-aarch64' - - '@napi-rs/cross-toolchain-arm64-target-armv7' - - '@napi-rs/cross-toolchain-arm64-target-x86_64' - - '@napi-rs/cross-toolchain-x64-target-aarch64' - - '@napi-rs/cross-toolchain-x64-target-armv7' - - '@napi-rs/cross-toolchain-x64-target-x86_64' + - '@types/node' + - babel-plugin-macros - supports-color + - ts-node - '@napi-rs/cross-toolchain@0.0.16': + create-require@1.1.1: {} + + cross-spawn@7.0.6: dependencies: - '@napi-rs/lzma': 1.3.1 - '@napi-rs/tar': 0.1.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - '@napi-rs/lzma-android-arm-eabi@1.3.1': - optional: true + debug@4.3.4: + dependencies: + ms: 2.1.2 - '@napi-rs/lzma-android-arm64@1.3.1': - optional: true + dedent@1.5.3: {} - '@napi-rs/lzma-darwin-arm64@1.3.1': - optional: true + deepmerge@4.3.1: {} - '@napi-rs/lzma-darwin-x64@1.3.1': - optional: true + detect-newline@3.1.0: {} - '@napi-rs/lzma-freebsd-x64@1.3.1': - optional: true + diff-sequences@29.6.3: {} - '@napi-rs/lzma-linux-arm-gnueabihf@1.3.1': - optional: true + diff@4.0.2: {} - '@napi-rs/lzma-linux-arm64-gnu@1.3.1': - optional: true + ejs@3.1.10: + dependencies: + jake: 10.9.2 - '@napi-rs/lzma-linux-arm64-musl@1.3.1': - optional: true + electron-to-chromium@1.5.84: {} - '@napi-rs/lzma-linux-x64-gnu@1.3.1': - optional: true + emittery@0.13.1: {} - '@napi-rs/lzma-linux-x64-musl@1.3.1': - optional: true + emoji-regex@8.0.0: {} - '@napi-rs/lzma-wasm32-wasi@1.3.1': + error-ex@1.3.2: dependencies: - '@napi-rs/wasm-runtime': 0.2.3 - optional: true + is-arrayish: 0.2.1 - '@napi-rs/lzma-win32-arm64-msvc@1.3.1': - optional: true + escalade@3.2.0: {} - '@napi-rs/lzma-win32-ia32-msvc@1.3.1': - optional: true + escape-string-regexp@2.0.0: {} - '@napi-rs/lzma-win32-x64-msvc@1.3.1': - optional: true + esprima@4.0.1: {} - '@napi-rs/lzma@1.3.1': - optionalDependencies: - '@napi-rs/lzma-android-arm-eabi': 1.3.1 - '@napi-rs/lzma-android-arm64': 1.3.1 - '@napi-rs/lzma-darwin-arm64': 1.3.1 - '@napi-rs/lzma-darwin-x64': 1.3.1 - '@napi-rs/lzma-freebsd-x64': 1.3.1 - '@napi-rs/lzma-linux-arm-gnueabihf': 1.3.1 - '@napi-rs/lzma-linux-arm64-gnu': 1.3.1 - '@napi-rs/lzma-linux-arm64-musl': 1.3.1 - '@napi-rs/lzma-linux-x64-gnu': 1.3.1 - '@napi-rs/lzma-linux-x64-musl': 1.3.1 - '@napi-rs/lzma-wasm32-wasi': 1.3.1 - '@napi-rs/lzma-win32-arm64-msvc': 1.3.1 - '@napi-rs/lzma-win32-ia32-msvc': 1.3.1 - '@napi-rs/lzma-win32-x64-msvc': 1.3.1 + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + 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 - '@napi-rs/tar-android-arm-eabi@0.1.1': - optional: true + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 - '@napi-rs/tar-android-arm64@0.1.1': - optional: true + fast-json-stable-stringify@2.1.0: {} - '@napi-rs/tar-darwin-arm64@0.1.1': - optional: true + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 - '@napi-rs/tar-darwin-x64@0.1.1': - optional: true + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 - '@napi-rs/tar-freebsd-x64@0.1.1': - optional: true + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 - '@napi-rs/tar-linux-arm-gnueabihf@0.1.1': - optional: true + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 - '@napi-rs/tar-linux-arm64-gnu@0.1.1': - optional: true + fs.realpath@1.0.0: {} - '@napi-rs/tar-linux-arm64-musl@0.1.1': + fsevents@2.3.3: optional: true - '@napi-rs/tar-linux-x64-gnu@0.1.1': - optional: true + function-bind@1.1.2: {} - '@napi-rs/tar-linux-x64-musl@0.1.1': - optional: true + gensync@1.0.0-beta.2: {} - '@napi-rs/tar-wasm32-wasi@0.1.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.3 - optional: true + get-caller-file@2.0.5: {} - '@napi-rs/tar-win32-arm64-msvc@0.1.1': - optional: true + get-package-type@0.1.0: {} - '@napi-rs/tar-win32-ia32-msvc@0.1.1': - optional: true + get-stream@6.0.1: {} - '@napi-rs/tar-win32-x64-msvc@0.1.1': - optional: true + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 - '@napi-rs/tar@0.1.1': - optionalDependencies: - '@napi-rs/tar-android-arm-eabi': 0.1.1 - '@napi-rs/tar-android-arm64': 0.1.1 - '@napi-rs/tar-darwin-arm64': 0.1.1 - '@napi-rs/tar-darwin-x64': 0.1.1 - '@napi-rs/tar-freebsd-x64': 0.1.1 - '@napi-rs/tar-linux-arm-gnueabihf': 0.1.1 - '@napi-rs/tar-linux-arm64-gnu': 0.1.1 - '@napi-rs/tar-linux-arm64-musl': 0.1.1 - '@napi-rs/tar-linux-x64-gnu': 0.1.1 - '@napi-rs/tar-linux-x64-musl': 0.1.1 - '@napi-rs/tar-wasm32-wasi': 0.1.1 - '@napi-rs/tar-win32-arm64-msvc': 0.1.1 - '@napi-rs/tar-win32-ia32-msvc': 0.1.1 - '@napi-rs/tar-win32-x64-msvc': 0.1.1 + globals@11.12.0: {} - '@napi-rs/wasm-runtime@0.2.3': + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: dependencies: - '@emnapi/core': 1.1.1 - '@emnapi/runtime': 1.1.1 - '@tybys/wasm-util': 0.8.3 - optional: true + function-bind: 1.1.2 - '@napi-rs/wasm-tools-android-arm-eabi@0.0.2': - optional: true + html-escaper@2.0.2: {} - '@napi-rs/wasm-tools-android-arm64@0.0.2': - optional: true + human-signals@2.1.0: {} - '@napi-rs/wasm-tools-darwin-arm64@0.0.2': - optional: true + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 - '@napi-rs/wasm-tools-darwin-x64@0.0.2': - optional: true + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 - '@napi-rs/wasm-tools-freebsd-x64@0.0.2': - optional: true + imurmurhash@0.1.4: {} - '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.2': - optional: true + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 - '@napi-rs/wasm-tools-linux-arm64-musl@0.0.2': - optional: true + inherits@2.0.4: {} - '@napi-rs/wasm-tools-linux-x64-gnu@0.0.2': - optional: true + inquirer@10.2.2: + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/prompts': 5.5.0 + '@inquirer/type': 1.5.5 + '@types/mute-stream': 0.0.4 + ansi-escapes: 4.3.2 + mute-stream: 1.0.0 + run-async: 3.0.0 + rxjs: 7.8.1 - '@napi-rs/wasm-tools-linux-x64-musl@0.0.2': - optional: true + is-arrayish@0.2.1: {} - '@napi-rs/wasm-tools-wasm32-wasi@0.0.2': + is-core-module@2.16.1: dependencies: - '@napi-rs/wasm-runtime': 0.2.3 - optional: true + hasown: 2.0.2 - '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.2': - optional: true + is-fullwidth-code-point@3.0.0: {} - '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.2': - optional: true + is-generator-fn@2.1.0: {} - '@napi-rs/wasm-tools-win32-x64-msvc@0.0.2': - optional: true + is-number@7.0.0: {} - '@napi-rs/wasm-tools@0.0.2': - optionalDependencies: - '@napi-rs/wasm-tools-android-arm-eabi': 0.0.2 - '@napi-rs/wasm-tools-android-arm64': 0.0.2 - '@napi-rs/wasm-tools-darwin-arm64': 0.0.2 - '@napi-rs/wasm-tools-darwin-x64': 0.0.2 - '@napi-rs/wasm-tools-freebsd-x64': 0.0.2 - '@napi-rs/wasm-tools-linux-arm64-gnu': 0.0.2 - '@napi-rs/wasm-tools-linux-arm64-musl': 0.0.2 - '@napi-rs/wasm-tools-linux-x64-gnu': 0.0.2 - '@napi-rs/wasm-tools-linux-x64-musl': 0.0.2 - '@napi-rs/wasm-tools-wasm32-wasi': 0.0.2 - '@napi-rs/wasm-tools-win32-arm64-msvc': 0.0.2 - '@napi-rs/wasm-tools-win32-ia32-msvc': 0.0.2 - '@napi-rs/wasm-tools-win32-x64-msvc': 0.0.2 + is-stream@2.0.1: {} - '@octokit/auth-token@5.1.1': {} + isexe@2.0.0: {} - '@octokit/core@6.1.2': + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: dependencies: - '@octokit/auth-token': 5.1.1 - '@octokit/graphql': 8.1.1 - '@octokit/request': 9.1.3 - '@octokit/request-error': 6.1.4 - '@octokit/types': 13.5.0 - before-after-hook: 3.0.2 - universal-user-agent: 7.0.2 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@octokit/endpoint@10.1.1': + istanbul-lib-instrument@6.0.3: dependencies: - '@octokit/types': 13.5.0 - universal-user-agent: 7.0.2 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color - '@octokit/graphql@8.1.1': + istanbul-lib-report@3.0.1: dependencies: - '@octokit/request': 9.1.3 - '@octokit/types': 13.5.0 - universal-user-agent: 7.0.2 - - '@octokit/openapi-types@22.2.0': {} + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@6.1.2)': + istanbul-lib-source-maps@4.0.1: dependencies: - '@octokit/core': 6.1.2 - '@octokit/types': 13.5.0 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color - '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.2)': + istanbul-reports@3.1.7: dependencies: - '@octokit/core': 6.1.2 + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@6.1.2)': + jake@10.9.2: dependencies: - '@octokit/core': 6.1.2 - '@octokit/types': 13.5.0 + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 - '@octokit/request-error@6.1.4': + jest-changed-files@29.7.0: dependencies: - '@octokit/types': 13.5.0 + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 - '@octokit/request@9.1.3': + jest-circus@29.7.0: dependencies: - '@octokit/endpoint': 10.1.1 - '@octokit/request-error': 6.1.4 - '@octokit/types': 13.5.0 - universal-user-agent: 7.0.2 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.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.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color - '@octokit/rest@21.0.1': + jest-cli@29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): dependencies: - '@octokit/core': 6.1.2 - '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@6.1.2) - '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.2) - '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@6.1.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node - '@octokit/types@13.5.0': + jest-config@29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): dependencies: - '@octokit/openapi-types': 22.2.0 + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + 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.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.12.11 + ts-node: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color - '@scarf/scarf@1.3.0': {} + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - '@tsconfig/node10@1.0.11': {} + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 - '@tsconfig/node12@1.0.11': {} + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 - '@tsconfig/node14@1.0.3': {} + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + jest-mock: 29.7.0 + jest-util: 29.7.0 - '@tsconfig/node16@1.0.4': {} + jest-get-type@29.6.3: {} - '@tybys/wasm-util@0.8.3': + jest-haste-map@29.7.0: dependencies: - tslib: 2.6.2 - optional: true + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.12.11 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 - '@types/mute-stream@0.0.4': + jest-leak-detector@29.7.0: dependencies: - '@types/node': 20.12.11 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - '@types/node@20.12.11': + jest-matcher-utils@29.7.0: dependencies: - undici-types: 5.26.5 + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - '@types/node@22.7.4': + jest-message-util@29.7.0: dependencies: - undici-types: 6.19.8 + '@babel/code-frame': 7.26.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + jest-util: 29.7.0 - '@types/wrap-ansi@3.0.0': {} + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 - acorn-walk@8.3.2: {} + jest-regex-util@29.6.3: {} - acorn@8.11.3: {} + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color - ansi-escapes@4.3.2: + jest-resolve@29.7.0: dependencies: - type-fest: 0.21.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.10 + resolve.exports: 2.0.3 + slash: 3.0.0 + + jest-runner@29.7.0: + 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': 20.12.11 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + 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 + transitivePeerDependencies: + - supports-color - ansi-regex@5.0.1: {} + jest-runtime@29.7.0: + 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': 20.12.11 + chalk: 4.1.2 + cjs-module-lexer: 1.4.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + 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 + transitivePeerDependencies: + - supports-color - ansi-styles@4.3.0: + jest-snapshot@29.7.0: dependencies: - color-convert: 2.0.1 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.5 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + 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.6.2 + transitivePeerDependencies: + - supports-color - ansi-styles@6.2.1: {} + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 - arg@4.1.3: {} + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.11 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 - argparse@2.0.1: {} + jest-worker@29.7.0: + dependencies: + '@types/node': 20.12.11 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 - balanced-match@1.0.2: {} + jest@29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node - before-after-hook@3.0.2: {} + js-tokens@4.0.0: {} - brace-expansion@2.0.1: + js-yaml@3.14.1: dependencies: - balanced-match: 1.0.2 + argparse: 1.0.10 + esprima: 4.0.1 - chardet@0.7.0: {} + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 - cli-width@4.1.0: {} + jsesc@3.1.0: {} - clipanion@3.2.1(typanion@3.14.0): - dependencies: - typanion: 3.14.0 + json-parse-even-better-errors@2.3.1: {} - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 + json-parse-even-better-errors@3.0.2: {} - color-name@1.1.4: {} + json5@2.2.3: {} - colorette@2.0.20: {} + kleur@3.0.3: {} - create-require@1.1.1: {} + leven@3.1.0: {} - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + lines-and-columns@1.2.4: {} - debug@4.3.4: + locate-path@5.0.0: dependencies: - ms: 2.1.2 + p-locate: 4.1.0 - diff@4.0.2: {} + lodash-es@4.17.21: {} - emoji-regex@8.0.0: {} + lodash.memoize@4.1.2: {} - external-editor@3.1.0: + lru-cache@5.1.1: dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + yallist: 3.1.1 - iconv-lite@0.4.24: + make-dir@4.0.0: dependencies: - safer-buffer: 2.1.2 + semver: 7.6.2 - inquirer@10.2.2: + make-error@1.3.6: {} + + makeerror@1.0.12: dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/prompts': 5.5.0 - '@inquirer/type': 1.5.5 - '@types/mute-stream': 0.0.4 - ansi-escapes: 4.3.2 - mute-stream: 1.0.0 - run-async: 3.0.0 - rxjs: 7.8.1 + tmpl: 1.0.5 - is-fullwidth-code-point@3.0.0: {} + memorystream@0.3.1: {} - isexe@2.0.0: {} + merge-stream@2.0.0: {} - js-yaml@4.1.0: + micromatch@4.0.8: dependencies: - argparse: 2.0.1 - - json-parse-even-better-errors@3.0.2: {} + braces: 3.0.3 + picomatch: 2.3.1 - lodash-es@4.17.21: {} + mimic-fn@2.1.0: {} - make-error@1.3.6: {} + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 - memorystream@0.3.1: {} + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 minimatch@9.0.4: dependencies: @@ -1377,6 +3555,14 @@ snapshots: mute-stream@1.0.0: {} + natural-compare@1.4.0: {} + + node-int64@0.4.0: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + npm-normalize-package-bin@3.0.1: {} npm-run-all2@6.1.2: @@ -1389,17 +3575,97 @@ snapshots: read-package-json-fast: 3.0.2 shell-quote: 1.8.1 + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + os-tmpdir@1.0.2: {} + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + pidtree@0.6.0: {} + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + pure-rand@6.1.0: {} + + react-is@18.3.1: {} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + run-async@3.0.0: {} rxjs@7.8.1: @@ -1408,8 +3674,12 @@ snapshots: safer-buffer@2.1.2: {} + semver@6.3.1: {} + semver@7.6.2: {} + semver@7.6.3: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -1418,8 +3688,32 @@ snapshots: shell-quote@1.8.1: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -1430,12 +3724,59 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + toml@3.0.0: {} + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)))(typescript@5.4.5): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.12.11)(ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.4.5 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + ts-node@10.9.2(@types/node@20.12.11)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -1458,6 +3799,8 @@ snapshots: typanion@3.14.0: {} + type-detect@4.0.8: {} + type-fest@0.21.3: {} typescript@5.4.5: {} @@ -1468,8 +3811,24 @@ snapshots: universal-user-agent@7.0.2: {} + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + v8-compile-cache-lib@3.0.1: {} + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + wasm-sjlj@1.0.5: {} which@2.0.2: @@ -1482,6 +3841,37 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yn@3.1.1: {} + yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.2: {} From fa395f356aa1981b09ce4e78b141165bbe8913bc Mon Sep 17 00:00:00 2001 From: Aaron Villalpando Date: Fri, 14 Feb 2025 11:09:46 -0800 Subject: [PATCH 08/10] add python integ test --- integ-tests/python/.gitignore | 4 +++- integ-tests/python/tests/test_functions.py | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/integ-tests/python/.gitignore b/integ-tests/python/.gitignore index 2299a6acd..6d095e487 100644 --- a/integ-tests/python/.gitignore +++ b/integ-tests/python/.gitignore @@ -5,4 +5,6 @@ __pycache__/ # C extensions *.so -.env \ No newline at end of file +.env + +*.egg-info \ No newline at end of file diff --git a/integ-tests/python/tests/test_functions.py b/integ-tests/python/tests/test_functions.py index 934cd41b8..5ecd91c5b 100644 --- a/integ-tests/python/tests/test_functions.py +++ b/integ-tests/python/tests/test_functions.py @@ -869,6 +869,11 @@ async def test_dynamic(): for r in tb_res: print(r.model_dump()) +@pytest.mark.asyncio +async def test_typebuilder_print(): + tb = TypeBuilder() + tb.Person.add_property("candy", tb.string().list()) + print(tb) @pytest.mark.asyncio async def test_dynamic_class_output(): From 6c5f07fa6a5f1eaf5bc29caa57c152ae3f213795 Mon Sep 17 00:00:00 2001 From: Aaron Villalpando Date: Fri, 14 Feb 2025 13:59:39 -0800 Subject: [PATCH 09/10] Add typebuilder string representation --- engine/baml-runtime/src/type_builder/mod.rs | 119 +++++++++++++++--- .../python_src/baml_py/type_builder.py | 7 -- .../test/type_builder_test.rb | 14 +-- .../__test__/type_builder.test.ts | 19 +-- .../src/types/type_builder.ts | 43 ------- integ-tests/python/tests/test_functions.py | 11 +- 6 files changed, 132 insertions(+), 81 deletions(-) delete mode 100644 engine/language_client_typescript/src/types/type_builder.ts diff --git a/engine/baml-runtime/src/type_builder/mod.rs b/engine/baml-runtime/src/type_builder/mod.rs index a3db72b94..fd7c645c3 100644 --- a/engine/baml-runtime/src/type_builder/mod.rs +++ b/engine/baml-runtime/src/type_builder/mod.rs @@ -153,15 +153,13 @@ impl EnumBuilder { impl fmt::Display for ClassPropertyBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let meta = self.meta.lock().unwrap(); - write!( - f, - "{}", - self.r#type - .lock() - .unwrap() - .as_ref() - .map_or("unset", |_| "set") - )?; + let type_str = self + .r#type + .lock() + .unwrap() + .as_ref() + .map_or("(unknown-type)".to_string(), |t| format!("{}", t.clone())); + write!(f, "{}", type_str)?; if !meta.is_empty() { write!(f, " (")?; @@ -326,10 +324,10 @@ impl fmt::Display for TypeBuilder { let classes = self.classes.lock().unwrap(); let enums = self.enums.lock().unwrap(); - writeln!(f, "TypeBuilder(")?; + write!(f, "TypeBuilder(")?; if !classes.is_empty() { - write!(f, " Classes: [")?; + write!(f, "\n Classes: [")?; for (i, (name, cls)) in classes.iter().enumerate() { if i > 0 { write!(f, ",")?; @@ -641,11 +639,26 @@ mod tests { let output = builder.to_string(); assert_eq!( output, - "TypeBuilder(\n Classes: [\n User {\n name set (alias=String(\"username\"), description=String(\"The user's full name\")),\n age set (description=String(\"User's age in years\")),\n email set\n }\n ],\n Enums: [\n Status {\n ACTIVE (alias=String(\"active\"), description=String(\"User is active\")),\n INACTIVE (alias=String(\"inactive\")),\n PENDING\n }\n ]\n)" + r#"TypeBuilder( + Classes: [ + User { + name string (alias=String("username"), description=String("The user's full name")), + age int (description=String("User's age in years")), + email string + } + ], + Enums: [ + Status { + ACTIVE (alias=String("active"), description=String("User is active")), + INACTIVE (alias=String("inactive")), + PENDING + } + ] +)"# ); } - // my paranoia kicked in, so this test is to ensure that the string representation is correct + // this test is to ensure that the string representation is correct // and that the to_overrides method is working as expected #[test] @@ -746,11 +759,31 @@ mod tests { let output = builder.to_string(); assert_eq!( output, - "TypeBuilder(\n Classes: [\n Address {\n street set (alias=String(\"streetAddress\"), description=String(\"Street address including number\")),\n unit set (description=String(\"Apartment/unit number if applicable\")),\n tags set (alias=String(\"labels\")),\n is_primary set,\n coordinates set (skip=Bool(true))\n },\n EmptyClass {}\n ],\n Enums: [\n Priority {\n HIGH (alias=String(\"urgent\"), description=String(\"Needs immediate attention\"), skip=Bool(false)),\n MEDIUM (description=String(\"Standard priority\")),\n LOW (skip=Bool(true)),\n NONE\n },\n EmptyEnum {}\n ]\n)" + r#"TypeBuilder( + Classes: [ + Address { + street string (alias=String("streetAddress"), description=String("Street address including number")), + unit int? (description=String("Apartment/unit number if applicable")), + tags string[] (alias=String("labels")), + is_primary bool, + coordinates float (skip=Bool(true)) + }, + EmptyClass {} + ], + Enums: [ + Priority { + HIGH (alias=String("urgent"), description=String("Needs immediate attention"), skip=Bool(false)), + MEDIUM (description=String("Standard priority")), + LOW (skip=Bool(true)), + NONE + }, + EmptyEnum {} + ] +)"# ); // Test to_overrides() - let (classes, enums) = builder.to_overrides(); + let (classes, enums, aliases, recursive_aliases) = builder.to_overrides(); // Verify class overrides assert_eq!(classes.len(), 2); @@ -783,4 +816,60 @@ mod tests { .is_some()); assert!(priority_override.values.get("LOW").unwrap().skip.unwrap()); } + + #[test] + fn test_recursive_property() { + let builder = TypeBuilder::new(); + + // Create a 'Node' class where the 'child' property recursively refers to 'Node' + let node = builder.class("Node"); + { + let node = node.lock().unwrap(); + node.property("child") + .lock() + .unwrap() + .r#type(FieldType::class("Node")) + .with_meta( + "description", + BamlValue::String("recursive self reference".to_string()), + ); + } + + // Optionally, print the builder's string representation. + let output = builder.to_string(); + println!("{}", output); + + // Verify that the output string contains the recursive property information. + assert!( + output.contains( + r#"TypeBuilder( + Classes: [ + Node { + child Node (description=String("recursive self reference")) + } + ] +)"# + ), + "Output did not contain the expected recursive property format: {}", + output + ); + + // Verify via to_overrides() that the recursive field is set correctly. + let (class_overrides, _enum_overrides, _aliases, _recursive_aliases) = + builder.to_overrides(); + let node_override = class_overrides + .get("Node") + .expect("Expected override for Node"); + let (child_field_type, _child_attrs) = node_override + .new_fields + .get("child") + .expect("Expected a 'child' property in Node"); + + // The child's field type should exactly be a recursive reference to 'Node' + assert_eq!( + child_field_type, + &FieldType::class("Node"), + "The 'child' field is not correctly set as a recursive reference to 'Node'" + ); + } } diff --git a/engine/language_client_python/python_src/baml_py/type_builder.py b/engine/language_client_python/python_src/baml_py/type_builder.py index d59476d38..665e285f2 100644 --- a/engine/language_client_python/python_src/baml_py/type_builder.py +++ b/engine/language_client_python/python_src/baml_py/type_builder.py @@ -42,13 +42,6 @@ def __str__(self) -> str: ] ) - the representation includes: - - complete class hierarchy with properties - - property types and their metadata (aliases, descriptions) - - full enum definitions with values - - enum value metadata (aliases, descriptions) - - empty classes and enums are shown explicitly - returns: str: the formatted string representation of the typebuilder """ diff --git a/engine/language_client_ruby/test/type_builder_test.rb b/engine/language_client_ruby/test/type_builder_test.rb index 3c75dff04..d9b5f6b64 100644 --- a/engine/language_client_ruby/test/type_builder_test.rb +++ b/engine/language_client_ruby/test/type_builder_test.rb @@ -37,10 +37,10 @@ def test_class_string_representation # verify that the string output matches our expectations # we check for key structural elements and metadata - assert_match(/TypeBuilder\(Classes: \[User \{/, output) - assert_match(/name unset \(alias='username', desc='The user's full name'\)/, output) - assert_match(/age unset \(desc='User's age in years'\)/, output) - assert_match(/email unset/, output) + assert_match(/TypeBuilder\(\n Classes: \[\n User \{/, output) + assert_match(/name \(unknown-type\) \(alias=String\("username"\), description=String\("The user's full name"\)\)/, output) + assert_match(/age \(unknown-type\) \(description=String\("User's age in years"\)\)/, output) + assert_match(/email \(unknown-type\)/, output) end # tests that enum definitions are correctly stringified with their @@ -73,9 +73,9 @@ def test_enum_string_representation # verify the string representation includes all our carefully # defined values and their metadata - assert_match(/TypeBuilder\(Enums: \[Status \{/, output) - assert_match(/ACTIVE \(alias='active', desc='User is active'\)/, output) - assert_match(/INACTIVE \(alias='inactive'\)/, output) + assert_match(/TypeBuilder\(\n Enums: \[\n Status \{/, output) + assert_match(/ACTIVE \(alias=String\("active"\), description=String\("User is active"\)\)/, output) + assert_match(/INACTIVE \(alias=String\("inactive"\)\)/, output) assert_match(/PENDING/, output) end end \ No newline at end of file diff --git a/engine/language_client_typescript/__test__/type_builder.test.ts b/engine/language_client_typescript/__test__/type_builder.test.ts index b8fd34666..122ba1222 100644 --- a/engine/language_client_typescript/__test__/type_builder.test.ts +++ b/engine/language_client_typescript/__test__/type_builder.test.ts @@ -1,6 +1,6 @@ // import the typescript wrapper for the type builder that provides a clean interface // over the native rust implementation -import { TypeBuilder } from '../src/types/type_builder'; +import { TypeBuilder } from '../native'; describe('TypeBuilder', () => { // test that we can create classes with properties and add metadata like aliases and descriptions @@ -28,11 +28,11 @@ describe('TypeBuilder', () => { const output = builder.toString(); // make sure the output has the expected class structure - expect(output).toContain('TypeBuilder(Classes: [User {'); + expect(output).toContain('TypeBuilder(\n Classes: [\n User {'); // verify each property appears with its metadata - expect(output).toContain('name unset (alias=\'username\', desc=\'the user\'s full name\')'); - expect(output).toContain('age unset (desc=\'user\'s age in years\')'); - expect(output).toContain('email unset'); + expect(output).toContain("name (unknown-type) (alias=String(\"username\"), description=String(\"the user's full name\"))"); + expect(output).toContain("age (unknown-type) (description=String(\"user's age in years\"))"); + expect(output).toContain('email (unknown-type)'); }); // test that we can create enums with values and add metadata like aliases and descriptions @@ -60,10 +60,13 @@ describe('TypeBuilder', () => { const output = builder.toString(); // make sure the output has the expected enum structure - expect(output).toContain('TypeBuilder(Enums: [Status {'); + console.log(output); + expect(output).toContain(`TypeBuilder( + Enums: [ + Status {`); // verify each value appears with its metadata - expect(output).toContain('ACTIVE (alias=\'active\', desc=\'user is active\')'); - expect(output).toContain('INACTIVE (alias=\'inactive\')'); + expect(output).toContain('ACTIVE (alias=String(\"active\"), description=String(\"user is active\"))'); + expect(output).toContain('INACTIVE (alias=String(\"inactive\"))'); expect(output).toContain('PENDING'); }); }); \ No newline at end of file diff --git a/engine/language_client_typescript/src/types/type_builder.ts b/engine/language_client_typescript/src/types/type_builder.ts deleted file mode 100644 index eee6c70b1..000000000 --- a/engine/language_client_typescript/src/types/type_builder.ts +++ /dev/null @@ -1,43 +0,0 @@ -// import the native typebuilder that was compiled from rust code using napi-rs -// this provides the core functionality that our typescript wrapper will use -import { TypeBuilder as NativeTypeBuilder } from '../../native'; - -export class TypeBuilder { - // holds the instance of the native rust implementation - // the native instance handles all the actual type building logic - // we just provide a nice typescript interface on top - private native: NativeTypeBuilder; - - constructor() { - // instantiate a new native typebuilder when this wrapper is created - // this sets up the underlying rust state that we'll delegate to - this.native = new NativeTypeBuilder(); - } - - // creates a new class definition or returns an existing one with the given name - // we renamed this from addclass/class_ to getclass to better match what the native api expects - // this is used to define the structure and properties of classes in the type system - getClass(name: string) { - // pass the class creation request through to the native rust implementation - // the rust code handles all the details of managing the class definition - return this.native.getClass(name); - } - - // creates a new enum definition or returns an existing one with the given name - // we renamed this from addenum/enum to getenum to better match what the native api expects - // this is used to define enums with their possible values and metadata - getEnum(name: string) { - // delegate enum creation to the native rust implementation - // the rust code manages the enum definition and its allowed values - return this.native.getEnum(name); - } - - // converts the entire type definition to a human-readable string representation - // useful for debugging and seeing the full structure of defined types - toString(): string { - // let the native rust code generate the string representation - // it will include all classes and enums with their properties, values and metadata - // formatted in a consistent way for easy reading - return this.native.toString(); - } -} \ No newline at end of file diff --git a/integ-tests/python/tests/test_functions.py b/integ-tests/python/tests/test_functions.py index f5694ee12..cb996470e 100644 --- a/integ-tests/python/tests/test_functions.py +++ b/integ-tests/python/tests/test_functions.py @@ -925,7 +925,16 @@ async def test_dynamic(): async def test_typebuilder_print(): tb = TypeBuilder() tb.Person.add_property("candy", tb.string().list()) - print(tb) + print("Typebuilder print repr: ", tb) + expected = """TypeBuilder( + Classes: [ + Person { + candy string[] + } + ] +)""" + assert str(tb) == expected + @pytest.mark.asyncio async def test_dynamic_class_output(): From 5217bfb99f56ba94bd71530c2479a5f6c5d9e719 Mon Sep 17 00:00:00 2001 From: Aaron Villalpando Date: Fri, 14 Feb 2025 14:05:23 -0800 Subject: [PATCH 10/10] delete extraneous test --- integ-tests/python/test_type_builder_str.py | 78 --------------------- 1 file changed, 78 deletions(-) delete mode 100644 integ-tests/python/test_type_builder_str.py diff --git a/integ-tests/python/test_type_builder_str.py b/integ-tests/python/test_type_builder_str.py deleted file mode 100644 index fa93b8924..000000000 --- a/integ-tests/python/test_type_builder_str.py +++ /dev/null @@ -1,78 +0,0 @@ -import pytest -from baml_client.type_builder import TypeBuilder - -def test_type_builder_str(): - """ - test for typebuilder's string representation functionality. - - this test verifies that the typebuilder correctly represents its structure - in string format, ensuring proper exposure of the rust implementation to python. - - test coverage: - ------------- - 1. class representation: - - class names and structure - - property definitions with types - - property metadata: - * aliases for alternative naming - * descriptions for documentation - - 2. enum representation: - - enum names and structure - - value definitions - - value metadata: - * aliases for alternative naming - * descriptions for documentation - - 3. cross-language integration: - - verifies that the rust string representation is correctly - exposed through the python bindings - - ensures consistent formatting across language boundaries - """ - # Create a new TypeBuilder - tb = TypeBuilder() - - # Add a class with properties and metadata - user = tb.class_("User") - name_prop = user.property("name") - name_prop.type(tb.string()) - name_prop.with_meta("alias", "username") - name_prop.with_meta("description", "The user's full name") - - age_prop = user.property("age") - age_prop.type(tb.int()) - age_prop.with_meta("description", "User's age in years") - - email_prop = user.property("email") - email_prop.type(tb.string()) - - # Add an enum with values and metadata - status = tb.enum("Status") - active = status.value("ACTIVE") - active.with_meta("alias", "active") - active.with_meta("description", "User is active") - - inactive = status.value("INACTIVE") - inactive.with_meta("alias", "inactive") - - status.value("PENDING") - - # Convert to string and verify the format - output = str(tb) - print(f"TypeBuilder string representation:\n{output}") - - # Verify the expected format - assert "User" in output - assert "name" in output - assert "username" in output - assert "The user's full name" in output - assert "age" in output - assert "User's age in years" in output - assert "email" in output - assert "Status" in output - assert "ACTIVE" in output - assert "active" in output - assert "User is active" in output - assert "INACTIVE" in output - assert "inactive" in output - assert "PENDING" in output \ No newline at end of file