diff --git a/.sqlx/query-13d435d8f681b73e4080748dcef0579e246e41049af67e1bd79ffc06aa6ba974.json b/.sqlx/query-13d435d8f681b73e4080748dcef0579e246e41049af67e1bd79ffc06aa6ba974.json new file mode 100644 index 0000000000..129a5f59bd --- /dev/null +++ b/.sqlx/query-13d435d8f681b73e4080748dcef0579e246e41049af67e1bd79ffc06aa6ba974.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n UPDATE tasks\n SET is_dismissed_by_user = 1\n WHERE id = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "13d435d8f681b73e4080748dcef0579e246e41049af67e1bd79ffc06aa6ba974" +} diff --git a/.sqlx/query-a142dc3fdf5b6e741c268d8f2e9996a28c214f5835681297d58a9431da8de939.json b/.sqlx/query-a142dc3fdf5b6e741c268d8f2e9996a28c214f5835681297d58a9431da8de939.json new file mode 100644 index 0000000000..4b6a33696a --- /dev/null +++ b/.sqlx/query-a142dc3fdf5b6e741c268d8f2e9996a28c214f5835681297d58a9431da8de939.json @@ -0,0 +1,86 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT\n id,\n task_status,\n task_type,\n model_type,\n provider,\n provider_job_id,\n frontend_caller,\n frontend_subscriber_id,\n frontend_subscriber_payload,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n completed_at as \"completed_at: DateTime\"\n FROM tasks\n WHERE is_dismissed_by_user == 0\n ", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "task_status", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "task_type", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "model_type", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "provider", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "provider_job_id", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "frontend_caller", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "frontend_subscriber_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "frontend_subscriber_payload", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "created_at: DateTime", + "ordinal": 9, + "type_info": "Int64" + }, + { + "name": "updated_at: DateTime", + "ordinal": 10, + "type_info": "Int64" + }, + { + "name": "completed_at: DateTime", + "ordinal": 11, + "type_info": "Int64" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + false, + false, + false, + true, + true, + true, + true, + true, + true, + false, + false, + true + ] + }, + "hash": "a142dc3fdf5b6e741c268d8f2e9996a28c214f5835681297d58a9431da8de939" +} diff --git a/_sql/actions_and_analytics/artcraft/artcraft_active_users.sql b/_sql/actions_and_analytics/artcraft/artcraft_active_users.sql new file mode 100644 index 0000000000..bb90e9c83c --- /dev/null +++ b/_sql/actions_and_analytics/artcraft/artcraft_active_users.sql @@ -0,0 +1,20 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +select + u.display_name, + count(*) as sessions, + a.session_duration_seconds / 60 / 60 as hours, + a.measurement_count, + u.email_address, + a.os_platform, + a.os_version, + u.created_at, + u.maybe_source, + a.last_active_at +from analytics_app_sessions as a +left outer join users as u +on a.user_token = u.token +group by a.user_token +order by hours desc; \ No newline at end of file diff --git a/_sql/artcraft_migrations/20250708000000_create_tasks_table.sql b/_sql/artcraft_migrations/20250708000000_create_tasks_table.sql index 830b46617f..f63423b175 100644 --- a/_sql/artcraft_migrations/20250708000000_create_tasks_table.sql +++ b/_sql/artcraft_migrations/20250708000000_create_tasks_table.sql @@ -9,6 +9,7 @@ -- tasks_v1.sqlite - initial version -- tasks_v2.sqlite - added model_type (nullable) -- tasks_v3.sqlite - added frontend_caller, comments +-- tasks_v4.sqlite - added is_dismissed_by_user CREATE TABLE tasks ( -- Task auto-incrementing primary key. @@ -50,6 +51,9 @@ CREATE TABLE tasks ( -- will be re-emitted back to the frontend. frontend_subscriber_payload TEXT, + -- Whether the user has dismissed the task from view. + is_dismissed_by_user INTEGER NOT NULL DEFAULT 0, + created_at INTEGER NOT NULL DEFAULT (unixepoch('now')), updated_at INTEGER NOT NULL DEFAULT (unixepoch('now')), completed_at INTEGER DEFAULT NULL diff --git a/crates/desktop/artcraft/src/core/commands/mod.rs b/crates/desktop/artcraft/src/core/commands/mod.rs index 9a4a2135e1..393d80300b 100644 --- a/crates/desktop/artcraft/src/core/commands/mod.rs +++ b/crates/desktop/artcraft/src/core/commands/mod.rs @@ -7,4 +7,5 @@ pub mod load_without_cors_command; pub mod media_files; pub mod platform_info_command; pub mod providers; -pub mod response; \ No newline at end of file +pub mod response; +pub mod task_queue; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs b/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs new file mode 100644 index 0000000000..1862e18cd4 --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/task_queue/get_task_queue_command.rs @@ -0,0 +1,92 @@ +use crate::core::commands::response::shorthand::ResponseOrErrorMessage; +use crate::core::commands::response::success_response_wrapper::SerializeMarker; +use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; +use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; +use crate::core::state::data_dir::app_data_root::AppDataRoot; +use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; +use crate::core::state::task_database::TaskDatabase; +use crate::services::fal::state::fal_credential_manager::FalCredentialManager; +use crate::services::fal::state::fal_task_queue::FalTaskQueue; +use crate::services::sora::state::sora_task_queue::SoraTaskQueue; +use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; +use chrono::{DateTime, Utc}; +use enums::common::generation_provider::GenerationProvider; +use enums::tauri::tasks::task_model_type::TaskModelType; +use enums::tauri::tasks::task_status::TaskStatus; +use enums::tauri::tasks::task_type::TaskType; +use errors::AnyhowResult; +use log::{error, info, warn}; +use serde_derive::{Deserialize, Serialize}; +use sqlite_tasks::queries::list_tasks_for_frontend::list_tasks_for_frontend; +use storyteller_client::endpoints::media_files::delete_media_file::delete_media_file; +use tauri::{AppHandle, State}; +use tokens::tokens::media_files::MediaFileToken; +use tokens::tokens::sqlite::tasks::TaskId; + +#[derive(Serialize)] +pub struct GetTaskQueueCommandResponse { + tasks: Vec, +} + +#[derive(Serialize)] +pub struct TaskQueueItem { + pub id: TaskId, + pub task_status: TaskStatus, + pub task_type: TaskType, + pub model_type: Option, + pub provider: Option, + pub provider_job_id: Option, + pub created_at: DateTime, + pub updated_at: DateTime, + pub completed_at: Option>, +} + +impl SerializeMarker for GetTaskQueueCommandResponse {} + +#[tauri::command] +pub async fn get_task_queue_command( + app: AppHandle, + app_env_configs: State<'_, AppEnvConfigs>, + task_database: State<'_, TaskDatabase>, +) -> ResponseOrErrorMessage { + + info!("get_task_queue_command called"); + + let result = handle_request( + &task_database, + ).await; + + let tasks = match result { + Ok(items) => items, + Err(err) => { + error!("get_task_queue_command failed: {:?}", err); + return Err("get_task_queue_command failed".into()) + } + }; + + Ok(GetTaskQueueCommandResponse{ + tasks, + }.into()) +} + +pub async fn handle_request( + task_database: &TaskDatabase, +) -> AnyhowResult> { + + let tasks = list_tasks_for_frontend(task_database.get_connection()) + .await?; + + Ok(tasks.tasks.into_iter() + .map(|task| TaskQueueItem { + id: task.id, + task_status: task.status, + task_type: task.task_type, + model_type: task.model_type, + provider: task.provider, + provider_job_id: task.provider_job_id, + created_at: task.created_at, + updated_at: task.updated_at, + completed_at: task.completed_at, + }) + .collect()) +} diff --git a/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs b/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs new file mode 100644 index 0000000000..49d520030b --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/task_queue/mark_task_as_dismissed_command.rs @@ -0,0 +1,70 @@ +use crate::core::commands::response::shorthand::ResponseOrErrorMessage; +use crate::core::commands::response::success_response_wrapper::SerializeMarker; +use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; +use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; +use crate::core::state::data_dir::app_data_root::AppDataRoot; +use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; +use crate::core::state::task_database::TaskDatabase; +use crate::services::fal::state::fal_credential_manager::FalCredentialManager; +use crate::services::fal::state::fal_task_queue::FalTaskQueue; +use crate::services::sora::state::sora_task_queue::SoraTaskQueue; +use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; +use chrono::{DateTime, Utc}; +use enums::common::generation_provider::GenerationProvider; +use enums::tauri::tasks::task_model_type::TaskModelType; +use enums::tauri::tasks::task_status::TaskStatus; +use enums::tauri::tasks::task_type::TaskType; +use errors::AnyhowResult; +use log::{error, info, warn}; +use serde_derive::{Deserialize, Serialize}; +use sqlite_tasks::queries::list_tasks_for_frontend::list_tasks_for_frontend; +use sqlite_tasks::queries::mark_task_as_dismissed::mark_task_as_dismissed; +use storyteller_client::endpoints::media_files::delete_media_file::delete_media_file; +use tauri::{AppHandle, State}; +use tokens::tokens::media_files::MediaFileToken; +use tokens::tokens::sqlite::tasks::TaskId; + +#[derive(Deserialize)] +pub struct MarkTaskAsDismissedRequest { + task: TaskId, +} + +#[derive(Serialize)] +pub struct MarkTaskAsDismissedResponse { + success: bool, +} + +impl SerializeMarker for MarkTaskAsDismissedResponse {} + +#[tauri::command] +pub async fn mark_task_as_dismissed_command( + request: MarkTaskAsDismissedRequest, + app: AppHandle, + app_env_configs: State<'_, AppEnvConfigs>, + task_database: State<'_, TaskDatabase>, +) -> ResponseOrErrorMessage { + + info!("mark_task_as_dismissed_command called"); + + let result = handle_request( + &request.task, + &task_database, + ).await; + + if let Err(err) = &result { + error!("mark_task_as_dismissed_command failed: {:?}", err); + return Err("mark_task_as_dismissed_command failed".into()) + } + + Ok(MarkTaskAsDismissedResponse{ + success: true, + }.into()) +} + +pub async fn handle_request( + task_id: &TaskId, + task_database: &TaskDatabase, +) -> AnyhowResult<()> { + let _result = mark_task_as_dismissed(task_database.get_connection(), task_id).await?; + Ok(()) +} diff --git a/crates/desktop/artcraft/src/core/commands/task_queue/mod.rs b/crates/desktop/artcraft/src/core/commands/task_queue/mod.rs new file mode 100644 index 0000000000..af76e234d0 --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/task_queue/mod.rs @@ -0,0 +1,2 @@ +pub mod get_task_queue_command; +pub mod mark_task_as_dismissed_command; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/state/data_dir/app_state_dir.rs b/crates/desktop/artcraft/src/core/state/data_dir/app_state_dir.rs index ef39db2d44..66223b5a40 100644 --- a/crates/desktop/artcraft/src/core/state/data_dir/app_state_dir.rs +++ b/crates/desktop/artcraft/src/core/state/data_dir/app_state_dir.rs @@ -1,4 +1,5 @@ use crate::core::state::data_dir::trait_data_subdir::DataSubdir; +use crate::core::state::task_database_version::TASK_DATABASE_VERSION; use std::path::{Path, PathBuf}; #[derive(Clone)] @@ -24,7 +25,7 @@ impl AppStateDir { pub fn get_tasks_sqlite_database_path(&self) -> PathBuf { // NB: This must be incremented on any change to the database schema (including comments). // The database houses ephemeral content and will be migrated automatically. - self.path.join("tasks_v3.sqlite") + self.path.join(format!("tasks_v{TASK_DATABASE_VERSION}.sqlite")) } pub fn get_window_size_config_file(&self) -> PathBuf { diff --git a/crates/desktop/artcraft/src/core/state/mod.rs b/crates/desktop/artcraft/src/core/state/mod.rs index 34df30d255..c21ce0f85f 100644 --- a/crates/desktop/artcraft/src/core/state/mod.rs +++ b/crates/desktop/artcraft/src/core/state/mod.rs @@ -7,4 +7,5 @@ pub mod expanduser; pub mod os_platform; pub mod provider_priority; pub mod task_database; +pub mod task_database_version; pub mod window; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/state/task_database_version.rs b/crates/desktop/artcraft/src/core/state/task_database_version.rs new file mode 100644 index 0000000000..eef293ca86 --- /dev/null +++ b/crates/desktop/artcraft/src/core/state/task_database_version.rs @@ -0,0 +1,10 @@ + + +/// Used to bump the task database schema version. +/// Migrations on customers' machines tend to fail on existing databases, +/// even if we instruct that the database file be deleted first. +/// It's easiest to just write to a new file and migrate from scratch. +/// We increment this whenever we make a change to the database schema. +/// This prevents deadlock on startup if the schema has changed from the +/// previous version. +pub const TASK_DATABASE_VERSION: u32 = 4; diff --git a/crates/desktop/artcraft/src/lib.rs b/crates/desktop/artcraft/src/lib.rs index 068e7f721f..bc484d1659 100644 --- a/crates/desktop/artcraft/src/lib.rs +++ b/crates/desktop/artcraft/src/lib.rs @@ -18,6 +18,8 @@ use crate::core::commands::media_files::media_file_delete_command::media_file_de use crate::core::commands::platform_info_command::platform_info_command; use crate::core::commands::providers::get_provider_order_command::get_provider_order_command; use crate::core::commands::providers::set_provider_order_command::set_provider_order_command; +use crate::core::commands::task_queue::get_task_queue_command::get_task_queue_command; +use crate::core::commands::task_queue::mark_task_as_dismissed_command::mark_task_as_dismissed_command; use crate::core::lifecycle::startup::handle_tauri_startup::handle_tauri_startup; use crate::core::lifecycle::startup::setup_main_window::setup_main_window; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; @@ -190,8 +192,10 @@ pub fn run() { get_app_preferences_command, get_fal_api_key_command, get_provider_order_command, - media_file_delete_command, + get_task_queue_command, load_without_cors_command, + mark_task_as_dismissed_command, + media_file_delete_command, midjourney_clear_credentials_command, midjourney_get_credential_info_command, midjourney_open_login_command, diff --git a/crates/schema/database/sqlite_tasks/src/error.rs b/crates/schema/database/sqlite_tasks/src/error.rs index 708c4fd196..7224709e95 100644 --- a/crates/schema/database/sqlite_tasks/src/error.rs +++ b/crates/schema/database/sqlite_tasks/src/error.rs @@ -1,10 +1,11 @@ +use enums::error::enum_error::EnumError; use std::error::Error; use std::fmt::{Display, Formatter}; #[derive(Debug)] pub enum SqliteTasksError { SqlxError(sqlx::Error), - TaskParseError(String), + EnumError(EnumError), //TaskNotFound, //TaskAlreadyExists, //InvalidTaskStatus, @@ -17,8 +18,8 @@ impl Error for SqliteTasksError {} impl Display for SqliteTasksError { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { - SqliteTasksError::SqlxError(err) => write!(f, "SQLx error: {}", err), - SqliteTasksError::TaskParseError(err) => write!(f, "Task parse error: {}", err), + SqliteTasksError::SqlxError(err) => write!(f, "SQLx error: {:?}", err), + SqliteTasksError::EnumError(err) => write!(f, "Error parsing enum: {:?}", err), } } } @@ -28,3 +29,9 @@ impl From for SqliteTasksError { SqliteTasksError::SqlxError(err) } } + +impl From for SqliteTasksError { + fn from(err: EnumError) -> Self { + SqliteTasksError::EnumError(err) + } +} diff --git a/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_status.rs b/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_status.rs index f89d28f5bb..0d16ae4629 100644 --- a/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_status.rs +++ b/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_status.rs @@ -92,20 +92,15 @@ pub async fn list_tasks_by_provider_and_status( for task in results { tasks.push(Task { id: TaskId::new_from_str(&task.id), - status: TaskStatus::from_str(&task.task_status) - .map_err(|err| SqliteTasksError::TaskParseError(err))?, - task_type: TaskType::from_str(&task.task_type) - .map_err(|err| SqliteTasksError::TaskParseError(err))?, + status: TaskStatus::from_str(&task.task_status)?, + task_type: TaskType::from_str(&task.task_type)?, model_type: task.model_type - .map(|model| TaskModelType::from_str(&model) - .map_err(|err| SqliteTasksError::TaskParseError(err))) + .map(|model| TaskModelType::from_str(&model)) .transpose()?, - provider: GenerationProvider::from_str(&task.provider) - .map_err(|err| SqliteTasksError::TaskParseError(err))?, + provider: GenerationProvider::from_str(&task.provider)?, provider_job_id: task.provider_job_id, frontend_caller: task.frontend_caller - .map(|caller| TauriCommandCaller::from_str(&caller) - .map_err(|err| SqliteTasksError::TaskParseError(err))) + .map(|caller| TauriCommandCaller::from_str(&caller)) .transpose()?, frontend_subscriber_id: task.frontend_subscriber_id, frontend_subscriber_payload: task.frontend_subscriber_payload, diff --git a/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_tokens.rs b/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_tokens.rs index 5795f0c8bb..a6abe5086b 100644 --- a/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_tokens.rs +++ b/crates/schema/database/sqlite_tasks/src/queries/list_tasks_by_provider_and_tokens.rs @@ -91,20 +91,15 @@ pub async fn list_tasks_by_provider_and_tokens( for task in results { tasks.push(Task { id: TaskId::new_from_str(&task.id), - status: TaskStatus::from_str(&task.task_status) - .map_err(|err| SqliteTasksError::TaskParseError(err))?, - task_type: TaskType::from_str(&task.task_type) - .map_err(|err| SqliteTasksError::TaskParseError(err))?, + status: TaskStatus::from_str(&task.task_status)?, + task_type: TaskType::from_str(&task.task_type)?, model_type: task.model_type - .map(|model| TaskModelType::from_str(&model) - .map_err(|err| SqliteTasksError::TaskParseError(err))) + .map(|model| TaskModelType::from_str(&model)) .transpose()?, - provider: GenerationProvider::from_str(&task.provider) - .map_err(|err| SqliteTasksError::TaskParseError(err))?, + provider: GenerationProvider::from_str(&task.provider)?, provider_job_id: task.provider_job_id, frontend_caller: task.frontend_caller - .map(|caller| TauriCommandCaller::from_str(&caller) - .map_err(|err| SqliteTasksError::TaskParseError(err))) + .map(|caller| TauriCommandCaller::from_str(&caller)) .transpose()?, frontend_subscriber_id: task.frontend_subscriber_id, frontend_subscriber_payload: task.frontend_subscriber_payload, diff --git a/crates/schema/database/sqlite_tasks/src/queries/list_tasks_for_frontend.rs b/crates/schema/database/sqlite_tasks/src/queries/list_tasks_for_frontend.rs new file mode 100644 index 0000000000..cfb2576d1e --- /dev/null +++ b/crates/schema/database/sqlite_tasks/src/queries/list_tasks_for_frontend.rs @@ -0,0 +1,99 @@ +use crate::connection::TaskDbConnection; +use crate::error::SqliteTasksError; +use chrono::{DateTime, Utc}; +use enums::common::generation_provider::GenerationProvider; +use enums::tauri::tasks::task_model_type::TaskModelType; +use enums::tauri::tasks::task_status::TaskStatus; +use enums::tauri::tasks::task_type::TaskType; +use enums::tauri::ux::tauri_command_caller::TauriCommandCaller; +use tokens::tokens::sqlite::tasks::TaskId; + +pub struct TaskList { + pub tasks: Vec, +} + +pub struct TaskItem { + pub id: TaskId, + pub status: TaskStatus, + pub task_type: TaskType, + pub model_type: Option, + pub provider: Option, + pub provider_job_id: Option, + pub frontend_caller: Option, + pub frontend_subscriber_id: Option, + pub frontend_subscriber_payload: Option, + pub created_at: DateTime, + pub updated_at: DateTime, + pub completed_at: Option>, +} + +pub async fn list_tasks_for_frontend( + db: & TaskDbConnection +) -> Result { + let query = sqlx::query_as!( + TaskItemRaw, + r#" + SELECT + id, + task_status, + task_type, + model_type, + provider, + provider_job_id, + frontend_caller, + frontend_subscriber_id, + frontend_subscriber_payload, + created_at as "created_at: DateTime", + updated_at as "updated_at: DateTime", + completed_at as "completed_at: DateTime" + FROM tasks + WHERE is_dismissed_by_user == 0 + "#); + + let result = query.fetch_all(db.get_pool()) + .await?; + + let mut tasks = Vec::with_capacity(result.len()); + + for raw in result.into_iter() { + tasks.push(TaskItem { + id: TaskId::new(raw.id), + status: TaskStatus::from_str(&raw.task_status)?, + task_type: TaskType::from_str(&raw.task_type)?, + model_type: raw.model_type + .map(|model| TaskModelType::from_str(&model)) + .transpose()?, + provider: raw.provider + .map(|provider| GenerationProvider::from_str(&provider)) + .transpose()?, + provider_job_id: raw.provider_job_id, + frontend_caller: raw.frontend_caller + .map(|caller| TauriCommandCaller::from_str(&caller)) + .transpose()?, + frontend_subscriber_id: raw.frontend_subscriber_id, + frontend_subscriber_payload: raw.frontend_subscriber_payload, + created_at: raw.created_at, + updated_at: raw.updated_at, + completed_at: raw.completed_at, + }) + } + + Ok(TaskList { + tasks, + }) +} + +struct TaskItemRaw { + id: String, + task_status: String, + task_type: String, + model_type: Option, + provider: Option, + provider_job_id: Option, + frontend_caller: Option, + frontend_subscriber_id: Option, + frontend_subscriber_payload: Option, + created_at: DateTime, + updated_at: DateTime, + completed_at: Option>, +} diff --git a/crates/schema/database/sqlite_tasks/src/queries/mark_task_as_dismissed.rs b/crates/schema/database/sqlite_tasks/src/queries/mark_task_as_dismissed.rs new file mode 100644 index 0000000000..26f3c0b88b --- /dev/null +++ b/crates/schema/database/sqlite_tasks/src/queries/mark_task_as_dismissed.rs @@ -0,0 +1,27 @@ +use crate::connection::TaskDbConnection; +use crate::error::SqliteTasksError; +use tokens::tokens::sqlite::tasks::TaskId; + +/// Returns true if rows were updated. +pub async fn mark_task_as_dismissed( + db: &TaskDbConnection, + task_id: &TaskId, +) -> Result { + + // TODO(bt,2025-07-12): Fix this. The sqlx mysql queries never required temporaries + let task_id_temp = task_id.as_str(); + + // TODO(bt,2025-07-15): We can't set a LIMIT without a certain compiler flag for SQLite ? + let query = sqlx::query!(r#" + UPDATE tasks + SET is_dismissed_by_user = 1 + WHERE id = ? + "#, + task_id_temp, + ); + + let res = query.execute(db.get_pool()).await?; + let rows_updated = res.rows_affected() > 0; + + Ok(rows_updated) +} diff --git a/crates/schema/database/sqlite_tasks/src/queries/mod.rs b/crates/schema/database/sqlite_tasks/src/queries/mod.rs index d10010fa9d..083cdda18b 100644 --- a/crates/schema/database/sqlite_tasks/src/queries/mod.rs +++ b/crates/schema/database/sqlite_tasks/src/queries/mod.rs @@ -1,4 +1,6 @@ pub mod create_task; pub mod list_tasks_by_provider_and_status; pub mod list_tasks_by_provider_and_tokens; +pub mod list_tasks_for_frontend; +pub mod mark_task_as_dismissed; pub mod update_task_status; \ No newline at end of file diff --git a/crates/schema/public/enums/src/common/generation_provider.rs b/crates/schema/public/enums/src/common/generation_provider.rs index 86bf01235c..4be9e10c7e 100644 --- a/crates/schema/public/enums/src/common/generation_provider.rs +++ b/crates/schema/public/enums/src/common/generation_provider.rs @@ -1,5 +1,6 @@ use std::collections::BTreeSet; +use crate::error::enum_error::EnumError; #[cfg(test)] use strum::EnumCount; #[cfg(test)] @@ -22,6 +23,9 @@ impl_enum_display_and_debug_using_to_str!(GenerationProvider); impl_mysql_enum_coders!(GenerationProvider); impl_mysql_from_row!(GenerationProvider); +// For Tauri +impl_sqlite_enum_coders!(GenerationProvider); + // NB: We can derive `sqlx::Type` instead of using `impl_mysql_enum_coders` impl GenerationProvider { @@ -34,13 +38,13 @@ impl GenerationProvider { } } - pub fn from_str(job_status: &str) -> Result { - match job_status { + pub fn from_str(value: &str) -> Result { + match value { "artcraft" => Ok(Self::Artcraft), "fal" => Ok(Self::Fal), "midjourney" => Ok(Self::Midjourney), "sora" => Ok(Self::Sora), - _ => Err(format!("invalid generation_provider: {:?}", job_status)), + _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), } } @@ -58,8 +62,9 @@ impl GenerationProvider { #[cfg(test)] mod tests { - use crate::test_helpers::assert_serialization; use crate::common::generation_provider::GenerationProvider; + use crate::error::enum_error::EnumError; + use crate::test_helpers::assert_serialization; mod explicit_checks { use super::*; @@ -88,6 +93,17 @@ mod tests { assert_eq!(GenerationProvider::from_str("sora").unwrap(), GenerationProvider::Sora); } + #[test] + fn from_str_err() { + let result = GenerationProvider::from_str("asdf"); + assert!(result.is_err()); + if let Err(EnumError::CouldNotConvertFromString(value)) = result { + assert_eq!(value, "asdf"); + } else { + panic!("Expected EnumError::CouldNotConvertFromString"); + } + } + #[test] fn all_variants() { let mut variants = GenerationProvider::all_variants(); diff --git a/crates/schema/public/enums/src/error/enum_error.rs b/crates/schema/public/enums/src/error/enum_error.rs new file mode 100644 index 0000000000..a86cf4ed4c --- /dev/null +++ b/crates/schema/public/enums/src/error/enum_error.rs @@ -0,0 +1,18 @@ +use std::error::Error; + +#[derive(Debug)] +pub enum EnumError { + CouldNotConvertFromString(String), +} + +impl Error for EnumError {} + +impl std::fmt::Display for EnumError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + EnumError::CouldNotConvertFromString(value) => { + write!(f, "Could not convert from string: {}", value) + } + } + } +} diff --git a/crates/schema/public/enums/src/error/mod.rs b/crates/schema/public/enums/src/error/mod.rs new file mode 100644 index 0000000000..4f9259a491 --- /dev/null +++ b/crates/schema/public/enums/src/error/mod.rs @@ -0,0 +1 @@ +pub mod enum_error; \ No newline at end of file diff --git a/crates/schema/public/enums/src/lib.rs b/crates/schema/public/enums/src/lib.rs index 5d5ba51b9a..3c6e78872e 100644 --- a/crates/schema/public/enums/src/lib.rs +++ b/crates/schema/public/enums/src/lib.rs @@ -33,6 +33,7 @@ mod macros; pub mod by_table; pub mod common; +pub mod error; pub mod no_table; pub mod tauri; pub mod traits; diff --git a/crates/schema/public/enums/src/tauri/tasks/task_model_type.rs b/crates/schema/public/enums/src/tauri/tasks/task_model_type.rs index 7d64855feb..c7cd1cda3b 100644 --- a/crates/schema/public/enums/src/tauri/tasks/task_model_type.rs +++ b/crates/schema/public/enums/src/tauri/tasks/task_model_type.rs @@ -1,5 +1,6 @@ use std::collections::BTreeSet; +use crate::error::enum_error::EnumError; #[cfg(test)] use strum::EnumCount; #[cfg(test)] @@ -98,8 +99,8 @@ impl TaskModelType { } } - pub fn from_str(job_status: &str) -> Result { - match job_status { + pub fn from_str(value: &str) -> Result { + match value { // Image models "flux_1_dev" => Ok(Self::Flux1Dev), "flux_1_schnell" => Ok(Self::Flux1Schnell), @@ -124,7 +125,7 @@ impl TaskModelType { // 3D Object generation models "hunyuan_3d_2.0" => Ok(Self::Hunyuan3d2_0), "hunyuan_3d_2.1" => Ok(Self::Hunyuan3d2_1), - _ => Err(format!("invalid task_model_type: {:?}", job_status)), + _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), } } @@ -164,6 +165,7 @@ impl TaskModelType { mod tests { use crate::tauri::tasks::task_model_type::TaskModelType; use crate::test_helpers::assert_serialization; + use crate::error::enum_error::EnumError; mod explicit_checks { use super::*; @@ -252,6 +254,17 @@ mod tests { assert_eq!(TaskModelType::from_str("hunyuan_3d_2.1").unwrap(), TaskModelType::Hunyuan3d2_1); } + #[test] + fn from_str_err() { + let result = TaskModelType::from_str("asdf"); + assert!(result.is_err()); + if let Err(EnumError::CouldNotConvertFromString(value)) = result { + assert_eq!(value, "asdf"); + } else { + panic!("Expected EnumError::CouldNotConvertFromString"); + } + } + #[test] fn all_variants() { let mut variants = TaskModelType::all_variants(); diff --git a/crates/schema/public/enums/src/tauri/tasks/task_status.rs b/crates/schema/public/enums/src/tauri/tasks/task_status.rs index 542a4c6d65..8e4dbec150 100644 --- a/crates/schema/public/enums/src/tauri/tasks/task_status.rs +++ b/crates/schema/public/enums/src/tauri/tasks/task_status.rs @@ -1,5 +1,6 @@ use std::collections::BTreeSet; +use crate::error::enum_error::EnumError; #[cfg(test)] use strum::EnumCount; #[cfg(test)] @@ -48,8 +49,8 @@ impl TaskStatus { } } - pub fn from_str(job_status: &str) -> Result { - match job_status { + pub fn from_str(value: &str) -> Result { + match value { "pending" => Ok(Self::Pending), "started" => Ok(Self::Started), "complete_success" => Ok(Self::CompleteSuccess), @@ -59,7 +60,7 @@ impl TaskStatus { "cancelled_by_user" => Ok(Self::CancelledByUser), "cancelled_by_provider" => Ok(Self::CancelledByProvider), "cancelled_by_us" => Ok(Self::CancelledByUs), - _ => Err(format!("invalid task_status: {:?}", job_status)), + _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), } } @@ -82,11 +83,12 @@ impl TaskStatus { #[cfg(test)] mod tests { - use crate::test_helpers::assert_serialization; use crate::tauri::tasks::task_status::TaskStatus; + use crate::test_helpers::assert_serialization; mod explicit_checks { use super::*; + use crate::error::enum_error::EnumError; #[test] fn test_default() { @@ -132,6 +134,17 @@ mod tests { assert_eq!(TaskStatus::from_str("cancelled_by_us").unwrap(), TaskStatus::CancelledByUs); } + #[test] + fn from_str_err() { + let result = TaskStatus::from_str("asdf"); + assert!(result.is_err()); + if let Err(EnumError::CouldNotConvertFromString(value)) = result { + assert_eq!(value, "asdf"); + } else { + panic!("Expected EnumError::CouldNotConvertFromString"); + } + } + #[test] fn all_variants() { let mut variants = TaskStatus::all_variants(); diff --git a/crates/schema/public/enums/src/tauri/tasks/task_type.rs b/crates/schema/public/enums/src/tauri/tasks/task_type.rs index 8132160719..2b2d4edcf6 100644 --- a/crates/schema/public/enums/src/tauri/tasks/task_type.rs +++ b/crates/schema/public/enums/src/tauri/tasks/task_type.rs @@ -1,5 +1,6 @@ use std::collections::BTreeSet; +use crate::error::enum_error::EnumError; #[cfg(test)] use strum::EnumCount; #[cfg(test)] @@ -34,14 +35,14 @@ impl TaskType { } } - pub fn from_str(job_status: &str) -> Result { - match job_status { + pub fn from_str(value: &str) -> Result { + match value { "image_generation" => Ok(Self::ImageGeneration), "image_inpaint_edit" => Ok(Self::ImageInpaintEdit), "video_generation" => Ok(Self::VideoGeneration), "object_generation" => Ok(Self::ObjectGeneration), "background_removal" => Ok(Self::BackgroundRemoval), - _ => Err(format!("invalid task_type: {:?}", job_status)), + _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), } } @@ -60,11 +61,12 @@ impl TaskType { #[cfg(test)] mod tests { - use crate::test_helpers::assert_serialization; use crate::tauri::tasks::task_type::TaskType; + use crate::test_helpers::assert_serialization; mod explicit_checks { use super::*; + use crate::error::enum_error::EnumError; #[test] fn test_serialization() { @@ -92,6 +94,17 @@ mod tests { assert_eq!(TaskType::from_str("object_generation").unwrap(), TaskType::ObjectGeneration); assert_eq!(TaskType::from_str("background_removal").unwrap(), TaskType::BackgroundRemoval); } + + #[test] + fn from_str_err() { + let result = TaskType::from_str("asdf"); + assert!(result.is_err()); + if let Err(EnumError::CouldNotConvertFromString(value)) = result { + assert_eq!(value, "asdf"); + } else { + panic!("Expected EnumError::CouldNotConvertFromString"); + } + } #[test] fn all_variants() { diff --git a/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs b/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs index 7545f9e6b4..f745f91280 100644 --- a/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs +++ b/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs @@ -1,5 +1,6 @@ use std::collections::BTreeSet; +use crate::error::enum_error::EnumError; #[cfg(test)] use strum::EnumCount; #[cfg(test)] @@ -38,13 +39,13 @@ impl TauriCommandCaller { } } - pub fn from_str(job_status: &str) -> Result { - match job_status { + pub fn from_str(value: &str) -> Result { + match value { "canvas" => Ok(Self::Canvas), "image_editor" => Ok(Self::ImageEditor), "text_to_image" => Ok(Self::TextToImage), "image_to_video" => Ok(Self::ImageToVideo), - _ => Err(format!("invalid tauri_command_caller: {:?}", job_status)), + _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), } } @@ -62,8 +63,9 @@ impl TauriCommandCaller { #[cfg(test)] mod tests { - use crate::test_helpers::assert_serialization; + use crate::error::enum_error::EnumError; use crate::tauri::ux::tauri_command_caller::TauriCommandCaller; + use crate::test_helpers::assert_serialization; mod explicit_checks { use super::*; @@ -92,6 +94,17 @@ mod tests { assert_eq!(TauriCommandCaller::from_str("image_to_video").unwrap(), TauriCommandCaller::ImageToVideo); } + #[test] + fn from_str_err() { + let result = TauriCommandCaller::from_str("asdf"); + assert!(result.is_err()); + if let Err(EnumError::CouldNotConvertFromString(value)) = result { + assert_eq!(value, "asdf"); + } else { + panic!("Expected EnumError::CouldNotConvertFromString"); + } + } + #[test] fn all_variants() { let mut variants = TauriCommandCaller::all_variants(); diff --git a/frontend/apps/editor3d/tsconfig.json b/frontend/apps/editor3d/tsconfig.json index 0b749c655a..001d4b5638 100644 --- a/frontend/apps/editor3d/tsconfig.json +++ b/frontend/apps/editor3d/tsconfig.json @@ -156,6 +156,9 @@ }, { "path": "../../libs/api" + }, + { + "path": "../../libs/api-enums" } ] } diff --git a/frontend/libs/api-enums/.eslintrc.json b/frontend/libs/api-enums/.eslintrc.json new file mode 100644 index 0000000000..6c3657232b --- /dev/null +++ b/frontend/libs/api-enums/.eslintrc.json @@ -0,0 +1,50 @@ +{ + "extends": [ + "../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.json" + ], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": [ + "{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}", + "{projectRoot}/vite.config.{js,ts,mjs,mts}" + ] + } + ] + } + } + ] +} diff --git a/frontend/libs/api-enums/README.md b/frontend/libs/api-enums/README.md new file mode 100644 index 0000000000..871309f91c --- /dev/null +++ b/frontend/libs/api-enums/README.md @@ -0,0 +1,11 @@ +# api-enums + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build api-enums` to build the library. + +## Running unit tests + +Run `nx test api-enums` to execute the unit tests via [Vitest](https://vitest.dev/). diff --git a/frontend/libs/api-enums/package.json b/frontend/libs/api-enums/package.json new file mode 100644 index 0000000000..3db0385334 --- /dev/null +++ b/frontend/libs/api-enums/package.json @@ -0,0 +1,19 @@ +{ + "name": "@storyteller/api-enums", + "version": "0.0.1", + "private": true, + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "development": "./src/index.ts", + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "dependencies": {} +} diff --git a/frontend/libs/api-enums/src/index.ts b/frontend/libs/api-enums/src/index.ts new file mode 100644 index 0000000000..09c185e223 --- /dev/null +++ b/frontend/libs/api-enums/src/index.ts @@ -0,0 +1 @@ +export * from './lib/index.js'; diff --git a/frontend/libs/api-enums/src/lib/common/generation_provider.ts b/frontend/libs/api-enums/src/lib/common/generation_provider.ts new file mode 100644 index 0000000000..6c1c7d3502 --- /dev/null +++ b/frontend/libs/api-enums/src/lib/common/generation_provider.ts @@ -0,0 +1,10 @@ + +// NOTE: These are defined in Rust (as the source of truth) and duplicated in the frontend. +// In the future, we should use code gen (protobufs or similar) to keep the two sides in sync. + +export enum GenerationProvider { + Artcraft = "artcraft", + Fal = "fal", + Midjourney = "midjourney", + Sora = "sora", +} diff --git a/frontend/libs/api-enums/src/lib/common/index.ts b/frontend/libs/api-enums/src/lib/common/index.ts new file mode 100644 index 0000000000..b98495f81c --- /dev/null +++ b/frontend/libs/api-enums/src/lib/common/index.ts @@ -0,0 +1 @@ +export * from "./generation_provider.js"; \ No newline at end of file diff --git a/frontend/libs/api-enums/src/lib/index.ts b/frontend/libs/api-enums/src/lib/index.ts new file mode 100644 index 0000000000..e95d6b509e --- /dev/null +++ b/frontend/libs/api-enums/src/lib/index.ts @@ -0,0 +1,3 @@ +export * from "./common/index.js"; +export * from "./tauri/index.js"; + diff --git a/frontend/libs/api-enums/src/lib/tauri/index.ts b/frontend/libs/api-enums/src/lib/tauri/index.ts new file mode 100644 index 0000000000..2ec56a259f --- /dev/null +++ b/frontend/libs/api-enums/src/lib/tauri/index.ts @@ -0,0 +1 @@ +export * from "./tasks/index.js"; diff --git a/frontend/libs/api-enums/src/lib/tauri/tasks/index.ts b/frontend/libs/api-enums/src/lib/tauri/tasks/index.ts new file mode 100644 index 0000000000..f2e7bc0b17 --- /dev/null +++ b/frontend/libs/api-enums/src/lib/tauri/tasks/index.ts @@ -0,0 +1,3 @@ +export * from "./task_model_type.js"; +export * from "./task_status.js"; +export * from "./task_type.js"; \ No newline at end of file diff --git a/frontend/libs/api-enums/src/lib/tauri/tasks/task_model_type.ts b/frontend/libs/api-enums/src/lib/tauri/tasks/task_model_type.ts new file mode 100644 index 0000000000..44a3f9b31e --- /dev/null +++ b/frontend/libs/api-enums/src/lib/tauri/tasks/task_model_type.ts @@ -0,0 +1,33 @@ +// NOTE: These are defined in Rust (as the source of truth) and duplicated in the frontend. +// In the future, we should use code gen (protobufs or similar) to keep the two sides in sync. + +export enum TaskModelType { + // Image models + Flux1Dev = "flux_1_dev", + Flux1Schnell = "flux_1_schnell", + FluxDevJuggernaut = "flux_dev_juggernaut", + FluxPro1 = "flux_pro_1", + FluxPro11 = "flux_pro_1.1", + FluxPro11Ultra = "flux_pro_1.1_ultra", + FluxProKontextMax = "flux_pro_kontext_max", + Gemini25Flash = "gemini_25_flash", + GptImage1 = "gpt_image_1", + Recraft3 = "recraft_3", + + // Generic Midjourney model, version unknown. + Midjourney = "midjourney", + + // Video models + Kling16Pro = "kling_1.6_pro", + Kling21Pro = "kling_2.1_pro", + Kling21Master = "kling_2.1_master", + Seedance10Lite = "seedance_1.0_lite", + Sora2 = "sora_2", + Veo2 = "veo_2", + Veo3 = "veo_3", + Veo3Fast = "veo_3_fast", + + // 3D Object generation models + Hunyuan3d2_0 = "hunyuan_3d_2.0", + Hunyuan3d2_1 = "hunyuan_3d_2.1", +} diff --git a/frontend/libs/api-enums/src/lib/tauri/tasks/task_status.ts b/frontend/libs/api-enums/src/lib/tauri/tasks/task_status.ts new file mode 100644 index 0000000000..c5277949ec --- /dev/null +++ b/frontend/libs/api-enums/src/lib/tauri/tasks/task_status.ts @@ -0,0 +1,14 @@ +// NOTE: These are defined in Rust (as the source of truth) and duplicated in the frontend. +// In the future, we should use code gen (protobufs or similar) to keep the two sides in sync. + +export enum TaskStatus { + Pending = "pending", + Started = "started", + CompleteSuccess = "complete_success", + CompleteFailure = "complete_failure", + AttemptFailed = "attempt_failed", + Dead = "dead", + CancelledByUser = "cancelled_by_user", + CancelledByProvider = "cancelled_by_provider", + CancelledByUs = "cancelled_by_us", +} \ No newline at end of file diff --git a/frontend/libs/api-enums/src/lib/tauri/tasks/task_type.ts b/frontend/libs/api-enums/src/lib/tauri/tasks/task_type.ts new file mode 100644 index 0000000000..4dc337f80b --- /dev/null +++ b/frontend/libs/api-enums/src/lib/tauri/tasks/task_type.ts @@ -0,0 +1,10 @@ +// NOTE: These are defined in Rust (as the source of truth) and duplicated in the frontend. +// In the future, we should use code gen (protobufs or similar) to keep the two sides in sync. + +export enum TaskType { + ImageGeneration = "image_generation", + ImageInpaintEdit = "image_inpaint_edit", + VideoGeneration = "video_generation", + ObjectGeneration = "object_generation", + BackgroundRemoval = "background_removal", +} diff --git a/frontend/libs/api-enums/tsconfig.json b/frontend/libs/api-enums/tsconfig.json new file mode 100644 index 0000000000..62ebbd9464 --- /dev/null +++ b/frontend/libs/api-enums/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/frontend/libs/api-enums/tsconfig.lib.json b/frontend/libs/api-enums/tsconfig.lib.json new file mode 100644 index 0000000000..f4cb8aa229 --- /dev/null +++ b/frontend/libs/api-enums/tsconfig.lib.json @@ -0,0 +1,35 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", + "emitDeclarationOnly": true, + "module": "nodenext", + "moduleResolution": "nodenext", + "forceConsistentCasingInFileNames": true, + "types": [ + "node", + "vite/client" + ] + }, + "include": [ + "src/**/*.ts" + ], + "references": [], + "exclude": [ + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx" + ] +} diff --git a/frontend/libs/api-enums/tsconfig.spec.json b/frontend/libs/api-enums/tsconfig.spec.json new file mode 100644 index 0000000000..02e1e6743e --- /dev/null +++ b/frontend/libs/api-enums/tsconfig.spec.json @@ -0,0 +1,36 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out-tsc/vitest", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ], + "module": "nodenext", + "moduleResolution": "nodenext", + "forceConsistentCasingInFileNames": true + }, + "include": [ + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/frontend/libs/api-enums/vite.config.ts b/frontend/libs/api-enums/vite.config.ts new file mode 100644 index 0000000000..f5849d1c8d --- /dev/null +++ b/frontend/libs/api-enums/vite.config.ts @@ -0,0 +1,48 @@ +/// +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import * as path from 'path'; + +export default defineConfig(() => ({ + root: __dirname, + cacheDir: '../../node_modules/.vite/libs/api-enums', + plugins: [dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') })], + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + // Configuration for building your library. + // See: https://vitejs.dev/guide/build.html#library-mode + build: { + outDir: './dist', + emptyOutDir: true, + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + lib: { + // Could also be a dictionary or array of multiple entry points. + entry: 'src/index.ts', + name: '@storyteller/api-enums', + fileName: 'index', + // Change this to the formats you want to support. + // Don't forget to update your package.json as well. + formats: ['es' as const] + }, + rollupOptions: { + // External packages that should not be bundled into your library. + external: [] + }, + }, + test: { + watch: false, + globals: true, + environment: 'node', + include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: './test-output/vitest/coverage', + provider: 'v8' as const, + } + }, +})); diff --git a/frontend/libs/api/tsconfig.json b/frontend/libs/api/tsconfig.json index 85fee3a884..974f602415 100644 --- a/frontend/libs/api/tsconfig.json +++ b/frontend/libs/api/tsconfig.json @@ -6,6 +6,9 @@ { "path": "../tauri-utils" }, + { + "path": "../api-enums" + }, { "path": "./tsconfig.lib.json" }, diff --git a/frontend/libs/api/tsconfig.lib.json b/frontend/libs/api/tsconfig.lib.json index c058661156..db8984e697 100644 --- a/frontend/libs/api/tsconfig.lib.json +++ b/frontend/libs/api/tsconfig.lib.json @@ -18,6 +18,9 @@ "references": [ { "path": "../tauri-utils/tsconfig.lib.json" + }, + { + "path": "../api-enums/tsconfig.lib.json" } ], "exclude": [ diff --git a/frontend/libs/tauri-api/src/index.ts b/frontend/libs/tauri-api/src/index.ts index f404ce36be..4fd1da081d 100644 --- a/frontend/libs/tauri-api/src/index.ts +++ b/frontend/libs/tauri-api/src/index.ts @@ -20,6 +20,7 @@ export * from "./lib/openai/GetOpenAIApiKey.js"; export * from "./lib/openai/SetOpenAIApiKey.js"; export * from "./lib/providers/GetProviderOrder.js"; export * from "./lib/providers/Provider.js"; +export * from "./lib/artcraft/task_queue/GetTaskQueue.js"; export * from "./lib/providers/SetProviderOrder.js"; export * from "./lib/settings/GetAppPreferences.js"; export * from "./lib/settings/UpdateAppPreference.js"; diff --git a/frontend/libs/tauri-api/src/lib/artcraft/task_queue/GetTaskQueue.ts b/frontend/libs/tauri-api/src/lib/artcraft/task_queue/GetTaskQueue.ts new file mode 100644 index 0000000000..a86b8a521e --- /dev/null +++ b/frontend/libs/tauri-api/src/lib/artcraft/task_queue/GetTaskQueue.ts @@ -0,0 +1,34 @@ +import { invoke } from "@tauri-apps/api/core"; +import { CommandResult } from "../../common/CommandStatus"; +import { TaskStatus, TaskType, TaskModelType, GenerationProvider } from "@storyteller/api-enums"; + +interface GetTaskQueueResponse { + tasks: TaskQueueItem[], +} + +export interface TaskQueueItem { + id: string, + task_status: TaskStatus, + task_type: TaskType, + model_type?: TaskModelType, + provider?: GenerationProvider, + provider_job_id?: string, + created_at: Date, + updated_at: Date, + completed_at?: Date, +} + +interface GetTaskQueueSuccess extends CommandResult { + payload: GetTaskQueueResponse; +} + +export const GetTaskQueue = async () : Promise => { + try { + let result = await invoke("get_task_queue_command") as GetTaskQueueSuccess; + return result.payload; + } catch (error) { + throw error; + } +} + +(window as any).test_get_task_queue = GetTaskQueue; diff --git a/frontend/libs/tauri-api/src/lib/artcraft/task_queue/MarkTaskAsDismissed.ts b/frontend/libs/tauri-api/src/lib/artcraft/task_queue/MarkTaskAsDismissed.ts new file mode 100644 index 0000000000..7620833dc0 --- /dev/null +++ b/frontend/libs/tauri-api/src/lib/artcraft/task_queue/MarkTaskAsDismissed.ts @@ -0,0 +1,22 @@ +import { invoke } from "@tauri-apps/api/core"; +import { CommandResult } from "../../common/CommandStatus"; + +interface MarkTaskAsDismissedSuccess extends CommandResult { + payload: void; +} + +export const MarkTaskAsDismissed = async (task_id: string) : Promise => { + try { + let result = await invoke("mark_task_as_dismissed_command", { + request: { + task: task_id + } + }) as MarkTaskAsDismissedSuccess; + return result; + } catch (error) { + throw error; + } +} + +// Temporary just for testing - +(window as any).test_mark_task_as_dismissed = MarkTaskAsDismissed; diff --git a/frontend/libs/tauri-api/tsconfig.json b/frontend/libs/tauri-api/tsconfig.json index e49e97d8eb..e18e5d70fc 100644 --- a/frontend/libs/tauri-api/tsconfig.json +++ b/frontend/libs/tauri-api/tsconfig.json @@ -10,6 +10,9 @@ }, { "path": "../model-list" + }, + { + "path": "../api-enums" } ], "extends": "../../tsconfig.base.json" diff --git a/frontend/libs/tauri-api/tsconfig.lib.json b/frontend/libs/tauri-api/tsconfig.lib.json index 94d297b124..a531cc2a48 100644 --- a/frontend/libs/tauri-api/tsconfig.lib.json +++ b/frontend/libs/tauri-api/tsconfig.lib.json @@ -48,6 +48,9 @@ "references": [ { "path": "../model-list/tsconfig.lib.json" + }, + { + "path": "../api-enums/tsconfig.lib.json" } ] } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 567d663285..2d5bd7fc79 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1146,6 +1146,10 @@ "@tauri-apps/plugin-upload": "2.2.1" } }, + "libs/api-enums": { + "name": "@storyteller/api-enums", + "version": "0.0.1" + }, "libs/billing": { "name": "@storyteller/billing", "version": "0.0.1", @@ -1639,6 +1643,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "peer": true, "engines": { "node": ">=6.9.0" @@ -1947,6 +1952,7 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1959,6 +1965,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1971,6 +1978,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -1983,6 +1991,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2045,6 +2054,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2057,6 +2067,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2085,6 +2096,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2097,6 +2109,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2109,6 +2122,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2121,6 +2135,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2133,6 +2148,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2145,6 +2161,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2157,6 +2174,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2172,6 +2190,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -3419,6 +3438,7 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", @@ -4432,6 +4452,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "license": "ISC", "peer": true, "engines": { "node": ">=12" @@ -4441,6 +4462,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.3.1", @@ -4457,6 +4479,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "peer": true, "dependencies": { "sprintf-js": "~1.0.2" @@ -4466,6 +4489,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -4475,6 +4499,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^5.0.0", @@ -4488,6 +4513,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -4501,6 +4527,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^4.1.0" @@ -4513,6 +4540,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -4528,6 +4556,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.2.0" @@ -4540,6 +4569,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -4558,6 +4588,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3" @@ -4570,6 +4601,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "license": "MIT", "peer": true, "dependencies": { "@jest/fake-timers": "^29.7.0", @@ -4598,6 +4630,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4627,6 +4660,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.11.6", @@ -7096,24 +7130,26 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.4.tgz", - "integrity": "sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.82.0.tgz", + "integrity": "sha512-SHRZxH+VHb6RwcHNskxyjso6o91Lq0DPgOpE5cDrppn1ziYhI723rjufFgh59RcpH441eci0/cXs/b0csXTtnw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/codegen": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz", - "integrity": "sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.82.0.tgz", + "integrity": "sha512-DJKDwyr6s0EtoPKmAaOsx2EnS2sV/qICNWn/KA+8lohSY6gJF1wuA+DOjitivBfU0soADoo8tqGq50C5rlzmCA==", + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", - "hermes-parser": "0.29.1", + "hermes-parser": "0.32.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" @@ -7129,6 +7165,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -7140,6 +7177,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -7160,6 +7198,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -7169,12 +7208,13 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.4.tgz", - "integrity": "sha512-8mpnvfcLcnVh+t1ok6V9eozWo8Ut+TZhz8ylJ6gF9d6q9EGDQX6s8jenan5Yv/pzN4vQEKI4ib2pTf/FELw+SA==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.82.0.tgz", + "integrity": "sha512-n5dxQowsRAjruG5sNl6MEPUzANUiVERaL7w4lHGmm/pz/ey1JOM9sFxL6RpZp1FJSVu4QKmbx6sIHrKb2MCekg==", + "license": "MIT", "peer": true, "dependencies": { - "@react-native/dev-middleware": "0.81.4", + "@react-native/dev-middleware": "0.82.0", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.1", @@ -7199,22 +7239,39 @@ } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz", - "integrity": "sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.82.0.tgz", + "integrity": "sha512-rlTDcjf0ecjOHmygdBACAQCqPG0z/itAxnbhk8ZiQts7m4gRJiA/iCGFyC8/T9voUA0azAX6QCl4tHlnuUy7mQ==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">= 20.19.4" } }, + "node_modules/@react-native/debugger-shell": { + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.82.0.tgz", + "integrity": "sha512-XbXABIMzaH7SvapNWcW+zix1uHeSX/MoXYKKWWTs99a12TgwNuTeLKKTEj/ZkAjWtaCCqb/sMI4aJDLXKppCGg==", + "license": "MIT", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": ">= 20.19.4" + } + }, "node_modules/@react-native/dev-middleware": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz", - "integrity": "sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.82.0.tgz", + "integrity": "sha512-SHvpo89RSzH06yZCmY3Xwr1J82EdUljC2lcO4YvXfHmytFG453Nz6kyZQcDEqGCfWDjznIUFUyT2UcLErmRWQg==", + "license": "MIT", "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.4", + "@react-native/debugger-frontend": "0.82.0", + "@react-native/debugger-shell": "0.82.0", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -7233,6 +7290,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", "peer": true, "dependencies": { "is-docker": "^2.0.0", @@ -7249,33 +7307,37 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", "peer": true, "dependencies": { "async-limiter": "~1.0.0" } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.4.tgz", - "integrity": "sha512-T7fPcQvDDCSusZFVSg6H1oVDKb/NnVYLnsqkcHsAF2C2KGXyo3J7slH/tJAwNfj/7EOA2OgcWxfC1frgn9TQvw==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.82.0.tgz", + "integrity": "sha512-PTfmQ6cYsJgMXJ49NzB4Sz/DmRUtwatGtcA6MuskRvQpSinno/00Sns7wxphkTVMHGAwk3Xh0t0SFNd1d1HCyw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.4.tgz", - "integrity": "sha512-sr42FaypKXJHMVHhgSbu2f/ZJfrLzgaoQ+HdpRvKEiEh2mhFf6XzZwecyLBvWqf2pMPZa+CpPfNPiejXjKEy8w==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.82.0.tgz", + "integrity": "sha512-7K1K64rfq0sKoGxB2DTsZROxal0B04Q+ftia0JyCOGOto/tyBQIQqiQgVtMVEBZSEXZyXmGx3HzF4EEPlvrEtw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/normalize-colors": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz", - "integrity": "sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.82.0.tgz", + "integrity": "sha512-oinsK6TYEz5RnFTSk9P+hJ/N/E0pOG76O0euU0Gf3BlXArDpS8m3vrGcTjqeQvajRIaYVHIRAY9hCO6q+exyLg==", + "license": "MIT", "peer": true }, "node_modules/@react-spring/animated": { @@ -9050,6 +9112,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "type-detect": "4.0.8" @@ -9059,6 +9122,7 @@ "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.0" @@ -9068,6 +9132,10 @@ "resolved": "libs/api", "link": true }, + "node_modules/@storyteller/api-enums": { + "resolved": "libs/api-enums", + "link": true + }, "node_modules/@storyteller/common": { "resolved": "libs/common", "link": true @@ -10225,6 +10293,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -10400,6 +10469,7 @@ "version": "0.32.1", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.32.1.tgz", "integrity": "sha512-RsqPttsBQ+6af0nATFXJJpemYQH7kL9+xLNm1z+0MjQFDKBZDM2R6SBrjdvRmHu9i9fM6povACj57Ft+pKRNOA==", + "license": "MIT", "peer": true, "peerDependencies": { "@types/react": "*" @@ -12633,6 +12703,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "license": "MIT", "peer": true }, "node_modules/ansi-colors": { @@ -12911,6 +12982,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT", "peer": true }, "node_modules/assertion-error": { @@ -12961,6 +13033,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT", "peer": true }, "node_modules/asynckit": { @@ -13063,6 +13136,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "license": "MIT", "peer": true, "dependencies": { "@jest/transform": "^29.7.0", @@ -13099,6 +13173,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -13115,6 +13190,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/template": "^7.3.3", @@ -13222,12 +13298,13 @@ } }, "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "license": "MIT", "peer": true, "dependencies": { - "hermes-parser": "0.29.1" + "hermes-parser": "0.32.0" } }, "node_modules/babel-plugin-transform-typescript-metadata": { @@ -13244,6 +13321,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -13270,6 +13348,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "license": "MIT", "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", @@ -13508,6 +13587,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "node-int64": "^0.4.0" @@ -13896,6 +13976,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "@types/node": "*", @@ -13914,6 +13995,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -13936,6 +14018,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "license": "Apache-2.0", "peer": true, "dependencies": { "@types/node": "*", @@ -13950,6 +14033,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "peer": true, "engines": { "node": ">=10" @@ -14278,6 +14362,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", "peer": true, "dependencies": { "debug": "2.6.9", @@ -14293,6 +14378,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -14302,6 +14388,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.8" @@ -14311,6 +14398,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", "peer": true, "dependencies": { "debug": "2.6.9", @@ -14329,12 +14417,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", "peer": true }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", "peer": true, "dependencies": { "ee-first": "1.1.1" @@ -14347,6 +14437,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.6" @@ -14503,7 +14594,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -14518,7 +14608,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -15453,6 +15542,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", "peer": true, "dependencies": { "stackframe": "^1.3.4" @@ -16996,6 +17086,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "license": "Apache-2.0", "peer": true }, "node_modules/express": { @@ -17151,10 +17242,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/fb-dotslash": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", + "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", + "license": "(MIT OR Apache-2.0)", + "peer": true, + "bin": { + "dotslash": "bin/dotslash" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", "peer": true, "dependencies": { "bser": "2.1.1" @@ -17377,6 +17482,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "license": "MIT", "peer": true }, "node_modules/follow-redirects": { @@ -17738,6 +17844,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", "peer": true, "engines": { "node": ">=8.0.0" @@ -18143,19 +18250,28 @@ "he": "bin/he" } }, + "node_modules/hermes-compiler": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.0.0.tgz", + "integrity": "sha512-boVFutx6ME/Km2mB6vvsQcdnazEYYI/jV1pomx1wcFUG/EVqTkr5CU0CW9bKipOA/8Hyu3NYwW3THg2Q1kNCfA==", + "license": "MIT", + "peer": true + }, "node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT", "peer": true }, "node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.32.0" } }, "node_modules/homedir-polyfill": { @@ -18457,6 +18573,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", "peer": true, "dependencies": { "queue": "6.0.2" @@ -18563,6 +18680,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.0.0" @@ -19220,7 +19338,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/isomorphic-ws": { @@ -19246,6 +19363,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@babel/core": "^7.12.3", @@ -19262,6 +19380,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" @@ -19399,6 +19518,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "license": "MIT", "peer": true, "dependencies": { "@jest/environment": "^29.7.0", @@ -19425,6 +19545,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -19450,6 +19571,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -19465,6 +19587,7 @@ "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" @@ -19516,6 +19639,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -19530,6 +19654,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "license": "MIT", "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -19568,6 +19693,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "license": "MIT", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -19652,6 +19778,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", + "license": "0BSD", "peer": true }, "node_modules/jsdom": { @@ -20027,6 +20154,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -20050,6 +20178,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "license": "Apache-2.0", "peer": true, "dependencies": { "debug": "^2.6.9", @@ -20060,6 +20189,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" @@ -20069,6 +20199,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", "peer": true }, "node_modules/lilconfig": { @@ -20501,6 +20632,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT", "peer": true }, "node_modules/log-symbols": { @@ -20886,6 +21018,7 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "tmpl": "1.0.5" @@ -20905,6 +21038,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", + "license": "Apache-2.0", "peer": true }, "node_modules/math-intrinsics": { @@ -21153,6 +21287,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT", "peer": true }, "node_modules/merge-descriptors": { @@ -21197,9 +21332,10 @@ } }, "node_modules/metro": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.2.tgz", - "integrity": "sha512-HQgs9H1FyVbRptNSMy/ImchTTE5vS2MSqLoOo7hbDoBq6hPPZokwJvBMwrYSxdjQZmLXz2JFZtdvS+ZfgTc9yw==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", + "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.24.7", @@ -21223,18 +21359,18 @@ "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.2", - "metro-cache": "0.83.2", - "metro-cache-key": "0.83.2", - "metro-config": "0.83.2", - "metro-core": "0.83.2", - "metro-file-map": "0.83.2", - "metro-resolver": "0.83.2", - "metro-runtime": "0.83.2", - "metro-source-map": "0.83.2", - "metro-symbolicate": "0.83.2", - "metro-transform-plugins": "0.83.2", - "metro-transform-worker": "0.83.2", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", @@ -21251,9 +21387,10 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.2.tgz", - "integrity": "sha512-rirY1QMFlA1uxH3ZiNauBninwTioOgwChnRdDcbB4tgRZ+bGX9DiXoh9QdpppiaVKXdJsII932OwWXGGV4+Nlw==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", + "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", @@ -21265,40 +21402,27 @@ "node": ">=20.19.4" } }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "peer": true - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, "node_modules/metro-cache": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.2.tgz", - "integrity": "sha512-Z43IodutUZeIS7OTH+yQFjc59QlFJ6s5OvM8p2AP9alr0+F8UKr8ADzFzoGKoHefZSKGa4bJx7MZJLF6GwPDHQ==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", + "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", + "license": "MIT", "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.2" + "metro-core": "0.83.3" }, "engines": { "node": ">=20.19.4" } }, "node_modules/metro-cache-key": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.2.tgz", - "integrity": "sha512-3EMG/GkGKYoTaf5RqguGLSWRqGTwO7NQ0qXKmNBjr0y6qD9s3VBXYlwB+MszGtmOKsqE9q3FPrE5Nd9Ipv7rZw==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", + "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", + "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" @@ -21311,6 +21435,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", "peer": true, "engines": { "node": ">= 14" @@ -21320,6 +21445,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "peer": true, "dependencies": { "agent-base": "^7.1.2", @@ -21330,18 +21456,19 @@ } }, "node_modules/metro-config": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.2.tgz", - "integrity": "sha512-1FjCcdBe3e3D08gSSiU9u3Vtxd7alGH3x/DNFqWDFf5NouX4kLgbVloDDClr1UrLz62c0fHh2Vfr9ecmrOZp+g==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", + "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", + "license": "MIT", "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", - "metro": "0.83.2", - "metro-cache": "0.83.2", - "metro-core": "0.83.2", - "metro-runtime": "0.83.2", + "metro": "0.83.3", + "metro-cache": "0.83.3", + "metro-core": "0.83.3", + "metro-runtime": "0.83.3", "yaml": "^2.6.1" }, "engines": { @@ -21349,23 +21476,25 @@ } }, "node_modules/metro-core": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.2.tgz", - "integrity": "sha512-8DRb0O82Br0IW77cNgKMLYWUkx48lWxUkvNUxVISyMkcNwE/9ywf1MYQUE88HaKwSrqne6kFgCSA/UWZoUT0Iw==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", + "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", + "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.2" + "metro-resolver": "0.83.3" }, "engines": { "node": ">=20.19.4" } }, "node_modules/metro-file-map": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.2.tgz", - "integrity": "sha512-cMSWnEqZrp/dzZIEd7DEDdk72PXz6w5NOKriJoDN9p1TDQ5nAYrY2lHi8d6mwbcGLoSlWmpPyny9HZYFfPWcGQ==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", + "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", + "license": "MIT", "peer": true, "dependencies": { "debug": "^4.4.0", @@ -21386,6 +21515,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -21401,6 +21531,7 @@ "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" @@ -21413,9 +21544,10 @@ } }, "node_modules/metro-minify-terser": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.2.tgz", - "integrity": "sha512-zvIxnh7U0JQ7vT4quasKsijId3dOAWgq+ip2jF/8TMrPUqQabGrs04L2dd0haQJ+PA+d4VvK/bPOY8X/vL2PWw==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", + "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", + "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", @@ -21426,9 +21558,10 @@ } }, "node_modules/metro-resolver": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.2.tgz", - "integrity": "sha512-Yf5mjyuiRE/Y+KvqfsZxrbHDA15NZxyfg8pIk0qg47LfAJhpMVEX+36e6ZRBq7KVBqy6VDX5Sq55iHGM4xSm7Q==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", + "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", + "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" @@ -21438,9 +21571,10 @@ } }, "node_modules/metro-runtime": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.2.tgz", - "integrity": "sha512-nnsPtgRvFbNKwemqs0FuyFDzXLl+ezuFsUXDbX8o0SXOfsOPijqiQrf3kuafO1Zx1aUWf4NOrKJMAQP5EEHg9A==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", + "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", @@ -21451,9 +21585,10 @@ } }, "node_modules/metro-source-map": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.2.tgz", - "integrity": "sha512-5FL/6BSQvshIKjXOennt9upFngq2lFvDakZn5LfauIVq8+L4sxXewIlSTcxAtzbtjAIaXeOSVMtCJ5DdfCt9AA==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", + "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", @@ -21461,9 +21596,9 @@ "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.83.2", + "metro-symbolicate": "0.83.3", "nullthrows": "^1.1.1", - "ob1": "0.83.2", + "ob1": "0.83.3", "source-map": "^0.5.6", "vlq": "^1.0.0" }, @@ -21475,20 +21610,22 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/metro-symbolicate": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.2.tgz", - "integrity": "sha512-KoU9BLwxxED6n33KYuQQuc5bXkIxF3fSwlc3ouxrrdLWwhu64muYZNQrukkWzhVKRNFIXW7X2iM8JXpi2heIPw==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", + "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", + "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.83.2", + "metro-source-map": "0.83.3", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" @@ -21504,15 +21641,17 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/metro-transform-plugins": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.2.tgz", - "integrity": "sha512-5WlW25WKPkiJk2yA9d8bMuZrgW7vfA4f4MBb9ZeHbTB3eIAoNN8vS8NENgG/X/90vpTB06X66OBvxhT3nHwP6A==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", + "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", @@ -21527,9 +21666,10 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.2.tgz", - "integrity": "sha512-G5DsIg+cMZ2KNfrdLnWMvtppb3+Rp1GMyj7Bvd9GgYc/8gRmvq1XVEF9XuO87Shhb03kFhGqMTgZerz3hZ1v4Q==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", + "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", @@ -21537,13 +21677,13 @@ "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "metro": "0.83.2", - "metro-babel-transformer": "0.83.2", - "metro-cache": "0.83.2", - "metro-cache-key": "0.83.2", - "metro-minify-terser": "0.83.2", - "metro-source-map": "0.83.2", - "metro-transform-plugins": "0.83.2", + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-source-map": "0.83.3", + "metro-transform-plugins": "0.83.3", "nullthrows": "^1.1.1" }, "engines": { @@ -21554,27 +21694,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT", "peer": true }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "peer": true - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "peer": true, - "dependencies": { - "hermes-estree": "0.32.0" - } - }, "node_modules/metro/node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*", @@ -21590,6 +21717,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" @@ -21599,6 +21727,7 @@ "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" @@ -21614,6 +21743,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=8.3.0" @@ -22765,6 +22895,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT", "peer": true }, "node_modules/node-machine-id": { @@ -22975,6 +23106,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "license": "MIT", "peer": true }, "node_modules/nwsapi": { @@ -23057,9 +23189,10 @@ } }, "node_modules/ob1": { - "version": "0.83.2", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.2.tgz", - "integrity": "sha512-XlK3w4M+dwd1g1gvHzVbxiXEbUllRONEgcF2uEO0zm4nxa0eKlh41c6N65q1xbiDOeKKda1tvNOAD33fNjyvCg==", + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", + "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", + "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" @@ -23408,6 +23541,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -24228,6 +24362,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", "peer": true, "dependencies": { "asap": "~2.0.6" @@ -24390,6 +24525,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", "peer": true, "dependencies": { "inherits": "~2.0.3" @@ -24520,6 +24656,7 @@ "version": "6.1.5", "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", + "license": "MIT", "peer": true, "dependencies": { "shell-quote": "^1.6.1", @@ -24530,6 +24667,7 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "peer": true, "engines": { "node": ">=8.3.0" @@ -24645,6 +24783,7 @@ "url": "https://github.com/sponsors/lavrton" } ], + "license": "MIT", "peer": true, "dependencies": { "@types/react-reconciler": "^0.32.1", @@ -24662,6 +24801,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "license": "MIT", "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.9" @@ -24674,6 +24814,7 @@ "version": "0.28.9", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", "peer": true, "peerDependencies": { "@types/react": "*" @@ -24683,6 +24824,7 @@ "version": "0.32.0", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.32.0.tgz", "integrity": "sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ==", + "license": "MIT", "peer": true, "dependencies": { "scheduler": "^0.26.0" @@ -24698,6 +24840,7 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT", "peer": true }, "node_modules/react-lifecycles-compat": { @@ -24893,6 +25036,7 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.3.0.tgz", "integrity": "sha512-myPe3YL/C8+Eq939/4qIVEPBW/uxV0iiUbmjfwrs9sGKYDG8ib8Dz3Okq7BQt8P+0k4igedONbjXMQy84aDFmQ==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", @@ -24943,6 +25087,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "license": "MIT", "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.9" @@ -24955,6 +25100,7 @@ "version": "0.28.9", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", "peer": true, "peerDependencies": { "@types/react": "*" @@ -24964,6 +25110,7 @@ "version": "0.31.0", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz", "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==", + "license": "MIT", "peer": true, "dependencies": { "scheduler": "^0.25.0" @@ -24976,9 +25123,10 @@ } }, "node_modules/react-spring/node_modules/@types/react": { - "version": "19.1.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.15.tgz", - "integrity": "sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "license": "MIT", "peer": true, "dependencies": { "csstype": "^3.0.2" @@ -24988,6 +25136,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -25012,6 +25161,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true, "dependencies": { "base64-js": "^1.3.1", @@ -25022,6 +25172,7 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", "peer": true, "engines": { "node": ">=18" @@ -25032,6 +25183,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -25052,6 +25204,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -25061,28 +25214,30 @@ } }, "node_modules/react-spring/node_modules/react-native": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.4.tgz", - "integrity": "sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.82.0.tgz", + "integrity": "sha512-E+sBFDgpwzoZzPn86gSGRBGLnS9Q6r4y6Xk5I57/QbkqkDOxmQb/bzQq/oCdUCdHImKiow2ldC3WJfnvAKIfzg==", + "license": "MIT", "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.81.4", - "@react-native/codegen": "0.81.4", - "@react-native/community-cli-plugin": "0.81.4", - "@react-native/gradle-plugin": "0.81.4", - "@react-native/js-polyfills": "0.81.4", - "@react-native/normalize-colors": "0.81.4", - "@react-native/virtualized-lists": "0.81.4", + "@react-native/assets-registry": "0.82.0", + "@react-native/codegen": "0.82.0", + "@react-native/community-cli-plugin": "0.82.0", + "@react-native/gradle-plugin": "0.82.0", + "@react-native/js-polyfills": "0.82.0", + "@react-native/normalize-colors": "0.82.0", + "@react-native/virtualized-lists": "0.82.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-syntax-hermes-parser": "0.32.0", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", + "hermes-compiler": "0.0.0", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", @@ -25108,8 +25263,8 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.0", - "react": "^19.1.0" + "@types/react": "^19.1.1", + "react": "^19.1.1" }, "peerDependenciesMeta": { "@types/react": { @@ -25118,9 +25273,10 @@ } }, "node_modules/react-spring/node_modules/react-native/node_modules/@react-native/virtualized-lists": { - "version": "0.81.4", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.4.tgz", - "integrity": "sha512-hBM+rMyL6Wm1Q4f/WpqGsaCojKSNUBqAXLABNGoWm1vabZ7cSnARMxBvA/2vo3hLcoR4v7zDK8tkKm9+O0LjVA==", + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.82.0.tgz", + "integrity": "sha512-fReDITtqwWdN29doPHhmeQEqa12ATJ4M2Y1MrT8Q1Hoy5a0H3oEn9S7fknGr7Pj+/I77yHyJajUbCupnJ8vkFA==", + "license": "MIT", "peer": true, "dependencies": { "invariant": "^2.2.4", @@ -25130,7 +25286,7 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.0", + "@types/react": "^19.1.1", "react": "*", "react-native": "*" }, @@ -25144,24 +25300,28 @@ "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT", "peer": true }, "node_modules/react-spring/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", "peer": true }, "node_modules/react-spring/node_modules/scheduler": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT", "peer": true }, "node_modules/react-spring/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", "peer": true, "dependencies": { "async-limiter": "~1.0.0" @@ -25192,6 +25352,7 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "license": "MIT", "peer": true, "peerDependencies": { "react": ">=16.13", @@ -25225,6 +25386,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/react-zdog/-/react-zdog-1.2.2.tgz", "integrity": "sha512-Ix7ALha91aOEwiHuxumCeYbARS5XNpc/w0v145oGkM6poF/CvhKJwzLhM5sEZbtrghMA+psAhOJkCTzJoseicA==", + "license": "MIT", "peer": true, "dependencies": { "react": "^18.2.0", @@ -25567,6 +25729,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT", "peer": true }, "node_modules/resolve": { @@ -26054,6 +26217,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -26153,7 +26317,6 @@ "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" @@ -26166,7 +26329,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -26176,6 +26338,7 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.4" @@ -26488,12 +26651,14 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT", "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", "peer": true, "dependencies": { "type-fest": "^0.7.1" @@ -26983,6 +27148,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", "peer": true, "peerDependencies": { "react": ">=17.0" @@ -27358,6 +27524,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -27372,6 +27539,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "peer": true, "dependencies": { "balanced-match": "^1.0.0", @@ -27383,6 +27551,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -27403,6 +27572,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -27451,6 +27621,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "license": "MIT", "peer": true }, "node_modules/through2": { @@ -27571,6 +27742,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause", "peer": true }, "node_modules/to-regex-range": { @@ -27838,6 +28010,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -27847,6 +28020,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { "node": ">=8" @@ -29268,6 +29442,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "license": "MIT", "peer": true }, "node_modules/vscode-uri": { @@ -29294,6 +29469,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "makeerror": "1.0.12" @@ -29476,6 +29652,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT", "peer": true }, "node_modules/whatwg-mimetype": { @@ -29678,6 +29855,7 @@ "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==", + "license": "ISC", "peer": true, "dependencies": { "imurmurhash": "^0.1.4", @@ -29817,6 +29995,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/zdog/-/zdog-1.1.3.tgz", "integrity": "sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==", + "license": "MIT", "peer": true }, "node_modules/zustand": { diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 0fd72d5f21..291c3c3411 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -170,6 +170,9 @@ }, { "path": "./libs/components/tutorial-modal" + }, + { + "path": "./libs/api-enums" } ] }