diff --git a/.gitignore b/.gitignore index 826b0b188..08f084abe 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ redis/ node_modules/ .vscode/ runner/yarn.lock +**/.DS_Store + diff --git a/README.md b/README.md index 682af8129..2db9f194e 100644 --- a/README.md +++ b/README.md @@ -39,27 +39,12 @@ Runner: - `AWS_ACCESS_KEY_ID` - `AWS_SECRET_ACCESS_KEY` -Coordinator: -- `LAKE_AWS_ACCESS_KEY` -- `LAKE_AWS_SECRET_ACCESS_KEY` -- `QUEUE_AWS_ACCESS_KEY` -- `QUEUE_AWS_SECRET_ACCESS_KEY` +Block Streamer: +- `AWS_ACCESS_KEY_ID` +- `AWS_SECRET_ACCESS_KEY` These should be populated with your credentials. In most cases, the same key pair can be used for all 3 sets of credentials. Just ensure the keys have permissions to access S3 for handling [Requestor Pays](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html) in Near Lake. -### Hasura Configuration -Hasura contains shared tables for e.g. logging and setting arbitrary state. These tables must be configured prior to running the entire QueryApi application. Configuration is stored in the `hasura/` directory and deployed through the Hasura CLI. - -To configure Hasura, first start it with: -```sh -docker compose up hasura-graphql --detach -``` - -And apply the configuration with: -```sh -cd ./hasura && hasura deploy -``` - ### Running QueryApi With everything configured correctly, we can now start all components of QueryApi with: ```sh diff --git a/coordinator/Cargo.lock b/coordinator/Cargo.lock index 0e4e5e24f..222416d8c 100644 --- a/coordinator/Cargo.lock +++ b/coordinator/Cargo.lock @@ -1307,6 +1307,7 @@ dependencies = [ "tonic 0.10.2", "tonic-build 0.10.2", "tracing", + "tracing-stackdriver", "tracing-subscriber", ] diff --git a/coordinator/Cargo.toml b/coordinator/Cargo.toml index a595dcf2f..6829bb03f 100644 --- a/coordinator/Cargo.toml +++ b/coordinator/Cargo.toml @@ -12,6 +12,7 @@ tokio = "1.28" tonic = "0.10.2" tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-stackdriver = "0.10.0" serde = "1.0.195" serde_json = "1.0.108" diff --git a/coordinator/src/handlers/block_streams.rs b/coordinator/src/handlers/block_streams.rs index c3dc21e4a..b549fdea4 100644 --- a/coordinator/src/handlers/block_streams.rs +++ b/coordinator/src/handlers/block_streams.rs @@ -18,7 +18,19 @@ use tonic::transport::channel::Channel; use crate::indexer_config::IndexerConfig; use crate::redis::{KeyProvider, RedisClient}; -const RESTART_TIMEOUT_SECONDS: u64 = 600; +#[derive(Debug, PartialEq)] +pub enum BlockStreamStatus { + /// Block Stream is running as expected + Active, + /// Existing Block Stream is in an unhealthy state + Unhealthy, + /// Existing Block Stream is not running + Inactive, + /// Block Stream is not synchronized with the latest config + Outdated, + /// Block Stream has not been encountered before + NotStarted, +} #[cfg(not(test))] use BlockStreamsClientWrapperImpl as BlockStreamsClientWrapper; @@ -67,13 +79,19 @@ impl BlockStreamsClientWrapperImpl { } } +#[cfg(not(test))] +pub use BlockStreamsHandlerImpl as BlockStreamsHandler; +#[cfg(test)] +pub use MockBlockStreamsHandlerImpl as BlockStreamsHandler; + #[derive(Clone)] -pub struct BlockStreamsHandler { +pub struct BlockStreamsHandlerImpl { client: BlockStreamsClientWrapper, redis_client: RedisClient, } -impl BlockStreamsHandler { +#[cfg_attr(test, mockall::automock)] +impl BlockStreamsHandlerImpl { pub fn connect(block_streamer_url: &str, redis_client: RedisClient) -> anyhow::Result { let channel = Channel::from_shared(block_streamer_url.to_string()) .context("Block Streamer URL is invalid")? @@ -185,7 +203,10 @@ impl BlockStreamsHandler { Ok(()) } - async fn reconfigure(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn reconfigure(&self, config: &IndexerConfig) -> anyhow::Result<()> { + self.stop_if_needed(config.account_id.clone(), config.function_name.clone()) + .await?; + if matches!( config.start_block, StartBlock::Latest | StartBlock::Height(..) @@ -210,7 +231,7 @@ impl BlockStreamsHandler { Ok(()) } - async fn start_new_block_stream(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn start_new_block_stream(&self, config: &IndexerConfig) -> anyhow::Result<()> { let height = match config.start_block { StartBlock::Height(height) => height, StartBlock::Latest => config.get_registry_version(), @@ -248,7 +269,7 @@ impl BlockStreamsHandler { Ok(height) } - async fn resume(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn resume(&self, config: &IndexerConfig) -> anyhow::Result<()> { let height = self.get_continuation_block_height(config).await?; tracing::info!(height, "Resuming block stream"); @@ -258,11 +279,7 @@ impl BlockStreamsHandler { Ok(()) } - async fn ensure_healthy( - &self, - config: &IndexerConfig, - block_stream: &StreamInfo, - ) -> anyhow::Result<()> { + fn is_healthy(&self, block_stream: &StreamInfo) -> bool { if let Some(health) = block_stream.health.as_ref() { let updated_at = SystemTime::UNIX_EPOCH + Duration::from_secs(health.updated_at_timestamp_secs); @@ -274,84 +291,67 @@ impl BlockStreamsHandler { ); if !stale && !stalled { - return Ok(()); - } else { - tracing::info!( - stale, - stalled, - "Restarting stalled block stream after {RESTART_TIMEOUT_SECONDS} seconds" - ); + return true; } - } else { - tracing::info!( - "Restarting stalled block stream after {RESTART_TIMEOUT_SECONDS} seconds" - ); } - self.stop(block_stream.stream_id.clone()).await?; - tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; - let height = self.get_continuation_block_height(config).await?; - self.start(height, config).await?; + false + } + + pub async fn stop_if_needed( + &self, + account_id: AccountId, + function_name: String, + ) -> anyhow::Result<()> { + if let Some(block_stream) = self.get(account_id, function_name).await? { + tracing::info!("Stopping block stream"); + + self.stop(block_stream.stream_id).await?; + } Ok(()) } - pub async fn synchronise( + pub async fn get_status( &self, config: &IndexerConfig, previous_sync_version: Option, - ) -> anyhow::Result<()> { - let block_stream = self + ) -> anyhow::Result { + if let Some(block_stream) = self .get(config.account_id.clone(), config.function_name.clone()) - .await?; - - if let Some(block_stream) = block_stream { - if block_stream.version == config.get_registry_version() { - self.ensure_healthy(config, &block_stream).await?; - return Ok(()); + .await? + { + if block_stream.version != config.get_registry_version() { + return Ok(BlockStreamStatus::Outdated); } - tracing::info!( - previous_version = block_stream.version, - "Stopping outdated block stream" - ); - - self.stop(block_stream.stream_id.clone()).await?; - - self.reconfigure(config).await?; + if !self.is_healthy(&block_stream) { + return Ok(BlockStreamStatus::Unhealthy); + } - return Ok(()); + return Ok(BlockStreamStatus::Active); } if previous_sync_version.is_none() { - self.start_new_block_stream(config).await?; - - return Ok(()); + return Ok(BlockStreamStatus::NotStarted); } if previous_sync_version.unwrap() != config.get_registry_version() { - self.reconfigure(config).await?; - - return Ok(()); + return Ok(BlockStreamStatus::Outdated); } - self.resume(config).await?; - - Ok(()) + Ok(BlockStreamStatus::Inactive) } - pub async fn stop_if_needed( - &self, - account_id: AccountId, - function_name: String, - ) -> anyhow::Result<()> { - if let Some(block_stream) = self.get(account_id, function_name).await? { - tracing::info!("Stopping block stream"); - - self.stop(block_stream.stream_id).await?; + pub async fn restart(&self, config: &IndexerConfig) -> anyhow::Result<()> { + if let Some(block_stream) = self + .get(config.account_id.clone(), config.function_name.clone()) + .await? + { + self.stop(block_stream.stream_id.clone()).await?; } - Ok(()) + self.resume(config).await } } @@ -368,19 +368,91 @@ mod tests { } } + impl Clone for MockBlockStreamsHandlerImpl { + fn clone(&self) -> Self { + Self::default() + } + } + #[tokio::test] - async fn resumes_stopped_streams() { + async fn returns_stream_status() { + let config = IndexerConfig::default(); + let test_cases = [ + ( + Some(StreamInfo { + version: config.get_registry_version(), + health: Some(block_streamer::Health { + updated_at_timestamp_secs: SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs(), + processing_state: ProcessingState::Running.into(), + }), + ..Default::default() + }), + Some(config.get_registry_version()), + BlockStreamStatus::Active, + ), + ( + None, + Some(config.get_registry_version()), + BlockStreamStatus::Inactive, + ), + ( + Some(StreamInfo { + version: config.get_registry_version() - 1, + ..Default::default() + }), + Some(config.get_registry_version()), + BlockStreamStatus::Outdated, + ), + ( + Some(StreamInfo { + version: config.get_registry_version(), + health: None, + ..Default::default() + }), + Some(config.get_registry_version()), + BlockStreamStatus::Unhealthy, + ), + (None, None, BlockStreamStatus::NotStarted), + ]; + + for (stream, previous_sync_version, expected) in test_cases { + let mut mock_client = BlockStreamsClientWrapper::default(); + mock_client + .expect_get_stream::() + .returning(move |_| { + if let Some(stream) = stream.clone() { + Ok(Response::new(stream)) + } else { + Err(tonic::Status::not_found("not found")) + } + }); + + let mock_redis = RedisClient::default(); + + let handler = BlockStreamsHandlerImpl { + client: mock_client, + redis_client: mock_redis, + }; + + assert_eq!( + expected, + handler + .get_status(&config, previous_sync_version) + .await + .unwrap() + ); + } + } + + #[tokio::test] + async fn resumes_streams() { let config = IndexerConfig::default(); let last_published_block = 10; let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))); mock_client .expect_start_stream::() .with(eq(StartStreamRequest { @@ -394,26 +466,25 @@ mod tests { start_block_height: last_published_block + 1, version: config.get_registry_version(), })) - .returning(|_| Ok(Response::new(StartStreamResponse::default()))); + .returning(|_| Ok(Response::new(StartStreamResponse::default()))) + .once(); let mut mock_redis = RedisClient::default(); mock_redis .expect_get_last_published_block::() - .returning(move |_| Ok(Some(last_published_block))); + .returning(move |_| Ok(Some(last_published_block))) + .once(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version())) - .await - .unwrap(); + handler.resume(&config).await.unwrap(); } #[tokio::test] - async fn reconfigures_outdated_streams() { + async fn reconfigures_streams() { let config = IndexerConfig::default(); let existing_stream = StreamInfo { @@ -463,15 +534,12 @@ mod tests { .returning(|_| Ok(())) .once(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version())) - .await - .unwrap(); + handler.reconfigure(&config).await.unwrap(); } #[tokio::test] @@ -479,13 +547,6 @@ mod tests { let config = IndexerConfig::default(); let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))); mock_client .expect_start_stream::() .with(eq(StartStreamRequest { @@ -507,67 +568,19 @@ mod tests { let mock_redis = RedisClient::default(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler.synchronise(&config, None).await.unwrap(); + handler.start_new_block_stream(&config).await.unwrap(); } #[tokio::test] - async fn reconfigures_outdated_and_stopped_streams() { - let config = IndexerConfig { - start_block: StartBlock::Latest, - ..Default::default() - }; - - let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))); - mock_client - .expect_start_stream::() - .with(eq(StartStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - redis_stream: config.get_redis_stream_key(), - rule: Some(Rule::ActionAnyRule(ActionAnyRule { - affected_account_id: "queryapi.dataplatform.near".to_string(), - status: Status::Any.into(), - })), - start_block_height: config.get_registry_version(), - version: config.get_registry_version(), - })) - .returning(|_| Ok(Response::new(StartStreamResponse::default()))); - - let mut mock_redis = RedisClient::default(); - mock_redis - .expect_clear_block_stream::() - .returning(|_| Ok(())) - .once(); - - let handler = BlockStreamsHandler { - client: mock_client, - redis_client: mock_redis, - }; - - handler - .synchronise(&config, Some(config.get_registry_version() - 1)) - .await - .unwrap(); - } - - #[tokio::test] - async fn restarts_unhealthy_streams() { + async fn unhealthy_stream() { tokio::time::pause(); let config = IndexerConfig::default(); - let last_published_block = 10; let existing_stream = StreamInfo { account_id: config.account_id.to_string(), @@ -583,53 +596,19 @@ mod tests { }), }; - let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_stop_stream::() - .with(eq(StopStreamRequest { - stream_id: existing_stream.stream_id.clone(), - })) - .returning(|_| Ok(Response::new(StopStreamResponse::default()))); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(move |_| Ok(Response::new(existing_stream.clone()))); - mock_client - .expect_start_stream::() - .with(eq(StartStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - redis_stream: config.get_redis_stream_key(), - rule: Some(Rule::ActionAnyRule(ActionAnyRule { - affected_account_id: "queryapi.dataplatform.near".to_string(), - status: Status::Any.into(), - })), - start_block_height: last_published_block + 1, - version: config.get_registry_version(), - })) - .returning(|_| Ok(Response::new(StartStreamResponse::default()))); - - let mut mock_redis = RedisClient::default(); - mock_redis - .expect_get_last_published_block::() - .returning(move |_| Ok(Some(last_published_block))); + let mock_client = BlockStreamsClientWrapper::default(); + let mock_redis = RedisClient::default(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version() - 1)) - .await - .unwrap(); + assert!(!handler.is_healthy(&existing_stream)); } #[tokio::test] - async fn ignores_healthy_streams() { + async fn healthy_streams() { tokio::time::pause(); let config = IndexerConfig::default(); @@ -655,32 +634,15 @@ mod tests { }), }; - let mut mock_client = BlockStreamsClientWrapper::default(); - mock_client - .expect_get_stream::() - .with(eq(GetStreamRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(move |_| Ok(Response::new(existing_stream.clone()))); - mock_client - .expect_stop_stream::() - .never(); - mock_client - .expect_start_stream::() - .never(); - + let mock_client = BlockStreamsClientWrapper::default(); let mock_redis = RedisClient::default(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; - handler - .synchronise(&config, Some(config.get_registry_version())) - .await - .unwrap(); + assert!(handler.is_healthy(&existing_stream)); } } @@ -697,6 +659,10 @@ mod tests { }; let mut mock_client = BlockStreamsClientWrapper::default(); + mock_client + .expect_get_stream::() + .returning(|_| Err(tonic::Status::not_found("not found"))) + .times(3); mock_client .expect_start_stream::() .with(always()) @@ -723,7 +689,7 @@ mod tests { .returning(|_| Ok(None)) .once(); - let handler = BlockStreamsHandler { + let handler = BlockStreamsHandlerImpl { client: mock_client, redis_client: mock_redis, }; diff --git a/coordinator/src/handlers/data_layer.rs b/coordinator/src/handlers/data_layer.rs index e0ea273cc..4b50f38b9 100644 --- a/coordinator/src/handlers/data_layer.rs +++ b/coordinator/src/handlers/data_layer.rs @@ -73,12 +73,18 @@ impl DataLayerClientWrapperImpl { } } +#[cfg(not(test))] +pub use DataLayerHandlerImpl as DataLayerHandler; +#[cfg(test)] +pub use MockDataLayerHandlerImpl as DataLayerHandler; + #[derive(Clone)] -pub struct DataLayerHandler { +pub struct DataLayerHandlerImpl { client: DataLayerClientWrapper, } -impl DataLayerHandler { +#[cfg_attr(test, mockall::automock)] +impl DataLayerHandlerImpl { pub fn connect(runner_url: &str) -> anyhow::Result { let channel = Channel::from_shared(runner_url.to_string()) .context("Runner URL is invalid")? @@ -249,6 +255,12 @@ mod tests { use mockall::predicate::*; + impl Clone for MockDataLayerHandlerImpl { + fn clone(&self) -> Self { + Self::default() + } + } + #[tokio::test] async fn provisions_data_layer() { let config = IndexerConfig::default(); @@ -290,7 +302,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -329,7 +341,7 @@ mod tests { }) .times(610); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -371,7 +383,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -423,7 +435,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -464,7 +476,7 @@ mod tests { }) .times(610); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; @@ -507,7 +519,7 @@ mod tests { }) .once(); - let handler = DataLayerHandler { + let handler = DataLayerHandlerImpl { client: mock_client, }; diff --git a/coordinator/src/handlers/executors.rs b/coordinator/src/handlers/executors.rs index 4fc67a671..55133f76d 100644 --- a/coordinator/src/handlers/executors.rs +++ b/coordinator/src/handlers/executors.rs @@ -14,7 +14,17 @@ use tonic::transport::channel::Channel; use crate::indexer_config::IndexerConfig; use crate::redis::KeyProvider; -const RESTART_TIMEOUT_SECONDS: u64 = 600; +#[derive(Debug, PartialEq)] +pub enum ExecutorStatus { + /// Executor is running as expected + Active, + /// Executor is in an unhealthy state + Unhealthy, + /// Executor is not running + Inactive, + /// Executor is not synchronized with the latest config + Outdated, +} #[cfg(not(test))] use ExecutorsClientWrapperImpl as ExecutorsClientWrapper; @@ -63,12 +73,18 @@ impl ExecutorsClientWrapperImpl { } } +#[cfg(not(test))] +pub use ExecutorsHandlerImpl as ExecutorsHandler; +#[cfg(test)] +pub use MockExecutorsHandlerImpl as ExecutorsHandler; + #[derive(Clone)] -pub struct ExecutorsHandler { +pub struct ExecutorsHandlerImpl { client: ExecutorsClientWrapper, } -impl ExecutorsHandler { +#[cfg_attr(test, mockall::automock)] +impl ExecutorsHandlerImpl { pub fn connect(runner_url: &str) -> anyhow::Result { let channel = Channel::from_shared(runner_url.to_string()) .context("Runner URL is invalid")? @@ -142,56 +158,40 @@ impl ExecutorsHandler { Ok(()) } - async fn ensure_healthy( - &self, - config: &IndexerConfig, - executor: ExecutorInfo, - ) -> anyhow::Result<()> { + fn is_healthy(&self, executor: ExecutorInfo) -> bool { if let Some(health) = executor.health { - if !matches!( + return !matches!( health.execution_state.try_into(), Ok(ExecutionState::Stalled) - ) { - return Ok(()); - } + ); } - tracing::info!("Restarting stalled executor after {RESTART_TIMEOUT_SECONDS} seconds"); - - self.stop(executor.executor_id).await?; - tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; - self.start(config).await?; - - Ok(()) + false } - pub async fn synchronise(&self, config: &IndexerConfig) -> anyhow::Result<()> { + pub async fn get_status(&self, config: &IndexerConfig) -> anyhow::Result { let executor = self .get(config.account_id.clone(), config.function_name.clone()) .await?; if let Some(executor) = executor { - if executor.version == config.get_registry_version() { - self.ensure_healthy(config, executor).await?; - return Ok(()); + if executor.version != config.get_registry_version() { + return Ok(ExecutorStatus::Outdated); } - tracing::info!( - account_id = config.account_id.as_str(), - function_name = config.function_name, - version = executor.version, - "Stopping outdated executor" - ); + if !self.is_healthy(executor) { + return Ok(ExecutorStatus::Unhealthy); + } - self.stop(executor.executor_id).await?; + return Ok(ExecutorStatus::Active); } - tracing::info!( - account_id = config.account_id.as_str(), - function_name = config.function_name, - version = config.get_registry_version(), - "Starting executor" - ); + Ok(ExecutorStatus::Inactive) + } + + pub async fn restart(&self, config: &IndexerConfig) -> anyhow::Result<()> { + self.stop_if_needed(config.account_id.clone(), config.function_name.clone()) + .await?; self.start(config).await?; @@ -225,19 +225,70 @@ mod tests { } } + impl Clone for MockExecutorsHandlerImpl { + fn clone(&self) -> Self { + Self::default() + } + } + + #[tokio::test] + async fn returns_executor_status() { + let config = IndexerConfig::default(); + let test_cases = [ + ( + Some(ExecutorInfo { + version: config.get_registry_version(), + health: None, + ..Default::default() + }), + ExecutorStatus::Unhealthy, + ), + (None, ExecutorStatus::Inactive), + ( + Some(ExecutorInfo { + version: config.get_registry_version() - 1, + ..Default::default() + }), + ExecutorStatus::Outdated, + ), + ( + Some(ExecutorInfo { + version: config.get_registry_version(), + health: Some(runner::Health { + execution_state: runner::ExecutionState::Running.into(), + }), + ..Default::default() + }), + ExecutorStatus::Active, + ), + ]; + + for (executor, expected_status) in test_cases { + let mut mock_client = ExecutorsClientWrapper::default(); + mock_client + .expect_get_executor::() + .with(always()) + .returning(move |_| { + if let Some(executor) = executor.clone() { + Ok(Response::new(executor)) + } else { + Err(tonic::Status::not_found("not found")) + } + }); + + let handler = ExecutorsHandlerImpl { + client: mock_client, + }; + + assert_eq!(handler.get_status(&config).await.unwrap(), expected_status); + } + } + #[tokio::test] - async fn resumes_stopped_executors() { + async fn starts_executors() { let config = IndexerConfig::default(); let mut mock_client = ExecutorsClientWrapper::default(); - mock_client - .expect_get_executor::() - .with(eq(GetExecutorRequest { - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| Err(tonic::Status::not_found("not found"))) - .once(); mock_client .expect_start_executor::() .with(eq(StartExecutorRequest { @@ -255,15 +306,15 @@ mod tests { }) .once(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + handler.start(&config).await.unwrap() } #[tokio::test] - async fn reconfigures_outdated_executors() { + async fn restarts_executors() { let config = IndexerConfig::default(); let executor = ExecutorInfo { @@ -308,15 +359,15 @@ mod tests { .returning(move |_| Ok(Response::new(executor.clone()))) .once(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + handler.restart(&config).await.unwrap() } #[tokio::test] - async fn restarts_unhealthy_executors() { + async fn unhealthy_executor() { tokio::time::pause(); let config = IndexerConfig::default(); @@ -331,49 +382,17 @@ mod tests { }), }; - let mut mock_client = ExecutorsClientWrapper::default(); - mock_client - .expect_stop_executor::() - .with(eq(StopExecutorRequest { - executor_id: executor.executor_id.clone(), - })) - .returning(|_| { - Ok(Response::new(StopExecutorResponse { - executor_id: "executor_id".to_string(), - })) - }) - .once(); - mock_client - .expect_start_executor::() - .with(eq(StartExecutorRequest { - code: config.code.clone(), - schema: config.schema.clone(), - redis_stream: config.get_redis_stream_key(), - version: config.get_registry_version(), - account_id: config.account_id.to_string(), - function_name: config.function_name.clone(), - })) - .returning(|_| { - Ok(tonic::Response::new(StartExecutorResponse { - executor_id: "executor_id".to_string(), - })) - }) - .once(); - mock_client - .expect_get_executor::() - .with(always()) - .returning(move |_| Ok(Response::new(executor.clone()))) - .once(); + let mock_client = ExecutorsClientWrapper::default(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + assert!(!handler.is_healthy(executor)); } #[tokio::test] - async fn ignores_healthy_executors() { + async fn healthy_executors() { tokio::time::pause(); let config = IndexerConfig::default(); @@ -396,23 +415,13 @@ mod tests { }), }; - let mut mock_client = ExecutorsClientWrapper::default(); - mock_client - .expect_stop_executor::() - .never(); - mock_client - .expect_start_executor::() - .never(); - mock_client - .expect_get_executor::() - .with(always()) - .returning(move |_| Ok(Response::new(executor.clone()))); + let mock_client = ExecutorsClientWrapper::default(); - let handler = ExecutorsHandler { + let handler = ExecutorsHandlerImpl { client: mock_client, }; - handler.synchronise(&config).await.unwrap() + assert!(handler.is_healthy(executor)); } } } diff --git a/coordinator/src/indexer_config.rs b/coordinator/src/indexer_config.rs index a29eab2d0..233cf852b 100644 --- a/coordinator/src/indexer_config.rs +++ b/coordinator/src/indexer_config.rs @@ -40,7 +40,7 @@ impl Default for IndexerConfig { }, created_at_block_height: 1, updated_at_block_height: Some(2), - deleted_at_block_height: Some(3), + deleted_at_block_height: None, start_block: StartBlock::Height(100), } } diff --git a/coordinator/src/indexer_state.rs b/coordinator/src/indexer_state.rs index 9e7b7a341..8fdb9ff81 100644 --- a/coordinator/src/indexer_state.rs +++ b/coordinator/src/indexer_state.rs @@ -16,13 +16,18 @@ pub enum ProvisionedState { Failed, } +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] +pub enum OldLifecycleState { + Stopping, + Stopped, +} #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] pub struct OldIndexerState { pub account_id: AccountId, pub function_name: String, pub block_stream_synced_at: Option, pub enabled: bool, - pub provisioned_state: ProvisionedState, + pub lifecycle_state: OldLifecycleState, } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] @@ -75,15 +80,23 @@ impl IndexerStateManagerImpl { tracing::info!("Migrating {}", raw_state); let old_state: OldIndexerState = serde_json::from_str(&raw_state)?; + let migrated_lifecycle_state = + if old_state.lifecycle_state == OldLifecycleState::Stopping { + LifecycleState::Suspending + } else if old_state.lifecycle_state == OldLifecycleState::Stopped { + LifecycleState::Suspended + } else { + tracing::warn!("Unknown lifecycle state: {:?}", old_state.lifecycle_state); + continue; + }; let state = IndexerState { account_id: old_state.account_id, function_name: old_state.function_name, block_stream_synced_at: old_state.block_stream_synced_at, enabled: old_state.enabled, - lifecycle_state: LifecycleState::Running, + lifecycle_state: migrated_lifecycle_state, }; - self.redis_client .set(state.get_state_key(), serde_json::to_string(&state)?) .await?; @@ -182,6 +195,59 @@ mod tests { use mockall::predicate; use registry_types::{Rule, StartBlock, Status}; + #[tokio::test] + async fn migrate_state() { + let mut mock_redis_client = RedisClient::default(); + let valid_state = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_valid_1", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Initializing" }).to_string(); + let valid_state_two = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_valid_2", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Running" }).to_string(); + let state_to_migrate_stopping = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_migrate_stopping", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Stopping" }).to_string(); + let state_to_migrate_stopped = serde_json::json!({ "account_id": "morgs.near", "function_name": "test_migrate_stopped", "block_stream_synced_at": 200, "enabled": true, "lifecycle_state": "Stopped" }).to_string(); + let migrated_suspending = IndexerState { + account_id: "morgs.near".parse().unwrap(), + function_name: "test_migrate_stopping".to_string(), + block_stream_synced_at: Some(200), + enabled: true, + lifecycle_state: LifecycleState::Suspending, + }; + let migrated_suspended = IndexerState { + account_id: "morgs.near".parse().unwrap(), + function_name: "test_migrate_stopped".to_string(), + block_stream_synced_at: Some(200), + enabled: true, + lifecycle_state: LifecycleState::Suspended, + }; + mock_redis_client + .expect_list_indexer_states() + .returning(move || { + Ok(vec![ + valid_state.clone(), + valid_state_two.clone(), + state_to_migrate_stopping.clone(), + state_to_migrate_stopped.clone(), + ]) + }) + .once(); + mock_redis_client + .expect_set::() + .with( + predicate::eq(migrated_suspending.get_state_key()), + predicate::eq(serde_json::to_string(&migrated_suspending).unwrap()), + ) + .returning(|_, _| Ok(())) + .once(); + mock_redis_client + .expect_set::() + .with( + predicate::eq(migrated_suspended.get_state_key()), + predicate::eq(serde_json::to_string(&migrated_suspended).unwrap()), + ) + .returning(|_, _| Ok(())) + .once(); + + let indexer_manager = IndexerStateManagerImpl::new(mock_redis_client); + let _ = indexer_manager.migrate().await; + } + #[tokio::test] async fn list_indexer_states() { let mut mock_redis_client = RedisClient::default(); diff --git a/coordinator/src/lifecycle.rs b/coordinator/src/lifecycle.rs index 32fb2f9f0..3d29967ee 100644 --- a/coordinator/src/lifecycle.rs +++ b/coordinator/src/lifecycle.rs @@ -1,14 +1,15 @@ use tracing::{info, warn}; -use crate::handlers::block_streams::BlockStreamsHandler; +use crate::handlers::block_streams::{BlockStreamStatus, BlockStreamsHandler}; use crate::handlers::data_layer::DataLayerHandler; -use crate::handlers::executors::ExecutorsHandler; +use crate::handlers::executors::{ExecutorStatus, ExecutorsHandler}; use crate::indexer_config::IndexerConfig; use crate::indexer_state::{IndexerState, IndexerStateManager}; use crate::redis::{KeyProvider, RedisClient}; use crate::registry::Registry; const LOOP_THROTTLE_MS: u64 = 1000; +const RESTART_TIMEOUT_SECONDS: u64 = 600; /// Represents the different lifecycle states of an Indexer #[derive(Default, Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)] @@ -24,22 +25,22 @@ pub enum LifecycleState { /// they are running the latest version of the Indexer. /// /// Transitions: - /// - `Stopping` if suspended + /// - `Suspending` if suspended /// - `Running` if Block Stream or Executor fails to synchronise, essentially triggering a /// retry /// - `Running` on success Running, - /// Indexer is being stopped, Block Stream and Executors are being stopped. + /// Indexer is being suspended, Block Stream and Executors are being stopped. /// /// Transitions: - /// - `Stopping` on failure, triggering a retry - /// - `Stopped` on success - Stopping, - /// Indexer is stopped, Block Stream and Executors are not running. + /// - `Suspending` on failure, triggering a retry + /// - `Suspended` on success + Suspending, + /// Indexer is suspended, Block Stream and Executors are not running. /// /// Transitions: /// - `Running` if unsuspended - Stopped, + Suspended, /// Indexer is in a bad state, currently requires manual intervention, but should eventually /// self heal. This is a dead-end state /// @@ -103,6 +104,7 @@ impl<'a> LifecycleManager<'a> { .await .is_err() { + tracing::warn!("Failed to provision data layer"); return LifecycleState::Repairing; } @@ -120,32 +122,67 @@ impl<'a> LifecycleManager<'a> { } if !state.enabled { - return LifecycleState::Stopping; + return LifecycleState::Suspending; } - if let Err(error) = self + let stream_status = match self .block_streams_handler - .synchronise(config, state.block_stream_synced_at) + .get_status(config, state.block_stream_synced_at) .await { - warn!(?error, "Failed to synchronise block stream, retrying..."); + Ok(status) => status, + Err(error) => { + warn!(?error, "Failed to get block stream status"); + return LifecycleState::Running; + } + }; + if let Err(error) = match stream_status { + BlockStreamStatus::Active => Ok(()), + BlockStreamStatus::Inactive => self.block_streams_handler.resume(config).await, + BlockStreamStatus::Outdated => self.block_streams_handler.reconfigure(config).await, + BlockStreamStatus::Unhealthy => { + tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; + self.block_streams_handler.restart(config).await + } + BlockStreamStatus::NotStarted => { + self.block_streams_handler + .start_new_block_stream(config) + .await + } + } { + warn!(?error, "Failed to synchronise block stream, retrying..."); return LifecycleState::Running; } state.block_stream_synced_at = Some(config.get_registry_version()); - if let Err(error) = self.executors_handler.synchronise(config).await { - warn!(?error, "Failed to synchronise executor, retrying..."); + let executor_status = match self.executors_handler.get_status(config).await { + Ok(status) => status, + Err(error) => { + warn!(?error, "Failed to synchronise executor"); + return LifecycleState::Running; + } + }; + if let Err(error) = match executor_status { + ExecutorStatus::Active => Ok(()), + ExecutorStatus::Inactive => self.executors_handler.start(config).await, + ExecutorStatus::Outdated => self.executors_handler.restart(config).await, + ExecutorStatus::Unhealthy => { + tokio::time::sleep(tokio::time::Duration::from_secs(RESTART_TIMEOUT_SECONDS)).await; + self.executors_handler.restart(config).await + } + } { + warn!(?error, "Failed to synchronise executor, retrying..."); return LifecycleState::Running; } LifecycleState::Running } - #[tracing::instrument(name = "stopping", skip_all)] - async fn handle_stopping(&self, config: &IndexerConfig) -> LifecycleState { + #[tracing::instrument(name = "suspending", skip_all)] + async fn handle_suspending(&self, config: &IndexerConfig) -> LifecycleState { if config.is_deleted() { return LifecycleState::Deleting; } @@ -156,7 +193,7 @@ impl<'a> LifecycleManager<'a> { .await { warn!(?error, "Failed to stop block stream, retrying..."); - return LifecycleState::Stopping; + return LifecycleState::Suspending; } if let Err(error) = self @@ -165,14 +202,18 @@ impl<'a> LifecycleManager<'a> { .await { warn!(?error, "Failed to stop executor, retrying..."); - return LifecycleState::Stopping; + return LifecycleState::Suspending; } - LifecycleState::Stopped + LifecycleState::Suspended } - #[tracing::instrument(name = "stopped", skip_all)] - async fn handle_stopped(&self, config: &IndexerConfig, state: &IndexerState) -> LifecycleState { + #[tracing::instrument(name = "suspended", skip_all)] + async fn handle_suspended( + &self, + config: &IndexerConfig, + state: &IndexerState, + ) -> LifecycleState { if config.is_deleted() { return LifecycleState::Deleting; } @@ -180,10 +221,11 @@ impl<'a> LifecycleManager<'a> { // TODO Transistion to `Running` on config update if state.enabled { + tracing::debug!("Suspended indexer was reactivated"); return LifecycleState::Running; } - LifecycleState::Stopped + LifecycleState::Suspended } #[tracing::instrument(name = "repairing", skip_all)] @@ -250,6 +292,79 @@ impl<'a> LifecycleManager<'a> { // LifecycleState::Deleted } + pub async fn handle_transitions(&self, first_iteration: bool) -> bool { + let config = match self + .registry + .fetch_indexer( + &self.initial_config.account_id, + &self.initial_config.function_name, + ) + .await + { + Ok(Some(config)) => config, + Ok(None) => { + warn!("No matching indexer config was found"); + return false; + } + Err(error) => { + warn!(?error, "Failed to fetch config"); + return false; + } + }; + + let mut state = match self.state_manager.get_state(&self.initial_config).await { + Ok(state) => state, + Err(error) => { + warn!(?error, "Failed to get state"); + return false; + } + }; + + if first_iteration { + info!("Initial lifecycle state: {:?}", state.lifecycle_state); + } + + let desired_lifecycle_state = match state.lifecycle_state { + LifecycleState::Initializing => self.handle_initializing(&config, &state).await, + LifecycleState::Running => self.handle_running(&config, &mut state).await, + LifecycleState::Suspending => self.handle_suspending(&config).await, + LifecycleState::Suspended => self.handle_suspended(&config, &state).await, + LifecycleState::Repairing => self.handle_repairing(&config, &state).await, + LifecycleState::Deleting => self.handle_deleting(&state).await, + LifecycleState::Deleted => LifecycleState::Deleted, + }; + + if desired_lifecycle_state != state.lifecycle_state { + info!( + "Transitioning lifecycle state: {:?} -> {:?}", + state.lifecycle_state, desired_lifecycle_state, + ); + } + + if desired_lifecycle_state == LifecycleState::Deleted { + return true; + } + + state.lifecycle_state = desired_lifecycle_state; + + loop { + match self + .state_manager + .set_state(&self.initial_config, state.clone()) + .await + { + Ok(_) => break, + Err(e) => { + warn!("Failed to set state: {:?}. Retrying...", e); + + tokio::time::sleep(std::time::Duration::from_millis(1000)).await; + } + } + } + + false + } + #[tracing::instrument( name = "lifecycle_manager", skip(self), @@ -263,76 +378,1143 @@ impl<'a> LifecycleManager<'a> { loop { tokio::time::sleep(std::time::Duration::from_millis(LOOP_THROTTLE_MS)).await; + let should_exit = self.handle_transitions(first_iteration).await; + + if should_exit { + break; + } + + first_iteration = false; + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use mockall::predicate::*; + + mod initializing { + use super::*; - let config = match self - .registry - .fetch_indexer( - &self.initial_config.account_id, - &self.initial_config.function_name, + #[tokio::test] + async fn transitions_to_running_on_provisioning_success() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + + let mut data_layer_handler = DataLayerHandler::default(); + data_layer_handler + .expect_ensure_provisioned() + .returning(|_| Ok(())); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Initializing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Running + }), ) - .await - { - Ok(Some(config)) => config, - Ok(None) => { - warn!("No matching indexer config was found"); - continue; - } - Err(error) => { - warn!(?error, "Failed to fetch config"); - continue; - } + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_repairing_on_provisioning_failure() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + + let mut data_layer_handler = DataLayerHandler::default(); + data_layer_handler + .expect_ensure_provisioned() + .returning(|_| anyhow::bail!("failed")); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Initializing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Repairing + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + + let mut data_layer_handler = DataLayerHandler::default(); + data_layer_handler + .expect_ensure_provisioned() + .returning(|_| anyhow::bail!("failed")); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Initializing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod running { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_suspending_on_disabled() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: false, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn ignores_active_stream() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, }; - let mut state = match self.state_manager.get_state(&self.initial_config).await { - Ok(state) => state, - Err(error) => { - warn!(?error, "Failed to get state"); - continue; - } + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn restarts_unhealthy_stream() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, }; - if first_iteration { - info!("Initial lifecycle state: {:?}", state.lifecycle_state,); - first_iteration = false; - } + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Unhealthy)); + block_streams_handler + .expect_restart() + .returning(|_| Ok(())) + .once(); - let desired_lifecycle_state = match state.lifecycle_state { - LifecycleState::Initializing => self.handle_initializing(&config, &state).await, - LifecycleState::Running => self.handle_running(&config, &mut state).await, - LifecycleState::Stopping => self.handle_stopping(&config).await, - LifecycleState::Stopped => self.handle_stopped(&config, &state).await, - LifecycleState::Repairing => self.handle_repairing(&config, &state).await, - LifecycleState::Deleting => self.handle_deleting(&state).await, - LifecycleState::Deleted => LifecycleState::Deleted, + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn resumes_inactive_streams() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, }; - if desired_lifecycle_state != state.lifecycle_state { - info!( - "Transitioning lifecycle state: {:?} -> {:?}", - state.lifecycle_state, desired_lifecycle_state, - ); - } + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Inactive)); + block_streams_handler + .expect_resume() + .returning(|_| Ok(())) + .once(); - if desired_lifecycle_state == LifecycleState::Deleted { - break; - } + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); - state.lifecycle_state = desired_lifecycle_state; + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); - loop { - match self - .state_manager - .set_state(&self.initial_config, state.clone()) - .await - { - Ok(_) => break, - Err(e) => { - warn!("Failed to set state: {:?}. Retrying...", e); + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); - tokio::time::sleep(std::time::Duration::from_millis(1000)).await; - } - } - } + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn reconfigures_outdated_streams() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Outdated)); + block_streams_handler + .expect_reconfigure() + .returning(|_| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn starts_new_streams() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::NotStarted)); + block_streams_handler + .expect_start_new_block_stream() + .returning(|_| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn ignores_active_executors() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Active)); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn starts_inactive_executors() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Inactive)); + executors_handler + .expect_start() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn restarts_unhealthy_executor() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Unhealthy)); + executors_handler + .expect_restart() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + + #[tokio::test] + async fn restarts_outdated_executor() { + let config = IndexerConfig::default(); + let mut state = IndexerState { + lifecycle_state: LifecycleState::Running, + account_id: config.account_id.clone(), + function_name: config.function_name.clone(), + enabled: true, + block_stream_synced_at: None, + }; + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_get_status() + .returning(|_, _| Ok(BlockStreamStatus::Active)); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_get_status() + .returning(|_| Ok(ExecutorStatus::Outdated)); + executors_handler + .expect_restart() + .returning(|_| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + let state_manager = IndexerStateManager::default(); + let registry = Registry::default(); + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config.clone(), + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_running(&config, &mut state).await; + } + } + + mod suspending { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspending, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn stops_streams_and_executors() { + let config = IndexerConfig::default(); + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspending, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Suspended + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod suspended { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspended, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: false, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_running_on_enabled() { + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspended, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Running + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_suspended() { + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Suspended, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: false, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Suspended + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod repairing { + use super::*; + + #[tokio::test] + async fn transitions_to_deleting_on_delete() { + let config = IndexerConfig::default(); + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry.expect_fetch_indexer().returning(move |_, _| { + Ok(Some(IndexerConfig { + deleted_at_block_height: Some(3), + ..Default::default() + })) + }); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Repairing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleting + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + + #[tokio::test] + async fn transitions_to_repairing() { + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Repairing, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Repairing + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod deleting { + use super::*; + + #[tokio::test] + async fn stops_streams_and_executors() { + let config = IndexerConfig::default(); + + let mut block_streams_handler = BlockStreamsHandler::default(); + block_streams_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let mut executors_handler = ExecutorsHandler::default(); + executors_handler + .expect_stop_if_needed() + .returning(|_, _| Ok(())) + .once(); + + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Deleting, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleted + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.handle_transitions(true).await; + } + } + + mod deleted { + use super::*; + + #[tokio::test] + async fn exits() { + tokio::time::pause(); + + let config = IndexerConfig::default(); + + let block_streams_handler = BlockStreamsHandler::default(); + let executors_handler = ExecutorsHandler::default(); + let data_layer_handler = DataLayerHandler::default(); + + let mut registry = Registry::default(); + registry + .expect_fetch_indexer() + .returning(move |_, _| Ok(Some(IndexerConfig::default()))); + + let mut state_manager = IndexerStateManager::default(); + state_manager.expect_get_state().returning(|_| { + Ok(IndexerState { + lifecycle_state: LifecycleState::Deleted, + account_id: "near".parse().unwrap(), + function_name: "function_name".to_string(), + enabled: true, + block_stream_synced_at: None, + }) + }); + state_manager + .expect_set_state() + .with( + always(), + function(|state: &IndexerState| { + state.lifecycle_state == LifecycleState::Deleted + }), + ) + .returning(|_, _| Ok(())); + + let redis_client = RedisClient::default(); + + let lifecycle_manager = LifecycleManager::new( + config, + &block_streams_handler, + &executors_handler, + &data_layer_handler, + ®istry, + &state_manager, + &redis_client, + ); + + lifecycle_manager.run().await; } } } diff --git a/coordinator/src/main.rs b/coordinator/src/main.rs index fef71dd32..37cd3dcbd 100644 --- a/coordinator/src/main.rs +++ b/coordinator/src/main.rs @@ -33,10 +33,16 @@ async fn sleep(duration: Duration) -> anyhow::Result<()> { #[tokio::main] async fn main() -> anyhow::Result<()> { - tracing_subscriber::registry() - .with(tracing_subscriber::fmt::layer()) - .with(tracing_subscriber::EnvFilter::from_default_env()) - .init(); + let subscriber = + tracing_subscriber::registry().with(tracing_subscriber::EnvFilter::from_default_env()); + + if std::env::var("GCP_LOGGING_ENABLED").is_ok() { + subscriber.with(tracing_stackdriver::layer()).init(); + } else { + subscriber + .with(tracing_subscriber::fmt::layer().compact()) + .init(); + } let rpc_url = std::env::var("RPC_URL").expect("RPC_URL is not set"); let registry_contract_id = std::env::var("REGISTRY_CONTRACT_ID") diff --git a/coordinator/src/registry.rs b/coordinator/src/registry.rs index e1372a2ec..2a5879e17 100644 --- a/coordinator/src/registry.rs +++ b/coordinator/src/registry.rs @@ -250,6 +250,13 @@ impl RegistryImpl { deleted_at_block_height: config.deleted_at_block_height, })) } else { + tracing::info!( + account_id = account_id.as_str(), + function_name, + "Received null config from registry: {:?}", + String::from_utf8_lossy(&call_result.result) + ); + Ok(None) }; } diff --git a/core-indexers/package.json b/core-indexers/package.json index c79a64266..ce9f80868 100644 --- a/core-indexers/package.json +++ b/core-indexers/package.json @@ -7,9 +7,6 @@ }, "author": "", "license": "ISC", - "dependencies": { - "queryapi-runner": "file:../runner" - }, "devDependencies": { "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.7.0", diff --git a/core-indexers/receiver-blocks/unit.test.ts b/core-indexers/receiver-blocks/unit.test.ts index 1d0c103bf..fdbc98f75 100644 --- a/core-indexers/receiver-blocks/unit.test.ts +++ b/core-indexers/receiver-blocks/unit.test.ts @@ -1,5 +1,5 @@ import fs from 'fs'; -import LocalIndexer from 'queryapi-runner/src/local-indexer'; +import LocalIndexer from 'queryapi-runner/src/indexer/local-indexer'; import { LocalIndexerConfig } from 'queryapi-runner/src/indexer-config/indexer-config'; import { LogLevel } from 'queryapi-runner/src/indexer-meta/log-entry'; import path from 'path'; @@ -15,6 +15,44 @@ describe('Receiver Blocks Indexer Tests', () => { test('Try executing on a block', async () => { const localIndexer = new LocalIndexer(indexerConfig); - await localIndexer.executeOnBlock(123621232); + const context = localIndexer.getContext(); + + // Run on one block to populate receivers table and initial bitmap + await localIndexer.executeOnBlock(100000000); + const receivers = await context.db.Receivers.select({ + receiver: 'app.nearcrowd.near' + }); + const tokenSweatId = receivers[0].id; + + const correctBitmapOne = { + first_block_height: 100000000, + block_date: '2023-08-30', + receiver_id: tokenSweatId, + bitmap: 'wA==', + last_elias_gamma_start_bit: 1, + max_index: 0, + }; + const correctBitmapTwo = { + first_block_height: 100000000, + block_date: '2023-08-30', + receiver_id: tokenSweatId, + bitmap: 'oA==', + last_elias_gamma_start_bit: 1, + max_index: 1, + }; + + let bitmap = await context.db.Bitmaps.select({ + receiver_id: tokenSweatId + }); + expect(bitmap.length).toBe(1); + expect(bitmap[0]).toEqual(correctBitmapOne); + + // Run on second block and verify bitmap update + await localIndexer.executeOnBlock(100000001); + bitmap = await context.db.Bitmaps.select({ + receiver_id: tokenSweatId + }); + expect(bitmap.length).toBe(1); + expect(bitmap[0]).toEqual(correctBitmapTwo); }); }); diff --git a/core-indexers/tsconfig.json b/core-indexers/tsconfig.json index 9555e4723..0cb90e9df 100644 --- a/core-indexers/tsconfig.json +++ b/core-indexers/tsconfig.json @@ -3,7 +3,10 @@ "target": "es2018", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": ["es2021"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ "module": "commonjs", /* Specify what module code is generated. */ - "rootDir": "..", + "rootDir": "..", + "paths": { + "@queryapi-runner/*": ["../runner/*"], /* Allow imports from runner using queryapi-runner alias */ + }, "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ "resolveJsonModule": true, /* Enable importing .json files. */ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ diff --git a/frontend/README.md b/frontend/README.md index ea5a8cb1d..492456ea9 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -21,11 +21,11 @@ npm run serve:widgets:prod // for running prod enviornment **Then, Head to `dev.near.org/flags` and enter `http://127.0.0.1:3030`** -> In order to tell our BOS gateway (near.org), where to load the local widgets from, we head to `near.org/flags` and enter the local path we got from running the previous command. If you have not changed any configurations then the default should be `http://127.0.0.1:3030` +> In order to tell our BOS gateway (near.org), where to load the local widgets from, we head to `dev.near.org/flags` and enter the local path we got from running the previous command. If you have not changed any configurations then the default should be `http://127.0.0.1:3030` **Finally**, run the following to serve the local NextJS frontend ```bash -npm dev +npm run dev ``` **Now, head to the path where the widgets are served on the BOS.** diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 72ea96a9e..07d15b05d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -69,7 +69,6 @@ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -82,7 +81,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -92,10 +90,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.6.tgz", - "integrity": "sha512-3lLFGJtzC1/mEnK11BRf+Bf8536kBQUSB1G9yMtcRsxmY+tCKdTPzsP3fMUKy10BPIE0sDUY1pux3iMPIn2vow==", - "license": "MIT", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.3.tgz", + "integrity": "sha512-bocd9vQc9PSq4MG6129HKF8ujUirVod98he9OEWpyOs5CXnUC81zNRaUshA4wPSflR6mnx0yRuRankp1V8A+og==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -115,8 +112,8 @@ "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "peerDependenciesMeta": { @@ -139,7 +136,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -149,32 +145,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -190,13 +184,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -206,15 +199,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -222,52 +214,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -277,17 +228,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -297,11 +246,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -311,7 +259,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -320,25 +267,11 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -348,30 +281,27 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -382,7 +312,6 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -394,11 +323,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -411,7 +342,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -424,7 +354,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -437,7 +366,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -450,7 +378,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -463,7 +390,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -476,7 +402,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -492,7 +417,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -505,7 +429,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -518,7 +441,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -531,7 +453,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -544,7 +465,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -557,7 +477,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -570,7 +489,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -586,7 +504,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -602,7 +519,6 @@ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", "dev": true, - "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -618,10 +534,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -632,39 +547,33 @@ "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -673,13 +582,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -691,14 +599,12 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@codemirror/language": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.0.0.tgz", "integrity": "sha512-rtjk5ifyMzOna1c7PBu7J1VCt0PvA5wy3o8eMVnxMKb7z8KA7JFecvD04dSn14vj/bBaAbqRsGed5OjtofEnLA==", - "license": "MIT", "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", @@ -713,14 +619,12 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", - "license": "MIT", "peer": true }, "node_modules/@codemirror/view": { - "version": "6.28.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.2.tgz", - "integrity": "sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==", - "license": "MIT", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.30.0.tgz", + "integrity": "sha512-96Nmn8OeLh6aONQprIeYk8hGVnEuYpWuxKSkdsODOx9hWPxyuyZGvmvxV/JmLsp+CubMO1PsLaN5TNNgrl0UrQ==", "peer": true, "dependencies": { "@codemirror/state": "^6.4.0", @@ -732,7 +636,6 @@ "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "license": "MIT", "optional": true, "dependencies": { "@emotion/memoize": "0.7.4" @@ -742,21 +645,18 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "license": "MIT", "optional": true }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -768,11 +668,10 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -782,7 +681,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -806,7 +704,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -822,7 +719,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -835,35 +731,31 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", - "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", - "license": "MIT", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", + "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", - "license": "MIT", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", + "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.6" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -873,16 +765,14 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", - "license": "MIT" + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" }, "node_modules/@graphiql/plugin-code-exporter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@graphiql/plugin-code-exporter/-/plugin-code-exporter-0.3.5.tgz", "integrity": "sha512-14CmC6IWcfJyhC27pfUoPz3dmLQyNuOQIeEmPFH2M9k0z/GzZr6bnxMK/ImVsAmzTP3M7Jm0bCTXUwU7AVO0tA==", - "license": "MIT", "dependencies": { "graphiql-code-exporter": "^3.0.3" }, @@ -897,7 +787,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/graphiql-code-exporter/-/graphiql-code-exporter-3.0.3.tgz", "integrity": "sha512-Ml3J/ojCQ56qrIgJPDCrWQ2cpI/6yio2P1tHPBuvhGJ2zVSUCH/D+v1DIwXIzsAMwqq0WkaknqH3iuA6LD5A5A==", - "license": "MIT", "dependencies": { "copy-to-clipboard": "^3.0.8" }, @@ -912,7 +801,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@graphiql/plugin-explorer/-/plugin-explorer-0.3.5.tgz", "integrity": "sha512-oHn4cuH1uPWv70zy64mpG/x99BeFOFzGJ/tZXdx8wvb6c4aBMMCo4ouVnvNReVxE9N0KAwJfPvC6laWSbQ6lkQ==", - "license": "MIT", "dependencies": { "graphiql-explorer": "^0.9.0" }, @@ -927,7 +815,6 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/graphiql-explorer/-/graphiql-explorer-0.9.0.tgz", "integrity": "sha512-fZC/wsuatqiQDO2otchxriFO0LaWIo/ovF/CQJ1yOudmY0P7pzDiP+l9CEHUiWbizk3e99x6DQG4XG1VxA+d6A==", - "license": "MIT", "peerDependencies": { "graphql": "^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "react": "^15.6.0 || ^16.0.0", @@ -938,7 +825,6 @@ "version": "0.19.4", "resolved": "https://registry.npmjs.org/@graphiql/react/-/react-0.19.4.tgz", "integrity": "sha512-qg3N2Zeuq2+GDMZddz7K/ak1p5O56kKuLM/idOJZD+Lxbk2e8Eye3KWM24lJuuCi2gdvJuqPMfCdewLXrHhEkw==", - "license": "MIT", "dependencies": { "@graphiql/toolkit": "^0.9.1", "@headlessui/react": "^1.7.15", @@ -963,10 +849,9 @@ } }, "node_modules/@graphiql/toolkit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@graphiql/toolkit/-/toolkit-0.9.1.tgz", - "integrity": "sha512-LVt9pdk0830so50ZnU2Znb2rclcoWznG8r8asqAENzV0U1FM1kuY0sdPpc/rBc9MmmNgnB6A+WZzDhq6dbhTHA==", - "license": "MIT", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@graphiql/toolkit/-/toolkit-0.9.2.tgz", + "integrity": "sha512-QLPhwx9+E4JfGY+0iwFwa85OBjCJ7GHNypkQoz3pCOwAAlIpFBtXDOuLF1eH9Z08WNZSjRLL7VYW4Ci3hfTqxg==", "dependencies": { "@n1ru4l/push-pull-async-iterable-iterator": "^3.1.0", "meros": "^1.1.4" @@ -985,7 +870,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } @@ -994,7 +878,6 @@ "version": "1.7.19", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", - "license": "MIT", "dependencies": { "@tanstack/react-virtual": "^3.0.0-beta.60", "client-only": "^0.0.1" @@ -1013,7 +896,6 @@ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -1028,7 +910,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1042,15 +923,13 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -1068,7 +947,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -1081,7 +959,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1097,7 +974,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1114,7 +990,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -1124,7 +999,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1138,7 +1012,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1152,7 +1025,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -1165,7 +1037,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1181,7 +1052,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1194,7 +1064,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1204,7 +1073,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1214,7 +1082,6 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -1232,7 +1099,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1248,7 +1114,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1265,7 +1130,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1277,15 +1141,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1295,7 +1157,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1308,7 +1169,6 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -1356,7 +1216,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1372,7 +1231,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1389,7 +1247,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1401,15 +1258,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1419,7 +1274,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1432,7 +1286,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -1448,7 +1301,6 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1462,7 +1314,6 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1475,7 +1326,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1493,7 +1343,6 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1509,7 +1358,6 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1553,7 +1401,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1569,7 +1416,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1586,7 +1432,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1598,8 +1443,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", @@ -1607,7 +1451,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1628,7 +1471,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1638,7 +1480,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1651,7 +1492,6 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1664,7 +1504,6 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1679,7 +1518,6 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1695,7 +1533,6 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1711,7 +1548,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1738,7 +1574,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1754,7 +1589,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1771,7 +1605,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1783,15 +1616,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1801,7 +1632,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1814,7 +1644,6 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1832,7 +1661,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1848,7 +1676,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1865,7 +1692,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1877,15 +1703,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1895,7 +1719,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1907,7 +1730,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1921,7 +1743,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1930,7 +1751,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1939,7 +1759,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "license": "MIT", "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1947,16 +1766,14 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "license": "MIT" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1966,24 +1783,21 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", - "license": "MIT", "peer": true }, "node_modules/@lezer/highlight": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", - "license": "MIT", "peer": true, "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@lezer/lr": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz", - "integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==", - "license": "MIT", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "peer": true, "dependencies": { "@lezer/common": "^1.0.0" @@ -1993,7 +1807,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "license": "MIT", "dependencies": { "state-local": "^1.0.6" }, @@ -2005,7 +1818,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "license": "MIT", "dependencies": { "@monaco-editor/loader": "^1.4.0" }, @@ -2019,7 +1831,6 @@ "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", - "license": "MIT", "dependencies": { "@motionone/easing": "^10.18.0", "@motionone/types": "^10.17.1", @@ -2031,7 +1842,6 @@ "version": "10.12.0", "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz", "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==", - "license": "MIT", "dependencies": { "@motionone/animation": "^10.12.0", "@motionone/generators": "^10.12.0", @@ -2045,7 +1855,6 @@ "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", - "license": "MIT", "dependencies": { "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" @@ -2055,7 +1864,6 @@ "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", - "license": "MIT", "dependencies": { "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", @@ -2065,14 +1873,12 @@ "node_modules/@motionone/types": { "version": "10.17.1", "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", - "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", - "license": "MIT" + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==" }, "node_modules/@motionone/utils": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", - "license": "MIT", "dependencies": { "@motionone/types": "^10.17.1", "hey-listen": "^1.0.8", @@ -2083,7 +1889,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@n1ru4l/push-pull-async-iterable-iterator/-/push-pull-async-iterable-iterator-3.2.0.tgz", "integrity": "sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q==", - "license": "MIT", "engines": { "node": ">=12" } @@ -2098,29 +1903,26 @@ } }, "node_modules/@next/env": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz", - "integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==", - "license": "MIT" + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", + "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz", - "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", + "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", "dev": true, - "license": "MIT", "dependencies": { "glob": "10.3.10" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", - "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2130,13 +1932,12 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", - "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2146,13 +1947,12 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", - "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2162,13 +1962,12 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", - "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2178,13 +1977,12 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", - "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2194,13 +1992,12 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", - "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -2210,13 +2007,12 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", - "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2226,13 +2022,12 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", - "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", "cpu": [ "ia32" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2242,13 +2037,12 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", - "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -2262,7 +2056,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2276,7 +2069,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -2286,7 +2078,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2300,7 +2091,6 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -2310,7 +2100,6 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2319,14 +2108,12 @@ "node_modules/@radix-ui/primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", - "license": "MIT" + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", - "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.0.0" }, @@ -2349,7 +2136,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-context": "1.1.0", @@ -2375,7 +2161,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2390,7 +2175,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2405,7 +2189,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2441,7 +2224,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2456,7 +2238,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2483,7 +2264,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2512,7 +2292,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2527,7 +2306,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-primitive": "2.0.0", @@ -2552,7 +2330,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, @@ -2570,7 +2347,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-collection": "1.1.0", @@ -2610,7 +2386,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", - "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.0", @@ -2642,7 +2417,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", - "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.0.0", "@radix-ui/react-use-layout-effect": "1.1.0" @@ -2666,7 +2440,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" @@ -2690,7 +2463,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.1.0" }, @@ -2713,7 +2485,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-collection": "1.1.0", @@ -2744,7 +2515,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0" }, @@ -2759,10 +2529,9 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.1.tgz", - "integrity": "sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==", - "license": "MIT", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", + "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-compose-refs": "1.1.0", @@ -2796,7 +2565,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2811,7 +2579,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, @@ -2829,7 +2596,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, @@ -2847,7 +2613,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2862,7 +2627,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", - "license": "MIT", "dependencies": { "@radix-ui/rect": "1.1.0" }, @@ -2880,7 +2644,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, @@ -2898,7 +2661,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", - "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.0.0" }, @@ -2920,14 +2682,12 @@ "node_modules/@radix-ui/rect": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", - "license": "MIT" + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" }, "node_modules/@react-aria/ssr": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz", - "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==", - "license": "Apache-2.0", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz", + "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -2935,14 +2695,13 @@ "node": ">= 12" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@restart/hooks": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "license": "MIT", "dependencies": { "dequal": "^2.0.3" }, @@ -2951,10 +2710,9 @@ } }, "node_modules/@restart/ui": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.9.tgz", - "integrity": "sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw==", - "license": "MIT", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.8.0.tgz", + "integrity": "sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g==", "dependencies": { "@babel/runtime": "^7.21.0", "@popperjs/core": "^2.11.6", @@ -2975,31 +2733,27 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", - "license": "MIT", "peerDependencies": { "react": ">=16.14.0" } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", - "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", - "dev": true, - "license": "MIT" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "dev": true }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } @@ -3009,7 +2763,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -3017,26 +2770,23 @@ "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" }, "node_modules/@swc/helpers": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "node_modules/@tanstack/react-virtual": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.7.0.tgz", - "integrity": "sha512-3RtOwEU1HKS4iFBoTcCrV3Szqt4KoERMhZr8v57dvnh5o70sR9GAdF+0aE/qhiOmePrKujGwAayFNJSr/8Dbqw==", - "license": "MIT", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.8.4.tgz", + "integrity": "sha512-Dq0VQr3QlTS2qL35g360QaJWBt7tCn/0xw4uZ0dHXPLO1Ak4Z4nVX4vuj1Npg1b/jqNMDToRtR5OIxM2NXRBWg==", "dependencies": { - "@tanstack/virtual-core": "3.7.0" + "@tanstack/virtual-core": "3.8.4" }, "funding": { "type": "github", @@ -3048,10 +2798,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.7.0.tgz", - "integrity": "sha512-p0CWuqn+n8iZmsL7/l0Xg7kbyIKnHNqkEJkMDOkg4x3Ni3LohszmnJY8FPhTgG7Ad9ZFGcdKmn1R1mKUGEh9Xg==", - "license": "MIT", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.8.4.tgz", + "integrity": "sha512-iO5Ujgw3O1yIxWDe9FgUPNkGjyT657b1WNX52u+Wv1DyBFEpdCdGkuVaky0M3hHFqNWjAmHWTn4wgj9rTr7ZQg==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -3062,7 +2811,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -3076,7 +2824,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -3086,7 +2833,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -3097,7 +2843,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -3107,7 +2852,6 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3117,7 +2861,6 @@ "version": "5.60.15", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", - "license": "MIT", "dependencies": { "@types/tern": "*" } @@ -3127,16 +2870,14 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "license": "MIT", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "peer": true, "dependencies": { "@types/estree": "*", @@ -3147,7 +2888,6 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", "peer": true, "dependencies": { "@types/eslint": "*", @@ -3157,15 +2897,13 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "license": "MIT" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3178,7 +2916,6 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3191,7 +2928,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3200,22 +2936,19 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -3225,7 +2958,6 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } @@ -3235,7 +2967,6 @@ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -3244,28 +2975,24 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "20.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", - "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", - "license": "MIT", + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -3273,34 +3000,29 @@ "node_modules/@types/pegjs": { "version": "0.10.6", "resolved": "https://registry.npmjs.org/@types/pegjs/-/pegjs-0.10.6.tgz", - "integrity": "sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==", - "license": "MIT" + "integrity": "sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==" }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "license": "MIT" + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/qs": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -3311,7 +3033,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", "devOptional": true, - "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3320,7 +3041,6 @@ "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3329,15 +3049,13 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3348,7 +3066,6 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -3359,20 +3076,17 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" }, "node_modules/@types/tern": { "version": "0.23.9", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", - "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -3380,15 +3094,13 @@ "node_modules/@types/warning": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", - "license": "MIT" + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -3397,15 +3109,13 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -3436,11 +3146,10 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3453,7 +3162,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -3481,7 +3189,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -3499,7 +3206,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -3527,7 +3233,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3541,7 +3246,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -3565,11 +3269,10 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3582,7 +3285,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -3605,11 +3307,10 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3622,7 +3323,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -3639,14 +3339,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -3657,28 +3355,24 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", @@ -3690,14 +3384,12 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3710,7 +3402,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "license": "MIT", "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -3720,7 +3411,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "license": "Apache-2.0", "peer": true, "dependencies": { "@xtuc/long": "4.2.2" @@ -3730,14 +3420,12 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "license": "MIT", "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3754,7 +3442,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3768,7 +3455,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3781,7 +3467,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3796,7 +3481,6 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "license": "MIT", "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -3807,7 +3491,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3819,7 +3502,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3831,7 +3513,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3843,7 +3524,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -3855,14 +3535,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause", "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0", "peer": true }, "node_modules/accepts": { @@ -3870,7 +3548,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3880,10 +3557,9 @@ } }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "license": "MIT", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -3895,7 +3571,6 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "license": "MIT", "peer": true, "peerDependencies": { "acorn": "^8" @@ -3906,7 +3581,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3915,7 +3589,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3931,7 +3604,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -3941,7 +3613,6 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -3957,7 +3628,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3967,7 +3637,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -3979,15 +3648,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4000,20 +3667,17 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-hidden": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -4026,7 +3690,6 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } @@ -4036,7 +3699,6 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -4053,7 +3715,6 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4074,7 +3735,6 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4084,7 +3744,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4105,7 +3764,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4126,7 +3784,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4145,7 +3802,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4159,25 +3815,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4194,7 +3836,6 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -4216,27 +3857,30 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -4252,13 +3896,12 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4276,7 +3919,6 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4288,11 +3930,10 @@ } }, "node_modules/axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", "dev": true, - "license": "MPL-2.0", "engines": { "node": ">=4" } @@ -4302,7 +3943,6 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } @@ -4312,7 +3952,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -4334,7 +3973,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4350,7 +3988,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4367,7 +4004,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4379,15 +4015,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4397,7 +4031,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4410,7 +4043,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -4427,7 +4059,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -4444,7 +4075,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -4460,7 +4090,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -4484,7 +4113,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -4500,14 +4128,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "license": "MIT", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4529,14 +4155,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", "engines": { "node": ">=0.6" } @@ -4545,7 +4169,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", "engines": { "node": "*" } @@ -4555,7 +4178,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -4566,8 +4188,7 @@ "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/bootstrap": { "version": "5.3.3", @@ -4583,7 +4204,6 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } @@ -4591,14 +4211,12 @@ "node_modules/borsh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-2.0.0.tgz", - "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==", - "license": "Apache-2.0" + "integrity": "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==" }, "node_modules/borsher": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/borsher/-/borsher-1.2.1.tgz", "integrity": "sha512-vP5g3q2BWxqjgGuQeLKJr1ymr3yvFDSFAtN+UZa5L1BB82eFCYnrLCEj+6uiJnzhtJ7IXZfYUYu4EYBnI949Xg==", - "license": "MIT", "dependencies": { "borsh": "^2.0.0", "buffer": "^6.0.3" @@ -4609,7 +4227,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4620,7 +4237,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4629,9 +4245,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -4646,12 +4262,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4665,7 +4280,6 @@ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -4677,7 +4291,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -4687,7 +4300,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -4710,7 +4322,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -4719,15 +4330,13 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -4740,17 +4349,15 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/builtins/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4774,7 +4381,6 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4794,7 +4400,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4804,7 +4409,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4814,7 +4418,6 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -4823,15 +4426,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", "funding": [ { "type": "opencollective", @@ -4845,21 +4447,18 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/capability": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz", - "integrity": "sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==", - "license": "MIT" + "integrity": "sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==" }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4874,7 +4473,6 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -4884,7 +4482,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4909,7 +4506,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4921,7 +4517,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", "peer": true, "engines": { "node": ">=6.0" @@ -4938,7 +4533,6 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } @@ -4947,27 +4541,23 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4982,7 +4572,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4998,7 +4587,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5010,22 +4598,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5040,7 +4625,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5058,7 +4642,6 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5072,7 +4655,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5082,26 +4664,23 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==", - "license": "MIT" + "version": "5.65.17", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.17.tgz", + "integrity": "sha512-1zOsUx3lzAOu/gnMAZkQ9kpIHcPYOc9y1Fbm2UVk5UBPkdq380nhkelG0qUwm1f7wPvTbndu9ZYlug35EwAZRQ==" }, "node_modules/codemirror-graphql": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-2.0.12.tgz", - "integrity": "sha512-5UCqhWzck1jClCmRewFb8aSiabnAqiaRfsvIPfmbf6WJvOb8oiefJeHilclPPiZBzY8v/Et6EBMtOeKnWCoyng==", - "license": "MIT", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-2.0.13.tgz", + "integrity": "sha512-MBx8BtfqpacLUwcx0smI0JLq7uR6ssKvdF0ENz0yV1w1xqKmFcZ29uHh11LMWdeLL0j14KXGSIDl97fovfdszQ==", "dependencies": { "@types/codemirror": "^0.0.90", - "graphql-language-service": "5.2.1" + "graphql-language-service": "5.2.2" }, "peerDependencies": { "@codemirror/language": "6.0.0", @@ -5113,7 +4692,6 @@ "version": "0.0.90", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.90.tgz", "integrity": "sha512-8Z9+tSg27NPRGubbUPUCrt5DDG/OWzLph5BvcDykwR5D7RyZh5mhHG0uS1ePKV1YFCA+/cwc4Ey2AJAEFfV3IA==", - "license": "MIT", "dependencies": { "@types/tern": "*" } @@ -5122,15 +4700,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -5139,15 +4715,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5158,22 +4732,19 @@ "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -5182,15 +4753,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -5202,21 +4771,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" } @@ -5226,7 +4792,6 @@ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -5248,7 +4813,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5264,7 +4828,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5281,7 +4844,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5293,15 +4855,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5311,7 +4871,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5324,7 +4883,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5338,7 +4896,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", "engines": { "node": ">=4" } @@ -5347,7 +4904,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -5359,7 +4915,6 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -5370,22 +4925,19 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -5403,7 +4955,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -5421,7 +4972,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -5434,12 +4984,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/debounce-promise": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" + }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -5457,7 +5011,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, - "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -5472,7 +5025,6 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", @@ -5504,15 +5056,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5522,7 +5072,6 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5540,7 +5089,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5558,7 +5106,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -5567,7 +5114,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5576,7 +5122,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5586,7 +5131,6 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5594,15 +5138,13 @@ "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, - "license": "ISC", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -5612,15 +5154,13 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -5630,7 +5170,6 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5641,22 +5180,19 @@ "node_modules/discontinuous-range": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "license": "MIT" + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5668,7 +5204,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -5678,21 +5213,33 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "license": "MIT" + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/electron-to-chromium": { - "version": "1.4.808", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz", - "integrity": "sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==", - "license": "ISC" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5704,23 +5251,20 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "license": "MIT", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5733,7 +5277,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -5743,7 +5286,6 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -5752,7 +5294,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/error-polyfill/-/error-polyfill-0.1.3.tgz", "integrity": "sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==", - "license": "MIT", "dependencies": { "capability": "^0.2.5", "o3": "^1.0.3", @@ -5764,7 +5305,6 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -5825,7 +5365,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -5838,7 +5377,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5848,7 +5386,6 @@ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -5869,7 +5406,6 @@ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5891,10 +5427,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", - "license": "MIT", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "peer": true }, "node_modules/es-object-atoms": { @@ -5902,7 +5437,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -5915,7 +5449,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -5930,7 +5463,6 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.0" } @@ -5940,7 +5472,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5957,7 +5488,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -5967,7 +5497,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -5977,7 +5506,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6033,7 +5561,6 @@ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.4" }, @@ -6045,11 +5572,10 @@ } }, "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6058,13 +5584,12 @@ } }, "node_modules/eslint-config-next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz", - "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", + "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", "dev": true, - "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "14.2.4", + "@next/eslint-plugin-next": "14.2.5", "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", "eslint-import-resolver-node": "^0.3.6", @@ -6089,7 +5614,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6116,7 +5640,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -6133,7 +5656,6 @@ "integrity": "sha512-V8I/Q1eFf9tiOuFHkbksUdWO3p1crFmewecfBtRxXdnvb71BCJx+1xAknlIRZMwZioMX3/bPtMVCZsf1+AjjOw==", "deprecated": "Please use eslint-config-love, instead.", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^5.52.0", "eslint-config-standard": "17.1.0" @@ -6152,7 +5674,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -6164,7 +5685,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -6174,7 +5694,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -6200,7 +5719,6 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -6218,24 +5736,22 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-es-x": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.7.0.tgz", - "integrity": "sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, "funding": [ "https://github.com/sponsors/ota-meshi", "https://opencollective.com/eslint" ], - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", + "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "engines": { @@ -6250,7 +5766,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -6282,7 +5797,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -6292,7 +5806,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6305,7 +5818,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dev": true, - "license": "MIT", "dependencies": { "aria-query": "~5.1.3", "array-includes": "^3.1.8", @@ -6336,7 +5848,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", @@ -6365,7 +5876,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6377,11 +5887,10 @@ } }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6394,7 +5903,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6403,11 +5911,10 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz", - "integrity": "sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, - "license": "ISC", "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6420,36 +5927,35 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { @@ -6457,7 +5963,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6470,7 +5975,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6483,7 +5987,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6497,11 +6000,10 @@ } }, "node_modules/eslint-plugin-simple-import-sort": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz", - "integrity": "sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": ">=5.0.0" } @@ -6510,7 +6012,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -6523,7 +6024,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6533,7 +6033,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6546,7 +6045,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6562,7 +6060,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6579,7 +6076,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6591,15 +6087,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6612,7 +6106,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6629,7 +6122,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6645,7 +6137,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6655,7 +6146,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6668,7 +6158,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6681,7 +6170,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -6699,7 +6187,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6709,11 +6196,10 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -6725,7 +6211,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -6737,7 +6222,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6747,7 +6231,6 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -6756,7 +6239,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", "peer": true, "engines": { "node": ">=0.8.x" @@ -6767,7 +6249,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -6790,8 +6271,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/exit": { "version": "0.1.2", @@ -6807,7 +6287,6 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -6822,15 +6301,13 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6847,7 +6324,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6858,29 +6334,25 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -6890,7 +6362,6 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -6900,7 +6371,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -6908,12 +6378,41 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6926,7 +6425,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -6941,7 +6439,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6958,7 +6455,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6972,15 +6468,13 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -6990,7 +6484,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -7007,7 +6500,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7022,7 +6514,6 @@ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", "dev": true, - "license": "MIT", "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", @@ -7037,7 +6528,6 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, - "license": "MIT", "engines": { "node": "*" }, @@ -7050,7 +6540,6 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", - "license": "MIT", "dependencies": { "@motionone/dom": "10.12.0", "framesync": "6.0.1", @@ -7071,7 +6560,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" } @@ -7081,7 +6569,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7090,8 +6577,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -7099,7 +6585,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -7113,7 +6598,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7123,7 +6607,6 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7142,7 +6625,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7150,15 +6632,13 @@ "node_modules/genson-js": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/genson-js/-/genson-js-0.0.8.tgz", - "integrity": "sha512-4NUusDTwF+lzYh72uKV+Uvpky9iPO+YDIMpGImA5pbHfLV9HwgRCA4hYjGu78V4J4Cx2IZRTFfRERn9aUs74mw==", - "license": "Apache-2.0" + "integrity": "sha512-4NUusDTwF+lzYh72uKV+Uvpky9iPO+YDIMpGImA5pbHfLV9HwgRCA4hYjGu78V4J4Cx2IZRTFfRERn9aUs74mw==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -7168,7 +6648,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7178,7 +6657,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -7197,7 +6675,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", "engines": { "node": ">=6" } @@ -7207,7 +6684,6 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -7217,7 +6693,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7230,7 +6705,6 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -7244,11 +6718,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", - "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -7261,7 +6734,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -7284,7 +6756,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7296,7 +6767,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause", "peer": true }, "node_modules/glob/node_modules/brace-expansion": { @@ -7304,17 +6774,15 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7330,7 +6798,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7340,7 +6807,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -7357,7 +6823,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7378,7 +6843,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -7389,21 +6853,18 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/graphiql": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/graphiql/-/graphiql-3.0.6.tgz", "integrity": "sha512-PuyAhRQibTrwT3RUKmwIGrJAB+M1gg+TAftmChjBqQW0n5WMFFvP5Wcr2NEikomY0s06+oKeUGhBU2iPrq+cSQ==", - "license": "MIT", "dependencies": { "@graphiql/react": "^0.19.4", "@graphiql/toolkit": "^0.9.1", @@ -7420,17 +6881,16 @@ "version": "16.9.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, "node_modules/graphql-language-service": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.2.1.tgz", - "integrity": "sha512-8ewD6otGO43vg2TiEGjoLz3CweTwfaf4ZnqfNREqZXS2JSJGXtsRBOMMknCxMfFVh4x14ql3jyDrXcyAAtbmkQ==", - "license": "MIT", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.2.2.tgz", + "integrity": "sha512-ulIM1xE2eyEk8/QKg7I9QCGQWijNNZVwQ/dpm0B1XwD9AfYzeaGkipcsxW3JPmurt/d/ZMYRxK5Y0d2amrXEtQ==", "dependencies": { + "debounce-promise": "^3.1.2", "nullthrows": "^1.0.0", "vscode-languageserver-types": "^3.17.1" }, @@ -7445,7 +6905,6 @@ "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -7460,10 +6919,6 @@ "version": "5.16.0", "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.0.tgz", "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", - "license": "MIT", - "workspaces": [ - "website" - ], "engines": { "node": ">=10" }, @@ -7475,7 +6930,6 @@ "version": "6.0.6", "resolved": "https://registry.npmjs.org/gridjs/-/gridjs-6.0.6.tgz", "integrity": "sha512-TZ20nY+weE/wlyXOd3A9FJyJlsJ/MrHr6frMgUHFN29RmWZCYtnyfF0zuspXC81oePwSJeSZ8HY651aeyX8+rQ==", - "license": "MIT", "dependencies": { "preact": "^10.11.3" } @@ -7485,7 +6939,6 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7495,7 +6948,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7505,7 +6957,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -7518,7 +6969,6 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7531,7 +6981,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7544,7 +6993,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -7560,7 +7008,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7573,7 +7020,6 @@ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -7581,14 +7027,12 @@ "node_modules/hey-listen": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", - "license": "MIT" + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -7597,14 +7041,12 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -7620,7 +7062,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7630,7 +7071,6 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -7652,15 +7092,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -7670,7 +7108,6 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7683,11 +7120,10 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -7707,7 +7143,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -7721,7 +7156,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -7734,7 +7168,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -7750,7 +7183,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -7763,7 +7195,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -7776,7 +7207,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -7787,7 +7217,6 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7796,15 +7225,13 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -7818,7 +7245,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -7828,7 +7254,6 @@ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7845,7 +7270,6 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -7861,15 +7285,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7885,7 +7307,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -7898,7 +7319,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7911,7 +7331,6 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7928,7 +7347,6 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, - "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -7944,7 +7362,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7953,11 +7370,10 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -7973,7 +7389,6 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, - "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -7989,7 +7404,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8005,7 +7419,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8015,7 +7428,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -8028,7 +7440,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8038,7 +7449,6 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -8048,7 +7458,6 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8064,7 +7473,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8077,7 +7485,6 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8090,7 +7497,6 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8103,7 +7509,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -8113,7 +7518,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8129,7 +7533,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8138,7 +7541,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -8150,7 +7552,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8160,7 +7561,6 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8177,7 +7577,6 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8190,7 +7589,6 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -8206,7 +7604,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -8219,7 +7616,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8235,7 +7631,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -8251,7 +7646,6 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -8267,7 +7661,6 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8280,7 +7673,6 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -8293,7 +7685,6 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4" @@ -8309,21 +7700,18 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8333,17 +7721,15 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -8356,11 +7742,10 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8373,7 +7758,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -8388,7 +7772,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8398,7 +7781,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -8410,11 +7792,10 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8427,7 +7808,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8440,7 +7820,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -8455,7 +7834,6 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -8469,7 +7847,6 @@ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -8483,7 +7860,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -8497,12 +7873,99 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -8529,7 +7992,6 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -8544,7 +8006,6 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -8576,7 +8037,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8592,7 +8052,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8609,7 +8068,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8621,15 +8079,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8639,7 +8095,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8652,7 +8107,6 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -8686,7 +8140,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8702,7 +8155,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8719,7 +8171,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8731,15 +8182,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8749,7 +8198,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8762,7 +8210,6 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -8808,7 +8255,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8824,7 +8270,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8841,7 +8286,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8853,8 +8297,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-config/node_modules/glob": { "version": "7.2.3", @@ -8862,7 +8305,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8883,7 +8325,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8893,7 +8334,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8906,7 +8346,6 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -8922,7 +8361,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8938,7 +8376,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8955,7 +8392,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8967,15 +8403,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -8985,7 +8419,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8998,7 +8431,6 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -9011,7 +8443,6 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -9028,7 +8459,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9044,7 +8474,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9061,7 +8490,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9073,15 +8501,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9091,7 +8517,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9104,7 +8529,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -9122,7 +8546,6 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9132,7 +8555,6 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -9158,7 +8580,6 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -9172,7 +8593,6 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -9188,7 +8608,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9204,7 +8623,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9221,7 +8639,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9233,15 +8650,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9251,7 +8666,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9264,7 +8678,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -9285,7 +8698,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9301,7 +8713,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9318,7 +8729,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9330,15 +8740,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9348,7 +8756,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9361,7 +8768,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9376,7 +8782,6 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -9394,7 +8799,6 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9404,7 +8808,6 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -9425,7 +8828,6 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -9439,7 +8841,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9455,7 +8856,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9472,7 +8872,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9484,15 +8883,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9502,7 +8899,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9515,7 +8911,6 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -9548,7 +8943,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9564,7 +8958,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9581,7 +8974,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9593,15 +8985,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9611,7 +9001,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -9622,7 +9011,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9635,7 +9023,6 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -9669,7 +9056,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9685,7 +9071,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9702,7 +9087,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9714,8 +9098,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", @@ -9723,7 +9106,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9744,7 +9126,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9754,7 +9135,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9767,7 +9147,6 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -9799,7 +9178,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9815,7 +9193,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9832,7 +9209,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9844,25 +9220,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -9875,7 +9248,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9888,7 +9260,6 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9906,7 +9277,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9922,7 +9292,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9939,7 +9308,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9951,15 +9319,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9969,7 +9335,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9982,7 +9347,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -10000,7 +9364,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10016,7 +9379,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -10029,7 +9391,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10046,7 +9407,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10058,15 +9418,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10076,7 +9434,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10089,7 +9446,6 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -10109,7 +9465,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10125,7 +9480,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10142,7 +9496,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10154,15 +9507,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10172,7 +9523,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10185,7 +9535,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -10201,7 +9550,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10211,7 +9559,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10227,7 +9574,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, - "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -10235,21 +9581,18 @@ "node_modules/js-sha256": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "license": "MIT" + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10262,7 +9605,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -10274,33 +9616,28 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -10313,7 +9650,6 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -10329,7 +9665,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -10339,7 +9674,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10349,7 +9683,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10358,15 +9691,13 @@ "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" + "dev": true }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, - "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -10379,7 +9710,6 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10389,7 +9719,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -10403,7 +9732,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -10412,14 +9740,12 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "license": "MIT", "dependencies": { "uc.micro": "^1.0.1" } @@ -10428,7 +9754,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", "peer": true, "engines": { "node": ">=6.11.5" @@ -10438,7 +9763,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -10453,7 +9777,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -10468,21 +9791,18 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -10495,7 +9815,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -10505,7 +9824,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -10519,7 +9837,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -10528,15 +9845,13 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -10545,7 +9860,6 @@ "version": "12.3.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "~2.1.0", @@ -10560,15 +9874,13 @@ "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "license": "MIT" + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10578,7 +9890,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -10586,15 +9897,13 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -10603,7 +9912,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.0.tgz", "integrity": "sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==", - "license": "MIT", "engines": { "node": ">=13" }, @@ -10621,7 +9929,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10631,7 +9938,6 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -10641,23 +9947,21 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10666,7 +9970,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -10679,7 +9982,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10689,7 +9991,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10702,7 +10003,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10712,7 +10012,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -10720,27 +10019,23 @@ "node_modules/monaco-editor": { "version": "0.45.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz", - "integrity": "sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==", - "license": "MIT" + "integrity": "sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==" }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "license": "BSD-3-Clause" + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", "bin": { "mustache": "bin/mustache" } @@ -10750,7 +10045,6 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, - "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -10767,7 +10061,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10779,21 +10072,18 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/near-api-js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/near-api-js/-/near-api-js-1.1.0.tgz", "integrity": "sha512-qYKv1mYsaDZc2uYndhS+ttDhR9+60qFc+ZjD6lWsAxr3ZskMjRwPffDGQZYhC7BRDQMe1HEbk6d5mf+TVm0Lqg==", - "license": "(MIT AND Apache-2.0)", "dependencies": { "bn.js": "5.2.1", "borsh": "^0.7.0", @@ -10812,7 +10102,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", @@ -10823,7 +10112,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/near-social-bridge/-/near-social-bridge-1.7.1.tgz", "integrity": "sha512-wiivejrDs8pwn7apyOAY35w5dx86Fy7ypH1k0j36pENCNKoifBoSO7kGWZdMKJyxw+1MQFYu+qddjJllkqPvdA==", - "license": "MIT", "peerDependencies": { "react": ">=16", "react-dom": ">=16" @@ -10833,7 +10121,6 @@ "version": "2.20.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "license": "MIT", "dependencies": { "commander": "^2.19.0", "moo": "^0.5.0", @@ -10856,7 +10143,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10865,16 +10151,14 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT", "peer": true }, "node_modules/next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz", - "integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==", - "license": "MIT", + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", + "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", "dependencies": { - "@next/env": "14.2.4", + "@next/env": "14.2.5", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -10889,15 +10173,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.4", - "@next/swc-darwin-x64": "14.2.4", - "@next/swc-linux-arm64-gnu": "14.2.4", - "@next/swc-linux-arm64-musl": "14.2.4", - "@next/swc-linux-x64-gnu": "14.2.4", - "@next/swc-linux-x64-musl": "14.2.4", - "@next/swc-win32-arm64-msvc": "14.2.4", - "@next/swc-win32-ia32-msvc": "14.2.4", - "@next/swc-win32-x64-msvc": "14.2.4" + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -10936,7 +10220,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -10950,7 +10233,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10970,18 +10252,16 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-mocks-http": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.15.0.tgz", - "integrity": "sha512-3orGBAxXrnwz3ixU8AZpa0x8srAvVSHvbWanAqd5F0zVCVA2QstxaVcTSarFcjz4+pFSnR1zm28MsV83s/BtmA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.15.1.tgz", + "integrity": "sha512-X/GpUpNNiPDYUeUD183W8V4OW6OHYWI29w/QDyb+c/GzOfVEAlo6HjbW9++eXT2aV2lGg+uS+XqTD2q0pNREQA==", "dev": true, - "license": "MIT", "dependencies": { "@types/express": "^4.17.21", - "@types/node": "^20.10.6", + "@types/node": "*", "accepts": "^1.3.7", "content-disposition": "^0.5.3", "depd": "^1.1.0", @@ -11002,35 +10282,19 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/node-mocks-http/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "license": "MIT" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/node-sql-parser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-5.2.0.tgz", - "integrity": "sha512-lO/9ox0fLl47ksqlwGrorXm8BD+5UbxvUhj6T1XiCXnvoVwWWn7gC2l396p9OXNii19dc4MkyTN3XeJGNUZ8jw==", - "license": "Apache-2.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-5.3.0.tgz", + "integrity": "sha512-KjomhTRfjmzvUNZ40BBF96ZII8ME68AyQXALeTQ3zEEfqup1zhhM91XDpuG+GEEO5urmWgxMJMJ9u3xmL+MzMw==", "dependencies": { "@types/pegjs": "^0.10.0", "big-integer": "^1.6.48" @@ -11044,7 +10308,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11054,7 +10317,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11064,7 +10326,6 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -11075,14 +10336,12 @@ "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT" + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "node_modules/o3": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/o3/-/o3-1.0.3.tgz", "integrity": "sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ==", - "license": "MIT", "dependencies": { "capability": "^0.2.5" } @@ -11091,7 +10350,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11101,17 +10359,18 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11121,7 +10380,6 @@ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -11138,7 +10396,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -11148,7 +10405,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -11167,7 +10423,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11182,7 +10437,6 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11201,7 +10455,6 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11211,30 +10464,11 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11252,7 +10486,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -11262,7 +10495,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -11277,7 +10509,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", - "license": "MIT", "dependencies": { "@wry/caches": "^1.0.0", "@wry/context": "^0.7.0", @@ -11289,7 +10520,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", - "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -11302,7 +10532,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -11320,7 +10549,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -11336,7 +10564,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -11352,7 +10579,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11362,7 +10588,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -11375,7 +10600,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -11394,7 +10618,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11404,7 +10627,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11414,7 +10636,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11424,7 +10645,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11433,15 +10653,13 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -11454,21 +10672,16 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11476,15 +10689,13 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -11497,7 +10708,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11507,7 +10717,6 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -11517,7 +10726,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -11530,7 +10738,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -11543,7 +10750,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -11557,7 +10763,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -11573,7 +10778,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -11586,7 +10790,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -11595,7 +10798,6 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==", - "license": "MIT", "dependencies": { "framesync": "6.0.1", "hey-listen": "^1.0.8", @@ -11608,15 +10810,15 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -11631,10 +10833,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -11646,7 +10847,6 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -11664,7 +10864,6 @@ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -11694,7 +10893,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -11720,7 +10918,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, - "license": "MIT", "engines": { "node": ">=14" }, @@ -11729,31 +10926,35 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.2.14" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11765,14 +10966,12 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/preact": { - "version": "10.22.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", - "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", - "license": "MIT", + "version": "10.23.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.1.tgz", + "integrity": "sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -11783,7 +10982,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -11792,7 +10990,6 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -11807,7 +11004,6 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/prettier-plugin-sql/-/prettier-plugin-sql-0.13.0.tgz", "integrity": "sha512-Ui9603tDD6PFyr7JvIEoE6cIFMQnJVDriG+oLyVThsGo/MIl5ek18JhH3xtox9ux8jvyww/FUFrJzxpZ7FIdvw==", - "license": "MIT", "dependencies": { "node-sql-parser": "^4.4.0", "sql-formatter": "^11.0.2", @@ -11827,7 +11023,6 @@ "version": "4.18.0", "resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-4.18.0.tgz", "integrity": "sha512-2YEOR5qlI1zUFbGMLKNfsrR5JUvFg9LxIRVE+xJe962pfVLH0rnItqLzv96XVs1Y1UIR8FxsXAuvX/lYAWZ2BQ==", - "license": "Apache-2.0", "dependencies": { "big-integer": "^1.6.48" }, @@ -11840,7 +11035,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -11855,7 +11049,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -11867,15 +11060,13 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -11888,7 +11079,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -11899,7 +11089,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "license": "MIT", "dependencies": { "react-is": "^16.3.2", "warning": "^4.0.0" @@ -11912,7 +11101,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -11931,15 +11119,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -11968,20 +11154,17 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "license": "CC0-1.0" + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" }, "node_modules/randexp": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "license": "MIT", "dependencies": { "discontinuous-range": "1.0.0", "ret": "~0.1.10" @@ -11994,7 +11177,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "^5.1.0" @@ -12005,7 +11187,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12014,7 +11195,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -12034,7 +11214,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -12043,10 +11222,9 @@ } }, "node_modules/react-bootstrap": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.3.tgz", - "integrity": "sha512-cc1KAaQyj6Gr3AfA0eRRiUMSlRi3brDVcjc/o0E9y9XNW7ISo8TITrq8G8G3QTFe7VIhCiDt38k99AEFoLOolw==", - "license": "MIT", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.4.tgz", + "integrity": "sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==", "dependencies": { "@babel/runtime": "^7.24.7", "@restart/hooks": "^0.4.9", @@ -12076,7 +11254,6 @@ "version": "1.11.4", "resolved": "https://registry.npmjs.org/react-bootstrap-icons/-/react-bootstrap-icons-1.11.4.tgz", "integrity": "sha512-lnkOpNEZ/Zr7mNxvjA9efuarCPSgtOuGA55XiRj7ASJnBjb1wEAdtJOd2Aiv9t07r7FLI1IgyZPg9P6jqWD/IA==", - "license": "MIT", "dependencies": { "prop-types": "^15.7.2" }, @@ -12088,7 +11265,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -12100,20 +11276,17 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-remove-scroll": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", - "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.4", "react-style-singleton": "^2.2.1", @@ -12138,7 +11311,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "license": "MIT", "dependencies": { "react-style-singleton": "^2.2.1", "tslib": "^2.0.0" @@ -12160,7 +11332,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", "invariant": "^2.2.4", @@ -12183,7 +11354,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-switch/-/react-switch-7.0.0.tgz", "integrity": "sha512-KkDeW+cozZXI6knDPyUt3KBN1rmhoVYgAdCJqAh7st7tk8YE6N0iR89zjCWO8T8dUTeJGTR0KU+5CHCRMRffiA==", - "license": "MIT", "dependencies": { "prop-types": "^15.7.2" }, @@ -12196,7 +11366,6 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -12213,7 +11382,6 @@ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -12223,7 +11391,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12233,7 +11400,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -12246,7 +11412,6 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12266,15 +11431,13 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -12292,7 +11455,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "*" @@ -12311,7 +11473,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12321,7 +11482,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -12339,7 +11499,6 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -12352,7 +11511,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12362,7 +11520,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -12372,7 +11529,6 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -12382,7 +11538,6 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -12391,7 +11546,6 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", - "license": "MIT", "engines": { "node": ">=0.8" } @@ -12400,7 +11554,6 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "license": "MIT", "engines": { "node": ">=0.12" } @@ -12410,7 +11563,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -12422,7 +11574,6 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -12439,7 +11590,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12474,7 +11624,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -12484,7 +11633,6 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -12515,15 +11663,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -12540,7 +11686,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -12549,7 +11694,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -12568,7 +11712,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -12577,7 +11720,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", "peer": true, "dependencies": { "randombytes": "^2.1.0" @@ -12588,7 +11730,6 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12606,7 +11747,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12626,7 +11766,6 @@ "https://paypal.me/jonathanschlinkert", "https://jonschlinkert.dev/sponsor" ], - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "is-primitive": "^3.0.1" @@ -12638,15 +11777,13 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -12657,15 +11794,13 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -12678,7 +11813,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12688,7 +11822,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -12707,7 +11840,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC", "engines": { "node": ">=14" }, @@ -12719,15 +11851,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12736,7 +11866,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12745,7 +11874,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12754,7 +11882,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12764,14 +11891,12 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/sql-formatter": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-11.0.2.tgz", "integrity": "sha512-6QumAdGHEnI5dXEq1d0aBRP876AyA9Wp/UE7wopKNA2Mp9sKGRKVqGgoWHk4dr0J0nceesC85Y0p36qmGoNqhw==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1", "nearley": "^2.20.1" @@ -12785,7 +11910,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -12798,7 +11922,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12806,14 +11929,12 @@ "node_modules/state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", - "license": "MIT" + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12823,7 +11944,6 @@ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", "dev": true, - "license": "MIT", "dependencies": { "internal-slot": "^1.0.4" }, @@ -12844,7 +11964,6 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -12858,7 +11977,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -12877,7 +11995,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12891,15 +12008,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12912,7 +12027,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12928,7 +12042,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -12939,7 +12052,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12961,12 +12073,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -12985,7 +12106,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13000,7 +12120,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13018,7 +12137,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13032,7 +12150,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13045,7 +12162,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -13055,7 +12171,6 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -13065,7 +12180,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -13077,24 +12191,21 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT", "peer": true }, "node_modules/style-value-types": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==", - "license": "MIT", "dependencies": { "hey-listen": "^1.0.8", "tslib": "^2.1.0" } }, "node_modules/styled-components": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz", - "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==", - "license": "MIT", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz", + "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==", "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -13122,7 +12233,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -13130,20 +12240,44 @@ "node_modules/styled-components/node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, "node_modules/styled-components/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "license": "MIT", "dependencies": { "client-only": "0.0.1" }, @@ -13165,15 +12299,13 @@ "node_modules/stylis": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -13196,7 +12328,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -13206,7 +12337,6 @@ "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", "dev": true, - "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -13222,12 +12352,23 @@ "node": ">=14.18.0" } }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/supertest": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", "dev": true, - "license": "MIT", "dependencies": { "methods": "^1.1.2", "superagent": "^9.0.1" @@ -13241,7 +12382,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -13254,7 +12394,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13266,17 +12405,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/tailwindcss": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", + "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==", "dev": true, - "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -13313,16 +12450,14 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "license": "BSD-2-Clause", + "version": "5.31.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13341,7 +12476,6 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "license": "MIT", "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", @@ -13376,7 +12510,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -13386,7 +12519,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -13401,7 +12533,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -13418,7 +12549,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -13434,7 +12564,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13459,15 +12588,13 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, - "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -13477,7 +12604,6 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, - "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -13489,15 +12615,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13507,7 +12631,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -13518,14 +12641,12 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } @@ -13533,21 +12654,18 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", - "license": "MIT", "dependencies": { "tslib": "^2.1.0" }, @@ -13556,13 +12674,13 @@ } }, "node_modules/ts-jest": { - "version": "29.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz", - "integrity": "sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==", + "version": "29.2.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz", + "integrity": "sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "0.x", + "ejs": "^3.1.10", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", "json5": "^2.2.3", @@ -13604,11 +12722,10 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -13621,7 +12738,6 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -13634,7 +12750,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -13647,7 +12762,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13655,15 +12769,13 @@ "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -13678,21 +12790,18 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" + "dev": true }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -13705,7 +12814,6 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13715,7 +12823,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -13728,7 +12835,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -13742,7 +12848,6 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -13757,7 +12862,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -13777,7 +12881,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -13798,7 +12901,6 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -13815,11 +12917,10 @@ } }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13831,21 +12932,18 @@ "node_modules/u3": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz", - "integrity": "sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==", - "license": "MIT" + "integrity": "sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==" }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "license": "MIT" + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -13860,7 +12958,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", @@ -13874,13 +12971,12 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -13895,7 +12991,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -13911,7 +13006,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -13920,7 +13014,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -13938,10 +13031,9 @@ } }, "node_modules/use-debounce": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.1.tgz", - "integrity": "sha512-0uUXjOfm44e6z4LZ/woZvkM8FwV1wiuoB6xnrrOmeAEjRDDzTLQNRFtYHvqUsJdrz1X37j0rVGIVp144GLHGKg==", - "license": "MIT", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.2.tgz", + "integrity": "sha512-MwBiJK2dk+2qhMDVDCPRPeLuIekKfH2t1UYMnrW9pwcJJGFDbTLliSMBz2UKGmE1PJs8l3XoMqbIU1MemMAJ8g==", "engines": { "node": ">= 16.0.0" }, @@ -13953,7 +13045,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -13975,15 +13066,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -13996,14 +13085,12 @@ "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT", "peer": true }, "node_modules/walker": { @@ -14011,7 +13098,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -14020,7 +13106,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -14029,7 +13114,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "license": "MIT", "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -14042,14 +13126,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", - "license": "MIT", + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -14097,7 +13179,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "license": "MIT", "peer": true, "engines": { "node": ">=10.13.0" @@ -14107,7 +13188,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14118,7 +13198,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -14134,7 +13213,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -14147,14 +13225,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, - "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -14163,8 +13240,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -14178,7 +13255,6 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -14197,7 +13273,6 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -14217,7 +13292,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14227,7 +13301,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -14246,7 +13319,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14264,7 +13336,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14280,7 +13351,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -14292,22 +13362,19 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14322,7 +13389,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14335,7 +13401,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14348,7 +13413,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -14363,15 +13427,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -14384,15 +13446,13 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -14401,15 +13461,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "dev": true, - "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -14422,7 +13480,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14441,7 +13498,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } @@ -14450,15 +13506,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14473,7 +13527,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -14484,14 +13537,12 @@ "node_modules/zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", - "license": "MIT" + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" }, "node_modules/zen-observable-ts": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", - "license": "MIT", "dependencies": { "zen-observable": "0.8.15" } diff --git a/frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx b/frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx deleted file mode 100644 index 1bffd6647..000000000 --- a/frontend/src/components/Editor/EditorComponents/DiffEditorComponent.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import { DiffEditor } from '@monaco-editor/react'; - -export const DiffEditorComponent = ({ original, modified, language, readOnly, options, onMount }) => ( - -); diff --git a/frontend/src/components/Editor/EditorComponents/Editor.tsx b/frontend/src/components/Editor/EditorComponents/Editor.tsx index 6247e04cb..d4ded1109 100644 --- a/frontend/src/components/Editor/EditorComponents/Editor.tsx +++ b/frontend/src/components/Editor/EditorComponents/Editor.tsx @@ -15,7 +15,14 @@ import { } from '@/constants/Strings'; import { IndexerDetailsContext } from '@/contexts/IndexerDetailsContext'; import { useModal } from '@/contexts/ModalContext'; -import { defaultCode, defaultSchema, defaultSchemaTypes, formatIndexingCode, formatSQL } from '@/utils/formatters'; +import { + defaultCode, + defaultSchema, + defaultSchemaTypes, + formatIndexingCode, + formatSQL, + wrapCode, +} from '@/utils/formatters'; import { getLatestBlockHeight } from '@/utils/getLatestBlockHeight'; import IndexerRunner from '@/utils/indexerRunner'; import { PgSchemaTypeGen } from '@/utils/pgSchemaTypeGen'; @@ -24,17 +31,16 @@ import { validateJSCode, validateSQLSchema } from '@/utils/validators'; import DeveloperToolsContainer from '../EditorViewContainer/DeveloperToolsContainer'; import EditorMenuContainer from '../EditorViewContainer/EditorMenuContainer'; import QueryAPIStorageManager from '../QueryApiStorageManager'; -import { block_details } from './block_details'; import { FileSwitcher } from './FileSwitcher'; import { GlyphContainer } from './GlyphContainer'; import ResizableLayoutEditor from './ResizableLayoutEditor'; declare const monaco: any; const INDEXER_TAB_NAME = 'indexer.js'; -const SCHEMA_TAB_NAME = 'schema.sql'; const originalSQLCode = formatSQL(defaultSchema); const originalIndexingCode = formatIndexingCode(defaultCode); const pgSchemaTypeGen = new PgSchemaTypeGen(); + interface WizardResponse { wizardContractFilter: string; wizardMethods: Method[]; @@ -45,9 +51,36 @@ const fetchWizardData = (req: string): Promise => { return request('launchpad-create-indexer', req); }; +const fetchGeneratedCode = async (contractFilter: string, selectedMethods: Method[], selectedEvents?: Event[]) => { + try { + const response = await fetch('/api/generateCode', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ contractFilter, selectedMethods, selectedEvents }), + }); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + + if (!data.hasOwnProperty('jsCode') || !data.hasOwnProperty('sqlCode')) { + throw new Error('No code was returned from the server with properties jsCode and sqlCode'); + } + + return data; + } catch (error) { + throw error; + } +}; + const Editor: React.FC = (): ReactElement => { const { indexerDetails, isCreateNewIndexer } = useContext(IndexerDetailsContext); + const contextCode = indexerDetails.code && formatIndexingCode(indexerDetails.code); + const contextSchema = indexerDetails.schema && formatSQL(indexerDetails.schema); + const storageManager = useMemo(() => { if (indexerDetails.accountId && indexerDetails.indexerName) { return new QueryAPIStorageManager(indexerDetails.accountId, indexerDetails.indexerName); @@ -71,7 +104,10 @@ const Editor: React.FC = (): ReactElement => { const [heights, setHeights] = useState(initialHeights); const [diffView, setDiffView] = useState(false); - const [blockView, setBlockView] = useState(false); + + const [launchPadDefaultCode, setLaunchPadDefaultCode] = useState(''); + const [launchPadDefaultSchema, setLaunchPadDefaultSchema] = useState(''); + const { showModal } = useModal(); const [isExecutingIndexerFunction, setIsExecutingIndexerFunction] = useState(false); @@ -116,50 +152,23 @@ const Editor: React.FC = (): ReactElement => { return; }; - const generateCode = async (contractFilter: string, selectedMethods: Method[], selectedEvents?: Event[]) => { - try { - const response = await fetch('/api/generateCode', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ contractFilter, selectedMethods, selectedEvents }), - }); - if (!response.ok) { - throw new Error('Network response was not ok'); - } - const data = await response.json(); - - if (!data.hasOwnProperty('jsCode') || !data.hasOwnProperty('sqlCode')) { - throw new Error('No code was returned from the server with properties jsCode and sqlCode'); - } - - return data; - } catch (error) { - throw error; - } - }; - useEffect(() => { - const fetchData = async () => { + (async () => { try { - const response = await fetchWizardData(''); - const { wizardContractFilter, wizardMethods, wizardEvents } = response; + const { wizardContractFilter, wizardMethods, wizardEvents } = await fetchWizardData(''); - if (wizardContractFilter === 'noFilter') { - return; - } + if (wizardContractFilter === 'noFilter') return; + const { jsCode, sqlCode } = await fetchGeneratedCode(wizardContractFilter, wizardMethods, wizardEvents); + const wrappedIndexingCode = wrapCode(jsCode) ? wrapCode(jsCode) : jsCode; + const { validatedCode, validatedSchema } = reformatAll(wrappedIndexingCode, sqlCode); - const codeResponse = await generateCode(wizardContractFilter, wizardMethods, wizardEvents); - const { validatedCode, validatedSchema } = reformatAll(codeResponse.jsCode, codeResponse.sqlCode); - validatedCode && setIndexingCode(validatedCode); - validatedSchema && setSchema(validatedSchema); + validatedCode && (setIndexingCode(validatedCode), setLaunchPadDefaultCode(validatedCode)); + validatedSchema && (setSchema(validatedSchema), setLaunchPadDefaultSchema(validatedSchema)); } catch (error: unknown) { //todo: figure out best course of action for user if api fails console.error(error); } - }; - fetchData(); + })(); }, []); useEffect(() => { @@ -194,7 +203,6 @@ const Editor: React.FC = (): ReactElement => { useEffect(() => { const { error: schemaError } = validateSQLSchema(schema); const { error: codeError } = validateJSCode(indexingCode); - if (schemaError || codeError) { if (schemaError) schemaErrorHandler(schemaError); if (codeError) indexerErrorHandler(codeError); @@ -202,7 +210,7 @@ const Editor: React.FC = (): ReactElement => { } handleCodeGen(); - }, [fileName]); + }, [fileName, launchPadDefaultSchema]); useEffect(() => { cacheToLocal(); @@ -452,20 +460,21 @@ const Editor: React.FC = (): ReactElement => { indexerError={indexerError} /> - {/* @ts-ignore remove after refactoring Resizable Editor to ts*/} diff --git a/frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx b/frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx deleted file mode 100644 index 041d7e08c..000000000 --- a/frontend/src/components/Editor/EditorComponents/MonacoEditorComponent.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import MonacoEditor from '@monaco-editor/react'; -export const MonacoEditorComponent = ({ - value, - defaultValue, - defaultLanguage, - readOnly, - onChange, - onMount, - options, -}) => ( - -); diff --git a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx index f9c60ba92..1d95d4241 100644 --- a/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx +++ b/frontend/src/components/Editor/EditorComponents/ResizableLayoutEditor.jsx @@ -1,182 +1,114 @@ -import { DiffEditorComponent } from './DiffEditorComponent'; -import { MonacoEditorComponent } from './MonacoEditorComponent'; -import { defaultCode, defaultSchema } from '@/utils/formatters'; -import { useDragResize } from '@/utils/resize'; +import React from 'react'; +import MonacoEditor, { DiffEditor } from '@monaco-editor/react'; import GraphqlPlayground from '../../Playground'; -const containerStyle = { - display: 'flex', - flexDirection: 'row', - width: '100%', - height: '100%', +const editorOptions = { + wordWrap: 'on', + minimap: { enabled: false }, + folding: false, + lineNumberMinChars: 3, + scrollBeyondLastLine: true, + automaticLayout: true, + formatOnPaste: true, + definitionLinkOpensInPeek: true, + font: 'serif', }; -const editorContainerStyle = { - width: '100%', - display: 'flex', - justifyContent: 'center', - minWidth: '100px', -}; +const getEditorOptions = (options, readOnly) => ({ + ...options, + readOnly, +}); -const dragBarStyle = { - width: '10px', - backgroundColor: 'gray', - cursor: 'col-resize', -}; +const getDiffEditorOptions = (options, readOnly) => ({ + ...options, + readOnly, +}); -const ResizableEditor = ({ - accountId, +const getDefaultValues = (launchPadDefault, context, original) => launchPadDefault || context || original; + +const ResizableLayoutEditor = ({ fileName, - blockView, diffView, - consoleView, - onChangeCode, - onChangeSchema, - block_details, + launchPadDefaultSchema, + contextSchema, originalSQLCode, + launchPadDefaultCode, + contextCode, originalIndexingCode, schema, indexingCode, - onMount, isCreateNewIndexer, + onMount, + onChangeSchema, + onChangeCode, }) => { - const { firstRef, secondRef, dragBarRef } = useDragResize({ - direction: 'horizontal', - initiallyHidden: null, - defaultSizeRelation: 3, - sizeThresholdFirst: 60, - sizeThresholdSecond: 60, - }); + const determineEditorProps = () => { + const isSchemaEditor = fileName === 'schema.sql'; + const isCodeEditor = fileName === 'indexer.js'; - // Render logic based on fileName - const editorComponents = { - GraphiQL: () => , - 'indexer.js': () => - diffView ? ( - - ) : ( - - ), - 'schema.sql': () => - diffView ? ( - - ) : ( - - ), + if (!isSchemaEditor && !isCodeEditor) return null; + + const defaultValue = isSchemaEditor + ? getDefaultValues(launchPadDefaultSchema, contextSchema, originalSQLCode) + : getDefaultValues(launchPadDefaultCode, contextCode, originalIndexingCode); + + const value = isSchemaEditor ? schema : indexingCode; + const readOnly = isSchemaEditor && !isCreateNewIndexer; + + return { + editorProps: { + onMount, + options: getEditorOptions(editorOptions, readOnly), + defaultValue, + value, + readOnly, + onChange: isSchemaEditor ? onChangeSchema : onChangeCode, + language: isSchemaEditor ? 'sql' : 'typescript', + }, + diffProps: { + original: defaultValue, + modified: value, + language: isSchemaEditor ? 'sql' : 'typescript', + readOnly, + options: getDiffEditorOptions(editorOptions, readOnly), + }, + }; }; - return ( -
-
- {editorComponents[fileName] && editorComponents[fileName]()} -
-
-
- ); -}; + const renderEditor = () => { + if (fileName === 'GraphiQL') return ; -export default function ResizableLayoutEditor({ - accountId, - fileName, - blockView, - diffView, - consoleView, - onChangeCode, - onChangeSchema, - block_details, - originalSQLCode, - originalIndexingCode, - schema, - indexingCode, - onMount, - isCreateNewIndexer, -}) { - const { - dragBarRef: dragBarRefConsole, - firstRef: firstRefEditor, - secondRef: secondRefConsole, - } = useDragResize({ - direction: 'vertical', - initiallyHidden: 'second', - defaultSizeRelation: 3, - sizeThresholdFirst: 60, - sizeThresholdSecond: 20, - }); + const { editorProps, diffProps } = determineEditorProps(); - return ( -
- {/* Code Editor */} -
- -
-
- ); -} + ); + } + + return ( + + ); + }; + + return
{renderEditor()}
; +}; + +export default React.memo(ResizableLayoutEditor); diff --git a/frontend/src/components/Editor/EditorComponents/block_details.js b/frontend/src/components/Editor/EditorComponents/block_details.js deleted file mode 100644 index 64780ad94..000000000 --- a/frontend/src/components/Editor/EditorComponents/block_details.js +++ /dev/null @@ -1,1643 +0,0 @@ -export const block_details = { - block: { - author: 'continue.poolv1.near', - chunks: [ - { - balanceBurnt: '1486252472505500000000', - chunkHash: '3qxSWuuo5QLdgpYSuwtQcAcAoX91b6p55CLxjda2wNNw', - encodedLength: 1772, - encodedMerkleRoot: 'ChpbnZdB2NdSaC2ir443zB4Bv6WUMSDBY6n3RfDyEVs', - gasLimit: 1000000000000000, - gasUsed: 16028665261860, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'G5c89nTRQSRYPdJQFcP47YXccbmbrbutNwLZzKUeRG3f', - outgoingReceiptsRoot: '5GrcVRVw9njFAskhcEbUyPZAoKMEEjGnC6edUhupEDkj', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CRaTBLfd55cw6i5GfVvVSo1rw5ioZ91hT3ZVo5eBmNCi', - rentPaid: '0', - shardId: 0, - signature: 'ed25519:4Fzq1idZFShNtErzbK5uZWDcnWhHTMshVBvXG9c8cvc3YPkHF8SVgRsMym6V3WNHVY29gNaw1kXPCLBApcZ2bA1h', - txRoot: '5uqwhjC7wRJsvidh7gjtRRPvvUVwyefdQCivBMTL1hak', - validatorProposals: [], - validatorReward: '0', - }, - { - balanceBurnt: '1433581134734200000000', - chunkHash: 'BqfFW2NyLJuyp1pGgXd2ffYPGptNswNVH6ZJuTq5zSNa', - encodedLength: 161, - encodedMerkleRoot: 'EB5tG2a3aVfXv41ESuQVT1ZvQFvuwKnkYGLc2CDVCf5w', - gasLimit: 1000000000000000, - gasUsed: 19438956235189, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'Cp7GeqLAqZ1Z1GbtCL5nG13wxy6mV6PaRdwLddDHjhVc', - outgoingReceiptsRoot: 'DP1DT6QP1tNHM5ZjHMJ3C8G2mHJd8kGoFFNEdZPN8Hyx', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: '73sn3JyP1LU58r1FsTo5ZVgvErdbEGFxtiGExkWwhQUd', - rentPaid: '0', - shardId: 1, - signature: 'ed25519:3RYj6fpboT1ALHsVxYtYmofT8fGf1VRhNaJhWY45hsKdePcX3AZb3rdKBAZMThF5PVn5j5boKWHPb9zd1xZWYzex', - txRoot: '11111111111111111111111111111111', - validatorProposals: [], - validatorReward: '0', - }, - { - balanceBurnt: '242806857164400000000', - chunkHash: '6uDUqFuYwGohFMQ9UyRaHbmHALf8HS9F6WcNnZWypkka', - encodedLength: 1474, - encodedMerkleRoot: '9rtC25N5jqfLxMumUwvupL9MpMNUAEKuXZB8RmfkdD7p', - gasLimit: 1000000000000000, - gasUsed: 2428068571644, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'AvRw1DBT1JFB2KNuahMvYucvttrem74GSEnwMacxbkv6', - outgoingReceiptsRoot: 'C2QjTGsH8HcfR6W7ecLYwuYD3Vkw6mi9Pf9tFXuGdMLr', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CtxzDGCGs1SAr7GEqrA8gSKCcbaPDMKegnTyPEJmU7mb', - rentPaid: '0', - shardId: 2, - signature: 'ed25519:66LFkWB13BEUYRsmockx9LbiBzko9zohGkfbLwJertYWAa5TJY5ELFxPycps6poroh1C7Tfbh6NH7tQpgHZFr43d', - txRoot: 'DVr9U4uYvJY1cz5awdSmKm4CovJmr1VcPyqCMonat8bD', - validatorProposals: [], - validatorReward: '0', - }, - { - balanceBurnt: '599537042985400000000', - chunkHash: '3Q39LzrowGBhqRZvkjDqQNjkfUEYEK6Zis5LUzqvrtFj', - encodedLength: 1837, - encodedMerkleRoot: '2d1EBsn1UspGLYjyFkrzPoawjghZe4fBbWkZfmsPJRbM', - gasLimit: 1000000000000000, - gasUsed: 7599093905353, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'CUmJsZfPtNYEggezXf6wW7NX2i7Vn9yuPz7RWfVKxR7p', - outgoingReceiptsRoot: '8TG5j9ahcEtGUNREhCEJW3SgHyeCzochf4foYxSU7b8Q', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'EPbgnc5qJFvFGqqAyQQu2SrFcVr6mr3AVbSuXnHvZ1ie', - rentPaid: '0', - shardId: 3, - signature: 'ed25519:RgPmNaXij3pNFdMVi1Ex8WXyQiYr12uUyRk5tuoddJvCTwJXcxQZZLCdy1XqB6uB9imMz9NsXQwT1M993NBMsjS', - txRoot: '8V1iVH9TSzWsPtNVorScHc4ha9ESNqNEG13tZiRSDzk7', - validatorProposals: [], - validatorReward: '0', - }, - ], - header: { - approvals: [ - 'ed25519:3XJG7eriCesmFBP78Q6iECzr34boAvEKn1nMintoQyf8MGf6TUzkjH91jvnb3putUvCicXDzgQjYrjbqTrgQZdTB', - 'ed25519:238a4WVjhbpubpMhMi2wKzR6wjoVLZ7788KPE3a3RzkppLzd22CChmEHHEyqsFj5VpWFVr13iTmgcgh2MomMxhxQ', - null, - 'ed25519:3hE7715teaeQE2UNWuZy9T6B7yA833NeBZuEsfYnHWGmGvQtApVwyX5QsVF1NV8cT24yQTus1u98JPjUr3X1XBdG', - 'ed25519:2JFfKfhtZFLrqNHSKWfojnQ63986w9BDVckL88ny3wzmEgextjkvAAmg12EjsmCwXUdc2VZ6zFBwto2pMVSovHcE', - 'ed25519:3V28c6KbuvuV21W5h8AsbjfZYQXA7aPJEsBi97xpJWAtULikSqqjSVhoLk6ckiAhG83G2nUWc12M8bcroyRB9Lso', - 'ed25519:5rp3ZGsLKo6oHrUix29cEDdfMAeiWuPmaQEh4T22pCPFEGMQ4jf5WRG8PZKv8zKGeia7NJrWy5iR88k2KF554c7A', - 'ed25519:2is1ybPjjGhJGJx7BTWbtXVbQNauwEAZLywtZFGrjLPyXdekxGqG695K3W9q7xnfCJYEXzUxpcANhcL1viG7fG3F', - 'ed25519:3h8Bx2e8Zb5wRw9Cph29FGm1pvWhopqSfbWzQeeawQAssSAd2fcy32yJGtZabHtLp2VRRznv6CgotS4Cc2JWRjUR', - 'ed25519:v7cD1AUXxnqamFqZU3mg3h7zAx6rWZvWARsZhCc28zAHrTM3YgEJiEJCbqcTDtRRCxC2uyBwzzmZftaDum8p5Py', - 'ed25519:5VDMQYTp59pwJ1eVHjcFSUeQnmnkBC9F8jEHwjxoJb1YewM8VAgQCb718r4EpV9Z41MHW57i9H3gP9JHSWJiZUL2', - 'ed25519:2zwMz7w2MJHpg8F4G9AAu5UEy6Yo2TFw1VGFCAUsQrP3WwGDwUbsCR63Y88M9v4aWFdyr38no6yzd2DEsrQQCq7b', - 'ed25519:3M3cA2X1DqWdiELg7PKuFDf8u9MJC2rNhiHccZBYJxZcvKeomgRhGLcgjniEiAmC4uaYq86ePKY7e68smydbXRFr', - 'ed25519:5hX41Uom35xmLD5pTVaxEXzzQMJiS5Vi4Eyd3bBHcd2dKbE4g49AyCmCJ3Mpqr1xEEMsWGKtcLAFpAkhEyiTS73H', - 'ed25519:42kqMAMQdA1b1No1PhLwp8FL2g789vkwHTshiHLjvqSfJ4t6B8krevBj3Z2AmeEYduGMZGNaMcDmFG43vifoX15F', - null, - 'ed25519:4AxJBk1cK9sqHwP4F32KQ21tj37kroBqMyesqXy2ksF8MWmXpxC3R2UKwFJRp3EztNaD8EM2vy7oFRmdumZcM2Gf', - 'ed25519:3KJDnpo4vxwyBDE11AWVRrnyGh9fYgq1GrsinEUKdwkVSCGKGv3rQrm19y5drxZEsqRw39D1bws1scc1TniCv1AX', - 'ed25519:PapbiGeqfur5csDNK3C9Cky6eLUQxzQXDPmE441MqFv5x1VDmEe2ZqHQecjiU6p18o1sQMGwgMARQZxHFDenYLB', - 'ed25519:57Pz4cEpBK2WCMnSaqt4jswZ4QYyhcRx1xG9pD44mp8mLCG3ogJhrq23eFF2xMizUzEDSD7AVMG1tByRob8VCZYm', - null, - null, - 'ed25519:5qNA6byTPhr6GHyTGxEZfRX12tYbqiYy7dQ4kdZVx4PW3i7s5i4q3ZUmwqP5rq6bdxx5fGkdMUVc3sqomz2dErE7', - 'ed25519:5YcgeAxawhVaTnvuRTWbPCtDtS6NH2UrNjeXcn89eXbKHTqeWtHsXKAb1NptrLgKr8K5WUGXjTKicz1xJyv9HgNh', - 'ed25519:sqZFxPtQpBnWUzcuPJeQUqyp3z3vYDYYe7Fvgcu4pVA46ueaU1oyTBpoMakY7pkZGyPq4jmgEamS3Bupf1W8KW3', - null, - null, - null, - null, - null, - 'ed25519:291jQZp5NAeogGttS75JYoqaenVKkQHP8M1YXSB8kpB2UJWN4wn7CCPZUxSPPSsPYmvYfpX3pkrxhJ7gAms9h743', - null, - 'ed25519:W2igco7sqdc9am1aVYA59yfPUVCJ8v4y6G5GAgfN9xpHy9r5QCKmatHpVJ6FMzinhy9GkCiZ3qJizbQBSWScwcP', - null, - 'ed25519:4q7PyxNTZtEdoSQf4azWVmXVs851JH9aYJc9B2H67AdkmM5sBz2gDFce1b9c36xWccUtf7cDDGBE6YPAf5eELax6', - 'ed25519:3ECDJscq5C3JLy6XeqAX5qKSvk8KXRjucJPjCiTW7vLmwb5C1MHR8VUZa6ufpN5chHMgFie2L4D82nMuPABPkXmz', - 'ed25519:29VK9ikBVSp2ZDBKhLDXC4QbA3XXAp5gdMRvVtANNDW29M6boo939HXpwhazhVSJydft8x4WFNfrJUykGrPHtQi6', - null, - null, - null, - null, - 'ed25519:5nUAvGput21GYcbAYuPncCvhyMSQuoKD2eLxb3pUVhLcPyYCxETWwtY4k5AL1p5aR7c9aBG1cfEqUXRB99Y2zwYJ', - 'ed25519:3mae6hCDVnY1WrV1N74xnTkvN5ihTn8Y9SKUPY32zS4jpqJWKzdopgX7KZniiFkC41JhD4vQjWwKChvxfaztBKq6', - null, - 'ed25519:5XjF6gyHudHwy3b48eGsED47myBjxB2dxvYZG2m954eQquMyLcVwKRZJvAXbzbHKehXUP8r9eeL3rm2LriYsx1dD', - 'ed25519:5vtjieSMvoYXYYP3zit9x6Dd7qVRDPYmoBZfELvouSX5ur9dnHmUnjEAXsWSWB69obm6hnfJz1Bx5gkXjLvyen3X', - null, - null, - null, - 'ed25519:3WK1bgn3qqzSiZcEphbKcw6UajNSDdLSYeGYMSMGH4YMdS7FnFKAhdigotRZ8z32adAzZp1URjd39yBHBibJVnDJ', - 'ed25519:3hkDFUQhi9pDWKtb6YtcuFy56QY9CkhAKvEwrg99wFYtmcYicN5N3tSu3bSKpFFEWop3qsvr5rCc3zWwkqKVT2nb', - null, - 'ed25519:rpALm3QcZov6qnDscsyyKwtgLSXVjppugEgM1DAzMw6Ewk2ovVAtow5frCV7nc1umnDLuxfLSfRNxkjeDqgAr4S', - 'ed25519:282Bw4icWLoUEAa6KUmixVeGSjjt6o1GAMcLypc1ruCqneENnzPC9hVqUWWGe9PmHU6GCEDoe79Y8hGpP9GuDYdA', - 'ed25519:2JQENivaSR9iDsbEXB3gz6PdqBiNbWRKU1e9XvcChzwtHp3gcCMW6Gnr362ktodDcjtcxZzyR4mHKBgREm2iRDJC', - null, - 'ed25519:35ffy6YAW7V1VSF1XcYNQUXnQxgYyNpsaUWEF3Gu7LgijZkdFqVdbPxfQpKCntWuC3LLrb8Vs1a3WNHgmEcub4Ng', - null, - null, - 'ed25519:53swEewwpM15AN4uBW3DPSdX4VTcx7XvP7d7LZNtxDga7JnNXZXVYJeNw31ui9LB1ffnHMNyAFoiQMLm5bnPQcsq', - 'ed25519:3Wb7R4K6DXA3o3DDAEwaYNY72SwqUadjqesMYvq9cmhoHm2UtyDMp1wPWCWMLQ4BfrshGdMgryvSn8cpeiVuv5HN', - null, - 'ed25519:5gGB9iTkt31SvAYaR52WfYf51uhhUb3CTf9RDN3MXoD3VR4m8fwBgRpmeu2Txb1RQJCwczxfYByYuRJR3orKkXA', - 'ed25519:2L7h92UaYwSXGBTqVkuhpRKZwRpW2wB7568U6jcBnH3iQtj71jERJdAtru62dx17teRngxJjDzMAG2Hs273Nt4cn', - 'ed25519:DL2QVuWC6CWrr519nQiKRtgC2H59ebBKNb5MjAKyv64zF3VrguWKQCcfaRUGgugiVeUjx12m2QfQigHmrqHWPmi', - 'ed25519:2uRyW8QrTaxdeX11tKxFmCY1FZbHbz7iWKxrNzGV9jiJg56BJgRKSZKbFpzPTakWMsesUfUUq4HNB4YsE6pvJSsN', - 'ed25519:2JB1CzirhvYfDVhay5jdzW5zGhGCLftfAB2Ff1ByNRnrvN7osvswuzLGHYDbmdMPdhC1ZTqeNCmKnQHzqQxKSjzN', - null, - 'ed25519:4YNGqdPNKGGDcuWAnW1DFJfJ6Qeqz5wh7rGLj7gSK2jXYUh9vnuXcKoC2fBWsTKtfawncDyKE7sAfW3THaSqrDDM', - null, - null, - null, - null, - 'ed25519:KhbmAUdmHgTuVkUsBX2PdbPsLgKMtr8ds7pWrb1otn5dKidQJc8Vdtq5MBZUrn6pRL2d96YWL9jxTBpgBqrbn2M', - null, - 'ed25519:MZT25bZDDxDJP4CRhyTK17Qfr8oWroVdyRuTccpA3Ynhf3PwB1WcC31XwugD6L5LCtMU1hyCPbE16bk7NksHhHC', - null, - 'ed25519:2BWXNtCGqwLG9yu8KkRnT1tui8GcynBN5DrhtfNQtFotSHphtABu1iNucrd82aPTegFogSMDA2cvhhrgpu4SRevc', - null, - 'ed25519:4EFt6q2MUjvcvZrCFXY2amqBcd36gKezF3FFHWsGwtJcqbH4brTHMH5THio3pXFYCWY8mtQTpLZ9SnPUWDyVKxnA', - 'ed25519:57js3GUGprV3Rc5Aci4Ws2JciuuWMhmApPPmyhYJXcz67LuwTT4KCnhFNZYDzGnV2ueP1irNUFFUXhC6HXa7amUQ', - null, - 'ed25519:2uJEgTHUV1qSLLDSjuA6NBDdJur5Xh9wKQ9sHWmpwpePyknc93J64YVZxnidG2EDAKVBSDm9kpBndMXGNEXjqEew', - 'ed25519:BzXpv857MvdsUkgCdZRAspbAhrKqibxXs7JqSt2KkzjCm9JgsxiCGf5GJCYC3gV3NJfC4p6zst8UYezQ43LAkT1', - 'ed25519:3hX4uGLHK2GRCTng7SBazenaXxSHSscJyRCKgUpKiQfHMJ7BsVvJb9obJfSNN3ynfCNmRtoUiB3tE46xHKqZ73rt', - null, - 'ed25519:2VyXyzSMCS6nzA2rDVwoZJLt2k1Zx3c4wQMx15SBx3mYbjevfdt6ErHH4GvF7PMqnXAUEgCTzWoJ54NeV5nWbM9b', - null, - 'ed25519:2FURA8ZJGN7gTtoaGgYvNkQE46rNLmrwSqqNVhzevUg3MP6GNt821vqMpsfrR5t7mFy5pk5inzrWYZcELZw5LHKz', - null, - 'ed25519:3JHQcPV1nTLsqSTboA4NavexkhmYxDsiDun49KFVEZQRuxoNHuigJL1jBW78T4nRRPPowESosCZgmpgsWDb5UDAK', - 'ed25519:2yqmma3px8io4Dd7ezg5H5d3C4Rueyi3aok9agpzpowU4vPxj2Y58h3Mu2qPSYBUtT75DgEcTtiZaMjQsBMfjCj7', - null, - 'ed25519:647bt2zPCma9kZqZmaR4HshKrERRUiFg3KT1G6S5aeowmoELvLhHcwZyAki4hW8BtgdW5GuEu2pPRXFsoTbEcASC', - null, - 'ed25519:4kv1RTxeFCRxc6shxqwfmmL398dJDGjKvFPn9PuaJJoFZTBkkFDaNuMDagoBrfgZYBhb7eZ26vKAoPK3vBVUGZgp', - 'ed25519:4P183Ceq88jLBs1cKoANgrmTBDCsvbJVRYgBH4iYyK76bYrw795DkgMaQKsWo3ZFjMHH3fC9nZ8C4WNLwkJZVfE4', - 'ed25519:CbQsnkfYhEZ32hfTrj4d4MYd4duFep6zY1cqRUFqt74WtxQHWU4mVL4qoxgvQgfeWPLiev9FRVaFLK4VnL9jYsZ', - 'ed25519:4kFsUdepZzP9oVCYWdzNq3iHURJdNn9GHj4gJgeaHPVWFpbue52zagJpmh4hsNjhDXX5tkL3TQzcd5HTWjNcqgDC', - null, - ], - blockMerkleRoot: 'FYpXxjbPZ5FoB57ZcPMvvs94x52wbCJdhxYs6qnGaZsm', - blockOrdinal: 75337992, - challengesResult: [], - challengesRoot: '11111111111111111111111111111111', - chunkHeadersRoot: '5AzFQd9Ds8yWynns4B4TFFcBGSh24ze2jApisECRYEib', - chunkMask: [true, true, true, true], - chunkReceiptsRoot: 'CsBRzd4FJe8Qr22wDkQXtxaVs5z2Jmrk2ZQC1PBrHRoV', - chunkTxRoot: '9DwCvRfUYzaxHCjWEWDR3WxJfn9gPoignTYXmEN9D6wC', - chunksIncluded: 4, - epochId: '4GoC7oSPLfaXo3Gz9z2Rkb86nN1fM8qVd578gTAmf1fn', - epochSyncDataHash: null, - gasPrice: '100000000', - hash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - height: 85376002, - lastDsFinalBlock: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - lastFinalBlock: 'C3KNVyUKZ8uR166dc5vUKPQdsW5CL2mn4oerbMQFcQp5', - latestProtocolVersion: 58, - nextBpHash: '5BaNTEgDB11HxTGNKvQRJSytiv6ZM73YrJjxBymYau7', - nextEpochId: '3jvt2LuA1LZGQwKtbcThcjT4twe4juCfqwSEiuktBrqH', - outcomeRoot: '5dDKr6oN9bh1bxePyq2HbAWTA792ZRQSvfvcmTTrySi9', - prevHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevHeight: 85376001, - prevStateRoot: '6Y3XsdVvhHj3wcGVbXNQNg3qh46HHQA5FPKUoigHPVYr', - randomValue: '3SPgojnHE7CFj7bue5w8CsYDvg5Ffskue8qPDZohqQJh', - rentPaid: '0', - signature: 'ed25519:5kjuiCWar11gt9BSRncbEaUnwoL1Nx5tzdnxrnBzgWhjHdfH2QfDajYqdy4bkXaU3UJ6TQDGcLz7pPiNLR3mmnQS', - timestamp: 1676579182274205000, - timestampNanosec: '1676579182274204901', - totalSupply: '1121201720917794037313140715777439', - validatorProposals: [], - validatorReward: '0', - }, - }, - shards: [ - { - chunk: { - author: 'figment.poolv1.near', - header: { - balanceBurnt: '1486252472505500000000', - chunkHash: '3qxSWuuo5QLdgpYSuwtQcAcAoX91b6p55CLxjda2wNNw', - encodedLength: 1772, - encodedMerkleRoot: 'ChpbnZdB2NdSaC2ir443zB4Bv6WUMSDBY6n3RfDyEVs', - gasLimit: 1000000000000000, - gasUsed: 16028665261860, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'G5c89nTRQSRYPdJQFcP47YXccbmbrbutNwLZzKUeRG3f', - outgoingReceiptsRoot: '5GrcVRVw9njFAskhcEbUyPZAoKMEEjGnC6edUhupEDkj', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CRaTBLfd55cw6i5GfVvVSo1rw5ioZ91hT3ZVo5eBmNCi', - rentPaid: '0', - shardId: 0, - signature: 'ed25519:4Fzq1idZFShNtErzbK5uZWDcnWhHTMshVBvXG9c8cvc3YPkHF8SVgRsMym6V3WNHVY29gNaw1kXPCLBApcZ2bA1h', - txRoot: '5uqwhjC7wRJsvidh7gjtRRPvvUVwyefdQCivBMTL1hak', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'app.nearcrowd.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJhY2NvdW50X2lkIjoicmV6ZXJ2LTI5Lm5lYXIiLCJzb2x1dGlvbl9oYXNoIjpbMTY2LDIwNCw2NSw3NCwxMTksMiwyOSwzMywyMTMsMTA1LDE2OCw0LDE5NCwxNzksMTk3LDUyLDI0MSw1NSwxLDEwMSwxNTcsNjQsMTI0LDAsMTE4LDY3LDE4NywxMjEsMTMzLDQxLDIzOSwyNDNdfQ==', - deposit: '0', - gas: 200000000000000, - methodName: 'approve_solution', - }, - }, - ], - gasPrice: '335989893', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - }, - }, - receiptId: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', - receiverId: 'app.nearcrowd.near', - }, - { - predecessorId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC03YThiYTFiZDgwNDg2Mzg4M2FjZTEwZWQ3NjQ0MWU2YWQyMjM5YWU3OTE3Yjc4Yzg5NzAwYjcwMWY3NWNlMWFiIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - gasPrice: '109272700', - inputDataIds: [], - outputDataReceivers: [], - signerId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - signerPublicKey: 'ed25519:9FNEMP92rkuvRVefVkBW38RmbZ648XvQGeWbFYtdC7hk', - }, - }, - receiptId: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', - receiverId: 'token.sweat', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '67682508099918060916120' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:6MP4bCPHEud33eKXM9kg7f9fVNhmn97CNUyn5ZwM375U', - }, - }, - receiptId: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', - receiverId: 'app.nearcrowd.near', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13222602662027447938448' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'olezha4.near', - signerPublicKey: 'ed25519:EnLNUDncRuw4AYLcGmi1Hr2YQ1DLu12VutsubZ6k8c2F', - }, - }, - receiptId: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', - receiverId: 'olezha4.near', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13239855304236542651168' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'marthacecilia.near', - signerPublicKey: 'ed25519:8W28RYFfXztNA7ENP4VTaitsqEjSbABQJDqELwbwXswq', - }, - }, - receiptId: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', - receiverId: 'marthacecilia.near', - }, - ], - transactions: [ - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 2428314524384, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY'], - status: { SuccessReceiptId: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY' }, - tokensBurnt: '242831452438400000000', - }, - proof: [ - { direction: 'Right', hash: '8AS32PCfmnnsgkmrm2QH6ULKdTBS4o3EjcU2FZ34dTux' }, - { direction: 'Right', hash: '8PVbKv5bqbBoTUkXbcQ8sWEYbUDKo8hv8S1JHKVrftCz' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJhY2NvdW50X2lkIjoicmV6ZXJ2LTI5Lm5lYXIiLCJzb2x1dGlvbl9oYXNoIjpbMTY2LDIwNCw2NSw3NCwxMTksMiwyOSwzMywyMTMsMTA1LDE2OCw0LDE5NCwxNzksMTk3LDUyLDI0MSw1NSwxLDEwMSwxNTcsNjQsMTI0LDAsMTE4LDY3LDE4NywxMjEsMTMzLDQxLDIzOSwyNDNdfQ==', - deposit: '0', - gas: 200000000000000, - methodName: 'approve_solution', - }, - }, - ], - hash: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', - nonce: 43616777771952, - publicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - receiverId: 'app.nearcrowd.near', - signature: - 'ed25519:5KcVvC1zzJZkk92uWzMoD9e2fvded6JdgUApuV6NDCcY7YEhzVtUQaVPomQ4ZpDydtUyZmgxTXcqaVp5c54wciEX', - signerId: 'app.nearcrowd.near', - }, - }, - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', - outcome: { - executorId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - gasBurnt: 2428312288450, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['7CmRnTXnY3LmX7PojrByXqZpirVNVSuHgL9k3uhbdKm1'], - status: { SuccessReceiptId: '7CmRnTXnY3LmX7PojrByXqZpirVNVSuHgL9k3uhbdKm1' }, - tokensBurnt: '242831228845000000000', - }, - proof: [ - { direction: 'Left', hash: '5Bf7Pbbnwt6THJBxQ3mBkpc8WD2GBLoXrte6HYJZU6yh' }, - { direction: 'Right', hash: '8PVbKv5bqbBoTUkXbcQ8sWEYbUDKo8hv8S1JHKVrftCz' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC0yZmU3NTAwMGM4NGVmZDNiNjRmODhmNjFkODhjZDA4YzMzOWI4YzY2NTRlNjIzOWY3ZDRlMzU5MmFhOTJjNjU5In0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - hash: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', - nonce: 70681752000024, - publicKey: 'ed25519:4Dzjg5EJX1RBYctnzmi1SNoq6fswSowsiWB5m3sEcC4Q', - receiverId: 'token.sweat', - signature: - 'ed25519:5NuszWGgsVB5yPWqvGMGP3yCjs5YVh3QtWw79kch5mf3ApSVqpzTD42TzAsKcmhauDYDhzU8SUU9dGx2rHodJRLn', - signerId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - }, - }, - ], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 3300309921959, - logs: [], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3177217332' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '104961404250' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '86640000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '13049316000' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '315510639' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '7551495558' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '19712400' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '56356845750' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '154762665' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '123442110' }, - { cost: 'STORAGE_WRITE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '128393472000' }, - { cost: 'STORAGE_WRITE_EVICTED_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '706580754' }, - { cost: 'STORAGE_WRITE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1691588808' }, - { cost: 'STORAGE_WRITE_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1675001106' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '418650854076' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '24383196816' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '11215179444' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '588334752' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '11462089944' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '843947208' }, - ], - version: 1, - }, - receiptIds: ['8kGPN9gvU8dhZy3374rTa3LjtxcZcHcZkXRAf56si2vh'], - status: { SuccessValue: '' }, - tokensBurnt: '330030992195900000000', - }, - proof: [ - { direction: 'Right', hash: '8uFcqYe8azbspu5mofVCt5TC6K4n6kTbNBRwDt3CRT6Z' }, - { direction: 'Left', hash: '9C9aaY5ECUzq1t2NtXQVXTH6wZ8sBExs33KhVNmjFnQJ' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: { - predecessorId: 'app.nearcrowd.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJhY2NvdW50X2lkIjoicmV6ZXJ2LTI5Lm5lYXIiLCJzb2x1dGlvbl9oYXNoIjpbMTY2LDIwNCw2NSw3NCwxMTksMiwyOSwzMywyMTMsMTA1LDE2OCw0LDE5NCwxNzksMTk3LDUyLDI0MSw1NSwxLDEwMSwxNTcsNjQsMTI0LDAsMTE4LDY3LDE4NywxMjEsMTMzLDQxLDIzOSwyNDNdfQ==', - deposit: '0', - gas: 200000000000000, - methodName: 'approve_solution', - }, - }, - ], - gasPrice: '335989893', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - }, - }, - receiptId: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', - receiverId: 'app.nearcrowd.near', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 5360036359518, - logs: [], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '15091782327' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '104961404250' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '592800000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '62636716800' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2698946430' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '42791808162' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '125075178' }, - { cost: 'STORAGE_HAS_KEY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '54039896625' }, - { cost: 'STORAGE_HAS_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '738980280' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '281784228750' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4859547681' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4253141790' }, - { cost: 'STORAGE_REMOVE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '160419091500' }, - { cost: 'STORAGE_REMOVE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1605256128' }, - { cost: 'STORAGE_REMOVE_RET_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1141624044' }, - { cost: 'STORAGE_WRITE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '449377152000' }, - { cost: 'STORAGE_WRITE_EVICTED_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '9121315188' }, - { cost: 'STORAGE_WRITE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '6977803833' }, - { cost: 'STORAGE_WRITE_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '11880100437' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '933913443708' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '83208605304' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '50468307498' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3500047020' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '48713882262' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4824184716' }, - ], - version: 1, - }, - receiptIds: ['HF5rs8fq4n8HygFMYiQ8nWZSpVncKBnCXj9aNpvzZsAP'], - status: { SuccessValue: 'ZmFsc2U=' }, - tokensBurnt: '536003635951800000000', - }, - proof: [ - { direction: 'Left', hash: '2Lon5RSqBvnuGcXgkneYZTUUup6CotQYqEbi1eYfBfVK' }, - { direction: 'Left', hash: '9C9aaY5ECUzq1t2NtXQVXTH6wZ8sBExs33KhVNmjFnQJ' }, - { direction: 'Right', hash: '8VRHTUKsUcZRDgrKizV5sup3Zvzg6reRacn3KmeUVY9n' }, - ], - }, - receipt: { - predecessorId: 'evaenergy.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJ0YXNrX29yZGluYWwiOjEsImJpZCI6IjQ0NDQ2ODcxMTE2MjIyODMzODczMDc2In0=', - deposit: '0', - gas: 30000000000000, - methodName: 'claim_assignment', - }, - }, - ], - gasPrice: '122987387', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'evaenergy.near', - signerPublicKey: 'ed25519:9Q53x5kiLChb4tX3J5dV2wNAdTetejEcnizyQ3n3PZdg', - }, - }, - receiptId: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', - receiverId: 'app.nearcrowd.near', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', - outcome: { - executorId: 'app.nearcrowd.near', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [{ direction: 'Left', hash: 'BcJG6WkrSgW8dsc8iBJHNZcP7576vvRQGBagZZfuXkmG' }], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '67682508099918060916120' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'app.nearcrowd.near', - signerPublicKey: 'ed25519:6MP4bCPHEud33eKXM9kg7f9fVNhmn97CNUyn5ZwM375U', - }, - }, - receiptId: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', - receiverId: 'app.nearcrowd.near', - }, - }, - ], - shardId: 0, - stateChanges: [ - { - cause: { txHash: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', type: 'transaction_processing' }, - change: { - accountId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - amount: '31778755366428489684978', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { txHash: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', type: 'transaction_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406007009136306129113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976751, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406007009136306129113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976842, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406033168998233329113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976842, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406033168998233329113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976788, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559406121128031869529113176', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976788, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '5GMwBgfhgASLVXkCsqMn2riVbByJPh2pmyxCeQmbHHWe', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - amount: '6559473803636131787590029296', - codeHash: 'DyHG2t99dBZWiPgX53Z4UbbBQR6JJoxmqXwaKD4hTeyP', - locked: '0', - storagePaidAt: 0, - storageUsage: 3976788, - }, - type: 'account_update', - }, - { - cause: { txHash: '3GYUTXHUQMH1kpccEms6yNVzckyAedUTWKPQpEN4tc5K', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 70681752000024, permission: 'FullAccess' }, - accountId: '2fe75000c84efd3b64f88f61d88cd08c339b8c6654e6239f7d4e3592aa92c659', - publicKey: 'ed25519:4Dzjg5EJX1RBYctnzmi1SNoq6fswSowsiWB5m3sEcC4Q', - }, - type: 'access_key_update', - }, - { - cause: { txHash: '3W8KnZUsb7Mb3SZk7yygL5F2L2C6djxZ3fVumodB2KQe', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 43616777771952, permission: 'FullAccess' }, - accountId: 'app.nearcrowd.near', - publicKey: 'ed25519:CXYkSHvK2rj6sCGbaKPbTtwhcMrPvWxs1ntVvA6vLtm2', - }, - type: 'access_key_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'U1RBVEU=', - valueBase64: 'EgAAAGFwcC5uZWFyY3Jvd2QubmVhcg==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '8FWEuJ76SphAbWL2hgsJ36zD5jobWjqPNE2xQWaEFKNY', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'YQ4AAAByZXplcnYtMjkubmVhcg==', - valueBase64: 'psxBSncCHSHVaagEwrPFNPE3AWWdQHwAdkO7eYUp7/M=', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'cAEAAAA=', - valueBase64: - 'AABAe6XwY4GWCgAAAAAAAAAA9ESCkWNFAAAAAAAAAAAsAQAAAAAAABACoJtTF3zmCgkAAAAAAADcEUiC7mdEF6E7rAAAAAAABgAAAHQBAAAAYrtzrAAAAAAABgAAAHQBAAAAYh0EAAAAAAAABgAAAHQBAAAAYwYAAAB0AQAAAGUGAAAAdAEAAABmBgAAAHQBAAAAZwEGAAAAdAEAAABtAA==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { accountId: 'app.nearcrowd.near', keyBase64: 'dAEAAABjHQQAAAAAAAA=' }, - type: 'data_deletion', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABjIgEAAAAAAAA=', - valueBase64: 'epIvaamXn1S0leE2SA8w+TxNWM4rEC75i6V3XS7gjvAE', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABjmwAAAAAAAAA=', - valueBase64: '0h0vJmTB/V9IK0xVxNBid+JAmsnySRFNF3jnQNl2m8sB', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABjqQEAAAAAAAA=', - valueBase64: 's+OZU4d49W6Qv/gFmkBPsmVUX1WVbDiJAJzJse0tXVEE', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', type: 'receipt_processing' }, - change: { - accountId: 'app.nearcrowd.near', - keyBase64: 'dAEAAABnDgAAAGV2YWVuZXJneS5uZWFy', - valueBase64: 'A/UhKZel+/gCMLF4XhBcxERDBIa48p9qlYBMRIbWALUgA+XURCXiZ0QXWujnX0t/H7y0BAAAAAAAAA==', - }, - type: 'data_update', - }, - ], - }, - { - chunk: { - author: 'bisontrails.poolv1.near', - header: { - balanceBurnt: '1433581134734200000000', - chunkHash: 'BqfFW2NyLJuyp1pGgXd2ffYPGptNswNVH6ZJuTq5zSNa', - encodedLength: 161, - encodedMerkleRoot: 'EB5tG2a3aVfXv41ESuQVT1ZvQFvuwKnkYGLc2CDVCf5w', - gasLimit: 1000000000000000, - gasUsed: 19438956235189, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'Cp7GeqLAqZ1Z1GbtCL5nG13wxy6mV6PaRdwLddDHjhVc', - outgoingReceiptsRoot: 'DP1DT6QP1tNHM5ZjHMJ3C8G2mHJd8kGoFFNEdZPN8Hyx', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: '73sn3JyP1LU58r1FsTo5ZVgvErdbEGFxtiGExkWwhQUd', - rentPaid: '0', - shardId: 1, - signature: 'ed25519:3RYj6fpboT1ALHsVxYtYmofT8fGf1VRhNaJhWY45hsKdePcX3AZb3rdKBAZMThF5PVn5j5boKWHPb9zd1xZWYzex', - txRoot: '11111111111111111111111111111111', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '187086049935277727891452' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:8j2e8u9t1SoTgMPn5G65ChU5WskpcnemBjwzkAnxDtZq', - }, - }, - receiptId: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', - receiverId: 'relay.aurora', - }, - ], - transactions: [], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', - outcome: { - executorId: 'aurora', - gasBurnt: 3497076222351, - logs: ['signer_address Address(0x605ce19532c7121d1b5e632eb776e5aa7bfb8990)'], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '5295362220' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '207231423750' }, - { cost: 'ECRECOVER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '278821988457' }, - { cost: 'KECCAK256_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '17638473825' }, - { cost: 'KECCAK256_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '8889037470' }, - { cost: 'LOG_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3543313050' }, - { cost: 'LOG_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '871120206' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '9120000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '20878905600' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2128746480' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '22654486674' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '65642292' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '112713691500' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '897623457' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '482546430' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '209325427038' }, - { cost: 'UTF8_DECODING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '6223558122' }, - { cost: 'UTF8_DECODING_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '24784340715' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '84250214400' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '22430358888' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1639710744' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '25789702374' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2531841624' }, - ], - version: 1, - }, - receiptIds: ['H4FHCm5scAbLHhki995o2UoJsHYuJHfbbCx5egAjNmk9'], - status: { - Failure: { - ActionError: { - index: 0, - kind: { FunctionCallError: { ExecutionError: 'Smart contract panicked: ERR_INCORRECT_NONCE' } }, - }, - }, - }, - tokensBurnt: '349707622235100000000', - }, - proof: [], - }, - receipt: { - predecessorId: 'relay.aurora', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: '+QGPggpehAQsHYCCUgiU5ShUyG+2SwTdHXetVCh23cBAxPSAuQEkGMuv5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGiUDx20tY/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/fZpFXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAGBc4ZUyxxIdG15jLrd25ap7+4mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhaeq/ToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAADCXWsrHC113TW91as0DqbkM1NT1AAAAAAAAAAAAAAAASYiolrEichjkpob95eq9yr2RVx8AAAAAAAAAAAAAAADJve7TPNAVQeHu0Q+QUZ0sBv4/64ScioLIoNNwZYHzq18jJVWwzwd9vJY1JV4H29H/wOgwyQVM2FJzoCUAB6Nz+98pSh9AfalXBMbThpftEUVyF49fYhEKwmJf', - deposit: '0', - gas: 300000000000000, - methodName: 'submit', - }, - }, - ], - gasPrice: '625040174', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:2WmTnJeWZYKhh6NC3z3xTDKU5sHHAmHF96V6KAB3eHK5', - }, - }, - receiptId: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', - receiverId: 'aurora', - }, - }, - ], - shardId: 1, - stateChanges: [ - { - cause: { receiptHash: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'aurora', - amount: '62420509105129651830808079298', - codeHash: 'qorYWFPQKMbJGcmjtWUhD3ee7fJJakRRUYFk3cao4W3', - locked: '0', - storagePaidAt: 0, - storageUsage: 6176907778, - }, - type: 'account_update', - }, - ], - }, - { - chunk: { - author: 'republic.poolv1.near', - header: { - balanceBurnt: '242806857164400000000', - chunkHash: '6uDUqFuYwGohFMQ9UyRaHbmHALf8HS9F6WcNnZWypkka', - encodedLength: 1474, - encodedMerkleRoot: '9rtC25N5jqfLxMumUwvupL9MpMNUAEKuXZB8RmfkdD7p', - gasLimit: 1000000000000000, - gasUsed: 2428068571644, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'AvRw1DBT1JFB2KNuahMvYucvttrem74GSEnwMacxbkv6', - outgoingReceiptsRoot: 'C2QjTGsH8HcfR6W7ecLYwuYD3Vkw6mi9Pf9tFXuGdMLr', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'CtxzDGCGs1SAr7GEqrA8gSKCcbaPDMKegnTyPEJmU7mb', - rentPaid: '0', - shardId: 2, - signature: 'ed25519:66LFkWB13BEUYRsmockx9LbiBzko9zohGkfbLwJertYWAa5TJY5ELFxPycps6poroh1C7Tfbh6NH7tQpgHZFr43d', - txRoot: 'DVr9U4uYvJY1cz5awdSmKm4CovJmr1VcPyqCMonat8bD', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'evaenergy.near', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJ0YXNrX29yZGluYWwiOjEsImJpZCI6IjQ0NDQ2ODcxMTE2MjIyODMzODczMDc2In0=', - deposit: '0', - gas: 30000000000000, - methodName: 'claim_assignment', - }, - }, - ], - gasPrice: '122987387', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'evaenergy.near', - signerPublicKey: 'ed25519:9Q53x5kiLChb4tX3J5dV2wNAdTetejEcnizyQ3n3PZdg', - }, - }, - receiptId: '6XN47idjeWhq2QpkjGs9w7pPg452Z1GwgwRxZjy2ny7T', - receiverId: 'app.nearcrowd.near', - }, - ], - transactions: [ - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', - outcome: { - executorId: 'chadmoney.near', - gasBurnt: 2428372658668, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['Ht6wAxzHfyCwWmfkngi9n6DaJu6UtoD1skHpJrRJQGik'], - status: { SuccessReceiptId: 'Ht6wAxzHfyCwWmfkngi9n6DaJu6UtoD1skHpJrRJQGik' }, - tokensBurnt: '242837265866800000000', - }, - proof: [ - { direction: 'Right', hash: 'E4X99JiTuYjYW6WPMiBhZ61Eo9fDYXmDdv67ZdkSbcf3' }, - { direction: 'Right', hash: '2NXhS3PRa1H8UZEtrNo14QhYNTzk5ztBhrSe6rb64heg' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJhY3Rpb25zIjpbeyJwb29sX2lkIjo0LCJ0b2tlbl9pbiI6IndyYXAubmVhciIsInRva2VuX291dCI6ImRhYzE3Zjk1OGQyZWU1MjNhMjIwNjIwNjk5NDU5N2MxM2Q4MzFlYzcuZmFjdG9yeS5icmlkZ2UubmVhciIsImFtb3VudF9pbiI6IjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCJtaW5fYW1vdW50X291dCI6IjI0NzE5ODgxNjIifV19', - deposit: '1', - gas: 10000000000000, - methodName: 'swap', - }, - }, - ], - hash: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', - nonce: 72650480016948, - publicKey: 'ed25519:78fzZoSWw4yr7gRev6onwRFQPu5auDAPNuAhM2Ryy4EC', - receiverId: 'v2.ref-finance.near', - signature: - 'ed25519:SYNT4UNqfEpAofZykZpZUugyPxXpSxYPwo8BqVg1fPG8BZvQKJgmHkoLsEbG2bsTfW1iGr886E6mw4nRDLJQ9e1', - signerId: 'chadmoney.near', - }, - }, - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', - outcome: { - executorId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - gasBurnt: 2428312288450, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['ENQk2JGnPNtpXPUFkpBhnD3XUyv67eXB4XfmDU2sjHB7'], - status: { SuccessReceiptId: 'ENQk2JGnPNtpXPUFkpBhnD3XUyv67eXB4XfmDU2sjHB7' }, - tokensBurnt: '242831228845000000000', - }, - proof: [ - { direction: 'Left', hash: 'GAdP76ExKf5yQH9BU5usAeAWxiX2HkmDP7g54Ff47Zgz' }, - { direction: 'Right', hash: '2NXhS3PRa1H8UZEtrNo14QhYNTzk5ztBhrSe6rb64heg' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC1mZDMwNWQyOGZhMTJjYjJlMjc2OWIyMTEyNDgwNTliOGY0MDMzZWY0ZDRjMDA3MmM3ZGFmMjQ2YjE2NjEwNmJhIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - hash: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', - nonce: 64674524000017, - publicKey: 'ed25519:J3LvQdaf6r6YVuTrVzo6em32R2ZG7jE9n4ysiLUpMa4y', - receiverId: 'token.sweat', - signature: - 'ed25519:3gdWeCTcqbT3ezViXEPaRiRafz4NcRRsP7bAwgY1CTFenKcFQB5gyvQqSHPAtQbx7JdppByH4j6SrEMxmPedFyPY', - signerId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - }, - }, - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', - outcome: { - executorId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - gasBurnt: 2428158009004, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['86Xs7Z6wiQNb89hV5j33UHbBZTXrbBYtqwBMBT3Hhq4h'], - status: { SuccessReceiptId: '86Xs7Z6wiQNb89hV5j33UHbBZTXrbBYtqwBMBT3Hhq4h' }, - tokensBurnt: '242815800900400000000', - }, - proof: [ - { direction: 'Right', hash: 'AJhsQtiU5riKpBKSBbHYD9svR84eZ3oYqd8eRjipqTFZ' }, - { direction: 'Left', hash: '45QTFnLgDmAbiiVBFmVHnivqQFU2ATNgLNErLnvZYZq2' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6ImRlcG9zaXRzLmdyb3cuc3dlYXQiLCJhbW91bnQiOiIxMDIxOTAwMDAwMDAwMDAwMDAwMDAiLCJtZW1vIjoic3c6ZDpnV095RFk0TEVrIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - hash: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', - nonce: 64963031000010, - publicKey: 'ed25519:FyzTGZb9mP8gcDbyhLCLumsA38a1JF3E5WELLJHnJsab', - receiverId: 'token.sweat', - signature: - 'ed25519:25q5o12NchK9rnUmrddTFKzYYCdqmPfQWq1QgRhGJiDiZmazqS2B4mPu7PeGYvVAEqucgq2k41EmXwgN3vLExjW5', - signerId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - }, - }, - ], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', - outcome: { - executorId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - gasBurnt: 424555062500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [ - { direction: 'Left', hash: 'DiN9q4rgCEpmykqXzoXWP2dNdjLyWEAgYzi7UmsQhEpx' }, - { direction: 'Left', hash: '45QTFnLgDmAbiiVBFmVHnivqQFU2ATNgLNErLnvZYZq2' }, - ], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '1389731257024010315000' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - signerPublicKey: 'ed25519:HWHJq9M3m232SGpRTXuycdvjPEaaxn9TFN72bnEXnESp', - }, - }, - receiptId: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', - receiverId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - }, - }, - ], - shardId: 2, - stateChanges: [ - { - cause: { txHash: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', type: 'transaction_processing' }, - change: { - accountId: 'chadmoney.near', - amount: '3455422147665387737062056', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 2282, - }, - type: 'account_update', - }, - { - cause: { txHash: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', type: 'transaction_processing' }, - change: { - accountId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - amount: '37838802127313908609194', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { receiptHash: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', type: 'receipt_processing' }, - change: { - accountId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - amount: '44000142104620699999996', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { txHash: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', type: 'transaction_processing' }, - change: { - accountId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - amount: '33618268317256489684987', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 182, - }, - type: 'account_update', - }, - { - cause: { txHash: 'F4z3CFPjUGRJEF9rNSVhz4hZG2LpBvA3rR3AHv68432i', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 72650480016948, permission: 'FullAccess' }, - accountId: 'chadmoney.near', - publicKey: 'ed25519:78fzZoSWw4yr7gRev6onwRFQPu5auDAPNuAhM2Ryy4EC', - }, - type: 'access_key_update', - }, - { - cause: { txHash: 'DbCXaFDNfQ7LjM5Jh8BS5fKLF6UJG3vJZYbGtfpDaTEB', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 64963031000010, permission: 'FullAccess' }, - accountId: 'de9d1abf39de5fc4eac513b559cc825352d03c7b642a8af657113d61f8c195dc', - publicKey: 'ed25519:FyzTGZb9mP8gcDbyhLCLumsA38a1JF3E5WELLJHnJsab', - }, - type: 'access_key_update', - }, - { - cause: { txHash: '3Zgj4eFNymhW7LBsaKtUsCWAaoP9LBXKGFtmebYsfibU', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 64674524000017, permission: 'FullAccess' }, - accountId: 'fd305d28fa12cb2e2769b211248059b8f4033ef4d4c0072c7daf246b166106ba', - publicKey: 'ed25519:J3LvQdaf6r6YVuTrVzo6em32R2ZG7jE9n4ysiLUpMa4y', - }, - type: 'access_key_update', - }, - ], - }, - { - chunk: { - author: 'binancenode1.poolv1.near', - header: { - balanceBurnt: '599537042985400000000', - chunkHash: '3Q39LzrowGBhqRZvkjDqQNjkfUEYEK6Zis5LUzqvrtFj', - encodedLength: 1837, - encodedMerkleRoot: '2d1EBsn1UspGLYjyFkrzPoawjghZe4fBbWkZfmsPJRbM', - gasLimit: 1000000000000000, - gasUsed: 7599093905353, - heightCreated: 85376002, - heightIncluded: 85376002, - outcomeRoot: 'CUmJsZfPtNYEggezXf6wW7NX2i7Vn9yuPz7RWfVKxR7p', - outgoingReceiptsRoot: '8TG5j9ahcEtGUNREhCEJW3SgHyeCzochf4foYxSU7b8Q', - prevBlockHash: 'H5X25nVZgx43tQSMcF5bRLphWGN92UVYdvaAhcgW4no7', - prevStateRoot: 'EPbgnc5qJFvFGqqAyQQu2SrFcVr6mr3AVbSuXnHvZ1ie', - rentPaid: '0', - shardId: 3, - signature: 'ed25519:RgPmNaXij3pNFdMVi1Ex8WXyQiYr12uUyRk5tuoddJvCTwJXcxQZZLCdy1XqB6uB9imMz9NsXQwT1M993NBMsjS', - txRoot: '8V1iVH9TSzWsPtNVorScHc4ha9ESNqNEG13tZiRSDzk7', - validatorProposals: [], - validatorReward: '0', - }, - receipts: [ - { - predecessorId: 'relay.aurora', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: '+QGPggpehAQsHYCCUgiU5ShUyG+2SwTdHXetVCh23cBAxPSAuQEkGMuv5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGiUDx20tY/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/fZpFXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAGBc4ZUyxxIdG15jLrd25ap7+4mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhaeq/ToAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAADCXWsrHC113TW91as0DqbkM1NT1AAAAAAAAAAAAAAAASYiolrEichjkpob95eq9yr2RVx8AAAAAAAAAAAAAAADJve7TPNAVQeHu0Q+QUZ0sBv4/64ScioLIoNNwZYHzq18jJVWwzwd9vJY1JV4H29H/wOgwyQVM2FJzoCUAB6Nz+98pSh9AfalXBMbThpftEUVyF49fYhEKwmJf', - deposit: '0', - gas: 300000000000000, - methodName: 'submit', - }, - }, - ], - gasPrice: '625040174', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:2WmTnJeWZYKhh6NC3z3xTDKU5sHHAmHF96V6KAB3eHK5', - }, - }, - receiptId: '821S5L8Htxafh2DDuDKtA4qapudN3mRq2AMv2qPeBhpj', - receiverId: 'aurora', - }, - { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '1389731257024010315000' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - signerPublicKey: 'ed25519:HWHJq9M3m232SGpRTXuycdvjPEaaxn9TFN72bnEXnESp', - }, - }, - receiptId: 'CEgnqr5aYdpBErSzjvdtmdqnXdmXjXqe1AnPeamsLcvM', - receiverId: 'f53b45ec59e26a50160026bd4e3d232a6672e0ee812d46cfcd29c0ef44a089f5', - }, - ], - transactions: [ - { - outcome: { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', - outcome: { - executorId: 'relay.aurora', - gasBurnt: 2429696331596, - logs: [], - metadata: { gasProfile: null, version: 1 }, - receiptIds: ['9p28ts6sz8Meg4vu3Fqff5QmfkwFc65C22WgAoKF1ELh'], - status: { SuccessReceiptId: '9p28ts6sz8Meg4vu3Fqff5QmfkwFc65C22WgAoKF1ELh' }, - tokensBurnt: '242969633159600000000', - }, - proof: [ - { direction: 'Right', hash: 'CKbaXt3vrGUUt7Ydw1gjb9by6pbtMooXo7uWJrbWAXXX' }, - { direction: 'Right', hash: '4NXWzpp8uSWuhoAXgsJKCs2eyAVHL3wXxsAWocx1Fs5K' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: null, - }, - transaction: { - actions: [ - { - FunctionCall: { - args: '+QMRgw65o4QELB2Agww1AJSQVQb22oFec8oTVHtF0ZmIZxBLIoC5AqS/zVdxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApRioAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDIwNjdlMDg4OWUyYmJmM2ZjYTI3NmFjOWNiYzdiYjI5OThmNzQzMjM1ZjUwNjU4NDUwNjMyMzQxMDJhMGEzODYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGI2NmMxNTdiYTljMWM0YTAxOWEzOTQ4MjlkMzQyMGQ4YjIxZDg5OTQzZjMzYTdiYTExMDQ0MWFiNDExOGI4NTYzZWNiZTkxM2Q5YTJmZmNhNTNiNGU1NWJjNTFiZDdmNjEyZDQxZDkxNTY4M2MzNGNiZWVhYTg0Yzc0NWI2N2VmNjZlMTM2YjE2NTFkZTEwODk3OWM0YjE4NzFiMjIwMjIyYmI4ZTBkNTgwNmM0ZjFlZjliY2U1OWRlNzI1Y2Y0YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAYTE5ZWJlNmFmZjRiM2MxZGIxZjY2Njc5Nzc1MDc1ZTZkMzY0NGFlYjBiZmYyZmQxMjQzNjg5ZTQ3ZmNjYTk5NzA4NzhlY2E5MzI4ZDQ5YmM1ZGZiYWI0ZDU4N2Y4OGQ5MTkyMTJiY2FjYzY0YzJhNGFmMDUxZmFkZWE4NjdhZDkwMDUzMzY4OWQ1ZDcwNzg5YTQyMjNmMzVkM2JhYzhlNzE0NzY2NDg5NjQ4ODAxMTk1NGRlMDRiZWM0NDM3N2U4hJyKgsegSqdU7My5fwrLI1Mc3JcSJSgvQcmZsI1Chymt8Ydj0gqgXGqO8uaGvpV0jbfOyplT73XLhyC4ON9ekQI+tWB+8go=', - deposit: '0', - gas: 300000000000000, - methodName: 'submit', - }, - }, - ], - hash: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', - nonce: 65788368017229, - publicKey: 'ed25519:FptiMvPBN7QRJwroc2zJtTEAEo4h9CJAdGKQfd2bA3Qm', - receiverId: 'aurora', - signature: - 'ed25519:LehYX21sAyodn5g7MxXPkztx9tQMHQ92gMg2KQYQV4pBKyGidLHz6y2aeLREUFt2ckxrdWNZ6VannAGBsPpiHPu', - signerId: 'relay.aurora', - }, - }, - ], - }, - receiptExecutionOutcomes: [ - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', - outcome: { - executorId: 'relay.aurora', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [ - { direction: 'Left', hash: '3zQuvAtY9UVHq2ws8vvMLmPivCpBPWwDhmTtCHNy1roV' }, - { direction: 'Right', hash: '4NXWzpp8uSWuhoAXgsJKCs2eyAVHL3wXxsAWocx1Fs5K' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '187086049935277727891452' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'relay.aurora', - signerPublicKey: 'ed25519:8j2e8u9t1SoTgMPn5G65ChU5WskpcnemBjwzkAnxDtZq', - }, - }, - receiptId: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', - receiverId: 'relay.aurora', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', - outcome: { - executorId: 'token.sweat', - gasBurnt: 4072736369755, - logs: [ - 'EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_transfer","data":[{"old_owner_id":"7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab","new_owner_id":"reward-optin.sweat","amount":"100000000000000000","memo":"sw:rew:optin:YGRWvgpXK0-7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab"}]}', - ], - metadata: { - gasProfile: [ - { cost: 'BASE', costCategory: 'WASM_HOST_COST', gasUsed: '7413507108' }, - { cost: 'CONTRACT_LOADING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '35445963' }, - { cost: 'CONTRACT_LOADING_BYTES', costCategory: 'WASM_HOST_COST', gasUsed: '44831486250' }, - { cost: 'LOG_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3543313050' }, - { cost: 'LOG_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '4342402239' }, - { cost: 'READ_CACHED_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '280440000000' }, - { cost: 'READ_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '36538084800' }, - { cost: 'READ_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2816787753' }, - { cost: 'READ_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '27688817046' }, - { cost: 'READ_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '48295380' }, - { cost: 'SHA256_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '18163881000' }, - { cost: 'SHA256_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3955245564' }, - { cost: 'STORAGE_READ_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '169070537250' }, - { cost: 'STORAGE_READ_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2259534909' }, - { cost: 'STORAGE_READ_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '572322510' }, - { cost: 'STORAGE_WRITE_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '192590208000' }, - { cost: 'STORAGE_WRITE_EVICTED_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3275965314' }, - { cost: 'STORAGE_WRITE_KEY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '5145249291' }, - { cost: 'STORAGE_WRITE_VALUE_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '3163890978' }, - { cost: 'TOUCHING_TRIE_NODE', costCategory: 'WASM_HOST_COST', gasUsed: '611874325188' }, - { cost: 'UTF8_DECODING_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '3111779061' }, - { cost: 'UTF8_DECODING_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '95929977591' }, - { cost: 'WASM_INSTRUCTION', costCategory: 'WASM_HOST_COST', gasUsed: '56074112424' }, - { cost: 'WRITE_MEMORY_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '33645538332' }, - { cost: 'WRITE_MEMORY_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '1378228632' }, - { cost: 'WRITE_REGISTER_BASE', costCategory: 'WASM_HOST_COST', gasUsed: '34386269832' }, - { cost: 'WRITE_REGISTER_BYTE', costCategory: 'WASM_HOST_COST', gasUsed: '2128875840' }, - ], - version: 1, - }, - receiptIds: ['BXhqz9Hk5eVb5ibaN3uZmNW4cgW6zBerUYpM7Zh19kXe'], - status: { SuccessValue: '' }, - tokensBurnt: '407273636975500000000', - }, - proof: [ - { direction: 'Right', hash: 'Cbwr9BAamScEJV1aMoZ21CULLdjPTpY6QQmfZNAS8cUx' }, - { direction: 'Left', hash: '7x71otoV7zEDfh2v1hYcLD9GNFZkoza1d3uoJUc79GMV' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: { - predecessorId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - receipt: { - Action: { - actions: [ - { - FunctionCall: { - args: 'eyJyZWNlaXZlcl9pZCI6InJld2FyZC1vcHRpbi5zd2VhdCIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAwMCIsIm1lbW8iOiJzdzpyZXc6b3B0aW46WUdSV3ZncFhLMC03YThiYTFiZDgwNDg2Mzg4M2FjZTEwZWQ3NjQ0MWU2YWQyMjM5YWU3OTE3Yjc4Yzg5NzAwYjcwMWY3NWNlMWFiIn0=', - deposit: '1', - gas: 14000000000000, - methodName: 'ft_transfer', - }, - }, - ], - gasPrice: '109272700', - inputDataIds: [], - outputDataReceivers: [], - signerId: '7a8ba1bd804863883ace10ed76441e6ad2239ae7917b78c89700b701f75ce1ab', - signerPublicKey: 'ed25519:9FNEMP92rkuvRVefVkBW38RmbZ648XvQGeWbFYtdC7hk', - }, - }, - receiptId: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', - receiverId: 'token.sweat', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', - outcome: { - executorId: 'olezha4.near', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [ - { direction: 'Left', hash: 'GdEbJpKZ4iqem9VmS5Qbm2CTrt1qFZhfSD6zUv5JaYXT' }, - { direction: 'Left', hash: '7x71otoV7zEDfh2v1hYcLD9GNFZkoza1d3uoJUc79GMV' }, - { direction: 'Right', hash: 'FmBQ954izf84EZ5P4GVvmUfc8T4bGXXqQruyDTtikwo1' }, - ], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13222602662027447938448' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'olezha4.near', - signerPublicKey: 'ed25519:EnLNUDncRuw4AYLcGmi1Hr2YQ1DLu12VutsubZ6k8c2F', - }, - }, - receiptId: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', - receiverId: 'olezha4.near', - }, - }, - { - executionOutcome: { - blockHash: 'A5Jb7zz4VPuQhBFo7rXn8UoAPUSokjpiV9deSoEz5ijM', - id: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', - outcome: { - executorId: 'marthacecilia.near', - gasBurnt: 223182562500, - logs: [], - metadata: { gasProfile: [], version: 1 }, - receiptIds: [], - status: { SuccessValue: '' }, - tokensBurnt: '0', - }, - proof: [{ direction: 'Left', hash: '6FWhYXFGBgzSPDuBCFrfSkdAqSvsMHPbnCJ2Q3UsmUV6' }], - }, - receipt: { - predecessorId: 'system', - receipt: { - Action: { - actions: [{ Transfer: { deposit: '13239855304236542651168' } }], - gasPrice: '0', - inputDataIds: [], - outputDataReceivers: [], - signerId: 'marthacecilia.near', - signerPublicKey: 'ed25519:8W28RYFfXztNA7ENP4VTaitsqEjSbABQJDqELwbwXswq', - }, - }, - receiptId: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', - receiverId: 'marthacecilia.near', - }, - }, - ], - shardId: 3, - stateChanges: [ - { - cause: { receiptHash: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', type: 'receipt_processing' }, - change: { - accountId: 'marthacecilia.near', - amount: '376417715605581247237588', - codeHash: '7DcAdMUT1MjaZ9s7zhXdyxKvQsRsSfnmBGdzeZaquqDE', - locked: '0', - storagePaidAt: 0, - storageUsage: 13722, - }, - type: 'account_update', - }, - { - cause: { receiptHash: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', type: 'receipt_processing' }, - change: { - accountId: 'olezha4.near', - amount: '147297020835776249333187456', - codeHash: 'E8jZ1giWcVrps8PcV75ATauu6gFRkcwjNtKp7NKmipZG', - locked: '0', - storagePaidAt: 0, - storageUsage: 25029, - }, - type: 'account_update', - }, - { - cause: { txHash: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', type: 'transaction_processing' }, - change: { - accountId: 'relay.aurora', - amount: '2493412853875426176695038138', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 149094, - }, - type: 'account_update', - }, - { - cause: { receiptHash: 'CdUSBwV29D1P1qvxCwnbfNsTsdxfdRY6PxezsSWRFyqN', type: 'receipt_processing' }, - change: { - accountId: 'relay.aurora', - amount: '2493599939925361454422929590', - codeHash: '11111111111111111111111111111111', - locked: '0', - storagePaidAt: 0, - storageUsage: 149094, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - amount: '32545059778997347633373318383', - codeHash: 'FMy4MTxATGtfxqTg5PZfGhQpRWej9Ppbttwo7FWF13wA', - locked: '0', - storagePaidAt: 0, - storageUsage: 1648821628, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'action_receipt_gas_reward' }, - change: { - accountId: 'token.sweat', - amount: '32545059828330070072473318383', - codeHash: 'FMy4MTxATGtfxqTg5PZfGhQpRWej9Ppbttwo7FWF13wA', - locked: '0', - storagePaidAt: 0, - storageUsage: 1648821628, - }, - type: 'account_update', - }, - { - cause: { receiptHash: '3R2wjnktLwBKaceGiPetmShVAyHT2LuoQZMdNg6oWMwK', type: 'receipt_processing' }, - change: { - accessKey: { - nonce: 85297952000430, - permission: { - FunctionCall: { - allowance: '117616350729529600000000', - methodNames: [], - receiverId: 'app.nearcrowd.near', - }, - }, - }, - accountId: 'marthacecilia.near', - publicKey: 'ed25519:8W28RYFfXztNA7ENP4VTaitsqEjSbABQJDqELwbwXswq', - }, - type: 'access_key_update', - }, - { - cause: { receiptHash: 'BpZGWvbmx8sAMRsrhWyBnC5QHA9mFwist7orTceJTRvu', type: 'receipt_processing' }, - change: { - accessKey: { - nonce: 84682948002117, - permission: { - FunctionCall: { - allowance: '330678248075353400000000', - methodNames: [], - receiverId: 'app.nearcrowd.near', - }, - }, - }, - accountId: 'olezha4.near', - publicKey: 'ed25519:EnLNUDncRuw4AYLcGmi1Hr2YQ1DLu12VutsubZ6k8c2F', - }, - type: 'access_key_update', - }, - { - cause: { txHash: 'AMdmdjfHvKX6vv1fNEyCCio2jmSvepxSetxQFhgj826f', type: 'transaction_processing' }, - change: { - accessKey: { nonce: 65788368017229, permission: 'FullAccess' }, - accountId: 'relay.aurora', - publicKey: 'ed25519:FptiMvPBN7QRJwroc2zJtTEAEo4h9CJAdGKQfd2bA3Qm', - }, - type: 'access_key_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - keyBase64: 'U1RBVEU=', - valueBase64: - 'AgAAAHNpAQAAAAAAAAACAAAAc2UBAAAAdAEIAAAALnUuc3dlYXQUQEmH9+nGUg8Ez0cAAAAAWgAAAAAAAADiIbWN+QEAAA==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - keyBase64: 'dAAEzAvKN2Ekj8gSsSzscbcviXEnrSF9E4Nn8XlqPYFyaw==', - valueBase64: '6Hk2larECkgAAAAAAAAAAA==', - }, - type: 'data_update', - }, - { - cause: { receiptHash: '7Q29UAwrFbeMMM6niPSuMrqkp4Y21FYqJ1SXPvr9oZYU', type: 'receipt_processing' }, - change: { - accountId: 'token.sweat', - keyBase64: 'dADCUiigKPOTAl1jqrFvCFMV6YPDQuu8kGehwLHx0CgpIw==', - valueBase64: 'AAAu48ylkU6WIwAAAAAAAA==', - }, - type: 'data_update', - }, - ], - }, - ], -}; diff --git a/frontend/src/utils/indexerRunner.js b/frontend/src/utils/indexerRunner.js index c8cd4d9a9..7619f8b05 100644 --- a/frontend/src/utils/indexerRunner.js +++ b/frontend/src/utils/indexerRunner.js @@ -194,8 +194,8 @@ export default class IndexerRunner { blockHeight, `Mocking: Update of objects that match the specified fields with the following values in table ${tableDefinitionNames.originalTableName} on schema ${schemaName}`, { - matchingFields: whereObj.map((col) => tableDefinitionNames.originalColumnNames.get(col) ?? col), - fieldsToUpdate: updateObj.map((col) => tableDefinitionNames.originalColumnNames.get(col) ?? col), + matchingFields: whereObj, + fieldsToUpdate: updateObj, }, ), diff --git a/frontend/src/utils/resize.js b/frontend/src/utils/resize.js deleted file mode 100644 index 84356477d..000000000 --- a/frontend/src/utils/resize.js +++ /dev/null @@ -1,236 +0,0 @@ -import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; - -import debounce from './debounce'; - -export function useDragResize({ - defaultSizeRelation = DEFAULT_FLEX, - direction, - initiallyHidden, - onHiddenElementChange, - sizeThresholdFirst = 100, - sizeThresholdSecond = 100, - storageKey, -}) { - const storage = null; - - const store = useMemo( - () => - debounce(500, (value) => { - if (storage && storageKey) { - storage.set(storageKey, value); - } - }), - [storage, storageKey], - ); - - const [hiddenElement, setHiddenElement] = useState(() => { - const storedValue = storage && storageKey ? storage.get(storageKey) : null; - if (storedValue === HIDE_FIRST || initiallyHidden === 'first') { - return 'first'; - } - if (storedValue === HIDE_SECOND || initiallyHidden === 'second') { - return 'second'; - } - return null; - }); - - const setHiddenElementWithCallback = useCallback( - (element) => { - if (element !== hiddenElement) { - setHiddenElement(element); - onHiddenElementChange?.(element); - } - }, - [hiddenElement, onHiddenElementChange], - ); - - const firstRef = useRef(null); - const dragBarRef = useRef(null); - const secondRef = useRef(null); - - const defaultFlexRef = useRef(`${defaultSizeRelation}`); - - /** - * Set initial flex values - */ - useLayoutEffect(() => { - const storedValue = - storage && storageKey ? storage.get(storageKey) || defaultFlexRef.current : defaultFlexRef.current; - const flexDirection = direction === 'horizontal' ? 'row' : 'column'; - - if (firstRef.current) { - firstRef.current.style.display = 'flex'; - firstRef.current.style.flexDirection = flexDirection; - firstRef.current.style.flex = - storedValue === HIDE_FIRST || storedValue === HIDE_SECOND ? defaultFlexRef.current : storedValue; - } - - if (secondRef.current) { - secondRef.current.style.display = 'flex'; - secondRef.current.style.flexDirection = flexDirection; - secondRef.current.style.flex = '1'; - } - - if (dragBarRef.current) { - dragBarRef.current.style.display = 'flex'; - dragBarRef.current.style.flexDirection = flexDirection; - } - }, [direction, storage, storageKey]); - - const hide = useCallback((resizableElement) => { - const element = resizableElement === 'first' ? firstRef.current : secondRef.current; - if (!element) { - return; - } - - // We hide elements off screen because of codemirror. If the page is loaded - // and the codemirror container would have zero width, the layout isn't - // instant pretty. By always giving the editor some width we avoid any - // layout shifts when the editor reappears. - element.style.left = '-1000px'; - element.style.position = 'absolute'; - element.style.opacity = '0'; - element.style.height = '500px'; - element.style.width = '500px'; - - // Make sure that the flex value of the first item is at least equal to one - // so that the entire space of the parent element is filled up - if (firstRef.current) { - const flex = parseFloat(firstRef.current.style.flex); - if (!Number.isFinite(flex) || flex < 1) { - firstRef.current.style.flex = '1'; - } - } - }, []); - - const show = useCallback( - (resizableElement) => { - const element = resizableElement === 'first' ? firstRef.current : secondRef.current; - if (!element) { - return; - } - - element.style.width = ''; - element.style.height = ''; - element.style.opacity = ''; - element.style.position = ''; - element.style.left = ''; - - if (firstRef.current && storage && storageKey) { - const storedValue = storage?.get(storageKey); - if (storedValue !== HIDE_FIRST && storedValue !== HIDE_SECOND) { - firstRef.current.style.flex = storedValue || defaultFlexRef.current; - } - } - }, - [storage, storageKey], - ); - - /** - * Hide and show items when state changes - */ - useLayoutEffect(() => { - if (hiddenElement === 'first') { - hide('first'); - } else { - show('first'); - } - if (hiddenElement === 'second') { - hide('second'); - } else { - show('second'); - } - }, [hiddenElement, hide, show]); - - useEffect(() => { - if (!dragBarRef.current || !firstRef.current || !secondRef.current) { - return; - } - const dragBarContainer = dragBarRef.current; - const firstContainer = firstRef.current; - const wrapper = firstContainer.parentElement; - - const eventProperty = direction === 'horizontal' ? 'clientX' : 'clientY'; - const rectProperty = direction === 'horizontal' ? 'left' : 'top'; - const adjacentRectProperty = direction === 'horizontal' ? 'right' : 'bottom'; - const sizeProperty = direction === 'horizontal' ? 'clientWidth' : 'clientHeight'; - - function handleMouseDown(downEvent) { - downEvent.preventDefault(); - - // Distance between the start of the drag bar and the exact point where - // the user clicked on the drag bar. - const offset = downEvent[eventProperty] - dragBarContainer.getBoundingClientRect()[rectProperty]; - - function handleMouseMove(moveEvent) { - if (moveEvent.buttons === 0) { - return handleMouseUp(); - } - - const firstSize = moveEvent[eventProperty] - wrapper.getBoundingClientRect()[rectProperty] - offset; - const secondSize = - wrapper.getBoundingClientRect()[adjacentRectProperty] - - moveEvent[eventProperty] + - offset - - dragBarContainer[sizeProperty]; - - if (firstSize < sizeThresholdFirst) { - // Hide the first display - setHiddenElementWithCallback('first'); - store(HIDE_FIRST); - } else if (secondSize < sizeThresholdSecond) { - // Hide the second display - setHiddenElementWithCallback('second'); - store(HIDE_SECOND); - } else { - // Show both and adjust the flex value of the first one (the flex - // value for the second one is always `1`) - setHiddenElementWithCallback(null); - const newFlex = `${firstSize / secondSize}`; - firstContainer.style.flex = newFlex; - store(newFlex); - } - } - - function handleMouseUp() { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); - } - - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); - } - - dragBarContainer.addEventListener('mousedown', handleMouseDown); - - function reset() { - if (firstRef.current) { - firstRef.current.style.flex = defaultFlexRef.current; - } - store(defaultFlexRef.current); - setHiddenElementWithCallback(null); - } - - dragBarContainer.addEventListener('dblclick', reset); - - return () => { - dragBarContainer.removeEventListener('mousedown', handleMouseDown); - dragBarContainer.removeEventListener('dblclick', reset); - }; - }, [direction, setHiddenElementWithCallback, sizeThresholdFirst, sizeThresholdSecond, store]); - - return useMemo( - () => ({ - dragBarRef, - hiddenElement, - firstRef, - setHiddenElement, - secondRef, - }), - [hiddenElement, setHiddenElement], - ); -} - -const DEFAULT_FLEX = 1; -const HIDE_FIRST = 'hide-first'; -const HIDE_SECOND = 'hide-second'; diff --git a/frontend/widgets/src/QueryApi.Dashboard.jsx b/frontend/widgets/src/QueryApi.Dashboard.jsx index 73b593bac..809cd242e 100644 --- a/frontend/widgets/src/QueryApi.Dashboard.jsx +++ b/frontend/widgets/src/QueryApi.Dashboard.jsx @@ -2,6 +2,14 @@ const Wrapper = styled.div` margin-top: calc(var(--body-top-padding) * -1); `; +const Banner = styled.div` + background-color: #f8d7da; /* Light red background color */ + color: #721c24; /* Dark red text color */ + padding: 5px; /* Padding around the text */ + text-align: center; /* Center the text */ + border-radius: 4px; /* Rounded corners */ +`; + const Main = styled.div` display: block; `; @@ -63,6 +71,10 @@ const selectIndexerPage = (viewName) => { return ( + +

QueryApi is being decommissioned by Dec 9, 2024. New Indexer creation has been disabled. Please refer to documentation for more details.

+
+ {IS_DEV && ( -
{activeTab === 'launchpad' && IS_DEV && (
diff --git a/frontend/widgets/src/QueryApi.Launchpad.jsx b/frontend/widgets/src/QueryApi.Launchpad.jsx index d0ac5dcbc..503378896 100644 --- a/frontend/widgets/src/QueryApi.Launchpad.jsx +++ b/frontend/widgets/src/QueryApi.Launchpad.jsx @@ -14,11 +14,12 @@ const NoQueryText = styled.p` font-size: 16px; font-family: 'Mona Sans', sans-serif; color: #A1A09A; + width: 80%; text-align: center; `; const NoQuerySVG = styled.svg` - height: 100px; + height: 90px; width: 100%; color: #A1A09A; `; @@ -28,7 +29,7 @@ const CheckboxContainer = styled.div` `; const CheckboxLabel = styled.label` - font-size: 12px; + font-size: 14px; display: flex; align-items: center; cursor: pointer; @@ -53,6 +54,10 @@ const Checkbox = styled.input` vertical-align: middle; margin-right: 7.2px; outline: none; + + &:checked { + background-color: #8279E2; + } `; // TOP HALF @@ -86,7 +91,7 @@ const Subheadline = styled.p` font-family: 'Mona Sans', sans-serif; font-weight: 400; font-size: 16px; - line-height: 18.2px; + line-height: 24px; color: #717069; letter-spacing: 1.5%; `; @@ -101,25 +106,25 @@ const Container = styled.div` const HeadlineContainer = styled.div` width: 364px; - height: 193px; display: flex; flex-direction: column; justify-content: center; align-items: center; margin-right: 80px; /* Gap between HeadlineContainer and WidgetContainer */ + margin-top: 24px; //combine margin `; const WidgetContainer = styled.div` width: 301px; - height: 365px; display: flex; flex-direction: column; justify-content: center; align-items: center; box-shadow: 0 8.2px 19.92px 0 rgba(0, 0, 0, 0.1), 0 2.34px 2.34px 0 rgba(0, 0, 0, 0.15); - margin-top: 183px; /* Gap between WidgetContainer and HeadlineContainer */ + margin-top: 140px; /* Gap between WidgetContainer and HeadlineContainer */ background: #fff; border-radius: 10px; + padding: 16px 0 28px; `; const SubContainer = styled.div` @@ -128,7 +133,7 @@ const SubContainer = styled.div` `; const SubContainerTitle = styled.h2` - font-family: 'Product Sans', sans-serif; + font-family: 'Mona Sans', sans-serif; font-weight: 700; font-size: 14px; line-height: 14.06px; @@ -154,7 +159,7 @@ const MetadataIcon = styled.span` display: flex; align-items: center; justify-content: center; - font-size: 11px; + font-size: 12px; font-weight: normal; width: 23px; height: 17px; @@ -207,7 +212,7 @@ scrollbar-color: #888 #f1f1f1; `; const GenerateButton = styled.button` - margin-top: 16px; + margin-top: 24px; width: 100%; background-color: #37CD83; border: none; @@ -237,6 +242,7 @@ const InputWrapper = styled.div` border-radius: 6px; padding: 0; overflow: hidden; + margin-top: 24px; `; const StyledInput = styled.input` @@ -363,7 +369,7 @@ useEffect(() => { setCheckboxEvents(initializeCheckboxState(eventsData, 'event_name')); }, [methodsData, eventsData]); -const generateMethods = () => { +const generateProperties = () => { const filterData = (data, checkboxState, keyName) => { return data .map(item => { @@ -457,7 +463,7 @@ const handleFetchCheckboxData = async () => { }; const toggleAllSelection = (action) => { - const isSelectAll = action === 'select_all'; + const isSelectAll = !selectAllMethods; const isMethodsTab = tab === 'methods_tab'; const isEventsTab = tab === 'events_tab'; @@ -626,20 +632,11 @@ return ( toggleAllSelection('select_all')} + onChange={() => toggleAllSelection(selectAllMethods)} checked={selectAllMethods} /> Select All - - toggleAllSelection('unselect_all')} - checked={!selectAllMethods} - /> - Unselect All - {methodsData.map((item, index) => ( @@ -680,20 +677,11 @@ return ( toggleAllSelection('select_all')} + onChange={() => toggleAllSelection(selectAllEvents)} checked={selectAllEvents} /> Select All Events - - toggleAllSelection('unselect_all')} - checked={!selectAllEvents} - /> - Unselect All Events - {eventsData.map((item, index) => ( @@ -731,7 +719,7 @@ return ( )} - Generate + Generate diff --git a/hasura/Dockerfile b/hasura/Dockerfile deleted file mode 100644 index a3cb05d42..000000000 --- a/hasura/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM hasura/graphql-engine:latest.cli-migrations-v3 - -ARG DATABASE_URL -ARG PORT - -COPY migrations /hasura-migrations -COPY metadata /hasura-metadata - -CMD graphql-engine serve diff --git a/hasura/config.yaml b/hasura/config.yaml deleted file mode 100644 index d13faa054..000000000 --- a/hasura/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -version: 3 -endpoint: http://localhost:8080 -admin_secret: myadminsecretkey -metadata_directory: metadata -actions: - kind: synchronous - handler_webhook_baseurl: http://localhost:3000 diff --git a/hasura/metadata/actions.graphql b/hasura/metadata/actions.graphql deleted file mode 100644 index e69de29bb..000000000 diff --git a/hasura/metadata/actions.yaml b/hasura/metadata/actions.yaml deleted file mode 100644 index 1edb4c2ff..000000000 --- a/hasura/metadata/actions.yaml +++ /dev/null @@ -1,6 +0,0 @@ -actions: [] -custom_types: - enums: [] - input_objects: [] - objects: [] - scalars: [] diff --git a/hasura/metadata/allow_list.yaml b/hasura/metadata/allow_list.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/allow_list.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/cron_triggers.yaml b/hasura/metadata/cron_triggers.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/cron_triggers.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/databases/databases.yaml b/hasura/metadata/databases/databases.yaml deleted file mode 100644 index 65a11b202..000000000 --- a/hasura/metadata/databases/databases.yaml +++ /dev/null @@ -1,14 +0,0 @@ -- name: default - kind: postgres - configuration: - connection_info: - database_url: - from_env: HASURA_GRAPHQL_DATABASE_URL - isolation_level: read-committed - pool_settings: - connection_lifetime: 600 - idle_timeout: 180 - max_connections: 50 - retries: 1 - use_prepared_statements: true - tables: "!include default/tables/tables.yaml" diff --git a/hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml b/hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml deleted file mode 100644 index ff2c158f4..000000000 --- a/hasura/metadata/databases/default/tables/public_indexer_log_entries.yaml +++ /dev/null @@ -1,25 +0,0 @@ -table: - name: indexer_log_entries - schema: public -insert_permissions: -- permission: - backend_only: true - check: {} - columns: - - block_height - - function_name - - message - - timestamp - - id - role: append -select_permissions: -- permission: - columns: - - block_height - - function_name - - message - - timestamp - - id - allow_aggregations: true - filter: {} - role: append diff --git a/hasura/metadata/databases/default/tables/public_indexer_state.yaml b/hasura/metadata/databases/default/tables/public_indexer_state.yaml deleted file mode 100644 index 2bcc6c9b9..000000000 --- a/hasura/metadata/databases/default/tables/public_indexer_state.yaml +++ /dev/null @@ -1,34 +0,0 @@ -table: - name: indexer_state - schema: public -insert_permissions: -- permission: - backend_only: true - check: {} - columns: - - function_name - - current_block_height - - current_historical_block_height - - status - role: append -select_permissions: -- permission: - columns: - - function_name - - current_block_height - - current_historical_block_height - - status - allow_aggregations: true - filter: {} - role: append -update_permissions: -- permission: - backend_only: true - check: {} - columns: - - function_name - - current_block_height - - current_historical_block_height - - status - filter: {} - role: append diff --git a/hasura/metadata/databases/default/tables/tables.yaml b/hasura/metadata/databases/default/tables/tables.yaml deleted file mode 100644 index fb74b4277..000000000 --- a/hasura/metadata/databases/default/tables/tables.yaml +++ /dev/null @@ -1,2 +0,0 @@ -- "!include public_indexer_log_entries.yaml" -- "!include public_indexer_state.yaml" diff --git a/hasura/metadata/query_collections.yaml b/hasura/metadata/query_collections.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/query_collections.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/remote_schemas.yaml b/hasura/metadata/remote_schemas.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/remote_schemas.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/rest_endpoints.yaml b/hasura/metadata/rest_endpoints.yaml deleted file mode 100644 index fe51488c7..000000000 --- a/hasura/metadata/rest_endpoints.yaml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/hasura/metadata/version.yaml b/hasura/metadata/version.yaml deleted file mode 100644 index 0a70affa4..000000000 --- a/hasura/metadata/version.yaml +++ /dev/null @@ -1 +0,0 @@ -version: 3 diff --git a/hasura/migrations/default/1691364619300_init/down.sql b/hasura/migrations/default/1691364619300_init/down.sql deleted file mode 100644 index 9ba2f7739..000000000 --- a/hasura/migrations/default/1691364619300_init/down.sql +++ /dev/null @@ -1,2 +0,0 @@ -DROP TABLE public.indexer_log_entries; -DROP TABLE public.indexer_state; diff --git a/hasura/migrations/default/1691364619300_init/up.sql b/hasura/migrations/default/1691364619300_init/up.sql deleted file mode 100644 index 4c1dad71f..000000000 --- a/hasura/migrations/default/1691364619300_init/up.sql +++ /dev/null @@ -1,25 +0,0 @@ -SET check_function_bodies = false; - -CREATE TABLE public.indexer_log_entries ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - function_name text NOT NULL, - block_height numeric NOT NULL, - "timestamp" timestamp without time zone DEFAULT CURRENT_TIMESTAMP, - message text -); - -CREATE TABLE public.indexer_state ( - function_name character varying NOT NULL, - current_block_height numeric(21,0) NOT NULL, - status text, - current_historical_block_height numeric(21,0) -); - -ALTER TABLE ONLY public.indexer_log_entries - ADD CONSTRAINT indexer_log_entries_pkey PRIMARY KEY (id); - -ALTER TABLE ONLY public.indexer_state - ADD CONSTRAINT indexer_state_pkey PRIMARY KEY (function_name); - -CREATE INDEX idx_function_name ON indexer_log_entries(function_name); -CREATE INDEX idx_timestamp ON indexer_log_entries("timestamp"); diff --git a/runner/.DS_Store b/runner/.DS_Store deleted file mode 100644 index 5758fbfd7..000000000 Binary files a/runner/.DS_Store and /dev/null differ diff --git a/runner/src/dml-handler/index.ts b/runner/src/dml-handler/index.ts deleted file mode 100644 index 8beb5a70c..000000000 --- a/runner/src/dml-handler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './dml-handler'; diff --git a/runner/src/indexer-config/index.ts b/runner/src/indexer-config/index.ts index 1131822dd..a0beb66d8 100644 --- a/runner/src/indexer-config/index.ts +++ b/runner/src/indexer-config/index.ts @@ -1 +1,2 @@ export { default } from './indexer-config'; +export { ProvisioningConfig, LocalIndexerConfig } from './indexer-config'; diff --git a/runner/src/indexer-config/indexer-config.ts b/runner/src/indexer-config/indexer-config.ts index f975f4845..04b4b136f 100644 --- a/runner/src/indexer-config/indexer-config.ts +++ b/runner/src/indexer-config/indexer-config.ts @@ -17,7 +17,8 @@ export class ProvisioningConfig extends BaseConfig { constructor ( public readonly accountId: string, public readonly functionName: string, - public readonly schema: string + public readonly schema: string, + public readonly logLevel: LogLevel = LogLevel.INFO ) { super(accountId, functionName); } @@ -101,7 +102,7 @@ export default class IndexerConfig extends ProvisioningConfig { public readonly schema: string, public readonly logLevel: LogLevel ) { - super(accountId, functionName, schema); + super(accountId, functionName, schema, logLevel); const hash = crypto.createHash('sha256'); hash.update(`${accountId}/${functionName}`); this.executorId = hash.digest('hex'); diff --git a/runner/src/indexer-meta/indexer-meta.ts b/runner/src/indexer-meta/indexer-meta.ts index f0da10b98..d09b41390 100644 --- a/runner/src/indexer-meta/indexer-meta.ts +++ b/runner/src/indexer-meta/indexer-meta.ts @@ -4,7 +4,7 @@ import PgClient, { type PostgresConnectionParams } from '../pg-client'; import { trace } from '@opentelemetry/api'; import type LogEntry from './log-entry'; import { LogLevel } from './log-entry'; -import type IndexerConfig from '../indexer-config'; +import { type ProvisioningConfig } from '../indexer-config/indexer-config'; export enum IndexerStatus { PROVISIONING = 'PROVISIONING', @@ -29,11 +29,11 @@ export default class IndexerMeta implements IndexerMetaInterface { tracer = trace.getTracer('queryapi-runner-indexer-logger'); private readonly pgClient: PgClient; - private readonly indexerConfig: IndexerConfig; + private readonly indexerConfig: ProvisioningConfig; private readonly logInsertQueryTemplate: string = 'INSERT INTO %I.sys_logs (block_height, date, timestamp, type, level, message) VALUES %L'; constructor ( - indexerConfig: IndexerConfig, + indexerConfig: ProvisioningConfig, databaseConnectionParameters: PostgresConnectionParams, pgClientInstance: PgClient | undefined = undefined, ) { diff --git a/runner/src/indexer/__snapshots__/indexer.test.ts.snap b/runner/src/indexer/__snapshots__/indexer.test.ts.snap deleted file mode 100644 index bca20ca2d..000000000 --- a/runner/src/indexer/__snapshots__/indexer.test.ts.snap +++ /dev/null @@ -1,72 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Indexer unit tests Indexer.buildContext() can fetch from the near social api 1`] = ` -[ - [ - "https://api.near.social/index", - { - "body": "{"action":"post","key":"main","options":{"limit":1,"order":"desc"}}", - "headers": { - "Content-Type": "application/json", - }, - "method": "POST", - }, - ], -] -`; - -exports[`Indexer unit tests Indexer.execute() allows imperative execution of GraphQL operations 1`] = ` -[ - [ - "mock-hasura-endpoint/v1/graphql", - { - "body": "{"query":"\\n query {\\n posts(where: { id: { _eq: 1 } }) {\\n id\\n }\\n }\\n "}", - "headers": { - "Content-Type": "application/json", - "X-Hasura-Admin-Secret": "mock-hasura-secret", - "X-Hasura-Role": "buildnear_testnet", - "X-Hasura-Use-Backend-Only-Permissions": "true", - }, - "method": "POST", - }, - ], -] -`; - -exports[`Indexer unit tests Indexer.execute() catches errors 1`] = `[]`; - -exports[`Indexer unit tests Indexer.execute() should execute all functions against the current block 1`] = ` -[ - [ - "mock-hasura-endpoint/v1/graphql", - { - "body": "{"query":"mutation { set(functionName: \\"buildnear.testnet/test\\", key: \\"height\\", data: \\"456\\")}"}", - "headers": { - "Content-Type": "application/json", - "X-Hasura-Admin-Secret": "mock-hasura-secret", - "X-Hasura-Role": "buildnear_testnet", - "X-Hasura-Use-Backend-Only-Permissions": "true", - }, - "method": "POST", - }, - ], -] -`; - -exports[`Indexer unit tests Indexer.execute() supplies the required role to the GraphQL endpoint 1`] = ` -[ - [ - "mock-hasura-endpoint/v1/graphql", - { - "body": "{"query":"mutation { set(functionName: \\"buildnear.testnet/test\\", key: \\"height\\", data: \\"82699904\\")}"}", - "headers": { - "Content-Type": "application/json", - "X-Hasura-Admin-Secret": "mock-hasura-secret", - "X-Hasura-Role": "morgs_near", - "X-Hasura-Use-Backend-Only-Permissions": "true", - }, - "method": "POST", - }, - ], -] -`; diff --git a/runner/src/indexer/context-builder/__snapshots__/context-builder.test.ts.snap b/runner/src/indexer/context-builder/__snapshots__/context-builder.test.ts.snap new file mode 100644 index 000000000..05235ed9e --- /dev/null +++ b/runner/src/indexer/context-builder/__snapshots__/context-builder.test.ts.snap @@ -0,0 +1,158 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ContextBuilder unit tests Context object social api can fetch from the near social api 1`] = ` +[ + [ + "https://api.near.social/index", + { + "body": "{"action":"post","key":"main","options":{"limit":1,"order":"desc"}}", + "headers": { + "Content-Type": "application/json", + }, + "method": "POST", + }, + ], +] +`; + +exports[`ContextBuilder unit tests ContextBuilder adds CRUD operations for table 1`] = ` +{ + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], +} +`; + +exports[`ContextBuilder unit tests ContextBuilder can parse various schemas 1`] = ` +{ + "Posts": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, +} +`; + +exports[`ContextBuilder unit tests ContextBuilder can parse various schemas 2`] = ` +{ + "Comments": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "PostLikes": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "Posts": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, +} +`; + +exports[`ContextBuilder unit tests ContextBuilder can parse various schemas 3`] = ` +{ + "CommentsTable": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "Posts": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, +} +`; + +exports[`ContextBuilder unit tests ContextBuilder can parse various schemas 4`] = ` +{ + "AnotherTable": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "Comments": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "ComposerQuest": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "ContractorQuest": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "CreatorQuest": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "MyTable1": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "PostLikes": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "Posts": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "ThirdTable": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, + "YetAnotherTable": { + "delete": [Function], + "insert": [Function], + "select": [Function], + "update": [Function], + "upsert": [Function], + }, +} +`; diff --git a/runner/src/indexer/context-builder/context-builder.test.ts b/runner/src/indexer/context-builder/context-builder.test.ts new file mode 100644 index 000000000..f68093660 --- /dev/null +++ b/runner/src/indexer/context-builder/context-builder.test.ts @@ -0,0 +1,471 @@ +import type fetch from 'node-fetch'; + +import type { DmlHandler } from '../dml-handler'; +import IndexerConfig from '../../indexer-config'; +import { LogLevel } from '../../indexer-meta/log-entry'; +import ContextBuilder from './context-builder'; + +describe('ContextBuilder unit tests', () => { + const MOCK_CONFIG = { + hasuraEndpoint: 'mock-hasura-endpoint', + hasuraAdminSecret: 'mock-hasura-secret', + }; + + const SIMPLE_SCHEMA = `CREATE TABLE + "posts" ( + "id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "accounts_liked" JSONB NOT NULL DEFAULT '[]', + "last_comment_timestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + );`; + + const SOCIAL_SCHEMA = ` + CREATE TABLE + "posts" ( + "id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "accounts_liked" JSONB NOT NULL DEFAULT '[]', + "last_comment_timestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "comments" ( + "id" SERIAL NOT NULL, + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "post_likes" ( + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0), + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") + );`; + + const CASE_SENSITIVE_SCHEMA = ` + CREATE TABLE + Posts ( + "id" SERIAL NOT NULL, + "AccountId" VARCHAR NOT NULL, + BlockHeight DECIMAL(58, 0) NOT NULL, + "receiptId" VARCHAR NOT NULL, + content TEXT NOT NULL, + block_Timestamp DECIMAL(20, 0) NOT NULL, + "Accounts_Liked" JSONB NOT NULL DEFAULT '[]', + "LastCommentTimestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "CommentsTable" ( + "id" SERIAL NOT NULL, + PostId SERIAL NOT NULL, + "accountId" VARCHAR NOT NULL, + blockHeight DECIMAL(58, 0) NOT NULL, + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") + );`; + + const STRESS_TEST_SCHEMA = ` + CREATE TABLE creator_quest ( + account_id VARCHAR PRIMARY KEY, + num_components_created INTEGER NOT NULL DEFAULT 0, + completed BOOLEAN NOT NULL DEFAULT FALSE + ); + + CREATE TABLE + composer_quest ( + account_id VARCHAR PRIMARY KEY, + num_widgets_composed INTEGER NOT NULL DEFAULT 0, + completed BOOLEAN NOT NULL DEFAULT FALSE + ); + + CREATE TABLE + "contractor - quest" ( + account_id VARCHAR PRIMARY KEY, + num_contracts_deployed INTEGER NOT NULL DEFAULT 0, + completed BOOLEAN NOT NULL DEFAULT FALSE + ); + + CREATE TABLE + "posts" ( + "id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "accounts_liked" JSONB NOT NULL DEFAULT '[]', + "last_comment_timestamp" DECIMAL(20, 0), + CONSTRAINT "posts_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "comments" ( + "id" SERIAL NOT NULL, + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0) NOT NULL, + "content" TEXT NOT NULL, + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") + ); + + CREATE TABLE + "post_likes" ( + "post_id" SERIAL NOT NULL, + "account_id" VARCHAR NOT NULL, + "block_height" DECIMAL(58, 0), + "block_timestamp" DECIMAL(20, 0) NOT NULL, + "receipt_id" VARCHAR NOT NULL, + CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") + ); + + CREATE UNIQUE INDEX "posts_account_id_block_height_key" ON "posts" ("account_id" ASC, "block_height" ASC); + + CREATE UNIQUE INDEX "comments_post_id_account_id_block_height_key" ON "comments" ( + "post_id" ASC, + "account_id" ASC, + "block_height" ASC + ); + + CREATE INDEX + "posts_last_comment_timestamp_idx" ON "posts" ("last_comment_timestamp" DESC); + + ALTER TABLE + "comments" + ADD + CONSTRAINT "comments_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION; + + ALTER TABLE + "post_likes" + ADD + CONSTRAINT "post_likes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE CASCADE ON UPDATE NO ACTION; + + CREATE TABLE IF NOT EXISTS + "My Table1" (id serial PRIMARY KEY); + + CREATE TABLE + "Another-Table" (id serial PRIMARY KEY); + + CREATE TABLE + IF NOT EXISTS + "Third-Table" (id serial PRIMARY KEY); + + CREATE TABLE + yet_another_table (id serial PRIMARY KEY); + `; + + const SIMPLE_REDIS_STREAM = 'test:stream'; + const SIMPLE_ACCOUNT_ID = 'morgs.near'; + const SIMPLE_FUNCTION_NAME = 'test_indexer'; + const SIMPLE_CODE = 'const a = 1;'; + const SIMPLE_SCHEMA_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SIMPLE_SCHEMA, LogLevel.INFO); + const SIMPLE_SOCIAL_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SOCIAL_SCHEMA, LogLevel.INFO); + const CASE_SENSITIVE_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, CASE_SENSITIVE_SCHEMA, LogLevel.INFO); + const STRESS_TEST_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, STRESS_TEST_SCHEMA, LogLevel.INFO); + + const genericMockFetch = jest.fn() + .mockResolvedValue({ + status: 200, + json: async () => ({ + data: 'mock', + }), + }) as unknown as typeof fetch; + + const genericMockDmlHandler = { + insert: jest.fn().mockReturnValue([]), + select: jest.fn().mockReturnValue([]), + update: jest.fn().mockReturnValue([]), + upsert: jest.fn().mockReturnValue([]), + delete: jest.fn().mockReturnValue([]), + } as unknown as DmlHandler; + + test('ContextBuilder can parse various schemas', () => { + const simpleContextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + const socialContextBuilder = new ContextBuilder( + SIMPLE_SOCIAL_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + const caseSensitiveContextBuilder = new ContextBuilder( + CASE_SENSITIVE_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + const stressTestContextBuilder = new ContextBuilder( + STRESS_TEST_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + expect(simpleContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + expect(socialContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + expect(caseSensitiveContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + expect(stressTestContextBuilder.buildContext(1, []).db).toMatchSnapshot(); + }); + + test('ContextBuilder adds CRUD operations for table', () => { + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + context.db.Posts.insert({}); + context.db.Posts.select({}); + context.db.Posts.update({}, {}); + context.db.Posts.upsert({}, [], []); + context.db.Posts.delete({}); + + expect(genericMockDmlHandler.insert).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.select).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.update).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.upsert).toHaveBeenCalledTimes(1); + expect(genericMockDmlHandler.delete).toHaveBeenCalledTimes(1); + expect(context.db.Posts).toMatchSnapshot(); + }); + + test('Context object has empty db object if schema is empty', async () => { + const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', '', LogLevel.INFO); + const contextBuilder = new ContextBuilder( + indexerConfig, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + expect(Object.keys(context.db)).toStrictEqual([]); + }); + + test('Context object has empty db object if schema fails to parse', async () => { + const schemaWithDuplicateSanitizedTableNames = `CREATE TABLE + "test table" ( + "id" SERIAL NOT NULL + ); + CREATE TABLE "test!table" ( + "id" SERIAL NOT NULL + );`; + const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', schemaWithDuplicateSanitizedTableNames, LogLevel.INFO); + const contextBuilder = new ContextBuilder( + indexerConfig, + { + dmlHandler: genericMockDmlHandler, + fetch: genericMockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + + // Does not outright throw an error but instead returns an empty object + expect(contextBuilder.buildDatabaseContext(1, [])) + .toStrictEqual({}); + }); + + test('Context object allows execution of arbitrary GraphQL operations', async () => { + const mockFetch = jest.fn() + .mockResolvedValueOnce({ + status: 200, + json: async () => ({ + data: { + greet: 'hello' + } + }) + }) + .mockResolvedValueOnce({ + status: 200, + json: async () => ({ + data: { + newGreeting: { + success: true + } + } + }) + }); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + const query = ` + query { + greet() + } + `; + const { greet } = await context.graphql(query) as { greet: string }; + + const mutation = ` + mutation { + newGreeting(greeting: "${greet} morgan") { + success + } + } + `; + const { newGreeting: { success } } = await context.graphql(mutation); + + expect(greet).toEqual('hello'); + expect(success).toEqual(true); + expect(mockFetch.mock.calls[0]).toEqual([ + `${MOCK_CONFIG.hasuraEndpoint}/v1/graphql`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + 'X-Hasura-Role': 'morgs_near', + 'X-Hasura-Admin-Secret': MOCK_CONFIG.hasuraAdminSecret + }, + body: JSON.stringify({ query }) + } + ]); + expect(mockFetch.mock.calls[1]).toEqual([ + `${MOCK_CONFIG.hasuraEndpoint}/v1/graphql`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + 'X-Hasura-Role': 'morgs_near', + 'X-Hasura-Admin-Secret': MOCK_CONFIG.hasuraAdminSecret + }, + body: JSON.stringify({ query: mutation }) + } + ]); + }); + + test('Context object social api can fetch from the near social api', async () => { + const mockFetch = jest.fn(); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + await context.fetchFromSocialApi('/index', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + action: 'post', + key: 'main', + options: { + limit: 1, + order: 'desc' + } + }) + }); + + expect(mockFetch.mock.calls).toMatchSnapshot(); + }); + + test('Context object graphql function throws when a GraphQL response contains errors', async () => { + const mockFetch = jest.fn() + .mockResolvedValue({ + json: async () => ({ + errors: ['boom'] + }) + }); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + await expect(async () => await context.graphql('query { hello }')).rejects.toThrow('boom'); + }); + + test('Context object graphl handles GraphQL variables and sets backend only permissions', async () => { + const mockFetch = jest.fn() + .mockResolvedValue({ + status: 200, + json: async () => ({ + data: 'mock', + }), + }); + const contextBuilder = new ContextBuilder( + SIMPLE_SCHEMA_CONFIG, + { + dmlHandler: genericMockDmlHandler, + fetch: mockFetch as unknown as typeof fetch, + }, + MOCK_CONFIG + ); + const context = contextBuilder.buildContext(1, []); + + const query = 'query($name: String) { hello(name: $name) }'; + const variables = { name: 'morgan' }; + await context.graphql(query, variables); + + expect(mockFetch.mock.calls[0]).toEqual([ + `${MOCK_CONFIG.hasuraEndpoint}/v1/graphql`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + 'X-Hasura-Role': 'morgs_near', + 'X-Hasura-Admin-Secret': MOCK_CONFIG.hasuraAdminSecret + }, + body: JSON.stringify({ + query, + variables, + }), + }, + ]); + }); +}); diff --git a/runner/src/indexer/context-builder/context-builder.ts b/runner/src/indexer/context-builder/context-builder.ts new file mode 100644 index 000000000..0f1507f63 --- /dev/null +++ b/runner/src/indexer/context-builder/context-builder.ts @@ -0,0 +1,292 @@ +import fetch from 'node-fetch'; +import { type Response } from 'node-fetch'; +import { Parser } from 'node-sql-parser'; +import { type DmlHandlerInterface } from '../dml-handler'; +import { type TableDefinitionNames } from '../indexer'; +import type IndexerConfig from '../../indexer-config'; +import { LogEntry } from '../../indexer-meta'; +import { wrapSpan } from '../../utility'; +import assert from 'assert'; +import logger from '../../logger'; +import { trace } from '@opentelemetry/api'; + +export interface ContextObject { + graphql: (operation: string, variables?: Record) => Promise + set: (key: string, value: any) => Promise + debug: (message: string) => void + log: (message: string) => void + warn: (message: string) => void + error: (message: string) => void + fetchFromSocialApi: (path: string, options?: any) => Promise + db: Record any>> +} + +interface Dependencies { + fetch?: typeof fetch + dmlHandler: DmlHandlerInterface + parser?: Parser +} + +interface Config { + hasuraAdminSecret: string + hasuraEndpoint: string +} + +const defaultConfig: Config = { + hasuraAdminSecret: process.env.HASURA_ADMIN_SECRET ?? '', + hasuraEndpoint: process.env.HASURA_ENDPOINT ?? '', +}; + +export default class ContextBuilder { + DEFAULT_HASURA_ROLE: string = 'append'; + + tracer = trace.getTracer('queryapi-runner-context'); + private readonly logger: typeof logger; + tableDefinitions: Map; + deps: Required; + + constructor ( + private readonly indexerConfig: IndexerConfig, + deps: Dependencies, + private readonly config: Config = defaultConfig, + ) { + this.logger = logger.child({ accountId: indexerConfig.accountId, functionName: indexerConfig.functionName, service: this.constructor.name }); + + this.deps = { + fetch, + parser: new Parser(), + ...deps + }; + // TODO: Move Parsing logic to separate class + this.tableDefinitions = getTableNameToDefinitionNamesMapping(indexerConfig.schema); + } + + private sanitizeTableName (tableName: string): string { + // Convert to PascalCase + let pascalCaseTableName = tableName + // Replace special characters with underscores + .replace(/[^a-zA-Z0-9_]/g, '_') + // Makes first letter and any letters following an underscore upper case + .replace(/^([a-zA-Z])|_([a-zA-Z])/g, (match: string) => match.toUpperCase()) + // Removes all underscores + .replace(/_/g, ''); + + // Add underscore if first character is a number + if (/^[0-9]/.test(pascalCaseTableName)) { + pascalCaseTableName = '_' + pascalCaseTableName; + } + + return pascalCaseTableName; + } + + private async runGraphQLQuery (operation: string, variables: any, blockHeight: number, hasuraRoleName: string | null, logError: boolean = true): Promise { + assert(this.config.hasuraAdminSecret !== '' && this.config.hasuraEndpoint !== '', 'hasuraAdminSecret and hasuraEndpoint env variables are required'); + const response: Response = await this.deps.fetch(`${this.config.hasuraEndpoint}/v1/graphql`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Hasura-Use-Backend-Only-Permissions': 'true', + ...(hasuraRoleName && { + 'X-Hasura-Role': hasuraRoleName, + 'X-Hasura-Admin-Secret': this.config.hasuraAdminSecret, + }), + }, + body: JSON.stringify({ + query: operation, + ...(variables && { variables }), + }), + }); + + const { data, errors } = await response.json(); + + if (response.status !== 200 || errors) { + if (logError) { + const message: string = errors ? errors.map((e: any) => e.message).join(', ') : `HTTP ${response.status} error writing with graphql to indexer storage`; + const mutation: string = + `mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){ + insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) { + id + } + }`; + try { + await this.runGraphQLQuery(mutation, { function_name: this.indexerConfig.fullName(), block_height: blockHeight, message }, blockHeight, this.DEFAULT_HASURA_ROLE, false); + } catch (e) { + this.logger.error('Error writing log of graphql error', e); + } + } + throw new Error(`Failed to write graphql, http status: ${response.status}, errors: ${JSON.stringify(errors, null, 2)}`); + } + + return data; + } + + buildContext (blockHeight: number, logEntries: LogEntry[]): ContextObject { + return { + graphql: async (operation: string, variables?: Record) => { + return await wrapSpan(async () => { + return await this.runGraphQLQuery(operation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); + }, this.tracer, `Call graphql ${operation.includes('mutation') ? 'mutation' : 'query'} through Hasura`); + }, + set: async (key, value) => { + const mutation = ` + mutation SetKeyValue($function_name: String!, $key: String!, $value: String!) { + insert_${this.indexerConfig.hasuraRoleName()}_${this.indexerConfig.hasuraFunctionName()}_indexer_storage_one(object: {function_name: $function_name, key_name: $key, value: $value} on_conflict: {constraint: indexer_storage_pkey, update_columns: value}) {key_name} + }`; + const variables = { + function_name: this.indexerConfig.fullName(), + key, + value: value ? JSON.stringify(value) : null + }; + return await wrapSpan(async () => { + return await this.runGraphQLQuery(mutation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); + }, this.tracer, 'call insert mutation through Hasura'); + }, + debug: (...log) => { + const debugLogEntry = LogEntry.userDebug(log.join(' : '), blockHeight); + logEntries.push(debugLogEntry); + }, + log: (...log) => { + const infoLogEntry = LogEntry.userInfo(log.join(' : '), blockHeight); + logEntries.push(infoLogEntry); + }, + warn: (...log) => { + const warnLogEntry = LogEntry.userWarn(log.join(' : '), blockHeight); + logEntries.push(warnLogEntry); + }, + error: (...log) => { + const errorLogEntry = LogEntry.userError(log.join(' : '), blockHeight); + logEntries.push(errorLogEntry); + }, + fetchFromSocialApi: async (path, options) => { + return await this.deps.fetch(`https://api.near.social${path}`, options); + }, + db: this.buildDatabaseContext(blockHeight, logEntries) + }; + } + + buildDatabaseContext ( + blockHeight: number, + logEntries: LogEntry[], + ): Record any>> { + if (this.tableDefinitions.size === 0) { + logEntries.push(LogEntry.systemDebug('No tables found in schema. No context.db methods generated')); + return {}; + } + try { + const tableNames = Array.from(this.tableDefinitions.keys()); + const sanitizedTableNames = new Set(); + const dmlHandler: DmlHandlerInterface = this.deps.dmlHandler; + + // Generate and collect methods for each table name + const result = tableNames.reduce((prev, tableName) => { + // Generate sanitized table name and ensure no conflict + const sanitizedTableName = this.sanitizeTableName(tableName); + const tableDefinitionNames: TableDefinitionNames = this.tableDefinitions.get(tableName) as TableDefinitionNames; + if (sanitizedTableNames.has(sanitizedTableName)) { + throw new Error(`Table ${tableName} has the same sanitized name as another table. Special characters are removed to generate context.db methods. Please rename the table.`); + } else { + sanitizedTableNames.add(sanitizedTableName); + } + + // Generate context.db methods for table + const funcForTable = { + [`${sanitizedTableName}`]: { + insert: async (objectsToInsert: any) => { + const insertLogEntry = LogEntry.userDebug(`Inserting object ${JSON.stringify(objectsToInsert)} into table ${tableName}`, blockHeight); + logEntries.push(insertLogEntry); + + return await dmlHandler.insert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert]); + }, + select: async (filterObj: any, limit = null) => { + const selectLogEntry = LogEntry.userDebug(`Selecting objects in table ${tableName} with values ${JSON.stringify(filterObj)} with ${limit === null ? 'no' : limit} limit`, blockHeight); + logEntries.push(selectLogEntry); + + return await dmlHandler.select(tableDefinitionNames, filterObj, limit); + }, + update: async (filterObj: any, updateObj: any) => { + const updateLogEntry = LogEntry.userDebug(`Updating objects in table ${tableName} that match ${JSON.stringify(filterObj)} with values ${JSON.stringify(updateObj)}`, blockHeight); + logEntries.push(updateLogEntry); + + return await dmlHandler.update(tableDefinitionNames, filterObj, updateObj); + }, + upsert: async (objectsToInsert: any, conflictColumns: string[], updateColumns: string[]) => { + const upsertLogEntry = LogEntry.userDebug(`Inserting objects into table ${tableName} with values ${JSON.stringify(objectsToInsert)}. Conflict on columns ${conflictColumns.join(', ')} will update values in columns ${updateColumns.join(', ')}`, blockHeight); + logEntries.push(upsertLogEntry); + + return await dmlHandler.upsert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert], conflictColumns, updateColumns); + }, + delete: async (filterObj: any) => { + const deleteLogEntry = LogEntry.userDebug(`Deleting objects from table ${tableName} with values ${JSON.stringify(filterObj)}`, blockHeight); + logEntries.push(deleteLogEntry); + + return await dmlHandler.delete(tableDefinitionNames, filterObj); + } + } + }; + return { + ...prev, + ...funcForTable + }; + }, {}); + return result; + } catch (err) { + const error = err as Error; + logEntries.push(LogEntry.systemWarn(`Caught error when generating context.db methods: ${error.message}`)); + } + return {}; // Default to empty object if error + } +} + +// TODO: Migrate all below code to separate class +function getColumnDefinitionNames (columnDefs: any[]): Map { + const columnDefinitionNames = new Map(); + for (const columnDef of columnDefs) { + if (columnDef.column?.type === 'column_ref') { + const columnNameDef = columnDef.column.column.expr; + const actualColumnName = columnNameDef.type === 'double_quote_string' ? `"${columnNameDef.value as string}"` : columnNameDef.value; + columnDefinitionNames.set(columnNameDef.value, actualColumnName); + } + } + return columnDefinitionNames; +} + +function retainOriginalQuoting (schema: string, tableName: string): string { + const createTableQuotedRegex = `\\b(create|CREATE)\\s+(table|TABLE)\\s+"${tableName}"\\s*`; + + if (schema.match(new RegExp(createTableQuotedRegex, 'i'))) { + return `"${tableName}"`; + } + + return tableName; +} + +function getTableNameToDefinitionNamesMapping (schema: string): Map { + const parser = new Parser(); + let schemaSyntaxTree = parser.astify(schema, { database: 'Postgresql' }); + schemaSyntaxTree = Array.isArray(schemaSyntaxTree) ? schemaSyntaxTree : [schemaSyntaxTree]; // Ensure iterable + const tableNameToDefinitionNamesMap = new Map(); + + for (const statement of schemaSyntaxTree) { + if (statement.type === 'create' && statement.keyword === 'table' && statement.table !== undefined) { + const tableName: string = statement.table[0].table; + + if (tableNameToDefinitionNamesMap.has(tableName)) { + throw new Error(`Table ${tableName} already exists in schema. Table names must be unique. Quotes are not allowed as a differentiator between table names.`); + } + + const createDefs = statement.create_definitions ?? []; + for (const columnDef of createDefs) { + if (columnDef.column?.type === 'column_ref') { + const tableDefinitionNames: TableDefinitionNames = { + tableName, + originalTableName: retainOriginalQuoting(schema, tableName), + originalColumnNames: getColumnDefinitionNames(createDefs) + }; + tableNameToDefinitionNamesMap.set(tableName, tableDefinitionNames); + } + } + } + } + + return tableNameToDefinitionNamesMap; +} diff --git a/runner/src/indexer/context-builder/index.ts b/runner/src/indexer/context-builder/index.ts new file mode 100644 index 000000000..c3486cba5 --- /dev/null +++ b/runner/src/indexer/context-builder/index.ts @@ -0,0 +1,2 @@ +export { default } from './context-builder'; +export type { ContextObject } from './context-builder'; diff --git a/runner/src/dml-handler/dml-handler.test.ts b/runner/src/indexer/dml-handler/dml-handler.test.ts similarity index 96% rename from runner/src/dml-handler/dml-handler.test.ts rename to runner/src/indexer/dml-handler/dml-handler.test.ts index 4b7c2ef19..8f52d6a1a 100644 --- a/runner/src/dml-handler/dml-handler.test.ts +++ b/runner/src/indexer/dml-handler/dml-handler.test.ts @@ -1,10 +1,10 @@ import pgFormat from 'pg-format'; import DmlHandler from './dml-handler'; -import type PgClient from '../pg-client'; -import { type TableDefinitionNames } from '../indexer'; -import { type PostgresConnectionParams } from '../pg-client'; -import IndexerConfig from '../indexer-config/indexer-config'; -import { LogLevel } from '../indexer-meta/log-entry'; +import type PgClient from '../../pg-client'; +import { type PostgresConnectionParams } from '../../pg-client'; +import { type TableDefinitionNames } from '../../indexer'; +import IndexerConfig from '../../indexer-config'; +import { LogLevel } from '../../indexer-meta/log-entry'; describe('DML Handler tests', () => { const getDbConnectionParameters: PostgresConnectionParams = { diff --git a/runner/src/dml-handler/dml-handler.ts b/runner/src/indexer/dml-handler/dml-handler.ts similarity index 96% rename from runner/src/dml-handler/dml-handler.ts rename to runner/src/indexer/dml-handler/dml-handler.ts index 29feb7d32..05b36d68b 100644 --- a/runner/src/dml-handler/dml-handler.ts +++ b/runner/src/indexer/dml-handler/dml-handler.ts @@ -1,7 +1,7 @@ -import { wrapError } from '../utility'; -import PgClient, { type PostgresConnectionParams } from '../pg-client'; -import { type TableDefinitionNames } from '../indexer'; -import type IndexerConfig from '../indexer-config/indexer-config'; +import { wrapError } from '../../utility'; +import PgClient, { type PostgresConnectionParams } from '../../pg-client'; +import { type TableDefinitionNames } from '../../indexer'; +import type IndexerConfig from '../../indexer-config/indexer-config'; import { type Tracer, trace, type Span } from '@opentelemetry/api'; import { type QueryResult } from 'pg'; diff --git a/runner/src/dml-handler/in-memory-dml-handler.test.ts b/runner/src/indexer/dml-handler/in-memory-dml-handler.test.ts similarity index 99% rename from runner/src/dml-handler/in-memory-dml-handler.test.ts rename to runner/src/indexer/dml-handler/in-memory-dml-handler.test.ts index 6fbc20c79..b8f946759 100644 --- a/runner/src/dml-handler/in-memory-dml-handler.test.ts +++ b/runner/src/indexer/dml-handler/in-memory-dml-handler.test.ts @@ -1,4 +1,4 @@ -import { type TableDefinitionNames } from '../indexer'; +import { type TableDefinitionNames } from '../../indexer'; import InMemoryDmlHandler from './in-memory-dml-handler'; const DEFAULT_ITEM_1_WITHOUT_ID = { diff --git a/runner/src/dml-handler/in-memory-dml-handler.ts b/runner/src/indexer/dml-handler/in-memory-dml-handler.ts similarity index 99% rename from runner/src/dml-handler/in-memory-dml-handler.ts rename to runner/src/indexer/dml-handler/in-memory-dml-handler.ts index d6fa9f1d4..450ff0104 100644 --- a/runner/src/dml-handler/in-memory-dml-handler.ts +++ b/runner/src/indexer/dml-handler/in-memory-dml-handler.ts @@ -1,5 +1,5 @@ import { type AST, Parser } from 'node-sql-parser'; -import { type TableDefinitionNames } from '../indexer'; +import { type TableDefinitionNames } from '../../indexer'; import { type PostgresRow, type WhereClauseMulti, type WhereClauseSingle, type DmlHandlerInterface } from './dml-handler'; // TODO: Define class to represent specification diff --git a/runner/src/indexer/dml-handler/index.ts b/runner/src/indexer/dml-handler/index.ts new file mode 100644 index 000000000..7bdf14d68 --- /dev/null +++ b/runner/src/indexer/dml-handler/index.ts @@ -0,0 +1,3 @@ +export { default as DmlHandler } from './dml-handler'; +export { default as InMemoryDmlHandler } from './in-memory-dml-handler'; +export type { DmlHandlerInterface } from './dml-handler'; diff --git a/runner/src/indexer/index.ts b/runner/src/indexer/index.ts index f4d7192ae..7c066fb5d 100644 --- a/runner/src/indexer/index.ts +++ b/runner/src/indexer/index.ts @@ -1,2 +1,3 @@ -export { default } from './indexer'; +export { default as Indexer } from './indexer'; +export { default as LocalIndexer } from './local-indexer'; export type { TableDefinitionNames } from './indexer'; diff --git a/runner/src/indexer/indexer.test.ts b/runner/src/indexer/indexer.test.ts index 63e857dce..4dd366207 100644 --- a/runner/src/indexer/indexer.test.ts +++ b/runner/src/indexer/indexer.test.ts @@ -1,213 +1,45 @@ import { Block, type StreamerMessage } from '@near-lake/primitives'; -import type fetch from 'node-fetch'; import Indexer from './indexer'; import { VM } from 'vm2'; -import DmlHandler from '../dml-handler/dml-handler'; -import type PgClient from '../pg-client'; +import type { DmlHandler } from './dml-handler'; import { LogLevel } from '../indexer-meta/log-entry'; import IndexerConfig from '../indexer-config/indexer-config'; import { IndexerStatus } from '../indexer-meta'; import type IndexerMeta from '../indexer-meta'; -import { type PostgresConnectionParams } from '../pg-client'; +import ContextBuilder from './context-builder'; +import { type ContextObject } from './context-builder'; describe('Indexer unit tests', () => { - const SIMPLE_SCHEMA = `CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "accounts_liked" JSONB NOT NULL DEFAULT '[]', - "last_comment_timestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - );`; - - const SOCIAL_SCHEMA = ` - CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "accounts_liked" JSONB NOT NULL DEFAULT '[]', - "last_comment_timestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "comments" ( - "id" SERIAL NOT NULL, - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "comments_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "post_likes" ( - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0), - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") - );`; - - const CASE_SENSITIVE_SCHEMA = ` - CREATE TABLE - Posts ( - "id" SERIAL NOT NULL, - "AccountId" VARCHAR NOT NULL, - BlockHeight DECIMAL(58, 0) NOT NULL, - "receiptId" VARCHAR NOT NULL, - content TEXT NOT NULL, - block_Timestamp DECIMAL(20, 0) NOT NULL, - "Accounts_Liked" JSONB NOT NULL DEFAULT '[]', - "LastCommentTimestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "CommentsTable" ( - "id" SERIAL NOT NULL, - PostId SERIAL NOT NULL, - "accountId" VARCHAR NOT NULL, - blockHeight DECIMAL(58, 0) NOT NULL, - CONSTRAINT "comments_pkey" PRIMARY KEY ("id") - );`; - - const STRESS_TEST_SCHEMA = ` - CREATE TABLE creator_quest ( - account_id VARCHAR PRIMARY KEY, - num_components_created INTEGER NOT NULL DEFAULT 0, - completed BOOLEAN NOT NULL DEFAULT FALSE - ); - - CREATE TABLE - composer_quest ( - account_id VARCHAR PRIMARY KEY, - num_widgets_composed INTEGER NOT NULL DEFAULT 0, - completed BOOLEAN NOT NULL DEFAULT FALSE - ); - - CREATE TABLE - "contractor - quest" ( - account_id VARCHAR PRIMARY KEY, - num_contracts_deployed INTEGER NOT NULL DEFAULT 0, - completed BOOLEAN NOT NULL DEFAULT FALSE - ); - - CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "accounts_liked" JSONB NOT NULL DEFAULT '[]', - "last_comment_timestamp" DECIMAL(20, 0), - CONSTRAINT "posts_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "comments" ( - "id" SERIAL NOT NULL, - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0) NOT NULL, - "content" TEXT NOT NULL, - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "comments_pkey" PRIMARY KEY ("id") - ); - - CREATE TABLE - "post_likes" ( - "post_id" SERIAL NOT NULL, - "account_id" VARCHAR NOT NULL, - "block_height" DECIMAL(58, 0), - "block_timestamp" DECIMAL(20, 0) NOT NULL, - "receipt_id" VARCHAR NOT NULL, - CONSTRAINT "post_likes_pkey" PRIMARY KEY ("post_id", "account_id") - ); - - CREATE UNIQUE INDEX "posts_account_id_block_height_key" ON "posts" ("account_id" ASC, "block_height" ASC); - - CREATE UNIQUE INDEX "comments_post_id_account_id_block_height_key" ON "comments" ( - "post_id" ASC, - "account_id" ASC, - "block_height" ASC - ); - - CREATE INDEX - "posts_last_comment_timestamp_idx" ON "posts" ("last_comment_timestamp" DESC); - - ALTER TABLE - "comments" - ADD - CONSTRAINT "comments_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION; - - ALTER TABLE - "post_likes" - ADD - CONSTRAINT "post_likes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "posts" ("id") ON DELETE CASCADE ON UPDATE NO ACTION; - - CREATE TABLE IF NOT EXISTS - "My Table1" (id serial PRIMARY KEY); - - CREATE TABLE - "Another-Table" (id serial PRIMARY KEY); - - CREATE TABLE - IF NOT EXISTS - "Third-Table" (id serial PRIMARY KEY); - - CREATE TABLE - yet_another_table (id serial PRIMARY KEY); - `; - const SIMPLE_REDIS_STREAM = 'test:stream'; const SIMPLE_ACCOUNT_ID = 'morgs.near'; const SIMPLE_FUNCTION_NAME = 'test_indexer'; const SIMPLE_CODE = 'const a = 1;'; + const SIMPLE_SCHEMA = 'create table posts("id" SERIAL NOT NULL PRIMARY KEY);'; + const SIMPLE_INDEXER_CONFIG: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SIMPLE_SCHEMA, LogLevel.INFO); + + const genericMockContextObject = { + graphql: jest.fn().mockResolvedValue({ data: 'mock' }), + set: jest.fn().mockResolvedValue({ data: 'mock' }), + debug: jest.fn().mockResolvedValue(null), + log: jest.fn().mockResolvedValue(null), + warn: jest.fn().mockResolvedValue(null), + error: jest.fn().mockResolvedValue(null), + fetchFromSocialApi: jest.fn().mockResolvedValue({ data: 'mock' }), + db: { + Posts: { + insert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + select: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + update: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + upsert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + delete: jest.fn().mockResolvedValue([{ colA: 'valA' }]) + } + }, + } as unknown as ContextObject; - const simpleSchemaConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SIMPLE_SCHEMA, LogLevel.INFO); - const socialSchemaConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, SOCIAL_SCHEMA, LogLevel.INFO); - const caseSensitiveConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, CASE_SENSITIVE_SCHEMA, LogLevel.INFO); - const stressTestConfig: IndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, SIMPLE_CODE, STRESS_TEST_SCHEMA, LogLevel.INFO); - - const genericDbCredentials: PostgresConnectionParams = { - database: 'test_near', - host: 'postgres', - password: 'test_pass', - port: 5432, - user: 'test_near' - }; - - const genericMockFetch = jest.fn() - .mockResolvedValue({ - status: 200, - json: async () => ({ - data: 'mock', - }), - }) as unknown as typeof fetch; - - const genericMockDmlHandler = { - insert: jest.fn().mockReturnValue([]), - select: jest.fn().mockReturnValue([]), - update: jest.fn().mockReturnValue([]), - upsert: jest.fn().mockReturnValue([]), - delete: jest.fn().mockReturnValue([]), - } as unknown as DmlHandler; + const genericMockContextBuilder = { + buildContext: jest.fn().mockReturnValue(genericMockContextObject), + } as unknown as ContextBuilder; const genericMockIndexerMeta: any = { writeLogs: jest.fn(), @@ -215,18 +47,29 @@ describe('Indexer unit tests', () => { updateBlockHeight: jest.fn().mockResolvedValue(null), } as unknown as IndexerMeta; - const config = { - hasuraEndpoint: 'mock-hasura-endpoint', - hasuraAdminSecret: 'mock-hasura-secret', - }; + test('Indexer.execute() can call context object functions', async () => { + const mockContextObject = { + graphql: jest.fn().mockResolvedValue({ data: 'mock' }), + set: jest.fn().mockResolvedValue({ data: 'mock' }), + debug: jest.fn().mockResolvedValue(null), + log: jest.fn().mockResolvedValue(null), + warn: jest.fn().mockResolvedValue(null), + error: jest.fn().mockResolvedValue(null), + fetchFromSocialApi: jest.fn().mockResolvedValue({ data: 'mock' }), + db: { + Posts: { + insert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + select: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + update: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + upsert: jest.fn().mockResolvedValue([{ colA: 'valA' }]), + delete: jest.fn().mockResolvedValue([{ colA: 'valA' }]) + } + }, + } as unknown as ContextObject; + const mockContextBuilder = { + buildContext: jest.fn().mockReturnValue(mockContextObject), + } as unknown as ContextBuilder; - test('Indexer.execute() should execute all functions against the current block', async () => { - const mockFetch = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); const blockHeight = 456; const mockBlock = Block.fromStreamerMessage({ block: { @@ -240,7 +83,10 @@ describe('Indexer unit tests', () => { const code = ` const foo = 3; - block.result = context.graphql(\`mutation { set(functionName: "buildnear.testnet/test", key: "height", data: "\${block.blockHeight}")}\`); + await context.graphql('query { hello }'); + await context.log('log'); + await context.fetchFromSocialApi('query { hello }'); + await context.db.Posts.insert({ foo }); `; const indexerMeta = { writeLogs: jest.fn(), @@ -249,619 +95,20 @@ describe('Indexer unit tests', () => { } as unknown as IndexerMeta; const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, + contextBuilder: mockContextBuilder, indexerMeta, - }, config); + }); await indexer.execute(mockBlock); - expect(mockFetch.mock.calls).toMatchSnapshot(); + expect(mockContextObject.graphql).toHaveBeenCalledWith('query { hello }'); + expect(mockContextObject.log).toHaveBeenCalledWith('log'); + expect(mockContextObject.fetchFromSocialApi).toHaveBeenCalledWith('query { hello }'); + expect(mockContextObject.db.Posts.insert).toHaveBeenCalledWith({ foo: 3 }); expect(indexerMeta.setStatus).toHaveBeenCalledWith(IndexerStatus.RUNNING); expect(indexerMeta.updateBlockHeight).toHaveBeenCalledWith(blockHeight); }); - test('Indexer.buildContext() allows execution of arbitrary GraphQL operations', async () => { - const mockFetch = jest.fn() - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: { - greet: 'hello' - } - }) - }) - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: { - newGreeting: { - success: true - } - } - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - - const context = indexer.buildContext(1, []); - - const query = ` - query { - greet() - } - `; - const { greet } = await context.graphql(query) as { greet: string }; - - const mutation = ` - mutation { - newGreeting(greeting: "${greet} morgan") { - success - } - } - `; - const { newGreeting: { success } } = await context.graphql(mutation); - - expect(greet).toEqual('hello'); - expect(success).toEqual(true); - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': 'morgs_near', - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ query }) - } - ]); - expect(mockFetch.mock.calls[1]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': 'morgs_near', - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ query: mutation }) - } - ]); - }); - - test('Indexer.buildContext() can fetch from the near social api', async () => { - const mockFetch = jest.fn(); - const indexer = new Indexer(simpleSchemaConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - - const context = indexer.buildContext(1, []); - - await context.fetchFromSocialApi('/index', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - action: 'post', - key: 'main', - options: { - limit: 1, - order: 'desc' - } - }) - }); - - expect(mockFetch.mock.calls).toMatchSnapshot(); - }); - - test('Indexer.buildContext() throws when a GraphQL response contains errors', async () => { - const mockFetch = jest.fn() - .mockResolvedValue({ - json: async () => ({ - errors: ['boom'] - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - const context = indexer.buildContext(1, []); - - await expect(async () => await context.graphql('query { hello }')).rejects.toThrow('boom'); - }); - - test('Indexer.buildContext() handles GraphQL variables', async () => { - const mockFetch = jest.fn() - .mockResolvedValue({ - status: 200, - json: async () => ({ - data: 'mock', - }), - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - const context = indexer.buildContext(1, []); - - const query = 'query($name: String) { hello(name: $name) }'; - const variables = { name: 'morgan' }; - await context.graphql(query, variables); - - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': 'morgs_near', - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ - query, - variables, - }), - }, - ]); - }); - - test('GetTableNameToDefinitionNamesMapping works for a variety of input schemas', async () => { - const indexer = new Indexer(stressTestConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }); - - const tableNameToDefinitionNamesMapping = indexer.getTableNameToDefinitionNamesMapping(STRESS_TEST_SCHEMA); - expect([...tableNameToDefinitionNamesMapping.keys()]).toStrictEqual([ - 'creator_quest', - 'composer_quest', - 'contractor - quest', - 'posts', - 'comments', - 'post_likes', - 'My Table1', - 'Another-Table', - 'Third-Table', - 'yet_another_table']); - - // Test that duplicate table names throw an error - const duplicateTableSchema = `CREATE TABLE - "posts" ( - "id" SERIAL NOT NULL - ); - CREATE TABLE posts ( - "id" SERIAL NOT NULL - );`; - expect(() => { - indexer.getTableNameToDefinitionNamesMapping(duplicateTableSchema); - }).toThrow('Table posts already exists in schema. Table names must be unique. Quotes are not allowed as a differentiator between table names.'); - - // Test that schema with no tables throws an error - expect(() => { - indexer.getTableNameToDefinitionNamesMapping(''); - }).toThrow('Schema does not have any tables. There should be at least one table.'); - }); - - test('GetTableNameToDefinitionNamesMapping works for mixed quotes schema', async () => { - const indexer = new Indexer(caseSensitiveConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }); - - const tableNameToDefinitionNamesMapping = indexer.getTableNameToDefinitionNamesMapping(CASE_SENSITIVE_SCHEMA); - const tableNames = [...tableNameToDefinitionNamesMapping.keys()]; - const originalTableNames = tableNames.map((tableName) => tableNameToDefinitionNamesMapping.get(tableName)?.originalTableName); - expect(tableNames).toStrictEqual(['Posts', 'CommentsTable']); - expect(originalTableNames).toStrictEqual(['Posts', '"CommentsTable"']); - - // Spot check quoting for columnNames - const postsColumnNames = tableNameToDefinitionNamesMapping.get('Posts')?.originalColumnNames; - const commentsColumnNames = tableNameToDefinitionNamesMapping.get('CommentsTable')?.originalColumnNames; - expect(postsColumnNames?.get('id')).toStrictEqual('"id"'); - expect(postsColumnNames?.get('AccountId')).toStrictEqual('"AccountId"'); - expect(postsColumnNames?.get('BlockHeight')).toStrictEqual('BlockHeight'); - expect(commentsColumnNames?.get('accountId')).toStrictEqual('"accountId"'); - expect(commentsColumnNames?.get('blockHeight')).toStrictEqual('blockHeight'); - }); - - test('GetSchemaLookup works for mixed quotes schema', async () => { - const indexer = new Indexer(caseSensitiveConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }); - - const schemaLookup = indexer.getTableNameToDefinitionNamesMapping(CASE_SENSITIVE_SCHEMA); - const tableNames = [...schemaLookup.keys()]; - const originalTableNames = tableNames.map((tableName) => schemaLookup.get(tableName)?.originalTableName); - expect(tableNames).toStrictEqual(['Posts', 'CommentsTable']); - expect(originalTableNames).toStrictEqual(['Posts', '"CommentsTable"']); - - // Spot check quoting for columnNames - expect(schemaLookup.get('Posts')?.originalColumnNames.get('id')).toStrictEqual('"id"'); - expect(schemaLookup.get('Posts')?.originalColumnNames.get('AccountId')).toStrictEqual('"AccountId"'); - expect(schemaLookup.get('Posts')?.originalColumnNames.get('BlockHeight')).toStrictEqual('BlockHeight'); - expect(schemaLookup.get('CommentsTable')?.originalColumnNames.get('accountId')).toStrictEqual('"accountId"'); - expect(schemaLookup.get('CommentsTable')?.originalColumnNames.get('blockHeight')).toStrictEqual('blockHeight'); - }); - - test('SanitizeTableName works properly on many test cases', async () => { - const indexer = new Indexer(simpleSchemaConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - expect(indexer.sanitizeTableName('table_name')).toStrictEqual('TableName'); - expect(indexer.sanitizeTableName('tablename')).toStrictEqual('Tablename'); // name is not capitalized - expect(indexer.sanitizeTableName('table name')).toStrictEqual('TableName'); - expect(indexer.sanitizeTableName('table!name!')).toStrictEqual('TableName'); - expect(indexer.sanitizeTableName('123TABle')).toStrictEqual('_123TABle'); // underscore at beginning - expect(indexer.sanitizeTableName('123_tABLE')).toStrictEqual('_123TABLE'); // underscore at beginning, capitalization - expect(indexer.sanitizeTableName('some-table_name')).toStrictEqual('SomeTableName'); - expect(indexer.sanitizeTableName('!@#$%^&*()table@)*&(%#')).toStrictEqual('Table'); // All special characters removed - expect(indexer.sanitizeTableName('T_name')).toStrictEqual('TName'); - expect(indexer.sanitizeTableName('_table')).toStrictEqual('Table'); // Starting underscore was removed - }); - - test('indexer fails to build context.db due to collision on sanitized table names', async () => { - const schemaWithDuplicateSanitizedTableNames = `CREATE TABLE - "test table" ( - "id" SERIAL NOT NULL - ); - CREATE TABLE "test!table" ( - "id" SERIAL NOT NULL - );`; - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', schemaWithDuplicateSanitizedTableNames, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - // Does not outright throw an error but instead returns an empty object - expect(indexer.buildDatabaseContext(1, [])) - .toStrictEqual({}); - }); - - test('indexer builds context and inserts an objects into existing table', async () => { - const mockDmlHandler: any = { insert: jest.fn().mockReturnValue([{ colA: 'valA' }, { colA: 'valA' }]) }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const objToInsert = [{ - account_id: 'morgs_near', - block_height: 1, - receipt_id: 'abc', - content: 'test', - block_timestamp: 800, - accounts_liked: JSON.stringify(['cwpuzzles.near', 'devbose.near']) - }, - { - account_id: 'morgs_near', - block_height: 2, - receipt_id: 'abc', - content: 'test', - block_timestamp: 801, - accounts_liked: JSON.stringify(['cwpuzzles.near']) - }]; - - const result = await context.db.Posts.insert(objToInsert); - expect(result.length).toEqual(2); - }); - - test('indexer builds context and does simultaneous upserts', async () => { - const mockPgClient = { - query: jest.fn().mockReturnValue({ rows: [] }), - format: jest.fn().mockReturnValue('mock') - } as unknown as PgClient; - const mockDmlHandler: any = new DmlHandler(genericDbCredentials, socialSchemaConfig, mockPgClient); - const upsertSpy = jest.spyOn(mockDmlHandler, 'upsert'); - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - const promises: any[] = []; - - for (let i = 1; i <= 100; i++) { - const promise = context.db.Posts.upsert( - { - account_id: 'morgs_near', - block_height: i, - receipt_id: 'abc', - content: 'test_content', - block_timestamp: 800, - accounts_liked: JSON.stringify(['cwpuzzles.near', 'devbose.near']) - }, - ['account_id', 'block_height'], - ['content', 'block_timestamp'] - ); - promises.push(promise); - } - await Promise.all(promises); - - expect(upsertSpy).toHaveBeenCalledTimes(100); - }); - - test('indexer builds context and selects objects from existing table', async () => { - const selectFn = jest.fn(); - selectFn.mockImplementation((...args) => { - // Expects limit to be last parameter - return args[args.length - 1] === null ? [{ colA: 'valA' }, { colA: 'valA' }] : [{ colA: 'valA' }]; - }); - const mockDmlHandler: any = { select: selectFn }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const objToSelect = { - account_id: 'morgs_near', - receipt_id: 'abc', - }; - const result = await context.db.Posts.select(objToSelect); - expect(result.length).toEqual(2); - const resultLimit = await context.db.Posts.select(objToSelect, 1); - expect(resultLimit.length).toEqual(1); - }); - - test('indexer builds context and updates multiple objects from existing table', async () => { - const mockDmlHandler: any = { - update: jest.fn().mockImplementation((_, whereObj, updateObj) => { - if (whereObj.account_id === 'morgs_near' && updateObj.content === 'test_content') { - return [{ colA: 'valA' }, { colA: 'valA' }]; - } - return [{}]; - }) - }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const whereObj = { - account_id: 'morgs_near', - receipt_id: 'abc', - }; - const updateObj = { - content: 'test_content', - block_timestamp: 805, - }; - const result = await context.db.Posts.update(whereObj, updateObj); - expect(result.length).toEqual(2); - }); - - test('indexer builds context and upserts on existing table', async () => { - const mockDmlHandler: any = { - upsert: jest.fn().mockImplementation((_, objects, conflict, update) => { - if (objects.length === 2 && conflict.includes('account_id') && update.includes('content')) { - return [{ colA: 'valA' }, { colA: 'valA' }]; - } else if (objects.length === 1 && conflict.includes('account_id') && update.includes('content')) { - return [{ colA: 'valA' }]; - } - return [{}]; - }) - }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const objToInsert = [{ - account_id: 'morgs_near', - block_height: 1, - receipt_id: 'abc', - content: 'test', - block_timestamp: 800, - accounts_liked: JSON.stringify(['cwpuzzles.near', 'devbose.near']) - }, - { - account_id: 'morgs_near', - block_height: 2, - receipt_id: 'abc', - content: 'test', - block_timestamp: 801, - accounts_liked: JSON.stringify(['cwpuzzles.near']) - }]; - - let result = await context.db.Posts.upsert(objToInsert, ['account_id', 'block_height'], ['content', 'block_timestamp']); - expect(result.length).toEqual(2); - result = await context.db.Posts.upsert(objToInsert[0], ['account_id', 'block_height'], ['content', 'block_timestamp']); - expect(result.length).toEqual(1); - }); - - test('indexer builds context and deletes objects from existing table', async () => { - const mockDmlHandler: any = { delete: jest.fn().mockReturnValue([{ colA: 'valA' }, { colA: 'valA' }]) }; - - const indexer = new Indexer(socialSchemaConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: mockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - const deleteFilter = { - account_id: 'morgs_near', - receipt_id: 'abc', - }; - const result = await context.db.Posts.delete(deleteFilter); - expect(result.length).toEqual(2); - }); - - test('indexer builds context and verifies all methods generated', async () => { - const indexer = new Indexer(stressTestConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - expect(Object.keys(context.db)).toStrictEqual([ - 'CreatorQuest', - 'ComposerQuest', - 'ContractorQuest', - 'Posts', - 'Comments', - 'PostLikes', - 'MyTable1', - 'AnotherTable', - 'ThirdTable', - 'YetAnotherTable']); - expect(Object.keys(context.db.CreatorQuest)).toStrictEqual([ - 'insert', - 'select', - 'update', - 'upsert', - 'delete']); - expect(Object.keys(context.db.PostLikes)).toStrictEqual([ - 'insert', - 'select', - 'update', - 'upsert', - 'delete']); - expect(Object.keys(context.db.MyTable1)).toStrictEqual([ - 'insert', - 'select', - 'update', - 'upsert', - 'delete']); - }); - - test('indexer builds context and returns empty array if failed to generate db methods', async () => { - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'code', '', LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { - fetch: genericMockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta, - }, config); - const context = indexer.buildContext(1, []); - - expect(Object.keys(context.db)).toStrictEqual([]); - }); - - test('Indexer.execute() allows imperative execution of GraphQL operations', async () => { - const postId = 1; - const commentId = 2; - const blockHeight = 82699904; - const mockFetch = jest.fn() - .mockReturnValueOnce({ // "running function on ..." log - status: 200, - json: async () => ({ - data: { - indexer_log_store: [ - { - id: '12345', - }, - ], - }, - }), - }) - .mockReturnValueOnce({ // set status - status: 200, - json: async () => ({ - errors: null, - }), - }) - .mockReturnValueOnce({ // query - status: 200, - json: async () => ({ - data: { - posts: [ - { - id: postId, - }, - ], - }, - }), - }) - .mockReturnValueOnce({ // mutation - status: 200, - json: async () => ({ - data: { - insert_comments: { - returning: { - id: commentId, - }, - }, - }, - }), - }) - .mockReturnValueOnce({ - status: 200, - json: async () => ({ - errors: null, - }), - }); - - const mockBlock = Block.fromStreamerMessage({ - block: { - chunks: [0], - header: { - height: blockHeight - } - }, - shards: {} - } as unknown as StreamerMessage) as unknown as Block; - - const code = ` - const { posts } = await context.graphql(\` - query { - posts(where: { id: { _eq: 1 } }) { - id - } - } - \`); - - if (!posts || posts.length === 0) { - return; - } - - const [post] = posts; - - const { insert_comments: { returning: { id } } } = await context.graphql(\` - mutation { - insert_comments( - objects: {account_id: "morgs.near", block_height: \${block.blockHeight}, content: "cool post", post_id: \${post.id}} - ) { - returning { - id - } - } - } - \`); - - return (\`Created comment \${id} on post \${post.id}\`) - `; - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta: genericMockIndexerMeta - }, config); - - await indexer.execute(mockBlock); - - expect(mockFetch.mock.calls).toMatchSnapshot(); - }); - - test('Indexer.execute() console.logs', async () => { - const logs: string[] = []; - const context = { - log: (...m: string[]) => { - logs.push(...m); - } - }; - const vm = new VM(); - vm.freeze(context, 'context'); - vm.freeze(context, 'console'); - await vm.run('console.log("hello", "brave new"); context.log("world")'); - expect(logs).toEqual(['hello', 'brave new', 'world']); - }); - test('Errors thrown in VM can be caught outside the VM', async () => { const vm = new VM(); expect(() => { @@ -870,12 +117,6 @@ describe('Indexer unit tests', () => { }); test('Indexer.execute() catches errors', async () => { - const mockFetch = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); const blockHeight = 456; const mockBlock = Block.fromStreamerMessage({ block: { @@ -896,57 +137,16 @@ describe('Indexer unit tests', () => { } as unknown as IndexerMeta; const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, + contextBuilder: genericMockContextBuilder, indexerMeta, - }, config); + }); await expect(indexer.execute(mockBlock)).rejects.toThrow(new Error('Execution error: boom')); - expect(mockFetch.mock.calls).toMatchSnapshot(); expect(indexerMeta.setStatus).toHaveBeenNthCalledWith(1, IndexerStatus.RUNNING); expect(indexerMeta.setStatus).toHaveBeenNthCalledWith(2, IndexerStatus.FAILING); expect(indexerMeta.updateBlockHeight).not.toHaveBeenCalled(); }); - test('Indexer.execute() supplies the required role to the GraphQL endpoint', async () => { - const blockHeight = 82699904; - const mockFetch = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); - const mockBlock = Block.fromStreamerMessage({ - block: { - chunks: [0], - header: { - height: blockHeight - } - }, - shards: {} - } as unknown as StreamerMessage) as unknown as Block; - const indexerMeta = { - writeLogs: jest.fn(), - setStatus: jest.fn(), - updateBlockHeight: jest.fn().mockResolvedValue(null) - } as unknown as IndexerMeta; - const code = ` - context.graphql(\`mutation { set(functionName: "buildnear.testnet/test", key: "height", data: "\${block.blockHeight}")}\`); - `; - const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'morgs.near', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { - fetch: mockFetch as unknown as typeof fetch, - dmlHandler: genericMockDmlHandler, - indexerMeta, - }, config); - - await indexer.execute(mockBlock); - - expect(indexerMeta.setStatus).toHaveBeenNthCalledWith(1, IndexerStatus.RUNNING); - expect(mockFetch.mock.calls).toMatchSnapshot(); - expect(indexerMeta.updateBlockHeight).toHaveBeenCalledWith(blockHeight); - }); - test('Indexer passes all relevant logs to writeLogs', async () => { const mockDebugIndexerMeta = { writeLogs: jest.fn(), @@ -987,33 +187,28 @@ describe('Indexer unit tests', () => { const infoIndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.INFO); const errorIndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.ERROR); const mockDmlHandler: DmlHandler = { select: jest.fn() } as unknown as DmlHandler; + const partialMockContextBuilder: ContextBuilder = new ContextBuilder(SIMPLE_INDEXER_CONFIG, { dmlHandler: mockDmlHandler }); const indexerDebug = new Indexer( debugIndexerConfig, { - fetch: jest.fn() as unknown as typeof fetch, - dmlHandler: mockDmlHandler, + contextBuilder: partialMockContextBuilder, indexerMeta: mockDebugIndexerMeta as unknown as IndexerMeta }, - config ); const indexerInfo = new Indexer( infoIndexerConfig, { - fetch: jest.fn() as unknown as typeof fetch, - dmlHandler: mockDmlHandler, + contextBuilder: partialMockContextBuilder, indexerMeta: mockInfoIndexerMeta as unknown as IndexerMeta }, - config ); const indexerError = new Indexer( errorIndexerConfig, { - fetch: jest.fn() as unknown as typeof fetch, - dmlHandler: mockDmlHandler, + contextBuilder: partialMockContextBuilder, indexerMeta: mockErrorIndexerMeta as unknown as IndexerMeta }, - config ); await indexerDebug.execute(mockBlock); @@ -1036,49 +231,7 @@ describe('Indexer unit tests', () => { expect(mockErrorIndexerMeta.updateBlockHeight).toHaveBeenCalledWith(blockHeight); }); - test('attaches the backend only header to requests to hasura', async () => { - const mockFetch = jest.fn() - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: {} - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - const context = indexer.buildContext(1, []); - - const mutation = ` - mutation { - newGreeting(greeting: "howdy") { - success - } - } - `; - - await context.graphql(mutation); - - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - 'X-Hasura-Role': simpleSchemaConfig.hasuraRoleName(), - 'X-Hasura-Admin-Secret': config.hasuraAdminSecret - }, - body: JSON.stringify({ query: mutation }) - } - ]); - }); - it('call writeLogs method at the end of execution with correct and all logs are present', async () => { - const mockFetchDebug = jest.fn(() => ({ - status: 200, - json: async () => ({ - errors: null, - }), - })); const blockHeight = 456; const mockBlock = Block.fromStreamerMessage({ block: { @@ -1108,52 +261,20 @@ describe('Indexer unit tests', () => { const debugIndexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, 'buildnear.testnet', 'test', 0, code, SIMPLE_SCHEMA, LogLevel.DEBUG); const mockDmlHandler: DmlHandler = { select: jest.fn() } as unknown as DmlHandler; + const partialMockContextBuilder: ContextBuilder = new ContextBuilder(debugIndexerConfig, { dmlHandler: mockDmlHandler }); const indexerDebug = new Indexer( debugIndexerConfig, - { fetch: mockFetchDebug as unknown as typeof fetch, dmlHandler: mockDmlHandler, indexerMeta }, - config + { contextBuilder: partialMockContextBuilder, indexerMeta }, ); await indexerDebug.execute(mockBlock); expect(indexerMeta.writeLogs).toHaveBeenCalledTimes(1); expect(indexerMeta.writeLogs.mock.calls[0][0]).toHaveLength(5); }); - test('does not attach the hasura admin secret header when no role specified', async () => { - const mockFetch = jest.fn() - .mockResolvedValueOnce({ - status: 200, - json: async () => ({ - data: {} - }) - }); - const indexer = new Indexer(simpleSchemaConfig, { fetch: mockFetch as unknown as typeof fetch, dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); - - const mutation = ` - mutation { - newGreeting(greeting: "howdy") { - success - } - } - `; - - await indexer.runGraphQLQuery(mutation, null, 0, null); - - expect(mockFetch.mock.calls[0]).toEqual([ - `${config.hasuraEndpoint}/v1/graphql`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - }, - body: JSON.stringify({ query: mutation }) - } - ]); - }); test('transformedCode applies the correct transformations', () => { const indexerConfig = new IndexerConfig(SIMPLE_REDIS_STREAM, SIMPLE_ACCOUNT_ID, SIMPLE_FUNCTION_NAME, 0, 'console.log(\'hello\')', SIMPLE_SCHEMA, LogLevel.INFO); - const indexer = new Indexer(indexerConfig, { dmlHandler: genericMockDmlHandler, indexerMeta: genericMockIndexerMeta }, config); + const indexer = new Indexer(indexerConfig, { contextBuilder: genericMockContextBuilder, indexerMeta: genericMockIndexerMeta }); const transformedFunction = indexer.transformIndexerFunction(); expect(transformedFunction).toEqual(` diff --git a/runner/src/indexer/indexer.ts b/runner/src/indexer/indexer.ts index 3e1891b10..f4f24fce3 100644 --- a/runner/src/indexer/indexer.ts +++ b/runner/src/indexer/indexer.ts @@ -1,4 +1,3 @@ -import fetch, { type Response } from 'node-fetch'; import { VM } from 'vm2'; import * as lakePrimitives from '@near-lake/primitives'; import { Parser } from 'node-sql-parser'; @@ -9,65 +8,36 @@ import logger from '../logger'; import LogEntry from '../indexer-meta/log-entry'; import type IndexerConfig from '../indexer-config'; import { IndexerStatus } from '../indexer-meta'; -import { wrapSpan } from '../utility'; import { type IndexerMetaInterface } from '../indexer-meta/indexer-meta'; -import { type DmlHandlerInterface } from '../dml-handler/dml-handler'; -import assert from 'assert'; +import type ContextBuilder from './context-builder'; interface Dependencies { - fetch?: typeof fetch - dmlHandler: DmlHandlerInterface + contextBuilder: ContextBuilder indexerMeta: IndexerMetaInterface parser?: Parser }; -interface Context { - graphql: (operation: string, variables?: Record) => Promise - set: (key: string, value: any) => Promise - debug: (message: string) => void - log: (message: string) => void - warn: (message: string) => void - error: (message: string) => void - fetchFromSocialApi: (path: string, options?: any) => Promise - db: Record any>> -} - export interface TableDefinitionNames { tableName: string originalTableName: string originalColumnNames: Map } -interface Config { - hasuraAdminSecret: string - hasuraEndpoint: string - -} - -const defaultConfig: Config = { - hasuraAdminSecret: process.env.HASURA_ADMIN_SECRET ?? '', - hasuraEndpoint: process.env.HASURA_ENDPOINT ?? '', -}; - export default class Indexer { - DEFAULT_HASURA_ROLE: string; IS_FIRST_EXECUTION: boolean = true; tracer = trace.getTracer('queryapi-runner-indexer'); private readonly logger: typeof logger; - private readonly deps: Required; + readonly deps: Required; private currentStatus?: string; constructor ( private readonly indexerConfig: IndexerConfig, deps: Dependencies, - private readonly config: Config = defaultConfig, ) { this.logger = logger.child({ accountId: indexerConfig.accountId, functionName: indexerConfig.functionName, service: this.constructor.name }); - this.DEFAULT_HASURA_ROLE = 'append'; this.deps = { - fetch, parser: new Parser(), ...deps }; @@ -94,7 +64,7 @@ export default class Indexer { this.logger.error('Failed to set status to RUNNING', e); })); const vm = new VM({ allowAsync: true }); - const context = this.buildContext(blockHeight, logEntries); + const context = this.deps.contextBuilder.buildContext(blockHeight, logEntries); vm.freeze(block, 'block'); vm.freeze(lakePrimitives, 'primitives'); @@ -133,194 +103,6 @@ export default class Indexer { } } - buildContext (blockHeight: number, logEntries: LogEntry[]): Context { - return { - graphql: async (operation, variables) => { - return await wrapSpan(async () => { - return await this.runGraphQLQuery(operation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); - }, this.tracer, `Call graphql ${operation.includes('mutation') ? 'mutation' : 'query'} through Hasura`); - }, - set: async (key, value) => { - const mutation = ` - mutation SetKeyValue($function_name: String!, $key: String!, $value: String!) { - insert_${this.indexerConfig.hasuraRoleName()}_${this.indexerConfig.hasuraFunctionName()}_indexer_storage_one(object: {function_name: $function_name, key_name: $key, value: $value} on_conflict: {constraint: indexer_storage_pkey, update_columns: value}) {key_name} - }`; - const variables = { - function_name: this.indexerConfig.fullName(), - key, - value: value ? JSON.stringify(value) : null - }; - return await wrapSpan(async () => { - return await this.runGraphQLQuery(mutation, variables, blockHeight, this.indexerConfig.hasuraRoleName()); - }, this.tracer, 'call insert mutation through Hasura'); - }, - debug: (...log) => { - const debugLogEntry = LogEntry.userDebug(log.join(' : '), blockHeight); - logEntries.push(debugLogEntry); - }, - log: (...log) => { - const infoLogEntry = LogEntry.userInfo(log.join(' : '), blockHeight); - logEntries.push(infoLogEntry); - }, - warn: (...log) => { - const warnLogEntry = LogEntry.userWarn(log.join(' : '), blockHeight); - logEntries.push(warnLogEntry); - }, - error: (...log) => { - const errorLogEntry = LogEntry.userError(log.join(' : '), blockHeight); - logEntries.push(errorLogEntry); - }, - fetchFromSocialApi: async (path, options) => { - return await this.deps.fetch(`https://api.near.social${path}`, options); - }, - db: this.buildDatabaseContext(blockHeight, logEntries) - }; - } - - private getColumnDefinitionNames (columnDefs: any[]): Map { - const columnDefinitionNames = new Map(); - for (const columnDef of columnDefs) { - if (columnDef.column?.type === 'column_ref') { - const columnNameDef = columnDef.column.column.expr; - const actualColumnName = columnNameDef.type === 'double_quote_string' ? `"${columnNameDef.value as string}"` : columnNameDef.value; - columnDefinitionNames.set(columnNameDef.value, actualColumnName); - } - } - return columnDefinitionNames; - } - - private retainOriginalQuoting (schema: string, tableName: string): string { - const createTableQuotedRegex = `\\b(create|CREATE)\\s+(table|TABLE)\\s+"${tableName}"\\s*`; - - if (schema.match(new RegExp(createTableQuotedRegex, 'i'))) { - return `"${tableName}"`; - } - - return tableName; - } - - getTableNameToDefinitionNamesMapping (schema: string): Map { - let schemaSyntaxTree = this.deps.parser.astify(schema, { database: 'Postgresql' }); - schemaSyntaxTree = Array.isArray(schemaSyntaxTree) ? schemaSyntaxTree : [schemaSyntaxTree]; // Ensure iterable - const tableNameToDefinitionNamesMap = new Map(); - - for (const statement of schemaSyntaxTree) { - if (statement.type === 'create' && statement.keyword === 'table' && statement.table !== undefined) { - const tableName: string = statement.table[0].table; - - if (tableNameToDefinitionNamesMap.has(tableName)) { - throw new Error(`Table ${tableName} already exists in schema. Table names must be unique. Quotes are not allowed as a differentiator between table names.`); - } - - const createDefs = statement.create_definitions ?? []; - for (const columnDef of createDefs) { - if (columnDef.column?.type === 'column_ref') { - const tableDefinitionNames: TableDefinitionNames = { - tableName, - originalTableName: this.retainOriginalQuoting(schema, tableName), - originalColumnNames: this.getColumnDefinitionNames(createDefs) - }; - tableNameToDefinitionNamesMap.set(tableName, tableDefinitionNames); - } - } - } - } - - if (tableNameToDefinitionNamesMap.size === 0) { - throw new Error('Schema does not have any tables. There should be at least one table.'); - } - - return tableNameToDefinitionNamesMap; - } - - sanitizeTableName (tableName: string): string { - // Convert to PascalCase - let pascalCaseTableName = tableName - // Replace special characters with underscores - .replace(/[^a-zA-Z0-9_]/g, '_') - // Makes first letter and any letters following an underscore upper case - .replace(/^([a-zA-Z])|_([a-zA-Z])/g, (match: string) => match.toUpperCase()) - // Removes all underscores - .replace(/_/g, ''); - - // Add underscore if first character is a number - if (/^[0-9]/.test(pascalCaseTableName)) { - pascalCaseTableName = '_' + pascalCaseTableName; - } - - return pascalCaseTableName; - } - - buildDatabaseContext ( - blockHeight: number, - logEntries: LogEntry[], - ): Record any>> { - try { - const tableNameToDefinitionNamesMapping = this.getTableNameToDefinitionNamesMapping(this.indexerConfig.schema); - const tableNames = Array.from(tableNameToDefinitionNamesMapping.keys()); - const sanitizedTableNames = new Set(); - const dmlHandler: DmlHandlerInterface = this.deps.dmlHandler; - - // Generate and collect methods for each table name - const result = tableNames.reduce((prev, tableName) => { - // Generate sanitized table name and ensure no conflict - const sanitizedTableName = this.sanitizeTableName(tableName); - const tableDefinitionNames: TableDefinitionNames = tableNameToDefinitionNamesMapping.get(tableName) as TableDefinitionNames; - if (sanitizedTableNames.has(sanitizedTableName)) { - throw new Error(`Table ${tableName} has the same sanitized name as another table. Special characters are removed to generate context.db methods. Please rename the table.`); - } else { - sanitizedTableNames.add(sanitizedTableName); - } - - // Generate context.db methods for table - const funcForTable = { - [`${sanitizedTableName}`]: { - insert: async (objectsToInsert: any) => { - const insertLogEntry = LogEntry.userDebug(`Inserting object ${JSON.stringify(objectsToInsert)} into table ${tableName}`, blockHeight); - logEntries.push(insertLogEntry); - - return await dmlHandler.insert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert]); - }, - select: async (filterObj: any, limit = null) => { - const selectLogEntry = LogEntry.userDebug(`Selecting objects in table ${tableName} with values ${JSON.stringify(filterObj)} with ${limit === null ? 'no' : limit} limit`, blockHeight); - logEntries.push(selectLogEntry); - - return await dmlHandler.select(tableDefinitionNames, filterObj, limit); - }, - update: async (filterObj: any, updateObj: any) => { - const updateLogEntry = LogEntry.userDebug(`Updating objects in table ${tableName} that match ${JSON.stringify(filterObj)} with values ${JSON.stringify(updateObj)}`, blockHeight); - logEntries.push(updateLogEntry); - - return await dmlHandler.update(tableDefinitionNames, filterObj, updateObj); - }, - upsert: async (objectsToInsert: any, conflictColumns: string[], updateColumns: string[]) => { - const upsertLogEntry = LogEntry.userDebug(`Inserting objects into table ${tableName} with values ${JSON.stringify(objectsToInsert)}. Conflict on columns ${conflictColumns.join(', ')} will update values in columns ${updateColumns.join(', ')}`, blockHeight); - logEntries.push(upsertLogEntry); - - return await dmlHandler.upsert(tableDefinitionNames, Array.isArray(objectsToInsert) ? objectsToInsert : [objectsToInsert], conflictColumns, updateColumns); - }, - delete: async (filterObj: any) => { - const deleteLogEntry = LogEntry.userDebug(`Deleting objects from table ${tableName} with values ${JSON.stringify(filterObj)}`, blockHeight); - logEntries.push(deleteLogEntry); - - return await dmlHandler.delete(tableDefinitionNames, filterObj); - } - } - }; - return { - ...prev, - ...funcForTable - }; - }, {}); - return result; - } catch (error) { - if (this.IS_FIRST_EXECUTION) { - this.logger.warn('Caught error when generating context.db methods', error); - } - } - return {}; // Default to empty object if error - } - async setStatus (status: IndexerStatus): Promise { if (this.currentStatus === status) { return; @@ -332,47 +114,6 @@ export default class Indexer { await this.deps.indexerMeta?.setStatus(status); } - async runGraphQLQuery (operation: string, variables: any, blockHeight: number, hasuraRoleName: string | null, logError: boolean = true): Promise { - assert(this.config.hasuraAdminSecret !== '' && this.config.hasuraEndpoint !== '', 'hasuraAdminSecret and hasuraEndpoint env variables are required'); - const response: Response = await this.deps.fetch(`${this.config.hasuraEndpoint}/v1/graphql`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-Hasura-Use-Backend-Only-Permissions': 'true', - ...(hasuraRoleName && { - 'X-Hasura-Role': hasuraRoleName, - 'X-Hasura-Admin-Secret': this.config.hasuraAdminSecret, - }), - }, - body: JSON.stringify({ - query: operation, - ...(variables && { variables }), - }), - }); - - const { data, errors } = await response.json(); - - if (response.status !== 200 || errors) { - if (logError) { - const message: string = errors ? errors.map((e: any) => e.message).join(', ') : `HTTP ${response.status} error writing with graphql to indexer storage`; - const mutation: string = - `mutation writeLog($function_name: String!, $block_height: numeric!, $message: String!){ - insert_indexer_log_entries_one(object: {function_name: $function_name, block_height: $block_height, message: $message}) { - id - } - }`; - try { - await this.runGraphQLQuery(mutation, { function_name: this.indexerConfig.fullName(), block_height: blockHeight, message }, blockHeight, this.DEFAULT_HASURA_ROLE, false); - } catch (e) { - this.logger.error('Error writing log of graphql error', e); - } - } - throw new Error(`Failed to write graphql, http status: ${response.status}, errors: ${JSON.stringify(errors, null, 2)}`); - } - - return data; - } - private enableAwaitTransform (code: string): string { return ` async function f(){ diff --git a/runner/src/local-indexer/local-indexer.ts b/runner/src/indexer/local-indexer.ts similarity index 70% rename from runner/src/local-indexer/local-indexer.ts rename to runner/src/indexer/local-indexer.ts index d84dfebaf..9baeaa145 100644 --- a/runner/src/local-indexer/local-indexer.ts +++ b/runner/src/indexer/local-indexer.ts @@ -1,8 +1,9 @@ -import InMemoryDmlHandler from '../dml-handler/in-memory-dml-handler'; +import ContextBuilder, { type ContextObject } from './context-builder'; +import InMemoryDmlHandler from './dml-handler/in-memory-dml-handler'; import IndexerConfig from '../indexer-config'; -import { type LocalIndexerConfig } from '../indexer-config/indexer-config'; +import { type LocalIndexerConfig } from '../indexer-config'; import NoOpIndexerMeta from '../indexer-meta/no-op-indexer-meta'; -import Indexer from '../indexer/indexer'; +import Indexer from './indexer'; import LakeClient from '../lake-client/lake-client'; export default class LocalIndexer { @@ -20,11 +21,16 @@ export default class LocalIndexer { logLevel: config.logLevel, }); const dmlHandler = new InMemoryDmlHandler(config.schema); + const contextBuilder = new ContextBuilder(fullIndexerConfig, { dmlHandler }); const indexerMeta = new NoOpIndexerMeta(config); - this.indexer = new Indexer(fullIndexerConfig, { indexerMeta, dmlHandler }); + this.indexer = new Indexer(fullIndexerConfig, { indexerMeta, contextBuilder }); this.lakeClient = new LakeClient(); } + getContext (): ContextObject { + return this.indexer.deps.contextBuilder.buildContext(0, []); + } + async executeOnBlock (blockHeight: number): Promise { // TODO: Cache Block data locally const block = await this.lakeClient.fetchBlock(blockHeight); diff --git a/runner/src/local-indexer/index.ts b/runner/src/local-indexer/index.ts deleted file mode 100644 index b05461694..000000000 --- a/runner/src/local-indexer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './local-indexer'; diff --git a/runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap b/runner/src/provisioner/hasura-client/__snapshots__/hasura-client.test.ts.snap similarity index 100% rename from runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap rename to runner/src/provisioner/hasura-client/__snapshots__/hasura-client.test.ts.snap diff --git a/runner/src/hasura-client/hasura-client.test.ts b/runner/src/provisioner/hasura-client/hasura-client.test.ts similarity index 100% rename from runner/src/hasura-client/hasura-client.test.ts rename to runner/src/provisioner/hasura-client/hasura-client.test.ts diff --git a/runner/src/hasura-client/hasura-client.ts b/runner/src/provisioner/hasura-client/hasura-client.ts similarity index 99% rename from runner/src/hasura-client/hasura-client.ts rename to runner/src/provisioner/hasura-client/hasura-client.ts index 8b50242f2..f2f4e89c5 100644 --- a/runner/src/hasura-client/hasura-client.ts +++ b/runner/src/provisioner/hasura-client/hasura-client.ts @@ -10,7 +10,7 @@ interface SqlOptions { source?: string } -export type HasuraPermission = 'select' | 'insert' | 'update' | 'delete'; +export const HASURA_PERMISSION_TYPES = ['select', 'insert', 'update', 'delete']; interface TableDefinition { name: string diff --git a/runner/src/hasura-client/index.ts b/runner/src/provisioner/hasura-client/index.ts similarity index 63% rename from runner/src/hasura-client/index.ts rename to runner/src/provisioner/hasura-client/index.ts index fa21831b8..77a2b4aea 100644 --- a/runner/src/hasura-client/index.ts +++ b/runner/src/provisioner/hasura-client/index.ts @@ -1,2 +1,3 @@ export { default } from './hasura-client'; -export type { HasuraMetadata, HasuraSource, HasuraConfiguration, HasuraDatabaseConnectionParameters, HasuraTableMetadata, HasuraRolePermission, HasuraPermission } from './hasura-client'; +export type { HasuraMetadata, HasuraSource, HasuraConfiguration, HasuraDatabaseConnectionParameters, HasuraTableMetadata, HasuraRolePermission } from './hasura-client'; +export { HASURA_PERMISSION_TYPES } from './hasura-client'; diff --git a/runner/src/provisioner/index.ts b/runner/src/provisioner/index.ts index 5a4dbeb8d..98efce62b 100644 --- a/runner/src/provisioner/index.ts +++ b/runner/src/provisioner/index.ts @@ -1 +1,2 @@ export { default } from './provisioner'; +export { METADATA_TABLE_NAME, LOGS_TABLE_NAME } from './provisioner'; diff --git a/runner/src/provisioner/provisioner.test.ts b/runner/src/provisioner/provisioner.test.ts index 8ef123714..425ed219a 100644 --- a/runner/src/provisioner/provisioner.test.ts +++ b/runner/src/provisioner/provisioner.test.ts @@ -1,8 +1,9 @@ import pgFormat from 'pg-format'; -import Provisioner from './provisioner'; +import Provisioner, { LOGS_TABLE_NAME, METADATA_TABLE_NAME } from './provisioner'; import IndexerConfig from '../indexer-config/indexer-config'; import { LogLevel } from '../indexer-meta/log-entry'; +import { type HasuraTableMetadata, type HasuraMetadata, type HasuraSource } from './hasura-client'; describe('Provisioner', () => { let adminPgClient: any; @@ -13,15 +14,24 @@ describe('Provisioner', () => { let indexerConfig: IndexerConfig; const tableNames = ['blocks']; + const systemTables = [METADATA_TABLE_NAME, LOGS_TABLE_NAME]; + const tableNamesWithSystemTables = ['blocks', ...systemTables]; const accountId = 'morgs.near'; const functionName = 'test-function'; const databaseSchema = 'CREATE TABLE blocks (height numeric)'; indexerConfig = new IndexerConfig('', accountId, functionName, 0, '', databaseSchema, LogLevel.INFO); + const emptyHasuraMetadata = generateDefaultHasuraMetadata(); + const hasuraMetadataWithEmptySource = generateDefaultHasuraMetadata(); + hasuraMetadataWithEmptySource.sources.push(generateSourceWithTables([], [], indexerConfig.userName(), indexerConfig.databaseName())); + const hasuraMetadataWithSystemProvisions = generateDefaultHasuraMetadata(); + hasuraMetadataWithSystemProvisions.sources.push(generateSourceWithTables([indexerConfig.schemaName()], systemTables, indexerConfig.userName(), indexerConfig.databaseName())); + const hasuraMetadataWithProvisions = generateDefaultHasuraMetadata(); + hasuraMetadataWithProvisions.sources.push(generateSourceWithTables([indexerConfig.schemaName()], tableNamesWithSystemTables, indexerConfig.userName(), indexerConfig.databaseName())); const testingRetryConfig = { maxRetries: 5, baseDelay: 10 }; - const setProvisioningStatusQuery = `INSERT INTO ${indexerConfig.schemaName()}.sys_metadata (attribute, value) VALUES ('STATUS', 'PROVISIONING') ON CONFLICT (attribute) DO UPDATE SET value = EXCLUDED.value RETURNING *`; + const setProvisioningStatusQuery = `INSERT INTO ${indexerConfig.schemaName()}.${METADATA_TABLE_NAME} (attribute, value) VALUES ('STATUS', 'PROVISIONING') ON CONFLICT (attribute) DO UPDATE SET value = EXCLUDED.value RETURNING *`; const logsDDL = expect.any(String); const metadataDDL = expect.any(String); const error = new Error('some error'); @@ -39,7 +49,8 @@ describe('Provisioner', () => { beforeEach(() => { hasuraClient = { - getTableNames: jest.fn().mockReturnValueOnce(tableNames), + exportMetadata: jest.fn().mockResolvedValueOnce(emptyHasuraMetadata).mockResolvedValue(hasuraMetadataWithSystemProvisions), + getTableNames: jest.fn().mockResolvedValueOnce([]).mockResolvedValue(tableNamesWithSystemTables), trackTables: jest.fn().mockReturnValueOnce(null), trackForeignKeyRelationships: jest.fn().mockReturnValueOnce(null), addPermissionsToTables: jest.fn().mockReturnValueOnce(null), @@ -72,7 +83,13 @@ describe('Provisioner', () => { }; }); - provisioner = new Provisioner(hasuraClient, adminPgClient, cronPgClient, undefined, crypto, pgFormat, PgClient as any, testingRetryConfig); + const IndexerMeta = jest.fn().mockImplementation(() => { + return { + writeLogs: jest.fn() + }; + }); + + provisioner = new Provisioner(hasuraClient, adminPgClient, cronPgClient, undefined, crypto, pgFormat, PgClient as any, testingRetryConfig, IndexerMeta); indexerConfig = new IndexerConfig('', accountId, functionName, 0, '', databaseSchema, LogLevel.INFO); }); @@ -173,28 +190,6 @@ describe('Provisioner', () => { }); }); - describe('isUserApiProvisioned', () => { - it('returns false if datasource doesnt exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(false); - - await expect(provisioner.isProvisioned(indexerConfig)).resolves.toBe(false); - }); - - it('returns false if datasource and schema dont exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(false); - hasuraClient.doesSchemaExist = jest.fn().mockReturnValueOnce(false); - - await expect(provisioner.isProvisioned(indexerConfig)).resolves.toBe(false); - }); - - it('returns true if datasource and schema exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(true); - hasuraClient.doesSchemaExist = jest.fn().mockReturnValueOnce(true); - - await expect(provisioner.isProvisioned(indexerConfig)).resolves.toBe(true); - }); - }); - describe('provisionUserApi', () => { it('provisions an API for the user', async () => { await provisioner.provisionUserApi(indexerConfig); @@ -221,7 +216,20 @@ describe('Provisioner', () => { expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(2, indexerConfig.userName(), indexerConfig.schemaName(), logsDDL); expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(3, indexerConfig.userName(), indexerConfig.schemaName(), databaseSchema); expect(hasuraClient.getTableNames).toBeCalledWith(indexerConfig.schemaName(), indexerConfig.databaseName()); - expect(hasuraClient.trackTables).toBeCalledWith(indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(1, indexerConfig.schemaName(), [METADATA_TABLE_NAME, LOGS_TABLE_NAME], indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(2, indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.addPermissionsToTables).toBeCalledWith( + indexerConfig.schemaName(), + indexerConfig.databaseName(), + [METADATA_TABLE_NAME, LOGS_TABLE_NAME], + indexerConfig.userName(), + [ + 'select', + 'insert', + 'update', + 'delete' + ] + ); expect(hasuraClient.addPermissionsToTables).toBeCalledWith( indexerConfig.schemaName(), indexerConfig.databaseName(), @@ -237,7 +245,7 @@ describe('Provisioner', () => { }); it('skips provisioning the datasource if it already exists', async () => { - hasuraClient.doesSourceExist = jest.fn().mockReturnValueOnce(true); + hasuraClient.exportMetadata = jest.fn().mockResolvedValueOnce(hasuraMetadataWithEmptySource).mockResolvedValue(hasuraMetadataWithSystemProvisions); await provisioner.provisionUserApi(indexerConfig); @@ -249,7 +257,20 @@ describe('Provisioner', () => { expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(2, indexerConfig.userName(), indexerConfig.schemaName(), logsDDL); expect(hasuraClient.executeSqlOnSchema).toHaveBeenNthCalledWith(3, indexerConfig.databaseName(), indexerConfig.schemaName(), databaseSchema); expect(hasuraClient.getTableNames).toBeCalledWith(indexerConfig.schemaName(), indexerConfig.databaseName()); - expect(hasuraClient.trackTables).toBeCalledWith(indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(1, indexerConfig.schemaName(), [METADATA_TABLE_NAME, LOGS_TABLE_NAME], indexerConfig.databaseName()); + expect(hasuraClient.trackTables).toHaveBeenNthCalledWith(2, indexerConfig.schemaName(), tableNames, indexerConfig.databaseName()); + expect(hasuraClient.addPermissionsToTables).toBeCalledWith( + indexerConfig.schemaName(), + indexerConfig.databaseName(), + [METADATA_TABLE_NAME, LOGS_TABLE_NAME], + indexerConfig.userName(), + [ + 'select', + 'insert', + 'update', + 'delete' + ] + ); expect(hasuraClient.addPermissionsToTables).toBeCalledWith( indexerConfig.schemaName(), indexerConfig.databaseName(), @@ -264,6 +285,22 @@ describe('Provisioner', () => { ); }); + it('skips all provisioning if all provisioning tasks already done', async () => { + hasuraClient.exportMetadata = jest.fn().mockResolvedValue(hasuraMetadataWithProvisions); + hasuraClient.getTableNames = jest.fn().mockResolvedValue(tableNamesWithSystemTables); + + await provisioner.provisionUserApi(indexerConfig); + + expect(adminPgClient.query).not.toBeCalled(); + expect(hasuraClient.addDatasource).not.toBeCalled(); + + expect(hasuraClient.createSchema).not.toBeCalled(); + expect(hasuraClient.executeSqlOnSchema).not.toBeCalled(); + expect(hasuraClient.trackTables).not.toBeCalled(); + expect(hasuraClient.trackForeignKeyRelationships).toHaveBeenCalledTimes(1); + expect(hasuraClient.addPermissionsToTables).not.toBeCalled(); + }); + it('formats user input before executing the query', async () => { await provisioner.createUserDb('morgs_near', 'pass; DROP TABLE users;--', 'databaseName UNION SELECT * FROM users --'); @@ -306,12 +343,6 @@ describe('Provisioner', () => { await expect(provisioner.runLogsSql(accountId, functionName)).rejects.toThrow('Failed to run logs script: some error'); }); - it('throws an error when it fails to fetch table names', async () => { - hasuraClient.getTableNames = jest.fn().mockRejectedValue(error); - - await expect(provisioner.provisionUserApi(indexerConfig)).rejects.toThrow('Failed to provision endpoint: Failed to fetch table names: some error'); - }); - it('throws an error when it fails to track tables', async () => { hasuraClient.trackTables = jest.fn().mockRejectedValue(error); @@ -401,3 +432,52 @@ describe('Provisioner', () => { }); }); }); + +function generateDefaultHasuraMetadata (): HasuraMetadata { + const sources: HasuraSource[] = []; + // Insert default source which has different format than the rest + sources.push({ + name: 'default', + kind: 'postgres', + tables: [], + configuration: { + connection_info: { + database_url: { from_env: 'HASURA_GRAPHQL_DATABASE_URL' }, + } + } + }); + + return { + version: 3, + sources + }; +} + +function generateSourceWithTables (schemaNames: string[], tableNames: string[], role: string, db: string): HasuraSource { + const tables: HasuraTableMetadata[] = []; + schemaNames.forEach((schemaName) => { + tableNames.forEach((tableName) => { + tables.push(generateTableConfig(schemaName, tableName, role)); + }); + }); + + return { + name: db, + kind: 'postgres', + tables, + configuration: {} as any, + }; +} + +function generateTableConfig (schemaName: string, tableName: string, role: string): HasuraTableMetadata { + return { + table: { + name: tableName, + schema: schemaName, + }, + insert_permissions: [{ role, permission: {} }], + select_permissions: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; +} diff --git a/runner/src/provisioner/provisioner.ts b/runner/src/provisioner/provisioner.ts index f9d4e5118..398ab05f6 100644 --- a/runner/src/provisioner/provisioner.ts +++ b/runner/src/provisioner/provisioner.ts @@ -5,12 +5,14 @@ import { wrapError, wrapSpan } from '../utility'; import cryptoModule from 'crypto'; import HasuraClient, { type HasuraDatabaseConnectionParameters, -} from '../hasura-client'; +} from './hasura-client'; import { logsTableDDL } from './schemas/logs-table'; import { metadataTableDDL } from './schemas/metadata-table'; import PgClientClass, { type PostgresConnectionParams } from '../pg-client'; import { type ProvisioningConfig } from '../indexer-config/indexer-config'; -import { METADATA_TABLE_UPSERT, MetadataFields, IndexerStatus } from '../indexer-meta'; +import IndexerMetaClass, { METADATA_TABLE_UPSERT, MetadataFields, IndexerStatus, LogEntry } from '../indexer-meta'; +import logger from '../logger'; +import ProvisioningState from './provisioning-state/provisioning-state'; const DEFAULT_PASSWORD_LENGTH = 16; @@ -57,9 +59,15 @@ const defaultRetryConfig: RetryConfig = { baseDelay: 1000 }; +export const METADATA_TABLE_NAME = 'sys_metadata'; +export const LOGS_TABLE_NAME = 'sys_logs'; + export default class Provisioner { tracer: Tracer = trace.getTracer('queryapi-runner-provisioner'); + private readonly SYSTEM_TABLES = [METADATA_TABLE_NAME, LOGS_TABLE_NAME]; + private readonly logger: typeof logger; + constructor ( private readonly hasuraClient: HasuraClient = new HasuraClient(), private readonly adminDefaultPgClient: PgClientClass = adminDefaultPgClientGlobal, @@ -69,7 +77,10 @@ export default class Provisioner { private readonly pgFormat: typeof pgFormatLib = pgFormatLib, private readonly PgClient: typeof PgClientClass = PgClientClass, private readonly retryConfig: RetryConfig = defaultRetryConfig, - ) {} + private readonly IndexerMeta: typeof IndexerMetaClass = IndexerMetaClass + ) { + this.logger = logger.child({ service: 'Provisioner' }); + } generatePassword (length: number = DEFAULT_PASSWORD_LENGTH): string { return this.crypto @@ -155,24 +166,6 @@ export default class Provisioner { ); } - async isProvisioned (indexerConfig: ProvisioningConfig): Promise { - const checkProvisioningSpan = this.tracer.startSpan('Check if indexer is provisioned'); - - const databaseName = indexerConfig.databaseName(); - const schemaName = indexerConfig.schemaName(); - - const sourceExists = await this.hasuraClient.doesSourceExist(databaseName); - if (!sourceExists) { - return false; - } - - const schemaExists = await this.hasuraClient.doesSchemaExist(databaseName, schemaName); - - checkProvisioningSpan.end(); - - return schemaExists; - } - async createSchema (databaseName: string, schemaName: string): Promise { return await wrapError(async () => await this.hasuraClient.createSchema(databaseName, schemaName), 'Failed to create schema'); } @@ -202,10 +195,6 @@ export default class Provisioner { return await wrapError(async () => await this.hasuraClient.executeSqlOnSchema(databaseName, schemaName, sqlScript), 'Failed to run user script'); } - async getTableNames (schemaName: string, databaseName: string): Promise { - return await wrapError(async () => await this.hasuraClient.getTableNames(schemaName, databaseName), 'Failed to fetch table names'); - } - async trackTables (schemaName: string, tableNames: string[], databaseName: string): Promise { return await wrapError(async () => await this.hasuraClient.trackTables(schemaName, tableNames, databaseName), 'Failed to track tables'); } @@ -322,42 +311,132 @@ export default class Provisioner { }, 'Failed to deprovision'); } - async provisionUserApi (indexerConfig: ProvisioningConfig): Promise { // replace any with actual type + async provisionUserApi (indexerConfig: ProvisioningConfig): Promise { + const logger = this.logger.child({ accountId: indexerConfig.accountId, functionName: indexerConfig.functionName }); + + await wrapSpan(async () => { + await wrapError(async () => { + let provisioningState: ProvisioningState; + try { + provisioningState = await ProvisioningState.loadProvisioningState(this.hasuraClient, indexerConfig); + } catch (error) { + logger.error('Failed to get current state of indexer resources', error); + throw error; + } + try { + await this.provisionSystemResources(indexerConfig, provisioningState); + } catch (error) { + logger.error('Failed to provision system resources', error); + throw error; + } + + try { + await this.provisionUserResources(indexerConfig, provisioningState); + } catch (err) { + const error = err as Error; + + try { + await this.writeFailureToUserLogs(indexerConfig, error); + } catch (error) { + logger.error('Failed to log provisioning failure', error); + } + + logger.warn('Failed to provision user resources', error); + throw error; + } + }, 'Failed to provision endpoint'); + }, this.tracer, 'provision indexer resources'); + } + + async writeFailureToUserLogs (indexerConfig: ProvisioningConfig, error: Error): Promise { + const indexerMeta = new this.IndexerMeta(indexerConfig, await this.getPostgresConnectionParameters(indexerConfig.userName())); + await indexerMeta.writeLogs([LogEntry.systemError(error.message)]); + } + + async provisionSystemResources (indexerConfig: ProvisioningConfig, provisioningState: ProvisioningState): Promise { const userName = indexerConfig.userName(); const databaseName = indexerConfig.databaseName(); const schemaName = indexerConfig.schemaName(); - await wrapSpan(async () => { - await wrapError( - async () => { - if (!await this.hasuraClient.doesSourceExist(databaseName)) { - const password = this.generatePassword(); - await this.createUserDb(userName, password, databaseName); - await this.addDatasource(userName, password, databaseName); - } + if (!provisioningState.doesSourceExist()) { + const password = this.generatePassword(); + await this.createUserDb(userName, password, databaseName); + await this.addDatasource(userName, password, databaseName); + } else { + logger.debug('Source already exists'); + } - await this.createSchema(databaseName, schemaName); + if (!provisioningState.doesSchemaExist()) { + await this.createSchema(databaseName, schemaName); + } else { + logger.debug('Schema already exists'); + } - await this.createMetadataTable(databaseName, schemaName); - await this.setProvisioningStatus(userName, schemaName); - await this.setupPartitionedLogsTable(userName, databaseName, schemaName); - await this.runIndexerSql(databaseName, schemaName, indexerConfig.schema); + const createdTables = provisioningState.getCreatedTables(); - const updatedTableNames = await this.getTableNames(schemaName, databaseName); + if (!createdTables.includes(METADATA_TABLE_NAME)) { + await this.createMetadataTable(databaseName, schemaName); + } else { + logger.debug('Metadata table already exists'); + } + await this.setProvisioningStatus(userName, schemaName); - await this.trackTables(schemaName, updatedTableNames, databaseName); + if (!createdTables.includes(LOGS_TABLE_NAME)) { + await this.setupPartitionedLogsTable(userName, databaseName, schemaName); + } else { + logger.debug('Logs table already exists'); + } - await this.exponentialRetry(async () => { - await this.trackForeignKeyRelationships(schemaName, databaseName); - }); + const tablesToTrack = this.SYSTEM_TABLES.filter(systemTable => !provisioningState.getTrackedTables().includes(systemTable)); + if (tablesToTrack.length > 0) { + await this.trackTables(schemaName, tablesToTrack, databaseName); + } else { + logger.debug('All system tables are already tracked'); + } - await this.exponentialRetry(async () => { - await this.addPermissionsToTables(indexerConfig, updatedTableNames, ['select', 'insert', 'update', 'delete']); - }); - }, - 'Failed to provision endpoint' - ); - }, this.tracer, 'provision indexer resources'); + const tablesToAddPermissions = this.SYSTEM_TABLES.filter(systemTable => !provisioningState.getTablesWithPermissions().includes(systemTable)); + if (tablesToAddPermissions.length > 0) { + await this.exponentialRetry(async () => { + await this.addPermissionsToTables(indexerConfig, tablesToAddPermissions, ['select', 'insert', 'update', 'delete']); + }); + } else { + logger.debug('All system tables already have permissions'); + } + } + + async provisionUserResources (indexerConfig: ProvisioningConfig, provisioningState: ProvisioningState): Promise { + const databaseName = indexerConfig.databaseName(); + const schemaName = indexerConfig.schemaName(); + + const onlySystemTablesCreated = provisioningState.getCreatedTables().every((table) => this.SYSTEM_TABLES.includes(table)); + if (onlySystemTablesCreated) { + await this.runIndexerSql(databaseName, schemaName, indexerConfig.schema); + } else { + logger.debug('Skipping user script execution as non system tables have already been created'); + } + + await provisioningState.reload(this.hasuraClient); + const userTableNames = provisioningState.getCreatedTables().filter((tableName) => !provisioningState.getTrackedTables().includes(tableName)); + + if (userTableNames.length > 0) { + await this.trackTables(schemaName, userTableNames, databaseName); + } else { + logger.debug('No user tables to track'); + } + + // Safely retryable + await this.exponentialRetry(async () => { + await this.trackForeignKeyRelationships(schemaName, databaseName); + }); + + const tablesWithoutPermissions = userTableNames.filter((tableName) => !provisioningState.getTablesWithPermissions().includes(tableName)); + if (tablesWithoutPermissions.length > 0) { + await this.exponentialRetry(async () => { + await this.addPermissionsToTables(indexerConfig, userTableNames, ['select', 'insert', 'update', 'delete']); + }); + } else { + logger.debug('All user tables already have permissions'); + } } async exponentialRetry (fn: () => Promise): Promise { diff --git a/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap b/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap new file mode 100644 index 000000000..e4dccf844 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/__snapshots__/provisioning-state.test.ts.snap @@ -0,0 +1,250 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ProvisioiningState correctly fetch metadata for existing source and schema 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; + +exports[`ProvisioiningState handles table with missing permissions 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableC", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permission": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableD", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; + +exports[`ProvisioiningState reload loads metadata and created tables 1`] = ` +[ + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableA", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, + { + "delete_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "insert_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "select_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + "table": { + "name": "tableB", + "schema": "account_id_function_name", + }, + "update_permissions": [ + { + "permission": {}, + "role": "account_id", + }, + ], + }, +] +`; diff --git a/runner/src/provisioner/provisioning-state/index.ts b/runner/src/provisioner/provisioning-state/index.ts new file mode 100644 index 000000000..468349a65 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/index.ts @@ -0,0 +1 @@ +export { default } from './provisioning-state'; diff --git a/runner/src/provisioner/provisioning-state/provisioning-state.test.ts b/runner/src/provisioner/provisioning-state/provisioning-state.test.ts new file mode 100644 index 000000000..4b9c2bd21 --- /dev/null +++ b/runner/src/provisioner/provisioning-state/provisioning-state.test.ts @@ -0,0 +1,219 @@ +import { ProvisioningConfig } from '../../indexer-config'; +import { LogLevel } from '../../indexer-meta/log-entry'; +import type HasuraClient from '../hasura-client'; +import { type HasuraTableMetadata, type HasuraConfiguration, type HasuraDatabaseConnectionParameters, type HasuraSource, type HasuraMetadata } from '../hasura-client'; +import ProvisioningState from './provisioning-state'; + +describe('ProvisioiningState', () => { + const provisioningConfig = new ProvisioningConfig( + 'account-id', + 'function-name', + 'schema', + LogLevel.INFO, + ); + + it('can create state whether source exists or not', async () => { + const metadataWithoutUser = generateHasuraMetadata(['some_schema'], ['tableA', 'tableB'], 'someAccount', 'someDb'); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithoutUser); + const mockGetTableNames = jest.fn().mockRejectedValueOnce(new Error('{"error":"source with name "someAccount" does not exist","path":"$.args","code":"not-exists"}')); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(false); + expect(provisioningState.doesSchemaExist()).toBe(false); + expect(provisioningState.getCreatedTables()).toEqual([]); + expect(provisioningState.getSourceMetadata()).toEqual(undefined); + expect(provisioningState.getMetadataForTables()).toEqual([]); + expect(provisioningState.getTrackedTables()).toEqual([]); + expect(provisioningState.getTablesWithPermissions()).toEqual([]); + }); + + it('state works with existing source', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole', 'anotherDb')); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(true); + expect(provisioningState.doesSchemaExist()).toBe(true); + expect(provisioningState.getCreatedTables()).toEqual(['tableA']); + }); + + it('correctly fetch metadata for existing source and schema', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole', 'anotherDb')); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.getSourceMetadata()?.name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(2); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); + + it('reload loads metadata and created tables', async () => { + const metadataWithoutUser = generateHasuraMetadata(['some_schema'], ['tableA', 'tableB'], 'someAccount', 'someDb'); + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], 'anotherRole', 'anotherDb')); + const mockExportMetadata = jest.fn().mockResolvedValueOnce(metadataWithoutUser).mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockRejectedValueOnce(new Error('{"error":"source with name "someAccount" does not exist","path":"$.args","code":"not-exists"}')).mockResolvedValueOnce(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.doesSourceExist()).toBe(false); + expect(provisioningState.doesSchemaExist()).toBe(false); + expect(provisioningState.getCreatedTables()).toEqual([]); + expect(provisioningState.getSourceMetadata()).toEqual(undefined); + + await provisioningState.reload(mockHasuraClient); + expect(provisioningState.getSourceMetadata()?.name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(2); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); + + it('handles table with missing permissions', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + const role = provisioningConfig.hasuraRoleName(); + const tableMissingPermissions = { + table: { + name: 'tableC', + schema: provisioningConfig.schemaName(), + }, + insert_permissions: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; + const tableWithIncorrectlyNamedPermission = { + table: { + name: 'tableD', + schema: provisioningConfig.schemaName(), + }, + select_permissions: [{ role, permission: {} }], + insert_permission: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; + metadataWithUser.sources[1].tables.push(tableMissingPermissions); // First source is a default source + metadataWithUser.sources[1].tables.push(tableWithIncorrectlyNamedPermission); + + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(provisioningState.getSourceMetadata()?.name).toBe(provisioningConfig.hasuraRoleName()); + expect(provisioningState.getMetadataForTables().length).toBe(4); + expect(provisioningState.getMetadataForTables()).toMatchSnapshot(); + expect(provisioningState.getTrackedTables()).toEqual(['tableA', 'tableB', 'tableC', 'tableD']); + expect(provisioningState.getTablesWithPermissions()).toEqual(['tableA', 'tableB']); + }); + + it('throws error when multiple sources with same name exist', async () => { + const metadataWithUser = generateHasuraMetadata([provisioningConfig.schemaName(), 'some_schema'], ['tableA', 'tableB'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName()); + metadataWithUser.sources.push(generateSourceWithTables(['anotherSchema'], ['anotherTable'], provisioningConfig.hasuraRoleName(), provisioningConfig.databaseName())); + const mockExportMetadata = jest.fn().mockResolvedValue(metadataWithUser); + const mockGetTableNames = jest.fn().mockResolvedValue(['tableA']); + const mockHasuraClient = { + exportMetadata: mockExportMetadata, + getTableNames: mockGetTableNames, + } as unknown as HasuraClient; + + const provisioningState = await ProvisioningState.loadProvisioningState(mockHasuraClient, provisioningConfig); + expect(() => provisioningState.getSourceMetadata()).toThrow('Expected no more than one source'); + expect(() => provisioningState.getMetadataForTables()).toThrow('Expected no more than one source'); + expect(() => provisioningState.getTrackedTables()).toThrow('Expected no more than one source'); + }); +}); + +function generateHasuraMetadata (schemaNames: string[], tableNames: string[], role: string, db: string): HasuraMetadata { + const sources: HasuraSource[] = []; + // Insert default source which has different format than the rest + sources.push({ + name: 'default', + kind: 'postgres', + tables: [], + configuration: { + connection_info: { + database_url: { from_env: 'HASURA_GRAPHQL_DATABASE_URL' }, + } + } + }); + + sources.push(generateSourceWithTables(schemaNames, tableNames, role, db)); + + return { + version: 3, + sources + }; +} + +function generateSourceWithTables (schemaNames: string[], tableNames: string[], role: string, db: string): HasuraSource { + const tables: HasuraTableMetadata[] = []; + schemaNames.forEach((schemaName) => { + tableNames.forEach((tableName) => { + tables.push(generateTableConfig(schemaName, tableName, role)); + }); + }); + + return { + name: db, + kind: 'postgres', + tables, + configuration: generateHasuraConfiguration(role, 'password'), + }; +} + +function generateTableConfig (schemaName: string, tableName: string, role: string): HasuraTableMetadata { + return { + table: { + name: tableName, + schema: schemaName, + }, + insert_permissions: [{ role, permission: {} }], + select_permissions: [{ role, permission: {} }], + update_permissions: [{ role, permission: {} }], + delete_permissions: [{ role, permission: {} }], + }; +} + +function generateHasuraConfiguration (user: string, password: string): HasuraConfiguration { + return { + connection_info: { + database_url: { connection_parameters: generateConnectionParameter(user, password) }, + isolation_level: 'read-committed', + use_prepared_statements: false + } + }; +} + +function generateConnectionParameter (user: string, password: string): HasuraDatabaseConnectionParameters { + return { + database: user, + host: 'postgres', + password, + port: 5432, + username: user + }; +} diff --git a/runner/src/provisioner/provisioning-state/provisioning-state.ts b/runner/src/provisioner/provisioning-state/provisioning-state.ts new file mode 100644 index 000000000..412fd4b5e --- /dev/null +++ b/runner/src/provisioner/provisioning-state/provisioning-state.ts @@ -0,0 +1,81 @@ +import { type ProvisioningConfig } from '../../indexer-config'; +import { type HasuraTableMetadata, type HasuraMetadata, type HasuraSource, HASURA_PERMISSION_TYPES } from '../hasura-client'; +import type HasuraClient from '../hasura-client'; + +export default class ProvisioningState { + constructor ( + private readonly config: ProvisioningConfig, + private hasuraMetadata: HasuraMetadata, + private tablesInSource: string[], + ) {} + + static async loadProvisioningState (hasuraClient: HasuraClient, provisioningConfig: ProvisioningConfig): Promise { + const hasuraMetadata = await hasuraClient.exportMetadata(); + const tablesInSource = await hasuraClient.getTableNames(provisioningConfig.schemaName(), provisioningConfig.databaseName()).catch((err) => { + const error = err as Error; + if (error.message.includes('source with name') && error.message.includes('not-exists')) { + return []; + } + throw error; + }); + return new ProvisioningState(provisioningConfig, hasuraMetadata, tablesInSource); + } + + async reload (hasuraClient: HasuraClient): Promise { + this.hasuraMetadata = await hasuraClient.exportMetadata(); + this.tablesInSource = await hasuraClient.getTableNames(this.config.schemaName(), this.config.databaseName()).catch((err) => { + const error = err as Error; + if (error.message.includes('source with name') && error.message.includes('not-exists')) { + return []; + } + throw error; + }); + } + + doesSourceExist (): boolean { + return this.hasuraMetadata.sources.some(source => source.name === this.config.databaseName()); + } + + doesSchemaExist (): boolean { + return this.hasuraMetadata.sources.some( + source => source.name === this.config.databaseName() && + source.tables.some( + table => table.table.schema === this.config.schemaName() + ) + ); + } + + getCreatedTables (): string[] { + return this.tablesInSource; + } + + getSourceMetadata (): HasuraSource | undefined { + const matchedSource = this.hasuraMetadata.sources.filter(source => source.name === this.config.databaseName()); + if (matchedSource.length > 1) { + throw new Error(`Expected no more than one source with name ${this.config.databaseName()}. Found ${matchedSource.length}`); + }; + return matchedSource.length === 0 ? undefined : matchedSource[0]; + } + + getMetadataForTables (): HasuraTableMetadata[] { + return this.getSourceMetadata()?.tables.filter(tableMetadata => tableMetadata.table.schema === this.config.schemaName()) ?? []; + } + + getTrackedTables (): string[] { + return this.getMetadataForTables().map(tableMetadata => tableMetadata.table.name); + } + + private tableContainsAllPermissions (tableMetadata: HasuraTableMetadata): boolean { + const allPermissions: string[] = HASURA_PERMISSION_TYPES.map(permission => `${permission}_permissions`); + const metadataKeys = Object.keys(tableMetadata); + return allPermissions.every(permission => metadataKeys.includes(permission)); + } + + // Does not check for partial permissions + getTablesWithPermissions (): string[] { + const tableMetadataList = this.getMetadataForTables(); + return tableMetadataList + .filter(metadata => this.tableContainsAllPermissions(metadata)) + .map(metadata => metadata.table.name); + } +} diff --git a/runner/src/server/services/data-layer/data-layer-service.test.ts b/runner/src/server/services/data-layer/data-layer-service.test.ts index 88541de69..8989c8a06 100644 --- a/runner/src/server/services/data-layer/data-layer-service.test.ts +++ b/runner/src/server/services/data-layer/data-layer-service.test.ts @@ -67,23 +67,6 @@ describe('DataLayerService', () => { }); describe('StartProvisioningTask', () => { - it('returns FAILED_PRECONDITION if already provisioned', (done) => { - const provisioner = { - isProvisioned: jest.fn().mockResolvedValue(true) - } as unknown as Provisioner; - const tasks = {}; - const call = { - request: { accountId: 'testAccount', functionName: 'testFunction', schema: 'testSchema' } - } as unknown as ServerUnaryCall; - const callback = (error: any): void => { - expect(error.code).toBe(status.FAILED_PRECONDITION); - expect(error.details).toBe('Data Layer is already provisioned'); - done(); - }; - - createDataLayerService(provisioner, tasks).StartProvisioningTask(call, callback); - }); - it('should start a new provisioning task', (done) => { const tasks: Record = {}; const provisioner = { diff --git a/runner/src/server/services/data-layer/data-layer-service.ts b/runner/src/server/services/data-layer/data-layer-service.ts index d24befa02..89332b136 100644 --- a/runner/src/server/services/data-layer/data-layer-service.ts +++ b/runner/src/server/services/data-layer/data-layer-service.ts @@ -87,47 +87,19 @@ export function createDataLayerService ( const logger = createLogger(provisioningConfig); - provisioner - .isProvisioned(provisioningConfig) - .then((isProvisioned) => { - if (isProvisioned) { - const failedPrecondition = new StatusBuilder() - .withCode(status.FAILED_PRECONDITION) - .withDetails('Data Layer is already provisioned') - .build(); - - callback(failedPrecondition); - - return; - } - - const taskId = crypto.randomUUID(); - - logger.info(`Starting provisioning task: ${taskId}`); - - tasks[taskId] = new AsyncTask( - provisioner - .provisionUserApi(provisioningConfig) - .then(() => { - logger.info('Successfully provisioned Data Layer'); - }) - .catch((err) => { - logger.error('Failed to provision Data Layer', err); - throw err; - }) - ); - - callback(null, { taskId }); - }) - .catch((err) => { - logger.error('Failed to check if Data Layer is provisioned', err); - - const internal = new StatusBuilder() - .withCode(status.INTERNAL) - .withDetails('Failed to check Data Layer provisioned status') - .build(); - callback(internal); - }); + const taskId = crypto.randomUUID(); + + logger.info(`Starting provisioning task: ${taskId}`); + + tasks[taskId] = new AsyncTask( + provisioner + .provisionUserApi(provisioningConfig) + .then(() => { + logger.info('Successfully provisioned Data Layer'); + }) + ); + + callback(null, { taskId }); }, StartDeprovisioningTask (call: ServerUnaryCall, callback: sendUnaryData): void { @@ -148,7 +120,7 @@ export function createDataLayerService ( logger.info('Successfully deprovisioned Data Layer'); }) .catch((err) => { - logger.error('Failed to deprovision Data Layer', err); + logger.warn('Failed to deprovision Data Layer', err); throw err; }) ); diff --git a/runner/src/server/services/runner/runner-service.ts b/runner/src/server/services/runner/runner-service.ts index 6299beac5..dd29d3921 100644 --- a/runner/src/server/services/runner/runner-service.ts +++ b/runner/src/server/services/runner/runner-service.ts @@ -81,7 +81,7 @@ export function getRunnerService ( executors.set(indexerConfig.executorId, streamHandler); callback(null, { executorId: indexerConfig.executorId }); streamHandler.start().catch((error: Error) => { - logger.error('Failed to start executor', error); + logger.warn('Failed to start executor', error); }); } catch (e) { const error = e as Error; diff --git a/runner/src/redis-client/index.ts b/runner/src/stream-handler/redis-client/index.ts similarity index 100% rename from runner/src/redis-client/index.ts rename to runner/src/stream-handler/redis-client/index.ts diff --git a/runner/src/redis-client/redis-client.test.ts b/runner/src/stream-handler/redis-client/redis-client.test.ts similarity index 100% rename from runner/src/redis-client/redis-client.test.ts rename to runner/src/stream-handler/redis-client/redis-client.test.ts diff --git a/runner/src/redis-client/redis-client.ts b/runner/src/stream-handler/redis-client/redis-client.ts similarity index 97% rename from runner/src/redis-client/redis-client.ts rename to runner/src/stream-handler/redis-client/redis-client.ts index 645987c6b..854278cab 100644 --- a/runner/src/redis-client/redis-client.ts +++ b/runner/src/stream-handler/redis-client/redis-client.ts @@ -1,6 +1,6 @@ import { createClient, type RedisClientType } from 'redis'; -import logger from '../logger'; +import logger from '../../logger'; interface StreamMessage { id: string diff --git a/runner/src/stream-handler/stream-handler.ts b/runner/src/stream-handler/stream-handler.ts index b6742840d..9b9ea9eed 100644 --- a/runner/src/stream-handler/stream-handler.ts +++ b/runner/src/stream-handler/stream-handler.ts @@ -74,7 +74,7 @@ export default class StreamHandler { this.executorContext.executionState = ExecutionState.RUNNING; } catch (error: any) { const errorContent = error instanceof Error ? error.toString() : JSON.stringify(error); - this.logger.error('Terminating thread', error); + this.logger.warn('Terminating thread', error); this.executorContext.executionState = ExecutionState.STALLED; throw new Error(`Failed to start Indexer: ${errorContent}`); } @@ -92,7 +92,7 @@ export default class StreamHandler { } private handleError (error: Error): void { - this.logger.error('Terminating thread', error); + this.logger.warn('Terminating thread', error); this.executorContext.executionState = ExecutionState.STALLED; if (this.indexerMeta) { diff --git a/runner/src/stream-handler/worker.ts b/runner/src/stream-handler/worker.ts index 1403d6605..a9014b140 100644 --- a/runner/src/stream-handler/worker.ts +++ b/runner/src/stream-handler/worker.ts @@ -3,8 +3,8 @@ import { trace, type Span, context } from '@opentelemetry/api'; import promClient from 'prom-client'; import { Block } from '@near-lake/primitives'; -import Indexer from '../indexer'; -import RedisClient from '../redis-client'; +import { Indexer } from '../indexer'; +import RedisClient from './redis-client'; import { METRICS } from '../metrics'; import LakeClient from '../lake-client'; import { WorkerMessageType, type WorkerMessage, ExecutionState } from './stream-handler'; @@ -14,7 +14,8 @@ import IndexerConfig from '../indexer-config'; import parentLogger from '../logger'; import { wrapSpan } from '../utility'; import { type PostgresConnectionParams } from '../pg-client'; -import DmlHandler from '../dml-handler/dml-handler'; +import { DmlHandler } from '../indexer/dml-handler'; +import ContextBuilder from '../indexer/context-builder'; if (isMainThread) { throw new Error('Worker should not be run on main thread'); @@ -102,8 +103,9 @@ async function blockQueueConsumer (workerContext: WorkerContext): Promise const indexerConfig: IndexerConfig = workerContext.indexerConfig; const dmlHandler: DmlHandler = new DmlHandler(workerContext.databaseConnectionParams, indexerConfig); + const contextBuilder: ContextBuilder = new ContextBuilder(indexerConfig, { dmlHandler }); const indexerMeta: IndexerMeta = new IndexerMeta(indexerConfig, workerContext.databaseConnectionParams); - const indexer = new Indexer(indexerConfig, { dmlHandler, indexerMeta }); + const indexer = new Indexer(indexerConfig, { contextBuilder, indexerMeta }); let streamMessageId = ''; let currBlockHeight = 0; @@ -187,7 +189,7 @@ async function blockQueueConsumer (workerContext: WorkerContext): Promise const error = err as Error; if (previousError !== error.message) { previousError = error.message; - workerContext.logger.error(`Failed on block ${currBlockHeight}`, err); + workerContext.logger.warn(`Failed on block ${currBlockHeight}`, err); } const sleepSpan = tracer.startSpan('Sleep for 10 seconds after failing', {}, context.active()); await sleep(10000); diff --git a/runner/tests/integration.test.ts b/runner/tests/integration.test.ts index 7b2112b00..717fc79db 100644 --- a/runner/tests/integration.test.ts +++ b/runner/tests/integration.test.ts @@ -2,8 +2,8 @@ import { Block, type StreamerMessage } from '@near-lake/primitives'; import { Network, type StartedNetwork } from 'testcontainers'; import { gql, GraphQLClient } from 'graphql-request'; -import Indexer from '../src/indexer'; -import HasuraClient from '../src/hasura-client'; +import { Indexer } from '../src/indexer'; +import HasuraClient from '../src/provisioner/hasura-client'; import Provisioner from '../src/provisioner'; import PgClient from '../src/pg-client'; @@ -14,7 +14,8 @@ import block_115185109 from './blocks/00115185109/streamer_message.json'; import { LogLevel } from '../src/indexer-meta/log-entry'; import IndexerConfig from '../src/indexer-config'; import IndexerMeta from '../src/indexer-meta/indexer-meta'; -import DmlHandler from '../src/dml-handler/dml-handler'; +import { DmlHandler } from '../src/indexer/dml-handler'; +import ContextBuilder from '../src/indexer/context-builder'; describe('Indexer integration', () => { jest.setTimeout(300_000); @@ -65,7 +66,7 @@ describe('Indexer integration', () => { postgresContainer = await (await PostgreSqlContainer.build()) .withNetwork(network) .start(); - hasuraContainer = await (await HasuraGraphQLContainer.build()) + hasuraContainer = await new HasuraGraphQLContainer() .withNetwork(network) .withDatabaseUrl(postgresContainer.getConnectionUri(network.getName())) .start(); @@ -269,29 +270,49 @@ describe('Indexer integration', () => { await expect(pgClient.query('SELECT * FROM cron.job WHERE jobname like $1', ['provisioning_near_test_provisioning%']).then(({ rows }) => rows)).resolves.toHaveLength(0); await expect(hasuraClient.doesSourceExist(testConfig1.databaseName())).resolves.toBe(false); }); + + it('Writes provisioning errors to user logs table', async () => { + const testConfig = new IndexerConfig( + 'test:stream', + 'user-failures.near', // must be unique to prevent conflicts with other tests + 'test', + 0, + '', + 'broken schema', + LogLevel.INFO + ); + + await expect(provisioner.provisionUserApi(testConfig)).rejects.toThrow(); + + const logs: any = await indexerLogsQuery(testConfig.schemaName(), graphqlClient); + expect(logs[0].message).toContain('Failed to run user script'); + }); }); -async function prepareIndexer(indexerConfig: IndexerConfig, provisioner: Provisioner, hasuraContainer: StartedHasuraGraphQLContainer): Promise { +async function prepareIndexer (indexerConfig: IndexerConfig, provisioner: Provisioner, hasuraContainer: StartedHasuraGraphQLContainer): Promise { await provisioner.provisionUserApi(indexerConfig); - const db_connection_params = await provisioner.getPostgresConnectionParameters(indexerConfig.userName()); - const dmlHandler = new DmlHandler(db_connection_params, indexerConfig); - const indexerMeta = new IndexerMeta(indexerConfig, db_connection_params); + const dbConnectionParams = await provisioner.getPostgresConnectionParameters(indexerConfig.userName()); + const dmlHandler = new DmlHandler(dbConnectionParams, indexerConfig); + const contextBuilder = new ContextBuilder( + indexerConfig, + { dmlHandler }, + { + hasuraAdminSecret: hasuraContainer.getAdminSecret(), + hasuraEndpoint: hasuraContainer.getEndpoint(), + }); + const indexerMeta = new IndexerMeta(indexerConfig, dbConnectionParams); return new Indexer( indexerConfig, { - dmlHandler, + contextBuilder, indexerMeta, - }, - { - hasuraAdminSecret: hasuraContainer.getAdminSecret(), - hasuraEndpoint: hasuraContainer.getEndpoint(), } ); } -async function indexerLogsQuery(indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { +async function indexerLogsQuery (indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { const graphqlResult: any = await graphqlClient.request(gql` query { ${indexerSchemaName}_sys_logs { @@ -302,15 +323,15 @@ async function indexerLogsQuery(indexerSchemaName: string, graphqlClient: GraphQ return graphqlResult[`${indexerSchemaName}_sys_logs`]; } -async function indexerStatusQuery(indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { +async function indexerStatusQuery (indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { return await indexerMetadataQuery(indexerSchemaName, 'STATUS', graphqlClient); } -async function indexerBlockHeightQuery(indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { +async function indexerBlockHeightQuery (indexerSchemaName: string, graphqlClient: GraphQLClient): Promise { return await indexerMetadataQuery(indexerSchemaName, 'LAST_PROCESSED_BLOCK_HEIGHT', graphqlClient); } -async function indexerMetadataQuery(indexerSchemaName: string, attribute: string, graphqlClient: GraphQLClient): Promise { +async function indexerMetadataQuery (indexerSchemaName: string, attribute: string, graphqlClient: GraphQLClient): Promise { const graphqlResult: any = await graphqlClient.request(gql` query { ${indexerSchemaName}_sys_metadata(where: {attribute: {_eq: "${attribute}"}}) { diff --git a/runner/tests/testcontainers/hasura.ts b/runner/tests/testcontainers/hasura.ts index 4fe28cd0c..98085149a 100644 --- a/runner/tests/testcontainers/hasura.ts +++ b/runner/tests/testcontainers/hasura.ts @@ -9,19 +9,13 @@ export class HasuraGraphQLContainer { private readonly PORT = 8080; - private constructor (private readonly container: GenericContainer) { + constructor (private readonly container = new GenericContainer('hasura/graphql-engine:latest')) { container.withExposedPorts(this.PORT) - .withWaitStrategy(Wait.forLogMessage(/.*Starting API server.*/, 2)) + .withWaitStrategy(Wait.forLogMessage(/.*Starting API server.*/i)) .withLogConsumer(logConsumer) .withStartupTimeout(120_000); } - public static async build (): Promise { - const container = await GenericContainer.fromDockerfile('../hasura/').build(); - - return new HasuraGraphQLContainer(container); - } - public withNetwork (network: StartedNetwork): this { this.container.withNetwork(network); return this;