diff --git a/.editorconfig b/.editorconfig index d8e085a..9571781 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,7 +2,7 @@ root = true [*] indent_style = space -indent_size = 2 +indent_size = 4 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true diff --git a/Cargo.lock b/Cargo.lock index e8ba6f9..fd525f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3298,8 +3298,6 @@ dependencies = [ [[package]] name = "loco-gen" version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef868bd2df99c949018850b36fb700bba01b10001715f94390bcdb81f412f874" dependencies = [ "chrono", "clap", @@ -3318,8 +3316,6 @@ dependencies = [ [[package]] name = "loco-rs" version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2250c89f0f996c3493ec3d2588a2d63e2861a48df7b9585cb28fbf6faf15a1a0" dependencies = [ "argon2", "async-trait", @@ -4621,12 +4617,15 @@ dependencies = [ "serde", "serde_json", "serde_with", + "serde_yaml", "serial_test", + "tera", "testcontainers", "testcontainers-modules", "thiserror 2.0.10", "tokio", "tower 0.5.2", + "tower-http", "tracing", "tracing-subscriber", "url", diff --git a/Cargo.toml b/Cargo.toml index 7c05fad..0034f94 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ resolver = "2" testcontainers = { git = "https://github.com/testcontainers/testcontainers-rs.git", rev = "af21727" } # loco-rs = { git = "https://github.com/lonelyhentxi/loco.git", rev = "beb890e" } # loco-rs = { git = "https://github.com/loco-rs/loco.git" } +loco-rs = { path = "./patches/loco" } async-graphql = { git = "https://github.com/aumetra/async-graphql.git", rev = "690ece7" } async-graphql-axum = { git = "https://github.com/aumetra/async-graphql.git", rev = "690ece7" } jwt-authorizer = { git = "https://github.com/blablacio/jwt-authorizer.git", rev = "e956774" } diff --git a/apps/app/middleware.ts b/apps/app/middleware.ts index 11fede4..9f463a1 100644 --- a/apps/app/middleware.ts +++ b/apps/app/middleware.ts @@ -3,11 +3,11 @@ import { noseconeConfig, noseconeMiddleware, } from '@konobangu/security/middleware'; -import { NextRequest } from 'next/server'; +import type { NextRequest } from 'next/server'; const securityHeaders = noseconeMiddleware(noseconeConfig); -export async function middleware (_request: NextRequest) { +export async function middleware(_request: NextRequest) { const response = await securityHeaders(); return authMiddleware(response as any); } diff --git a/apps/recorder/.gitignore b/apps/recorder/.gitignore index 8861634..3a6a884 100644 --- a/apps/recorder/.gitignore +++ b/apps/recorder/.gitignore @@ -15,3 +15,18 @@ Cargo.lock # MSVC Windows builds of rustc generate these, which store debugging information *.pdb + + +# Local +.DS_Store +*.local +*.log* + +# Dist +node_modules +dist/ + +# IDE +.vscode/* +!.vscode/extensions.json +.idea diff --git a/apps/recorder/Cargo.toml b/apps/recorder/Cargo.toml index 0909b07..3075aa1 100644 --- a/apps/recorder/Cargo.toml +++ b/apps/recorder/Cargo.toml @@ -99,6 +99,9 @@ quirks_path = "0.1.0" base64 = "0.22.1" tower = "0.5.2" axum-extra = "0.10.0" +tower-http = "0.6.2" +serde_yaml = "0.9.34" +tera = "1.20.0" [dev-dependencies] serial_test = "3" diff --git a/apps/recorder/assets/.gitkeep b/apps/recorder/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/recorder/assets/static/404.html b/apps/recorder/assets/static/404.html new file mode 100644 index 0000000..dbd7df4 --- /dev/null +++ b/apps/recorder/assets/static/404.html @@ -0,0 +1,7 @@ + + + + not found :-( + + + \ No newline at end of file diff --git a/apps/recorder/config/development.yaml b/apps/recorder/config/development.yaml index f56ba2d..2932a9b 100644 --- a/apps/recorder/config/development.yaml +++ b/apps/recorder/config/development.yaml @@ -2,137 +2,137 @@ # Application logging configuration logger: - # Enable or disable logging. - enable: true - # Enable pretty backtrace (sets RUST_BACKTRACE=1) - pretty_backtrace: true - # Log level, options: trace, debug, info, warn or error. - level: debug - # Define the logging format. options: compact, pretty or Json - format: compact - # By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries - # Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters. - # override_filter: trace + # Enable or disable logging. + enable: true + # Enable pretty backtrace (sets RUST_BACKTRACE=1) + pretty_backtrace: true + # Log level, options: trace, debug, info, warn or error. + level: debug + # Define the logging format. options: compact, pretty or Json + format: compact + # By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries + # Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters. + # override_filter: trace # Web server configuration server: - # Port on which the server will listen. the server binding is 0.0.0.0:{PORT} - port: 5001 - # The UI hostname or IP address that mailers will point to. - host: http://webui.konobangu.com - # Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block - middlewares: - # Enable Etag cache header middleware - etag: - enable: true - # Allows to limit the payload size request. payload that bigger than this file will blocked the request. - limit_payload: - # Enable/Disable the middleware. - enable: true - # the limit size. can be b,kb,kib,mb,mib,gb,gib - body_limit: 5mb - # Generating a unique request ID and enhancing logging with additional information such as the start and completion of request processing, latency, status code, and other request details. - logger: - # Enable/Disable the middleware. - enable: true - # when your code is panicked, the request still returns 500 status code. - catch_panic: - # Enable/Disable the middleware. - enable: true - # Timeout for incoming requests middleware. requests that take more time from the configuration will cute and 408 status code will returned. - timeout_request: - # Enable/Disable the middleware. - enable: false - # Duration time in milliseconds. - timeout: 5000 - cors: - enable: true - # Set the value of the [`Access-Control-Allow-Origin`][mdn] header - # allow_origins: - # - https://loco.rs - # Set the value of the [`Access-Control-Allow-Headers`][mdn] header - # allow_headers: - # - Content-Type - # Set the value of the [`Access-Control-Allow-Methods`][mdn] header - # allow_methods: - # - POST - # Set the value of the [`Access-Control-Max-Age`][mdn] header in seconds - # max_age: 3600 - fallback: - enable: false + # Port on which the server will listen. the server binding is 0.0.0.0:{PORT} + port: 5001 + # The UI hostname or IP address that mailers will point to. + host: http://webui.konobangu.com + # Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block + middlewares: + # Enable Etag cache header middleware + etag: + enable: true + # Allows to limit the payload size request. payload that bigger than this file will blocked the request. + limit_payload: + # Enable/Disable the middleware. + enable: true + # the limit size. can be b,kb,kib,mb,mib,gb,gib + body_limit: 5mb + # Generating a unique request ID and enhancing logging with additional information such as the start and completion of request processing, latency, status code, and other request details. + logger: + # Enable/Disable the middleware. + enable: true + # when your code is panicked, the request still returns 500 status code. + catch_panic: + # Enable/Disable the middleware. + enable: true + # Timeout for incoming requests middleware. requests that take more time from the configuration will cute and 408 status code will returned. + timeout_request: + # Enable/Disable the middleware. + enable: false + # Duration time in milliseconds. + timeout: 5000 + + cors: + enable: true + # Set the value of the [`Access-Control-Allow-Origin`][mdn] header + # allow_origins: + # - https://loco.rs + # Set the value of the [`Access-Control-Allow-Headers`][mdn] header + # allow_headers: + # - Content-Type + # Set the value of the [`Access-Control-Allow-Methods`][mdn] header + # allow_methods: + # - POST + # Set the value of the [`Access-Control-Max-Age`][mdn] header in seconds + # max_age: 3600 + fallback: + enable: false # Worker Configuration workers: - # specifies the worker mode. Options: - # - BackgroundQueue - Workers operate asynchronously in the background, processing queued. - # - ForegroundBlocking - Workers operate in the foreground and block until tasks are completed. - # - BackgroundAsync - Workers operate asynchronously in the background, processing tasks with async capabilities. - mode: BackgroundQueue + # specifies the worker mode. Options: + # - BackgroundQueue - Workers operate asynchronously in the background, processing queued. + # - ForegroundBlocking - Workers operate in the foreground and block until tasks are completed. + # - BackgroundAsync - Workers operate asynchronously in the background, processing tasks with async capabilities. + mode: BackgroundQueue # Mailer Configuration. mailer: - # SMTP mailer configuration. - smtp: - # Enable/Disable smtp mailer. - enable: true - # SMTP server host. e.x localhost, smtp.gmail.com - host: '{{ get_env(name="MAILER_HOST", default="localhost") }}' - # SMTP server port - port: 1025 - # Use secure connection (SSL/TLS). - secure: false - # auth: - # user: - # password: + # SMTP mailer configuration. + smtp: + # Enable/Disable smtp mailer. + enable: true + # SMTP server host. e.x localhost, smtp.gmail.com + host: '{{ get_env(name="MAILER_HOST", default="localhost") }}' + # SMTP server port + port: 1025 + # Use secure connection (SSL/TLS). + secure: false + # auth: + # user: + # password: # Database Configuration database: - # Database connection URI - uri: '{{ get_env(name="DATABASE_URL", default="postgres://konobangu:konobangu@127.0.0.1:5432/konobangu") }}' - # When enabled, the sql query will be logged. - enable_logging: true - # Set the timeout duration when acquiring a connection. - connect_timeout: 500 - # Set the idle duration before closing a connection. - idle_timeout: 500 - # Minimum number of connections for a pool. - min_connections: 1 - # Maximum number of connections for a pool. - max_connections: 1 - # Run migration up when application loaded - auto_migrate: true - # Truncate database when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode - dangerously_truncate: false - # Recreating schema when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode - dangerously_recreate: false + # Database connection URI + uri: '{{ get_env(name="DATABASE_URL", default="postgres://konobangu:konobangu@127.0.0.1:5432/konobangu") }}' + # When enabled, the sql query will be logged. + enable_logging: true + # Set the timeout duration when acquiring a connection. + connect_timeout: 500 + # Set the idle duration before closing a connection. + idle_timeout: 500 + # Minimum number of connections for a pool. + min_connections: 1 + # Maximum number of connections for a pool. + max_connections: 1 + # Run migration up when application loaded + auto_migrate: true + # Truncate database when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_truncate: false + # Recreating schema when application loaded. This is a dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_recreate: false # Redis Configuration redis: - # Redis connection URI - uri: '{{ get_env(name="REDIS_URL", default="redis://127.0.0.1:6379") }}' - # Dangerously flush all data in Redis on startup. dangerous operation, make sure that you using this flag only on dev environments or test mode - dangerously_flush: false + # Redis connection URI + uri: '{{ get_env(name="REDIS_URL", default="redis://127.0.0.1:6379") }}' + # Dangerously flush all data in Redis on startup. dangerous operation, make sure that you using this flag only on dev environments or test mode + dangerously_flush: false settings: + dal: + data_dir: ./data - dal: - data_dir: ./data + mikan: + base_url: "https://mikanani.me/" + http_client: + exponential_backoff_max_retries: 3 + leaky_bucket_max_tokens: 2 + leaky_bucket_initial_tokens: 0 + leaky_bucket_refill_tokens: 1 + leaky_bucket_refill_interval: 500 - mikan: - base_url: "https://mikanani.me/" - http_client: - exponential_backoff_max_retries: 3 - leaky_bucket_max_tokens: 2 - leaky_bucket_initial_tokens: 0 - leaky_bucket_refill_tokens: 1 - leaky_bucket_refill_interval: 500 - - auth: - auth_type: "oidc" # or "basic" - basic_user: "konobangu" - basic_password: "konobangu" - oidc_api_issuer: "https://some-oidc-auth.com/oidc" - oidc_api_audience: "https://konobangu.com/api" - oidc_extra_scopes: "read:konobangu,write:konobangu" - oidc_extra_claim_key: "" - oidc_extra_claim_value: "" + auth: + auth_type: "oidc" # or "basic" + basic_user: "konobangu" + basic_password: "konobangu" + oidc_api_issuer: "https://some-oidc-auth.com/oidc" + oidc_api_audience: "https://konobangu.com/api" + oidc_extra_scopes: "read:konobangu,write:konobangu" + oidc_extra_claim_key: "" + oidc_extra_claim_value: "" diff --git a/apps/recorder/package.json b/apps/recorder/package.json new file mode 100644 index 0000000..8c53afb --- /dev/null +++ b/apps/recorder/package.json @@ -0,0 +1,7 @@ +{ + "name": "recorder", + "version": "1.0.0", + "dependencies": { + "altair-static": "^8.1.3" + } +} diff --git a/apps/recorder/src/app.rs b/apps/recorder/src/app.rs deleted file mode 100644 index 9c4261d..0000000 --- a/apps/recorder/src/app.rs +++ /dev/null @@ -1,130 +0,0 @@ -use std::path::Path; - -use async_trait::async_trait; -use loco_rs::{ - app::{AppContext, Hooks}, - boot::{create_app, BootResult, StartMode}, - cache, - config::Config, - controller::AppRoutes, - db::truncate_table, - environment::Environment, - prelude::*, - task::Tasks, - Result, -}; - -use crate::{ - auth::service::{AppAuthService, AppAuthServiceInitializer}, - controllers::{self}, - dal::{AppDalClient, AppDalInitalizer}, - extract::mikan::{client::AppMikanClientInitializer, AppMikanClient}, - graphql::service::{AppGraphQLService, AppGraphQLServiceInitializer}, - migrations::Migrator, - models::subscribers, - workers::subscription_worker::SubscriptionWorker, -}; - -pub const CONFIG_FOLDER: &str = "LOCO_CONFIG_FOLDER"; - -pub trait AppContextExt { - fn get_dal_client(&self) -> &AppDalClient { - AppDalClient::app_instance() - } - - fn get_mikan_client(&self) -> &AppMikanClient { - AppMikanClient::app_instance() - } - - fn get_auth_service(&self) -> &AppAuthService { - AppAuthService::app_instance() - } - - fn get_graphql_service(&self) -> &AppGraphQLService { - AppGraphQLService::app_instance() - } -} - -impl AppContextExt for AppContext {} - -pub struct App; - -#[async_trait] -impl Hooks for App { - async fn load_config(env: &Environment) -> Result { - std::env::var(CONFIG_FOLDER).map_or_else( - |_| { - let monorepo_project_config_dir = Path::new("./apps/recorder/config"); - if monorepo_project_config_dir.exists() && monorepo_project_config_dir.is_dir() { - return env.load_from_folder(monorepo_project_config_dir); - } - let current_config_dir = Path::new("./config"); - env.load_from_folder(current_config_dir) - }, - |config_folder| env.load_from_folder(Path::new(&config_folder)), - ) - } - - fn app_name() -> &'static str { - env!("CARGO_CRATE_NAME") - } - - async fn initializers(_ctx: &AppContext) -> Result>> { - let initializers: Vec> = vec![ - Box::new(AppDalInitalizer), - Box::new(AppMikanClientInitializer), - Box::new(AppGraphQLServiceInitializer), - Box::new(AppAuthServiceInitializer), - ]; - - Ok(initializers) - } - - fn app_version() -> String { - format!( - "{} ({})", - env!("CARGO_PKG_VERSION"), - option_env!("BUILD_SHA") - .or(option_env!("GITHUB_SHA")) - .unwrap_or("dev") - ) - } - - async fn boot( - mode: StartMode, - environment: &Environment, - config: Config, - ) -> Result { - create_app::(mode, environment, config).await - } - - fn routes(ctx: &AppContext) -> AppRoutes { - AppRoutes::with_default_routes() - .prefix("/api") - .add_route(controllers::auth::routes()) - .add_route(controllers::graphql::routes(ctx.clone())) - } - - async fn connect_workers(ctx: &AppContext, queue: &Queue) -> Result<()> { - queue.register(SubscriptionWorker::build(ctx)).await?; - Ok(()) - } - - async fn after_context(ctx: AppContext) -> Result { - Ok(AppContext { - cache: cache::Cache::new(cache::drivers::inmem::new()).into(), - ..ctx - }) - } - - fn register_tasks(_tasks: &mut Tasks) {} - - async fn truncate(ctx: &AppContext) -> Result<()> { - truncate_table(&ctx.db, subscribers::Entity).await?; - Ok(()) - } - - async fn seed(_ctx: &AppContext, _base: &Path) -> Result<()> { - Ok(()) - } -} diff --git a/apps/recorder/src/app/ext.rs b/apps/recorder/src/app/ext.rs new file mode 100644 index 0000000..0057abd --- /dev/null +++ b/apps/recorder/src/app/ext.rs @@ -0,0 +1,26 @@ +use loco_rs::app::AppContext; + +use crate::{ + auth::service::AppAuthService, dal::AppDalClient, extract::mikan::AppMikanClient, + graphql::service::AppGraphQLService, +}; + +pub trait AppContextExt { + fn get_dal_client(&self) -> &AppDalClient { + AppDalClient::app_instance() + } + + fn get_mikan_client(&self) -> &AppMikanClient { + AppMikanClient::app_instance() + } + + fn get_auth_service(&self) -> &AppAuthService { + AppAuthService::app_instance() + } + + fn get_graphql_service(&self) -> &AppGraphQLService { + AppGraphQLService::app_instance() + } +} + +impl AppContextExt for AppContext {} diff --git a/apps/recorder/src/app/mod.rs b/apps/recorder/src/app/mod.rs new file mode 100644 index 0000000..52bcb91 --- /dev/null +++ b/apps/recorder/src/app/mod.rs @@ -0,0 +1,174 @@ +pub mod ext; + +use std::{ + fs, + path::{self, Path, PathBuf}, +}; + +use async_trait::async_trait; +pub use ext::AppContextExt; +use itertools::Itertools; +use loco_rs::{ + app::{AppContext, Hooks}, + boot::{create_app, BootResult, StartMode}, + cache, + config::Config, + controller::{middleware, middleware::MiddlewareLayer, AppRoutes}, + db::truncate_table, + environment::Environment, + prelude::*, + task::Tasks, + Result, +}; +use once_cell::sync::OnceCell; + +use crate::{ + auth::service::AppAuthServiceInitializer, + controllers::{self}, + dal::AppDalInitalizer, + extract::mikan::client::AppMikanClientInitializer, + graphql::service::AppGraphQLServiceInitializer, + migrations::Migrator, + models::subscribers, + workers::subscription_worker::SubscriptionWorker, +}; + +pub const WORKING_ROOT_VAR_NAME: &str = "WORKING_ROOT"; + +static APP_WORKING_ROOT: OnceCell = OnceCell::new(); + +pub struct App; + +impl App { + pub fn set_working_root(path: PathBuf) { + APP_WORKING_ROOT.get_or_init(|| { + quirks_path::PathBuf::from(path.as_os_str().to_string_lossy().to_string()) + }); + } + + pub fn get_working_root() -> &'static quirks_path::Path { + APP_WORKING_ROOT + .get() + .map(|p| p.as_path()) + .expect("working root not set") + } +} + +#[async_trait] +impl Hooks for App { + fn app_version() -> String { + format!( + "{} ({})", + env!("CARGO_PKG_VERSION"), + option_env!("BUILD_SHA") + .or(option_env!("GITHUB_SHA")) + .unwrap_or("dev") + ) + } + + fn app_name() -> &'static str { + env!("CARGO_CRATE_NAME") + } + + async fn boot( + mode: StartMode, + environment: &Environment, + config: Config, + ) -> Result { + create_app::(mode, environment, config).await + } + + async fn load_config(env: &Environment) -> Result { + let working_roots_to_search = [ + std::env::var(WORKING_ROOT_VAR_NAME).ok(), + Some(String::from("./apps/recorder")), + Some(String::from(".")), + ] + .into_iter() + .flatten() + .collect_vec(); + + for working_root in working_roots_to_search.iter() { + let working_root = PathBuf::from(working_root); + let config_dir = working_root.as_path().join("config"); + for config_file in [ + config_dir.join(format!("{env}.local.yaml")), + config_dir.join(format!("{env}.yaml")), + ] { + if config_file.exists() && config_file.is_file() { + tracing::info!(config_file =? config_file, "loading environment from"); + + let content = fs::read_to_string(config_file.clone())?; + let rendered = tera::Tera::one_off( + &content, + &tera::Context::from_serialize(serde_json::json!({}))?, + false, + )?; + + App::set_working_root(working_root); + + return serde_yaml::from_str(&rendered).map_err(|err| { + loco_rs::Error::YAMLFile(err, config_file.to_string_lossy().to_string()) + }); + } + } + } + + Err(loco_rs::Error::Message(format!( + "no configuration file found in search paths: {}", + working_roots_to_search + .iter() + .map(|p| path::absolute(PathBuf::from(p))) + .flatten() + .map(|p| p.to_string_lossy().to_string()) + .join(",") + ))) + } + + async fn initializers(_ctx: &AppContext) -> Result>> { + let initializers: Vec> = vec![ + Box::new(AppDalInitalizer), + Box::new(AppMikanClientInitializer), + Box::new(AppGraphQLServiceInitializer), + Box::new(AppAuthServiceInitializer), + ]; + + Ok(initializers) + } + + fn routes(ctx: &AppContext) -> AppRoutes { + AppRoutes::with_default_routes() + .prefix("/api") + .add_route(controllers::auth::routes()) + .add_route(controllers::graphql::routes(ctx.clone())) + } + + fn middlewares(ctx: &AppContext) -> Vec> { + let mut middlewares = middleware::default_middleware_stack(ctx); + middlewares.extend(controllers::graphql::asset_middlewares()); + middlewares + } + + async fn after_context(ctx: AppContext) -> Result { + Ok(AppContext { + cache: cache::Cache::new(cache::drivers::inmem::new()).into(), + ..ctx + }) + } + + async fn connect_workers(ctx: &AppContext, queue: &Queue) -> Result<()> { + queue.register(SubscriptionWorker::build(ctx)).await?; + Ok(()) + } + + fn register_tasks(_tasks: &mut Tasks) {} + + async fn truncate(ctx: &AppContext) -> Result<()> { + truncate_table(&ctx.db, subscribers::Entity).await?; + Ok(()) + } + + async fn seed(_ctx: &AppContext, _base: &Path) -> Result<()> { + Ok(()) + } +} diff --git a/apps/recorder/src/auth/basic.rs b/apps/recorder/src/auth/basic.rs index c90c70a..e1eccf3 100644 --- a/apps/recorder/src/auth/basic.rs +++ b/apps/recorder/src/auth/basic.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use axum::http::request::Parts; +use axum::http::{request::Parts, HeaderValue}; use base64::{self, Engine}; use reqwest::header::AUTHORIZATION; @@ -76,4 +76,8 @@ impl AuthService for BasicAuthService { } Err(AuthError::BasicInvalidCredentials) } + + fn www_authenticate_header_value(&self) -> Option { + Some(HeaderValue::from_static(r#"Basic realm="konobangu""#)) + } } diff --git a/apps/recorder/src/auth/errors.rs b/apps/recorder/src/auth/errors.rs index 358ede6..0fa2798 100644 --- a/apps/recorder/src/auth/errors.rs +++ b/apps/recorder/src/auth/errors.rs @@ -3,15 +3,16 @@ use axum::{ response::{IntoResponse, Response}, Json, }; +use serde::{Deserialize, Serialize}; use thiserror::Error; #[derive(Debug, Error)] pub enum AuthError { - #[error(transparent)] - OidcInitError(#[from] jwt_authorizer::error::InitError), #[error("Invalid credentials")] BasicInvalidCredentials, #[error(transparent)] + OidcInitError(#[from] jwt_authorizer::error::InitError), + #[error(transparent)] OidcJwtAuthError(#[from] jwt_authorizer::AuthError), #[error("Extra scopes {expected} do not match found scopes {found}")] OidcExtraScopesMatchError { expected: String, found: String }, @@ -29,8 +30,23 @@ pub enum AuthError { OidcSubMissingError, } -impl IntoResponse for AuthError { - fn into_response(self) -> Response { - (StatusCode::UNAUTHORIZED, Json(self.to_string())).into_response() +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct AuthErrorBody { + pub error_code: i32, + pub error_msg: String, +} + +impl From for AuthErrorBody { + fn from(value: AuthError) -> Self { + AuthErrorBody { + error_code: StatusCode::UNAUTHORIZED.as_u16() as i32, + error_msg: value.to_string(), + } + } +} + +impl IntoResponse for AuthError { + fn into_response(self) -> Response { + (StatusCode::UNAUTHORIZED, Json(AuthErrorBody::from(self))).into_response() } } diff --git a/apps/recorder/src/auth/middleware.rs b/apps/recorder/src/auth/middleware.rs new file mode 100644 index 0000000..8a5e886 --- /dev/null +++ b/apps/recorder/src/auth/middleware.rs @@ -0,0 +1,63 @@ +use axum::{ + extract::{Request, State}, + http::header, + middleware::Next, + response::{IntoResponse, Response}, +}; +use loco_rs::prelude::AppContext; + +use crate::{app::AppContextExt, auth::AuthService}; + +pub async fn api_auth_middleware( + State(ctx): State, + request: Request, + next: Next, +) -> Response { + let auth_service = ctx.get_auth_service(); + + let (mut parts, body) = request.into_parts(); + + let mut response = match auth_service.extract_user_info(&mut parts).await { + Ok(auth_user_info) => { + let mut request = Request::from_parts(parts, body); + request.extensions_mut().insert(auth_user_info); + next.run(request).await + } + Err(auth_error) => auth_error.into_response(), + }; + + if let Some(header_value) = auth_service.www_authenticate_header_value() { + response + .headers_mut() + .insert(header::WWW_AUTHENTICATE, header_value); + }; + + response +} + +pub async fn webui_auth_middleware( + State(ctx): State, + request: Request, + next: Next, +) -> Response { + let auth_service = ctx.get_auth_service(); + + let (mut parts, body) = request.into_parts(); + + let mut response = match auth_service.extract_user_info(&mut parts).await { + Ok(auth_user_info) => { + let mut request = Request::from_parts(parts, body); + request.extensions_mut().insert(auth_user_info); + next.run(request).await + } + Err(auth_error) => auth_error.into_response(), + }; + + if let Some(header_value) = auth_service.www_authenticate_header_value() { + response + .headers_mut() + .insert(header::WWW_AUTHENTICATE, header_value); + }; + + response +} diff --git a/apps/recorder/src/auth/mod.rs b/apps/recorder/src/auth/mod.rs index 73d162f..ae46bde 100644 --- a/apps/recorder/src/auth/mod.rs +++ b/apps/recorder/src/auth/mod.rs @@ -1,9 +1,11 @@ pub mod basic; pub mod config; pub mod errors; +pub mod middleware; pub mod oidc; pub mod service; pub use config::{AppAuthConfig, BasicAuthConfig, OidcAuthConfig}; pub use errors::AuthError; +pub use middleware::{api_auth_middleware, webui_auth_middleware}; pub use service::{AppAuthService, AuthService, AuthUserInfo}; diff --git a/apps/recorder/src/auth/oidc.rs b/apps/recorder/src/auth/oidc.rs index d6dd605..2dff393 100644 --- a/apps/recorder/src/auth/oidc.rs +++ b/apps/recorder/src/auth/oidc.rs @@ -1,7 +1,7 @@ use std::collections::{HashMap, HashSet}; use async_trait::async_trait; -use axum::http::request::Parts; +use axum::http::{request::Parts, HeaderValue}; use itertools::Itertools; use jwt_authorizer::{authorizer::Authorizer, NumericDate, OneOrArray}; use serde::{Deserialize, Serialize}; @@ -135,4 +135,8 @@ impl AuthService for OidcAuthService { auth_type: AuthType::Oidc, }) } + + fn www_authenticate_header_value(&self) -> Option { + Some(HeaderValue::from_static(r#"Bearer realm="konobangu""#)) + } } diff --git a/apps/recorder/src/auth/service.rs b/apps/recorder/src/auth/service.rs index ff47446..66ca719 100644 --- a/apps/recorder/src/auth/service.rs +++ b/apps/recorder/src/auth/service.rs @@ -7,6 +7,7 @@ use axum::{ use jwt_authorizer::{JwtAuthorizer, Validation}; use loco_rs::app::{AppContext, Initializer}; use once_cell::sync::OnceCell; +use reqwest::header::HeaderValue; use super::{ basic::BasicAuthService, @@ -16,6 +17,7 @@ use super::{ }; use crate::{app::AppContextExt as _, config::AppConfigExt, models::auth::AuthType}; +#[derive(Clone, Debug)] pub struct AuthUserInfo { pub user_pid: String, pub auth_type: AuthType, @@ -40,6 +42,7 @@ impl FromRequestParts for AuthUserInfo { #[async_trait] pub trait AuthService { async fn extract_user_info(&self, request: &mut Parts) -> Result; + fn www_authenticate_header_value(&self) -> Option; } pub enum AppAuthService { @@ -87,6 +90,13 @@ impl AuthService for AppAuthService { AppAuthService::Oidc(service) => service.extract_user_info(request).await, } } + + fn www_authenticate_header_value(&self) -> Option { + match self { + AppAuthService::Basic(service) => service.www_authenticate_header_value(), + AppAuthService::Oidc(service) => service.www_authenticate_header_value(), + } + } } pub struct AppAuthServiceInitializer; diff --git a/apps/recorder/src/config/settings_mixin.yaml b/apps/recorder/src/config/settings_mixin.yaml index 4a7621d..c33b94e 100644 --- a/apps/recorder/src/config/settings_mixin.yaml +++ b/apps/recorder/src/config/settings_mixin.yaml @@ -1,15 +1,16 @@ dal: - data_dir: ./data + data_dir: ./data mikan: - http_client: - exponential_backoff_max_retries: 3 - leaky_bucket_max_tokens: 2 - leaky_bucket_initial_tokens: 0 - leaky_bucket_refill_tokens: 1 - leaky_bucket_refill_interval: 500 - base_url: "https://mikanani.me/" + http_client: + exponential_backoff_max_retries: 3 + leaky_bucket_max_tokens: 2 + leaky_bucket_initial_tokens: 0 + leaky_bucket_refill_tokens: 1 + leaky_bucket_refill_interval: 500 + base_url: "https://mikanani.me/" graphql: - depth_limit: null - complexity_limit: null + playground_static: "./node_modules/altair-static/build/dist" + depth_limit: null + complexity_limit: null diff --git a/apps/recorder/src/controllers/auth.rs b/apps/recorder/src/controllers/auth.rs deleted file mode 100644 index f4e3484..0000000 --- a/apps/recorder/src/controllers/auth.rs +++ /dev/null @@ -1,14 +0,0 @@ -use loco_rs::prelude::*; - -use crate::{models::subscribers, views::subscribers::CurrentResponse}; - -async fn current(State(ctx): State) -> Result { - let subscriber = subscribers::Model::find_root(&ctx).await?; - format::json(CurrentResponse::new(&subscriber)) -} - -pub fn routes() -> Routes { - Routes::new() - .prefix("subscribers") - .add("/current", get(current)) -} diff --git a/apps/recorder/src/controllers/auth/mod.rs b/apps/recorder/src/controllers/auth/mod.rs new file mode 100644 index 0000000..80ff4c0 --- /dev/null +++ b/apps/recorder/src/controllers/auth/mod.rs @@ -0,0 +1,10 @@ +use axum::response::IntoResponse; +use loco_rs::prelude::*; + +async fn current() -> impl IntoResponse { + "" +} + +pub fn routes() -> Routes { + Routes::new().prefix("/auth").add("/current", get(current)) +} diff --git a/apps/recorder/src/controllers/graphql.rs b/apps/recorder/src/controllers/graphql.rs deleted file mode 100644 index e349e7d..0000000 --- a/apps/recorder/src/controllers/graphql.rs +++ /dev/null @@ -1,40 +0,0 @@ -use async_graphql::http::{playground_source, GraphQLPlaygroundConfig}; -use async_graphql_axum::{GraphQLRequest, GraphQLResponse}; -use axum::{ - extract::State, - middleware::from_extractor_with_state, - response::{Html, IntoResponse}, - routing::{get, post}, -}; -use loco_rs::{app::AppContext, prelude::Routes}; - -use crate::{app::AppContextExt, auth::AuthUserInfo}; - -async fn graphql_playground() -> impl IntoResponse { - Html(playground_source(GraphQLPlaygroundConfig::new( - "/api/graphql", - ))) -} - -async fn graphql_handler( - State(ctx): State, - auth_user_info: AuthUserInfo, - req: GraphQLRequest, -) -> GraphQLResponse { - let graphql_service = ctx.get_graphql_service(); - let mut req = req.into_inner(); - req = req.data(auth_user_info); - - graphql_service.schema.execute(req).await.into() -} - -pub fn routes(state: AppContext) -> Routes { - Routes::new() - .prefix("/graphql") - .add("/playground", get(graphql_playground)) - .add( - "/", - post(graphql_handler) - .layer(from_extractor_with_state::(state)), - ) -} diff --git a/apps/recorder/src/controllers/graphql/mod.rs b/apps/recorder/src/controllers/graphql/mod.rs new file mode 100644 index 0000000..ab05e5b --- /dev/null +++ b/apps/recorder/src/controllers/graphql/mod.rs @@ -0,0 +1,71 @@ +pub mod playground; + +use std::collections::HashMap; + +use async_graphql_axum::{GraphQLRequest, GraphQLResponse}; +use axum::{ + extract::State, + http::HeaderMap, + middleware::from_fn_with_state, + response::Html, + routing::{get, post}, + Extension, +}; +use loco_rs::{app::AppContext, controller::middleware::MiddlewareLayer, prelude::Routes}; +use playground::{altair_graphql_playground_asset_middleware, AltairGraphQLPlayground}; +use reqwest::header; + +use crate::{ + app::AppContextExt, + auth::{api_auth_middleware, webui_auth_middleware, AuthUserInfo}, +}; + +async fn graphql_playground(header_map: HeaderMap) -> loco_rs::Result> { + let mut playground_config = AltairGraphQLPlayground::new("/api/graphql"); + + if let Some(authorization) = header_map.get(header::AUTHORIZATION) { + if let Ok(authorization) = authorization.to_str() { + playground_config.initial_headers = { + let mut m = HashMap::new(); + m.insert(header::AUTHORIZATION.to_string(), authorization.to_string()); + Some(m) + } + } + } + + let html = Html(playground_config.render("/api/graphql/playground/static/")?); + + Ok(html) +} + +async fn graphql_handler( + State(ctx): State, + Extension(auth_user_info): Extension, + req: GraphQLRequest, +) -> GraphQLResponse { + let graphql_service = ctx.get_graphql_service(); + + let mut req = req.into_inner(); + req = req.data(auth_user_info); + + graphql_service.schema.execute(req).await.into() +} + +pub fn routes(state: AppContext) -> Routes { + Routes::new() + .prefix("/graphql") + .add( + "/playground", + get(graphql_playground).layer(from_fn_with_state(state.clone(), webui_auth_middleware)), + ) + .add( + "/", + post(graphql_handler).layer(from_fn_with_state(state, api_auth_middleware)), + ) +} + +pub fn asset_middlewares() -> Vec> { + vec![Box::new(altair_graphql_playground_asset_middleware( + "/api/graphql/playground/static/", + ))] +} diff --git a/apps/recorder/src/controllers/graphql/playground.rs b/apps/recorder/src/controllers/graphql/playground.rs new file mode 100644 index 0000000..0b539f2 --- /dev/null +++ b/apps/recorder/src/controllers/graphql/playground.rs @@ -0,0 +1,74 @@ +use std::collections::HashMap; + +use lazy_static::lazy_static; +use loco_rs::controller::middleware::static_assets::{FolderConfig, StaticAssets}; +use regex::Regex; +use serde::Serialize; +use serde_json::Value; + +use crate::app::App; + +const ALTAIR_GRAPHQL_HTML: &'static str = + include_str!("../../../node_modules/altair-static/build/dist/index.html"); + +lazy_static! { + static ref ALTAIR_GRAPHQL_BASE_REGEX: Regex = Regex::new(r"").unwrap(); +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct AltairGraphQLPlayground<'a> { + #[serde(rename = "endpointURL")] + pub endpoint_url: &'a str, + /** + * URL to set as the subscription endpoint. This can be relative or + * absolute. + */ + pub subscriptions_endpoint: Option<&'a str>, + pub initial_headers: Option>, + pub initial_settings: Option>, + #[serde(flatten)] + pub other: Option>, +} + +impl<'a> AltairGraphQLPlayground<'a> { + /// Create a config for GraphQL playground. + pub fn new(endpoint_url: &'a str) -> Self { + Self { + endpoint_url, + subscriptions_endpoint: Default::default(), + initial_headers: Default::default(), + initial_settings: Default::default(), + other: Default::default(), + } + } + + pub fn render(&self, base_url: &str) -> loco_rs::Result { + let option = serde_json::to_string(self)?; + let render_str = ALTAIR_GRAPHQL_BASE_REGEX + .replace(ALTAIR_GRAPHQL_HTML, format!(r#""#)) + .replace( + "", + &format!("", option), + ); + + Ok(render_str) + } +} + +pub fn altair_graphql_playground_asset_middleware(base_url: &str) -> StaticAssets { + StaticAssets { + enable: true, + must_exist: true, + folder: FolderConfig { + uri: String::from(base_url), + path: App::get_working_root() + .join("node_modules/altair-static/build/dist") + .into(), + }, + fallback: App::get_working_root() + .join("assets/static/404.html") + .into(), + precompressed: false, + } +} diff --git a/apps/recorder/src/dal/client.rs b/apps/recorder/src/dal/client.rs index 9c54544..8e53499 100644 --- a/apps/recorder/src/dal/client.rs +++ b/apps/recorder/src/dal/client.rs @@ -11,7 +11,7 @@ use url::Url; use uuid::Uuid; use super::AppDalConfig; -use crate::config::AppConfigExt; +use crate::{app::App, config::AppConfigExt}; // TODO: wait app-context-trait to integrate #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] @@ -52,12 +52,16 @@ impl fmt::Display for DalStoredUrl { #[derive(Debug, Clone)] pub struct AppDalClient { - pub config: AppDalConfig, + pub data_dir: String, } impl AppDalClient { pub fn new(config: AppDalConfig) -> Self { - Self { config } + Self { + data_dir: App::get_working_root() + .join(config.data_dir.as_deref().unwrap_or("./data")) + .to_string(), + } } pub fn app_instance() -> &'static AppDalClient { @@ -67,13 +71,7 @@ impl AppDalClient { } pub fn get_fs(&self) -> Fs { - Fs::default().root( - self.config - .data_dir - .as_ref() - .map(|s| s as &str) - .unwrap_or("./data"), - ) + Fs::default().root(&self.data_dir) } pub fn create_filename(extname: &str) -> String { diff --git a/apps/web/package.json b/apps/web/package.json index eec5cca..91a4be2 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -31,7 +31,6 @@ "import-in-the-middle": "^1.11.3", "lucide-react": "^0.468.0", "mdx-bundler": "^10.0.3", - "next": "^15.1.3", "react": "^19.0.0", "react-dom": "^19.0.0", "react-wrap-balancer": "^1.1.1", diff --git a/package.json b/package.json index e9a322c..e86089d 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "node": ">=22" }, "dependencies": { - "chalk": "^5.3.0", + "chalk": "^5.4.1", "commander": "^12.1.0" }, "devDependencies": { @@ -40,7 +40,7 @@ "shx": "^0.3.4", "tsx": "^4.19.2", "turbo": "^2.3.3", - "typescript": "^5.7.2", - "ultracite": "^4.1.12" + "typescript": "^5.7.3", + "ultracite": "^4.1.14" } } diff --git a/packages/typescript-config/base.json b/packages/typescript-config/base.json index 67e1628..41efa6d 100644 --- a/packages/typescript-config/base.json +++ b/packages/typescript-config/base.json @@ -8,14 +8,14 @@ "forceConsistentCasingInFileNames": true, "incremental": false, "isolatedModules": true, - "lib": ["es2022", "DOM", "DOM.Iterable"], + "lib": ["es2024", "DOM", "DOM.Iterable"], "module": "NodeNext", "moduleDetection": "force", "moduleResolution": "nodenext", "resolveJsonModule": true, "skipLibCheck": true, "strict": true, - "target": "ES2022", + "target": "ES2020", "strictNullChecks": true } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8ca06c..ecfbc8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ importers: .: dependencies: chalk: - specifier: ^5.3.0 + specifier: ^5.4.1 version: 5.4.1 commander: specifier: ^12.1.0 @@ -17,10 +17,10 @@ importers: devDependencies: '@auto-it/all-contributors': specifier: ^11.3.0 - version: 11.3.0(@types/node@22.10.1)(typescript@5.7.2) + version: 11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3) '@auto-it/first-time-contributor': specifier: ^11.3.0 - version: 11.3.0(@types/node@22.10.1)(typescript@5.7.2) + version: 11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3) '@biomejs/biome': specifier: 1.9.4 version: 1.9.4 @@ -29,7 +29,7 @@ importers: version: link:packages/typescript-config '@turbo/gen': specifier: ^2.3.3 - version: 2.3.3(@types/node@22.10.1)(typescript@5.7.2) + version: 2.3.3(@types/node@22.10.5)(typescript@5.7.3) '@types/jsdom': specifier: ^21.1.7 version: 21.1.7 @@ -46,10 +46,10 @@ importers: specifier: ^2.3.3 version: 2.3.3 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 ultracite: - specifier: ^4.1.12 + specifier: ^4.1.14 version: 4.1.14 apps/app: @@ -98,7 +98,7 @@ importers: version: 6.0.1 '@sentry/nextjs': specifier: ^8.43.0 - version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1) + version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1) fuse.js: specifier: ^7.0.0 version: 7.0.0 @@ -201,6 +201,12 @@ importers: specifier: ^2.9.61 version: 2.9.92 + apps/recorder: + dependencies: + altair-static: + specifier: ^8.1.3 + version: 8.1.3 + apps/storybook: dependencies: '@konobangu/design-system': @@ -242,7 +248,7 @@ importers: version: 8.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2)) '@storybook/nextjs': specifier: ^8.4.7 - version: 8.4.7(esbuild@0.23.1)(next@15.1.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(type-fest@4.31.0)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(esbuild@0.23.1)) + version: 8.4.7(@rspack/core@1.1.8(@swc/helpers@0.5.15))(esbuild@0.23.1)(next@15.1.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(type-fest@4.31.0)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(esbuild@0.23.1)) '@storybook/react': specifier: ^8.4.7 version: 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2) @@ -323,7 +329,7 @@ importers: version: 1.3.2(react@19.0.0) '@sentry/nextjs': specifier: ^8.43.0 - version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1(esbuild@0.21.5)) + version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1(esbuild@0.21.5)) date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -339,9 +345,6 @@ importers: mdx-bundler: specifier: ^10.0.3 version: 10.0.3(acorn@8.14.0)(esbuild@0.21.5) - next: - specifier: ^15.1.3 - version: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) react: specifier: ^19.0.0 version: 19.0.0 @@ -467,7 +470,7 @@ importers: version: link:../tailwind-config better-auth: specifier: ^1.1.4 - version: 1.1.4 + version: 1.1.4(encoding@0.1.13) next: specifier: ^15.1.3 version: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) @@ -504,13 +507,13 @@ importers: dependencies: '@content-collections/core': specifier: ^0.8.0 - version: 0.8.0(typescript@5.7.2) + version: 0.8.0(typescript@5.7.3) '@content-collections/mdx': specifier: ^0.2.0 - version: 0.2.0(@content-collections/core@0.8.0(typescript@5.7.2))(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 0.2.0(@content-collections/core@0.8.0(typescript@5.7.3))(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@content-collections/next': specifier: ^0.2.4 - version: 0.2.4(@content-collections/core@0.8.0(typescript@5.7.2))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 0.2.4(@content-collections/core@0.8.0(typescript@5.7.3))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) '@konobangu/env': specifier: workspace:* version: link:../env @@ -532,7 +535,7 @@ importers: devDependencies: '@content-collections/cli': specifier: ^0.1.6 - version: 0.1.6(@content-collections/core@0.8.0(typescript@5.7.2)) + version: 0.1.6(@content-collections/core@0.8.0(typescript@5.7.3)) '@konobangu/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -559,7 +562,7 @@ importers: version: 2.15.1 '@liveblocks/node': specifier: ^2.14.0 - version: 2.15.1 + version: 2.15.1(encoding@0.1.13) '@liveblocks/react': specifier: ^2.14.0 version: 2.15.1(react@19.0.0) @@ -923,10 +926,10 @@ importers: version: 6.1.0 '@sentry/nextjs': specifier: ^8.43.0 - version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1) + version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1) '@vercel/toolbar': specifier: ^0.1.28 - version: 0.1.30(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(vite@5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0)) + version: 0.1.30(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0)) devDependencies: '@konobangu/env': specifier: workspace:* @@ -948,7 +951,7 @@ importers: version: 0.1.7(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) '@sentry/nextjs': specifier: ^8.43.0 - version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1) + version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1) react: specifier: ^19.0.0 version: 19.0.0 @@ -1020,7 +1023,7 @@ importers: version: 19.0.0 schema-dts: specifier: ^1.1.2 - version: 1.1.2(typescript@5.7.2) + version: 1.1.2(typescript@5.7.3) devDependencies: '@konobangu/typescript-config': specifier: workspace:* @@ -1055,29 +1058,29 @@ importers: dependencies: '@tailwindcss/typography': specifier: ^0.5.15 - version: 0.5.15(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))) + version: 0.5.15(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3))) tailwind-merge: specifier: ^2.5.5 version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3))) devDependencies: '@konobangu/typescript-config': specifier: workspace:* version: link:../typescript-config tailwindcss: specifier: ^3.4.16 - version: 3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) packages/testing: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0)) + version: 4.3.4(vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0)) vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.10.1)(jsdom@25.0.1(bufferutil@4.0.9))(sass@1.77.4)(terser@5.37.0) + version: 2.1.8(@types/node@22.10.5)(jsdom@25.0.1(bufferutil@4.0.9))(sass@1.77.4)(terser@5.37.0) packages/typescript-config: {} @@ -1091,7 +1094,7 @@ importers: version: link:../env svix: specifier: ^1.43.0 - version: 1.44.0 + version: 1.44.0(encoding@0.1.13) devDependencies: '@konobangu/typescript-config': specifier: workspace:* @@ -2609,6 +2612,18 @@ packages: '@types/react': '>=16' react: '>=16' + '@module-federation/runtime-tools@0.5.1': + resolution: {integrity: sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==} + + '@module-federation/runtime@0.5.1': + resolution: {integrity: sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==} + + '@module-federation/sdk@0.5.1': + resolution: {integrity: sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==} + + '@module-federation/webpack-bundler-runtime@0.5.1': + resolution: {integrity: sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==} + '@next/bundle-analyzer@15.1.3': resolution: {integrity: sha512-dh5i2KBONWVhQzJnL10sv9+ImsKgGtOHHeA1dWp/H3MXphWBt1uGjXCwPCcitwimvNncHBmxaOyTm2FwfOLRSA==} @@ -2907,7 +2922,7 @@ packages: '@opentelemetry/api': ^1.3.0 '@opentelemetry/instrumentation-lru-memoizer@0.43.0': - resolution: {integrity: sha512-fZc+1eJUV+tFxaB3zkbupiA8SL3vhDUq89HbDNg1aswcolor_eyre::eyreb9OlHIB+Ot14ZiHUc1qCmmWmZHbPTwa56mVVwzg==} + resolution: {integrity: sha512-fZc+1eJUV+tFxaB3zkbupiA8SL3vhDUq89HbDNg1asweYrEb9OlHIB+Ot14ZiHUc1qCmmWmZHbPTwa56mVVwzg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -4007,6 +4022,67 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-darwin-arm64@1.1.8': + resolution: {integrity: sha512-I7avr471ghQ3LAqKm2fuXuJPLgQ9gffn5Q4nHi8rsukuZUtiLDPfYzK1QuupEp2JXRWM1gG5lIbSUOht3cD6Ug==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.1.8': + resolution: {integrity: sha512-vfqf/c+mcx8rr1M8LnqKmzDdnrgguflZnjGerBLjNerAc+dcUp3lCvNxRIvZ2TkSZZBW8BpCMgjj3n70CZ4VLQ==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.1.8': + resolution: {integrity: sha512-lZlO/rAJSeozi+qtVLkGSXfe+riPawCwM4FsrflELfNlvvEXpANwtrdJ+LsaNVXcgvhh50ZX2KicTdmx9G2b6Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.1.8': + resolution: {integrity: sha512-bX7exULSZwy8xtDh6Z65b6sRC4uSxGuyvSLCEKyhmG6AnJkg0gQMxk3hoO0hWnyGEZgdJEn+jEhk0fjl+6ZRAQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.1.8': + resolution: {integrity: sha512-2Prw2USgTJ3aLdLExfik8pAwAHbX4MZrACBGEmR7Vbb56kLjC+++fXkciRc50pUDK4JFr1VQ7eNZrJuDR6GG6Q==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.1.8': + resolution: {integrity: sha512-bnVGB/mQBKEdzOU/CPmcOE3qEXxGOGGW7/i6iLl2MamVOykJq8fYjL9j86yi6L0r009ja16OgWckykQGc4UqGw==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.1.8': + resolution: {integrity: sha512-u+na3gxhzeksm4xZyAzn1+XWo5a5j7hgWA/KcFPDQ8qQNkRknx4jnQMxVtcZ9pLskAYV4AcOV/AIximx7zvv8A==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.1.8': + resolution: {integrity: sha512-FijUxym1INd5fFHwVCLuVP8XEAb4Sk1sMwEEQUlugiDra9ZsLaPw4OgPGxbxkD6SB0DeUz9Zq46Xbcf6d3OgfA==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.1.8': + resolution: {integrity: sha512-SBzIcND4qpDt71jlu1MCDxt335tqInT3YID9V4DoQ4t8wgM/uad7EgKOWKTK6vc2RRaOIShfS2XzqjNUxPXh4w==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.1.8': + resolution: {integrity: sha512-+/JzXx1HctfgPj+XtsCTbRkxiaOfAXGZZLEvs7jgp04WgWRSZ5u97WRCePNPvy+sCfOEH/2zw2ZK36Z7oQRGhQ==} + + '@rspack/core@1.1.8': + resolution: {integrity: sha512-pcZtcj5iXLCuw9oElTYC47bp/RQADm/MMEb3djHdwJuSlFWfWPQi5QFgJ/lJAxIW9UNHnTFrYtytycfjpuoEcA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + '@scena/dragscroll@1.4.0': resolution: {integrity: sha512-3O8daaZD9VXA9CP3dra6xcgt/qrm0mg0xJCwiX6druCteQ9FFsXffkF8PrqxY4Z4VJ58fFKEa0RlKqbsi/XnRA==} @@ -4635,12 +4711,15 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@20.17.10': - resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} + '@types/node@20.17.12': + resolution: {integrity: sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==} '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4934,6 +5013,10 @@ packages: engines: {node: '>=4'} hasBin: true + altair-static@8.1.3: + resolution: {integrity: sha512-8OUH92VV5XiumtB5gsMDPbinl8nRO7GAKPJCK4Jsmrq8zDn0jgAN52SDl/FdvREjP924naP04DraehabEH2Z6w==} + engines: {node: '>= 6.9.1'} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -5567,6 +5650,9 @@ packages: core-js-pure@3.39.0: resolution: {integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==} + core-js-pure@3.40.0: + resolution: {integrity: sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -6021,6 +6107,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -6068,8 +6157,8 @@ packages: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} engines: {node: '>= 0.8'} - es-abstract@1.23.7: - resolution: {integrity: sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} es-content-type@0.0.10: @@ -6099,8 +6188,8 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: @@ -6293,6 +6382,10 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-parse@1.0.3: resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} @@ -6501,8 +6594,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} get-nonce@1.0.1: @@ -6513,6 +6606,10 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -6562,8 +6659,8 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} engines: {node: 20 || >=22} hasBin: true @@ -6885,8 +6982,8 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} engines: {node: '>= 0.4'} is-bigint@1.1.0: @@ -6949,6 +7046,10 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -7907,6 +8008,10 @@ packages: overlap-area@1.1.0: resolution: {integrity: sha512-3dlJgJCaVeXH0/eZjYVJvQiLVVrPO4U1ZGqlATtx6QGO3b5eNM6+JgUKa7oStBTdYuGTk7gVoABCW6Tp+dhRdw==} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -8653,8 +8758,8 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - reflect.getprototypeof@1.0.9: - resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerate-unicode-properties@10.2.0: @@ -8682,8 +8787,8 @@ packages: regex@5.1.1: resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} regexparam@1.3.0: @@ -8862,6 +8967,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -8992,6 +9101,10 @@ packages: resolution: {integrity: sha512-EwtraZ3sU/hOOyBDmwFR9pkXAFIyKXGSrgMPCMb6Qfx+th8BGykn4nrB4uZ9j5vNRxE4eRtxjRzSUfOY4wO+jA==} engines: {node: '>= 8'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -9689,6 +9802,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -10295,12 +10413,12 @@ snapshots: - '@bufbuild/protobuf' - '@connectrpc/connect' - '@auto-it/all-contributors@11.3.0(@types/node@22.10.1)(typescript@5.7.2)': + '@auto-it/all-contributors@11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3)': dependencies: '@auto-it/bot-list': 11.3.0 - '@auto-it/core': 11.3.0(@types/node@22.10.1)(typescript@5.7.2) - '@octokit/rest': 18.12.0 - all-contributors-cli: 6.19.0 + '@auto-it/core': 11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3) + '@octokit/rest': 18.12.0(encoding@0.1.13) + all-contributors-cli: 6.19.0(encoding@0.1.13) anymatch: 3.1.3 await-to-js: 3.0.0 endent: 2.1.0 @@ -10319,15 +10437,15 @@ snapshots: '@auto-it/bot-list@11.3.0': {} - '@auto-it/core@11.3.0(@types/node@22.10.1)(typescript@5.7.2)': + '@auto-it/core@11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3)': dependencies: '@auto-it/bot-list': 11.3.0 - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.0.0)(typescript@5.7.2) - '@octokit/core': 3.6.0 + '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.0.0)(typescript@5.7.3) + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/plugin-enterprise-compatibility': 1.3.0 '@octokit/plugin-retry': 3.0.9 - '@octokit/plugin-throttling': 3.7.0(@octokit/core@3.6.0) - '@octokit/rest': 18.12.0 + '@octokit/plugin-throttling': 3.7.0(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/rest': 18.12.0(encoding@0.1.13) await-to-js: 3.0.0 chalk: 4.1.2 cosmiconfig: 7.0.0 @@ -10336,7 +10454,7 @@ snapshots: endent: 2.1.0 enquirer: 2.4.1 env-ci: 5.5.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 fp-ts: 2.16.9 fromentries: 1.3.2 gitlog: 4.0.8 @@ -10346,7 +10464,7 @@ snapshots: io-ts: 2.2.22(fp-ts@2.16.9) lodash.chunk: 4.2.0 log-symbols: 4.1.0 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) parse-author: 2.0.0 parse-github-url: 1.0.2 pretty-ms: 7.0.1 @@ -10356,24 +10474,24 @@ snapshots: tapable: 2.2.1 terminal-link: 2.1.1 tinycolor2: 1.6.0 - ts-node: 10.9.2(@types/node@22.10.1)(typescript@5.7.2) + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) tslib: 2.1.0 type-fest: 0.21.3 - typescript: 5.7.2 + typescript: 5.7.3 typescript-memoize: 1.1.1 url-join: 4.0.1 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - encoding - supports-color - '@auto-it/first-time-contributor@11.3.0(@types/node@22.10.1)(typescript@5.7.2)': + '@auto-it/first-time-contributor@11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3)': dependencies: '@auto-it/bot-list': 11.3.0 - '@auto-it/core': 11.3.0(@types/node@22.10.1)(typescript@5.7.2) + '@auto-it/core': 11.3.0(@types/node@22.10.5)(encoding@0.1.13)(typescript@5.7.3) array.prototype.flatmap: 1.3.3 endent: 2.1.0 tslib: 2.1.0 @@ -11138,7 +11256,7 @@ snapshots: '@babel/runtime-corejs3@7.26.0': dependencies: - core-js-pure: 3.39.0 + core-js-pure: 3.40.0 regenerator-runtime: 0.14.1 '@babel/runtime@7.26.0': @@ -11170,7 +11288,7 @@ snapshots: '@behold/sharp-vibrant@0.2.1': dependencies: - '@types/node': 20.17.10 + '@types/node': 20.17.12 sharp: 0.32.6 '@better-auth/utils@0.2.2': @@ -11283,14 +11401,14 @@ snapshots: dependencies: '@bufbuild/protobuf': 1.10.0 - '@content-collections/cli@0.1.6(@content-collections/core@0.8.0(typescript@5.7.2))': + '@content-collections/cli@0.1.6(@content-collections/core@0.8.0(typescript@5.7.3))': dependencies: '@clerc/core': 0.44.0 '@clerc/plugin-completions': 0.44.0(@clerc/core@0.44.0) '@clerc/plugin-help': 0.44.0(@clerc/core@0.44.0) '@clerc/plugin-version': 0.44.0(@clerc/core@0.44.0) - '@content-collections/core': 0.8.0(typescript@5.7.2) - '@content-collections/integrations': 0.2.1(@content-collections/core@0.8.0(typescript@5.7.2)) + '@content-collections/core': 0.8.0(typescript@5.7.3) + '@content-collections/integrations': 0.2.1(@content-collections/core@0.8.0(typescript@5.7.3)) '@content-collections/core@0.8.0(typescript@5.7.2)': dependencies: @@ -11307,10 +11425,29 @@ snapshots: yaml: 2.6.1 zod: 3.24.1 + '@content-collections/core@0.8.0(typescript@5.7.3)': + dependencies: + '@parcel/watcher': 2.5.0 + camelcase: 8.0.0 + esbuild: 0.21.5 + gray-matter: 4.0.3 + p-limit: 6.2.0 + picomatch: 4.0.2 + pluralize: 8.0.0 + serialize-javascript: 6.0.2 + tinyglobby: 0.2.10 + typescript: 5.7.3 + yaml: 2.6.1 + zod: 3.24.1 + '@content-collections/integrations@0.2.1(@content-collections/core@0.8.0(typescript@5.7.2))': dependencies: '@content-collections/core': 0.8.0(typescript@5.7.2) + '@content-collections/integrations@0.2.1(@content-collections/core@0.8.0(typescript@5.7.3))': + dependencies: + '@content-collections/core': 0.8.0(typescript@5.7.3) + '@content-collections/mdx@0.2.0(@content-collections/core@0.8.0(typescript@5.7.2))(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@content-collections/core': 0.8.0(typescript@5.7.2) @@ -11323,12 +11460,30 @@ snapshots: - acorn - supports-color + '@content-collections/mdx@0.2.0(@content-collections/core@0.8.0(typescript@5.7.3))(acorn@8.14.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@content-collections/core': 0.8.0(typescript@5.7.3) + esbuild: 0.21.5 + mdx-bundler: 10.0.3(acorn@8.14.0)(esbuild@0.21.5) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + unified: 11.0.5 + transitivePeerDependencies: + - acorn + - supports-color + '@content-collections/next@0.2.4(@content-collections/core@0.8.0(typescript@5.7.2))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))': dependencies: '@content-collections/core': 0.8.0(typescript@5.7.2) '@content-collections/integrations': 0.2.1(@content-collections/core@0.8.0(typescript@5.7.2)) next: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + '@content-collections/next@0.2.4(@content-collections/core@0.8.0(typescript@5.7.3))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))': + dependencies: + '@content-collections/core': 0.8.0(typescript@5.7.3) + '@content-collections/integrations': 0.2.1(@content-collections/core@0.8.0(typescript@5.7.3)) + next: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -11354,13 +11509,13 @@ snapshots: tslib: 2.8.1 optional: true - '@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.0)(typescript@5.7.2)': + '@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.0)(typescript@5.7.3)': dependencies: cosmiconfig: 7.0.0 lodash.get: 4.4.2 make-error: 1.3.6 - ts-node: 9.1.1(typescript@5.7.2) - tslib: 2.8.1 + ts-node: 9.1.1(typescript@5.7.3) + tslib: 2.1.0 transitivePeerDependencies: - typescript @@ -11734,12 +11889,12 @@ snapshots: '@liveblocks/core@2.15.1': {} - '@liveblocks/node@2.15.1': + '@liveblocks/node@2.15.1(encoding@0.1.13)': dependencies: '@liveblocks/core': 2.15.1 '@stablelib/base64': 1.0.1 fast-sha256: 1.3.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -11802,6 +11957,26 @@ snapshots: '@types/react': 19.0.1 react: 18.2.0 + '@module-federation/runtime-tools@0.5.1': + dependencies: + '@module-federation/runtime': 0.5.1 + '@module-federation/webpack-bundler-runtime': 0.5.1 + optional: true + + '@module-federation/runtime@0.5.1': + dependencies: + '@module-federation/sdk': 0.5.1 + optional: true + + '@module-federation/sdk@0.5.1': + optional: true + + '@module-federation/webpack-bundler-runtime@0.5.1': + dependencies: + '@module-federation/runtime': 0.5.1 + '@module-federation/sdk': 0.5.1 + optional: true + '@next/bundle-analyzer@15.1.3(bufferutil@4.0.9)': dependencies: webpack-bundle-analyzer: 4.10.1(bufferutil@4.0.9) @@ -11886,11 +12061,11 @@ snapshots: dependencies: '@octokit/types': 6.41.0 - '@octokit/core@3.6.0': + '@octokit/core@3.6.0(encoding@0.1.13)': dependencies: '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 + '@octokit/graphql': 4.8.0(encoding@0.1.13) + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 @@ -11904,9 +12079,9 @@ snapshots: is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - '@octokit/graphql@4.8.0': + '@octokit/graphql@4.8.0(encoding@0.1.13)': dependencies: - '@octokit/request': 5.6.3 + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: @@ -11919,18 +12094,18 @@ snapshots: '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 - '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0)': + '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 - '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0)': + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) - '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)': + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 deprecation: 2.3.1 @@ -11939,9 +12114,9 @@ snapshots: '@octokit/types': 6.41.0 bottleneck: 2.19.5 - '@octokit/plugin-throttling@3.7.0(@octokit/core@3.6.0)': + '@octokit/plugin-throttling@3.7.0(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 bottleneck: 2.19.5 @@ -11951,23 +12126,23 @@ snapshots: deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@5.6.3': + '@octokit/request@5.6.3(encoding@0.1.13)': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - '@octokit/rest@18.12.0': + '@octokit/rest@18.12.0(encoding@0.1.13)': dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13)) transitivePeerDependencies: - encoding @@ -13232,6 +13407,59 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true + '@rspack/binding-darwin-arm64@1.1.8': + optional: true + + '@rspack/binding-darwin-x64@1.1.8': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.1.8': + optional: true + + '@rspack/binding-linux-arm64-musl@1.1.8': + optional: true + + '@rspack/binding-linux-x64-gnu@1.1.8': + optional: true + + '@rspack/binding-linux-x64-musl@1.1.8': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.1.8': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.1.8': + optional: true + + '@rspack/binding-win32-x64-msvc@1.1.8': + optional: true + + '@rspack/binding@1.1.8': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.1.8 + '@rspack/binding-darwin-x64': 1.1.8 + '@rspack/binding-linux-arm64-gnu': 1.1.8 + '@rspack/binding-linux-arm64-musl': 1.1.8 + '@rspack/binding-linux-x64-gnu': 1.1.8 + '@rspack/binding-linux-x64-musl': 1.1.8 + '@rspack/binding-win32-arm64-msvc': 1.1.8 + '@rspack/binding-win32-ia32-msvc': 1.1.8 + '@rspack/binding-win32-x64-msvc': 1.1.8 + optional: true + + '@rspack/core@1.1.8(@swc/helpers@0.5.15)': + dependencies: + '@module-federation/runtime-tools': 0.5.1 + '@rspack/binding': 1.1.8 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001690 + optionalDependencies: + '@swc/helpers': 0.5.15 + optional: true + + '@rspack/lite-tapable@1.0.1': + optional: true + '@scena/dragscroll@1.4.0': dependencies: '@daybrush/utils': 1.13.0 @@ -13278,11 +13506,11 @@ snapshots: '@sentry-internal/replay-canvas': 8.47.0 '@sentry/core': 8.47.0 - '@sentry/bundler-plugin-core@2.22.7': + '@sentry/bundler-plugin-core@2.22.7(encoding@0.1.13)': dependencies: '@babel/core': 7.26.0 '@sentry/babel-plugin-component-annotate': 2.22.7 - '@sentry/cli': 2.39.1 + '@sentry/cli': 2.39.1(encoding@0.1.13) dotenv: 16.4.7 find-up: 5.0.0 glob: 9.3.5 @@ -13313,10 +13541,10 @@ snapshots: '@sentry/cli-win32-x64@2.39.1': optional: true - '@sentry/cli@2.39.1': + '@sentry/cli@2.39.1(encoding@0.1.13)': dependencies: https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 @@ -13334,7 +13562,7 @@ snapshots: '@sentry/core@8.47.0': {} - '@sentry/nextjs@8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1(esbuild@0.21.5))': + '@sentry/nextjs@8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1(esbuild@0.21.5))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 @@ -13345,7 +13573,7 @@ snapshots: '@sentry/opentelemetry': 8.47.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0) '@sentry/react': 8.47.0(react@19.0.0) '@sentry/vercel-edge': 8.47.0 - '@sentry/webpack-plugin': 2.22.7(webpack@5.97.1(esbuild@0.21.5)) + '@sentry/webpack-plugin': 2.22.7(encoding@0.1.13)(webpack@5.97.1(esbuild@0.21.5)) chalk: 3.0.0 next: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) resolve: 1.22.8 @@ -13360,7 +13588,7 @@ snapshots: - supports-color - webpack - '@sentry/nextjs@8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1)': + '@sentry/nextjs@8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.97.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 @@ -13371,7 +13599,7 @@ snapshots: '@sentry/opentelemetry': 8.47.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0) '@sentry/react': 8.47.0(react@19.0.0) '@sentry/vercel-edge': 8.47.0 - '@sentry/webpack-plugin': 2.22.7(webpack@5.97.1) + '@sentry/webpack-plugin': 2.22.7(encoding@0.1.13)(webpack@5.97.1) chalk: 3.0.0 next: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) resolve: 1.22.8 @@ -13447,9 +13675,9 @@ snapshots: '@opentelemetry/api': 1.9.0 '@sentry/core': 8.47.0 - '@sentry/webpack-plugin@2.22.7(webpack@5.97.1(esbuild@0.21.5))': + '@sentry/webpack-plugin@2.22.7(encoding@0.1.13)(webpack@5.97.1(esbuild@0.21.5))': dependencies: - '@sentry/bundler-plugin-core': 2.22.7 + '@sentry/bundler-plugin-core': 2.22.7(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 webpack: 5.97.1(esbuild@0.21.5) @@ -13457,9 +13685,9 @@ snapshots: - encoding - supports-color - '@sentry/webpack-plugin@2.22.7(webpack@5.97.1)': + '@sentry/webpack-plugin@2.22.7(encoding@0.1.13)(webpack@5.97.1)': dependencies: - '@sentry/bundler-plugin-core': 2.22.7 + '@sentry/bundler-plugin-core': 2.22.7(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 webpack: 5.97.1 @@ -13505,7 +13733,7 @@ snapshots: '@simplewebauthn/browser@13.0.0': {} - '@simplewebauthn/server@13.0.0': + '@simplewebauthn/server@13.0.0(encoding@0.1.13)': dependencies: '@hexagon/base64': 1.1.28 '@levischuck/tiny-cbor': 0.2.2 @@ -13514,7 +13742,7 @@ snapshots: '@peculiar/asn1-rsa': 2.3.15 '@peculiar/asn1-schema': 2.3.15 '@peculiar/asn1-x509': 2.3.15 - cross-fetch: 4.1.0 + cross-fetch: 4.1.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -13641,7 +13869,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@storybook/builder-webpack5@8.4.7(esbuild@0.23.1)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2)': + '@storybook/builder-webpack5@8.4.7(@rspack/core@1.1.8(@swc/helpers@0.5.15))(esbuild@0.23.1)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2)': dependencies: '@storybook/core-webpack': 8.4.7(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2)) '@types/node': 22.10.1 @@ -13650,10 +13878,10 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.1 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.97.1(esbuild@0.23.1)) + css-loader: 6.11.0(@rspack/core@1.1.8(@swc/helpers@0.5.15))(webpack@5.97.1(esbuild@0.23.1)) es-module-lexer: 1.6.0 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.2)(webpack@5.97.1(esbuild@0.23.1)) - html-webpack-plugin: 5.6.3(webpack@5.97.1(esbuild@0.23.1)) + html-webpack-plugin: 5.6.3(@rspack/core@1.1.8(@swc/helpers@0.5.15))(webpack@5.97.1(esbuild@0.23.1)) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 @@ -13739,7 +13967,7 @@ snapshots: dependencies: storybook: 8.4.7(bufferutil@4.0.9)(prettier@3.4.2) - '@storybook/nextjs@8.4.7(esbuild@0.23.1)(next@15.1.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(type-fest@4.31.0)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(esbuild@0.23.1))': + '@storybook/nextjs@8.4.7(@rspack/core@1.1.8(@swc/helpers@0.5.15))(esbuild@0.23.1)(next@15.1.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(type-fest@4.31.0)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(esbuild@0.23.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) @@ -13755,14 +13983,14 @@ snapshots: '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/runtime': 7.26.0 '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(type-fest@4.31.0)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(esbuild@0.23.1)) - '@storybook/builder-webpack5': 8.4.7(esbuild@0.23.1)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2) + '@storybook/builder-webpack5': 8.4.7(@rspack/core@1.1.8(@swc/helpers@0.5.15))(esbuild@0.23.1)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2) '@storybook/preset-react-webpack': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2)))(esbuild@0.23.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2) '@storybook/react': 8.4.7(@storybook/test@8.4.7(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2))(typescript@5.7.2) '@storybook/test': 8.4.7(storybook@8.4.7(bufferutil@4.0.9)(prettier@3.4.2)) '@types/node': 22.10.1 '@types/semver': 7.5.8 babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.23.1)) - css-loader: 6.11.0(webpack@5.97.1(esbuild@0.23.1)) + css-loader: 6.11.0(@rspack/core@1.1.8(@swc/helpers@0.5.15))(webpack@5.97.1(esbuild@0.23.1)) find-up: 5.0.0 image-size: 1.2.0 loader-utils: 3.3.1 @@ -13770,7 +13998,7 @@ snapshots: node-polyfill-webpack-plugin: 2.0.1(webpack@5.97.1(esbuild@0.23.1)) pnp-webpack-plugin: 1.7.0(typescript@5.7.2) postcss: 8.4.49 - postcss-loader: 8.1.1(postcss@8.4.49)(typescript@5.7.2)(webpack@5.97.1(esbuild@0.23.1)) + postcss-loader: 8.1.1(@rspack/core@1.1.8(@swc/helpers@0.5.15))(postcss@8.4.49)(typescript@5.7.2)(webpack@5.97.1(esbuild@0.23.1)) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-refresh: 0.14.2 @@ -13919,13 +14147,13 @@ snapshots: optionalDependencies: typescript: 5.7.2 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2)))': + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) '@testing-library/dom@10.4.0': dependencies: @@ -14040,7 +14268,7 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@2.3.3(@types/node@22.10.1)(typescript@5.7.2)': + '@turbo/gen@2.3.3(@types/node@22.10.5)(typescript@5.7.3)': dependencies: '@turbo/workspaces': 2.3.3 commander: 10.0.1 @@ -14050,7 +14278,7 @@ snapshots: node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@22.10.1)(typescript@5.7.2) + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -14064,7 +14292,7 @@ snapshots: dependencies: commander: 10.0.1 execa: 5.1.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 inquirer: 8.2.6 @@ -14107,7 +14335,7 @@ snapshots: '@types/connect@3.4.36': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 '@types/cookie@0.4.1': {} @@ -14166,7 +14394,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.10.1 + '@types/node': 22.10.5 '@types/hast@3.0.4': dependencies: @@ -14181,7 +14409,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 '@types/tough-cookie': 4.0.5 parse5: 7.2.1 @@ -14205,9 +14433,9 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 - '@types/node@20.17.10': + '@types/node@20.17.12': dependencies: undici-types: 6.19.8 @@ -14215,6 +14443,10 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.10.5': + dependencies: + undici-types: 6.20.0 + '@types/parse-json@4.0.2': {} '@types/pg-pool@2.0.6': @@ -14229,7 +14461,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 pg-protocol: 1.7.0 pg-types: 2.2.0 @@ -14249,13 +14481,13 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 '@types/text-table@0.2.5': {} '@types/through@0.0.33': dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.5 '@types/tinycolor2@1.4.6': {} @@ -14313,14 +14545,28 @@ snapshots: react: 19.0.0 vite: 5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0) - '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0))': + '@vercel/toolbar@0.1.30(next@15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0))': + dependencies: + '@tinyhttp/app': 1.3.0 + chokidar: 3.6.0 + execa: 5.1.1 + fast-glob: 3.3.2 + find-up: 5.0.0 + get-port: 5.1.1 + strip-ansi: 6.0.1 + optionalDependencies: + next: 15.1.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + react: 19.0.0 + vite: 5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0) + + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0) transitivePeerDependencies: - supports-color @@ -14346,6 +14592,14 @@ snapshots: optionalDependencies: vite: 5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0) + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0))': + dependencies: + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0) + '@vitest/pretty-format@2.0.5': dependencies: tinyrainbow: 1.2.0 @@ -14551,7 +14805,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - all-contributors-cli@6.19.0: + all-contributors-cli@6.19.0(encoding@0.1.13): dependencies: '@babel/runtime': 7.26.0 async: 3.2.6 @@ -14560,12 +14814,14 @@ snapshots: inquirer: 7.3.3 json-fixer: 1.6.15 lodash: 4.17.21 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) pify: 5.0.0 yargs: 15.4.1 transitivePeerDependencies: - encoding + altair-static@8.1.3: {} + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -14648,7 +14904,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.7 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.4: @@ -14656,9 +14912,9 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.7 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 asn1.js@4.10.1: @@ -14789,14 +15045,14 @@ snapshots: before-after-hook@2.2.3: {} - better-auth@1.1.4: + better-auth@1.1.4(encoding@0.1.13): dependencies: '@better-auth/utils': 0.2.2 '@better-fetch/fetch': 1.1.12 '@noble/ciphers': 0.6.0 '@noble/hashes': 1.6.1 '@simplewebauthn/browser': 13.0.0 - '@simplewebauthn/server': 13.0.0 + '@simplewebauthn/server': 13.0.0(encoding@0.1.13) better-call: 0.3.3-beta.4 defu: 6.1.4 jose: 5.9.6 @@ -14963,13 +15219,13 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 callsites@3.1.0: {} @@ -15238,6 +15494,8 @@ snapshots: core-js-pure@3.39.0: {} + core-js-pure@3.40.0: {} + core-util-is@1.0.3: {} cors@2.8.5: @@ -15298,9 +15556,9 @@ snapshots: dependencies: cross-spawn: 7.0.6 - cross-fetch@4.1.0: + cross-fetch@4.1.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -15335,7 +15593,7 @@ snapshots: crypto-js@4.2.0: {} - css-loader@6.11.0(webpack@5.97.1(esbuild@0.23.1)): + css-loader@6.11.0(@rspack/core@1.1.8(@swc/helpers@0.5.15))(webpack@5.97.1(esbuild@0.23.1)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -15346,6 +15604,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: + '@rspack/core': 1.1.8(@swc/helpers@0.5.15) webpack: 5.97.1(esbuild@0.23.1) css-select@4.3.0: @@ -15704,6 +15963,11 @@ snapshots: encodeurl@2.0.0: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -15768,7 +16032,7 @@ snapshots: accepts: 1.3.8 escape-html: 1.0.3 - es-abstract@1.23.7: + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -15781,10 +16045,11 @@ snapshots: es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 gopd: 1.2.0 @@ -15805,9 +16070,12 @@ snapshots: object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.7 - regexp.prototype.flags: 1.5.3 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 + set-proto: 1.0.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -15836,9 +16104,10 @@ snapshots: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.6 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -16139,6 +16408,14 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-parse@1.0.3: {} fast-json-stable-stringify@2.1.0: {} @@ -16368,14 +16645,14 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.6: + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 function-bind: 1.1.2 + get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 @@ -16385,6 +16662,11 @@ snapshots: get-port@5.1.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 + get-stream@4.1.0: dependencies: pump: 3.0.2 @@ -16395,7 +16677,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 get-tsconfig@4.8.1: dependencies: @@ -16447,7 +16729,7 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.0: + glob@11.0.1: dependencies: foreground-child: 3.3.0 jackspeak: 4.0.2 @@ -16484,7 +16766,7 @@ snapshots: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob: 7.2.3 ignore: 5.3.2 merge2: 1.4.1 @@ -16675,7 +16957,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(webpack@5.97.1(esbuild@0.23.1)): + html-webpack-plugin@5.6.3(@rspack/core@1.1.8(@swc/helpers@0.5.15))(webpack@5.97.1(esbuild@0.23.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16683,6 +16965,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: + '@rspack/core': 1.1.8(@swc/helpers@0.5.15) webpack: 5.97.1(esbuild@0.23.1) htmlparser2@6.1.0: @@ -16868,15 +17151,18 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.0.0: + is-async-function@2.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-bigint@1.1.0: dependencies: @@ -16902,7 +17188,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -16928,6 +17214,13 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -17019,7 +17312,7 @@ snapshots: is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-wsl@2.2.0: dependencies: @@ -18009,13 +18302,17 @@ snapshots: node-addon-api@7.1.1: {} - node-fetch@2.6.7: + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-forge@1.3.1: {} @@ -18173,6 +18470,12 @@ snapshots: dependencies: '@daybrush/utils': 1.13.0 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-finally@1.0.0: {} p-limit@1.3.0: @@ -18488,13 +18791,22 @@ snapshots: postcss: 8.4.49 ts-node: 10.9.2(@types/node@22.10.1)(typescript@5.7.2) - postcss-loader@8.1.1(postcss@8.4.49)(typescript@5.7.2)(webpack@5.97.1(esbuild@0.23.1)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.6.1 + optionalDependencies: + postcss: 8.4.49 + ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.7.3) + + postcss-loader@8.1.1(@rspack/core@1.1.8(@swc/helpers@0.5.15))(postcss@8.4.49)(typescript@5.7.2)(webpack@5.97.1(esbuild@0.23.1)): dependencies: cosmiconfig: 9.0.0(typescript@5.7.2) jiti: 1.21.7 postcss: 8.4.49 semver: 7.6.3 optionalDependencies: + '@rspack/core': 1.1.8(@swc/helpers@0.5.15) webpack: 5.97.1(esbuild@0.23.1) transitivePeerDependencies: - typescript @@ -19007,15 +19319,15 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - reflect.getprototypeof@1.0.9: + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.23.7 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - gopd: 1.2.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 which-builtin-type: 1.2.1 regenerate-unicode-properties@10.2.0: @@ -19043,11 +19355,13 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.3: + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 regexparam@1.3.0: {} @@ -19231,7 +19545,7 @@ snapshots: rimraf@6.0.1: dependencies: - glob: 11.0.0 + glob: 11.0.1 package-json-from-dist: 1.0.1 ripemd160@2.0.2: @@ -19290,7 +19604,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 isarray: 2.0.5 @@ -19300,6 +19614,11 @@ snapshots: safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.3 @@ -19334,9 +19653,9 @@ snapshots: scheduler@0.25.0: {} - schema-dts@1.1.2(typescript@5.7.2): + schema-dts@1.1.2(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 schema-utils@3.3.0: dependencies: @@ -19442,7 +19761,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -19455,6 +19774,12 @@ snapshots: set-global-proxy@0.2.1: {} + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -19544,14 +19869,14 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 object-inspect: 1.13.3 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 object-inspect: 1.13.3 side-channel-map: 1.0.1 @@ -19812,7 +20137,7 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.7 + es-abstract: 1.23.9 es-object-atoms: 1.0.0 has-property-descriptors: 1.0.2 @@ -19946,20 +20271,20 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 - svix-fetch@3.0.0: + svix-fetch@3.0.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) whatwg-fetch: 3.6.20 transitivePeerDependencies: - encoding - svix@1.44.0: + svix@1.44.0(encoding@0.1.13): dependencies: '@stablelib/base64': 1.0.1 '@types/node': 22.10.1 es6-promise: 4.2.8 fast-sha256: 1.3.0 - svix-fetch: 3.0.0 + svix-fetch: 3.0.0(encoding@0.1.13) url-parse: 1.5.10 transitivePeerDependencies: - encoding @@ -19979,9 +20304,9 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2)): dependencies: @@ -20010,6 +20335,33 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3)) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tapable@2.2.1: {} tar-fs@2.1.1: @@ -20197,15 +20549,34 @@ snapshots: typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optional: true - ts-node@9.1.1(typescript@5.7.2): + ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.10.5 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@9.1.1(typescript@5.7.3): dependencies: arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 source-map-support: 0.5.21 - typescript: 5.7.2 + typescript: 5.7.3 yn: 3.1.1 ts-pnp@1.2.0(typescript@5.7.2): @@ -20310,7 +20681,7 @@ snapshots: gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.9 + reflect.getprototypeof: 1.0.10 typed-array-length@1.0.7: dependencies: @@ -20319,7 +20690,7 @@ snapshots: gopd: 1.2.0 is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.9 + reflect.getprototypeof: 1.0.10 typedarray@0.0.6: {} @@ -20331,6 +20702,8 @@ snapshots: typescript@5.7.2: {} + typescript@5.7.3: {} + typical@4.0.0: {} uglify-js@3.19.3: @@ -20567,6 +20940,24 @@ snapshots: - supports-color - terser + vite-node@2.1.8(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 1.1.2 + vite: 5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite@5.4.11(@types/node@22.10.1)(sass@1.77.4)(terser@5.37.0): dependencies: esbuild: 0.21.5 @@ -20578,6 +20969,17 @@ snapshots: sass: 1.77.4 terser: 5.37.0 + vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.29.1 + optionalDependencies: + '@types/node': 22.10.5 + fsevents: 2.3.3 + sass: 1.77.4 + terser: 5.37.0 + vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1(bufferutil@4.0.9))(sass@1.77.4)(terser@5.37.0): dependencies: '@vitest/expect': 2.1.8 @@ -20614,6 +21016,42 @@ snapshots: - supports-color - terser + vitest@2.1.8(@types/node@22.10.5)(jsdom@25.0.1(bufferutil@4.0.9))(sass@1.77.4)(terser@5.37.0): + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0) + vite-node: 2.1.8(@types/node@22.10.5)(sass@1.77.4)(terser@5.37.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.5 + jsdom: 25.0.1(bufferutil@4.0.9) + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vm-browserify@1.1.2: {} w3c-xmlserializer@5.0.0: @@ -20804,10 +21242,10 @@ snapshots: call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 + is-async-function: 2.1.0 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.0.10 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.0 isarray: 2.0.5