Merge branch 'main' into rei/policy_driven_session_limit

This commit is contained in:
Olivier 'reivilibre
2025-11-13 15:54:48 +00:00
30 changed files with 2699 additions and 5318 deletions

107
Cargo.lock generated
View File

@@ -85,9 +85,9 @@ dependencies = [
[[package]]
name = "aide"
version = "0.14.2"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2477554ebf38aea815a9c4729100cfc32f766876c45b9c9c38ef221b9d1a703"
checksum = "6966317188cdfe54c58c0900a195d021294afb3ece9b7073d09e4018dbb1e3a2"
dependencies = [
"aide-macros",
"axum",
@@ -96,7 +96,7 @@ dependencies = [
"cfg-if",
"http",
"indexmap 2.11.4",
"schemars 0.8.22",
"schemars 0.9.0",
"serde",
"serde_json",
"serde_qs",
@@ -108,11 +108,12 @@ dependencies = [
[[package]]
name = "aide-macros"
version = "0.8.0"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be8e0d4af7cc08353807aaf80722125a229bf2d67be7fe0b89163c648db3d223"
checksum = "9f2a08f14808f3c46f3e3004b727bace64af44c3c5996d0480a14d3852b1b25a"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn",
]
@@ -2799,7 +2800,6 @@ version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e"
dependencies = [
"schemars 0.8.22",
"serde",
]
@@ -3096,7 +3096,7 @@ dependencies = [
[[package]]
name = "mas-axum-utils"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"axum",
@@ -3130,7 +3130,7 @@ dependencies = [
[[package]]
name = "mas-cli"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"axum",
@@ -3203,7 +3203,7 @@ dependencies = [
[[package]]
name = "mas-config"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"camino",
@@ -3223,7 +3223,7 @@ dependencies = [
"rand_chacha 0.3.1",
"rustls-pemfile",
"rustls-pki-types",
"schemars 0.8.22",
"schemars 0.9.0",
"serde",
"serde_json",
"serde_with",
@@ -3235,7 +3235,7 @@ dependencies = [
[[package]]
name = "mas-context"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"console",
"opentelemetry",
@@ -3251,7 +3251,7 @@ dependencies = [
[[package]]
name = "mas-data-model"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"base64ct",
"chrono",
@@ -3274,7 +3274,7 @@ dependencies = [
[[package]]
name = "mas-email"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"async-trait",
"lettre",
@@ -3285,7 +3285,7 @@ dependencies = [
[[package]]
name = "mas-handlers"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"aide",
"anyhow",
@@ -3341,7 +3341,7 @@ dependencies = [
"rand_chacha 0.3.1",
"reqwest",
"rustls",
"schemars 0.8.22",
"schemars 0.9.0",
"sentry",
"serde",
"serde_json",
@@ -3365,7 +3365,7 @@ dependencies = [
[[package]]
name = "mas-http"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"futures-util",
"headers",
@@ -3386,7 +3386,7 @@ dependencies = [
[[package]]
name = "mas-i18n"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"camino",
"icu_calendar",
@@ -3408,7 +3408,7 @@ dependencies = [
[[package]]
name = "mas-i18n-scan"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"camino",
"clap",
@@ -3422,15 +3422,15 @@ dependencies = [
[[package]]
name = "mas-iana"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"schemars 0.8.22",
"schemars 0.9.0",
"serde",
]
[[package]]
name = "mas-iana-codegen"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3438,6 +3438,7 @@ dependencies = [
"convert_case",
"csv",
"reqwest",
"rustls",
"serde",
"tokio",
"tracing",
@@ -3446,7 +3447,7 @@ dependencies = [
[[package]]
name = "mas-jose"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"base64ct",
"chrono",
@@ -3463,7 +3464,7 @@ dependencies = [
"rand 0.8.5",
"rand_chacha 0.3.1",
"rsa",
"schemars 0.8.22",
"schemars 0.9.0",
"sec1",
"serde",
"serde_json",
@@ -3476,7 +3477,7 @@ dependencies = [
[[package]]
name = "mas-keystore"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"aead",
"base64ct",
@@ -3504,7 +3505,7 @@ dependencies = [
[[package]]
name = "mas-listener"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"bytes",
@@ -3529,7 +3530,7 @@ dependencies = [
[[package]]
name = "mas-matrix"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3539,7 +3540,7 @@ dependencies = [
[[package]]
name = "mas-matrix-synapse"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3556,7 +3557,7 @@ dependencies = [
[[package]]
name = "mas-oidc-client"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"assert_matches",
"async-trait",
@@ -3592,14 +3593,14 @@ dependencies = [
[[package]]
name = "mas-policy"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"arc-swap",
"mas-data-model",
"oauth2-types",
"opa-wasm",
"schemars 0.8.22",
"schemars 0.9.0",
"serde",
"serde_json",
"thiserror 2.0.17",
@@ -3609,7 +3610,7 @@ dependencies = [
[[package]]
name = "mas-router"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"axum",
"serde",
@@ -3620,7 +3621,7 @@ dependencies = [
[[package]]
name = "mas-spa"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"camino",
"serde",
@@ -3629,7 +3630,7 @@ dependencies = [
[[package]]
name = "mas-storage"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"async-trait",
"chrono",
@@ -3651,7 +3652,7 @@ dependencies = [
[[package]]
name = "mas-storage-pg"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"async-trait",
"chrono",
@@ -3679,7 +3680,7 @@ dependencies = [
[[package]]
name = "mas-tasks"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3711,7 +3712,7 @@ dependencies = [
[[package]]
name = "mas-templates"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"arc-swap",
@@ -3741,7 +3742,7 @@ dependencies = [
[[package]]
name = "mas-tower"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"http",
"opentelemetry",
@@ -4011,7 +4012,7 @@ dependencies = [
[[package]]
name = "oauth2-types"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"assert_matches",
"base64ct",
@@ -5227,14 +5228,14 @@ dependencies = [
[[package]]
name = "schemars"
version = "0.8.22"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
dependencies = [
"chrono",
"dyn-clone",
"indexmap 1.9.3",
"indexmap 2.11.4",
"ref-cast",
"schemars_derive",
"serde",
"serde_json",
@@ -5243,21 +5244,9 @@ dependencies = [
[[package]]
name = "schemars"
version = "0.9.0"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
dependencies = [
"dyn-clone",
"ref-cast",
"serde",
"serde_json",
]
[[package]]
name = "schemars"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0"
checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289"
dependencies = [
"dyn-clone",
"ref-cast",
@@ -5267,9 +5256,9 @@ dependencies = [
[[package]]
name = "schemars_derive"
version = "0.8.22"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
checksum = "5016d94c77c6d32f0b8e08b781f7dc8a90c2007d4e77472cc2807bc10a8438fe"
dependencies = [
"proc-macro2",
"quote",
@@ -5625,7 +5614,7 @@ dependencies = [
"indexmap 1.9.3",
"indexmap 2.11.4",
"schemars 0.9.0",
"schemars 1.0.4",
"schemars 1.1.0",
"serde",
"serde_derive",
"serde_json",
@@ -6094,7 +6083,7 @@ dependencies = [
[[package]]
name = "syn2mas"
version = "1.6.0-rc.0"
version = "1.6.0"
dependencies = [
"anyhow",
"arc-swap",

View File

@@ -9,7 +9,7 @@ members = ["crates/*"]
resolver = "2"
# Updated in the CI with a `sed` command
package.version = "1.6.0-rc.0"
package.version = "1.6.0"
package.license = "AGPL-3.0-only OR LicenseRef-Element-Commercial"
package.authors = ["Element Backend Team"]
package.edition = "2024"
@@ -34,39 +34,39 @@ broken_intra_doc_links = "deny"
[workspace.dependencies]
# Workspace crates
mas-axum-utils = { path = "./crates/axum-utils/", version = "=1.6.0-rc.0" }
mas-cli = { path = "./crates/cli/", version = "=1.6.0-rc.0" }
mas-config = { path = "./crates/config/", version = "=1.6.0-rc.0" }
mas-context = { path = "./crates/context/", version = "=1.6.0-rc.0" }
mas-data-model = { path = "./crates/data-model/", version = "=1.6.0-rc.0" }
mas-email = { path = "./crates/email/", version = "=1.6.0-rc.0" }
mas-graphql = { path = "./crates/graphql/", version = "=1.6.0-rc.0" }
mas-handlers = { path = "./crates/handlers/", version = "=1.6.0-rc.0" }
mas-http = { path = "./crates/http/", version = "=1.6.0-rc.0" }
mas-i18n = { path = "./crates/i18n/", version = "=1.6.0-rc.0" }
mas-i18n-scan = { path = "./crates/i18n-scan/", version = "=1.6.0-rc.0" }
mas-iana = { path = "./crates/iana/", version = "=1.6.0-rc.0" }
mas-iana-codegen = { path = "./crates/iana-codegen/", version = "=1.6.0-rc.0" }
mas-jose = { path = "./crates/jose/", version = "=1.6.0-rc.0" }
mas-keystore = { path = "./crates/keystore/", version = "=1.6.0-rc.0" }
mas-listener = { path = "./crates/listener/", version = "=1.6.0-rc.0" }
mas-matrix = { path = "./crates/matrix/", version = "=1.6.0-rc.0" }
mas-matrix-synapse = { path = "./crates/matrix-synapse/", version = "=1.6.0-rc.0" }
mas-oidc-client = { path = "./crates/oidc-client/", version = "=1.6.0-rc.0" }
mas-policy = { path = "./crates/policy/", version = "=1.6.0-rc.0" }
mas-router = { path = "./crates/router/", version = "=1.6.0-rc.0" }
mas-spa = { path = "./crates/spa/", version = "=1.6.0-rc.0" }
mas-storage = { path = "./crates/storage/", version = "=1.6.0-rc.0" }
mas-storage-pg = { path = "./crates/storage-pg/", version = "=1.6.0-rc.0" }
mas-tasks = { path = "./crates/tasks/", version = "=1.6.0-rc.0" }
mas-templates = { path = "./crates/templates/", version = "=1.6.0-rc.0" }
mas-tower = { path = "./crates/tower/", version = "=1.6.0-rc.0" }
oauth2-types = { path = "./crates/oauth2-types/", version = "=1.6.0-rc.0" }
syn2mas = { path = "./crates/syn2mas", version = "=1.6.0-rc.0" }
mas-axum-utils = { path = "./crates/axum-utils/", version = "=1.6.0" }
mas-cli = { path = "./crates/cli/", version = "=1.6.0" }
mas-config = { path = "./crates/config/", version = "=1.6.0" }
mas-context = { path = "./crates/context/", version = "=1.6.0" }
mas-data-model = { path = "./crates/data-model/", version = "=1.6.0" }
mas-email = { path = "./crates/email/", version = "=1.6.0" }
mas-graphql = { path = "./crates/graphql/", version = "=1.6.0" }
mas-handlers = { path = "./crates/handlers/", version = "=1.6.0" }
mas-http = { path = "./crates/http/", version = "=1.6.0" }
mas-i18n = { path = "./crates/i18n/", version = "=1.6.0" }
mas-i18n-scan = { path = "./crates/i18n-scan/", version = "=1.6.0" }
mas-iana = { path = "./crates/iana/", version = "=1.6.0" }
mas-iana-codegen = { path = "./crates/iana-codegen/", version = "=1.6.0" }
mas-jose = { path = "./crates/jose/", version = "=1.6.0" }
mas-keystore = { path = "./crates/keystore/", version = "=1.6.0" }
mas-listener = { path = "./crates/listener/", version = "=1.6.0" }
mas-matrix = { path = "./crates/matrix/", version = "=1.6.0" }
mas-matrix-synapse = { path = "./crates/matrix-synapse/", version = "=1.6.0" }
mas-oidc-client = { path = "./crates/oidc-client/", version = "=1.6.0" }
mas-policy = { path = "./crates/policy/", version = "=1.6.0" }
mas-router = { path = "./crates/router/", version = "=1.6.0" }
mas-spa = { path = "./crates/spa/", version = "=1.6.0" }
mas-storage = { path = "./crates/storage/", version = "=1.6.0" }
mas-storage-pg = { path = "./crates/storage-pg/", version = "=1.6.0" }
mas-tasks = { path = "./crates/tasks/", version = "=1.6.0" }
mas-templates = { path = "./crates/templates/", version = "=1.6.0" }
mas-tower = { path = "./crates/tower/", version = "=1.6.0" }
oauth2-types = { path = "./crates/oauth2-types/", version = "=1.6.0" }
syn2mas = { path = "./crates/syn2mas", version = "=1.6.0" }
# OpenAPI schema generation and validation
[workspace.dependencies.aide]
version = "0.14.2"
version = "0.15.1"
features = ["axum", "axum-extra", "axum-extra-query", "axum-json", "macros"]
# An `Arc` that can be atomically updated
@@ -336,7 +336,7 @@ features = ["yaml", "json"]
# IP network address types
[workspace.dependencies.ipnetwork]
version = "0.20.0"
features = ["serde", "schemars"]
features = ["serde"]
# Iterator utilities
[workspace.dependencies.itertools]
@@ -541,8 +541,8 @@ version = "0.4.5"
# JSON Schema generation
[workspace.dependencies.schemars]
version = "0.8.22"
features = ["url", "chrono", "preserve_order"]
version = "0.9.0"
features = ["url2", "chrono04", "preserve_order"]
# SEC1 encoding format
[workspace.dependencies.sec1]

View File

@@ -136,6 +136,10 @@ fn make_http_span<B>(req: &Request<B>) -> Span {
span.record(USER_AGENT_ORIGINAL, user_agent);
}
// In case the span is disabled by any of tracing layers, e.g. if `RUST_LOG`
// is set to `warn`, `set_parent` will fail. So we only try to set the
// parent context if the span is not disabled.
if !span.is_disabled() {
// Extract the parent span context from the request headers
let parent_context = opentelemetry::global::get_text_map_propagator(|propagator| {
let extractor = HeaderExtractor(req.headers());
@@ -149,6 +153,7 @@ fn make_http_span<B>(req: &Request<B>) -> Span {
"Failed to set parent context on span"
);
}
}
span
}

View File

@@ -4,14 +4,10 @@
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
// Please see LICENSE files in the repository root for full details.
use schemars::r#gen::SchemaSettings;
use schemars::generate::SchemaSettings;
fn main() {
let settings = SchemaSettings::draft07().with(|s| {
s.option_nullable = false;
s.option_add_null_type = false;
});
let generator = settings.into_generator();
let generator = SchemaSettings::draft07().into_generator();
let schema = generator.into_root_schema_for::<mas_config::RootConfig>();
serde_json::to_writer_pretty(std::io::stdout(), &schema).expect("Failed to serialize schema");

View File

@@ -6,29 +6,22 @@
//! Useful JSON Schema definitions
use schemars::{
JsonSchema,
r#gen::SchemaGenerator,
schema::{InstanceType, Schema, SchemaObject},
};
use std::borrow::Cow;
use schemars::{JsonSchema, Schema, SchemaGenerator, json_schema};
/// A network hostname
pub struct Hostname;
impl JsonSchema for Hostname {
fn schema_name() -> String {
"Hostname".to_string()
fn schema_name() -> Cow<'static, str> {
Cow::Borrowed("Hostname")
}
fn json_schema(generator: &mut SchemaGenerator) -> Schema {
hostname(generator)
}
}
fn hostname(_gen: &mut SchemaGenerator) -> Schema {
Schema::Object(SchemaObject {
instance_type: Some(InstanceType::String.into()),
format: Some("hostname".to_owned()),
..SchemaObject::default()
fn json_schema(_generator: &mut SchemaGenerator) -> Schema {
json_schema!({
"type": "string",
"format": "hostname",
})
}
}

View File

@@ -23,19 +23,6 @@ fn default_public_base() -> Url {
"http://[::]:8080".parse().unwrap()
}
fn http_address_example_1() -> &'static str {
"[::1]:8080"
}
fn http_address_example_2() -> &'static str {
"[::]:8080"
}
fn http_address_example_3() -> &'static str {
"127.0.0.1:8080"
}
fn http_address_example_4() -> &'static str {
"0.0.0.0:8080"
}
#[cfg(not(any(feature = "docker", feature = "dist")))]
fn http_listener_assets_path_default() -> Utf8PathBuf {
"./frontend/dist/".into()
@@ -111,10 +98,10 @@ pub enum BindConfig {
Address {
/// Host and port on which to listen
#[schemars(
example = "http_address_example_1",
example = "http_address_example_2",
example = "http_address_example_3",
example = "http_address_example_4"
example = &"[::1]:8080",
example = &"[::]:8080",
example = &"127.0.0.1:8080",
example = &"0.0.0.0:8080",
)]
address: String,
},
@@ -354,6 +341,7 @@ pub struct HttpConfig {
/// List of trusted reverse proxies that can set the `X-Forwarded-For`
/// header
#[serde(default = "default_trusted_proxies")]
#[schemars(with = "Vec<String>", inner(ip))]
pub trusted_proxies: Vec<IpNetwork>,
/// Public URL base from where the authentication service is reachable

View File

@@ -20,10 +20,6 @@ use tracing::info;
use super::ConfigurationSection;
fn example_secret() -> &'static str {
"0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff"
}
/// Password config option.
///
/// It either holds the password value directly or references a file where the
@@ -209,7 +205,7 @@ struct EncryptionRaw {
#[schemars(
with = "Option<String>",
regex(pattern = r"[0-9a-fA-F]{64}"),
example = "example_secret"
example = &"0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff"
)]
#[serde_as(as = "Option<serde_with::hex::Hex>")]
#[serde(skip_serializing_if = "Option::is_none")]

View File

@@ -11,10 +11,6 @@ use url::Url;
use super::ConfigurationSection;
fn sample_rate_example() -> f64 {
0.5
}
/// Propagation format for incoming and outgoing requests
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "lowercase")]
@@ -70,7 +66,7 @@ pub struct TracingConfig {
///
/// Defaults to `1.0` if not set.
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(example = "sample_rate_example", range(min = 0.0, max = 1.0))]
#[schemars(example = 0.5, range(min = 0.0, max = 1.0))]
pub sample_rate: Option<f64>,
}
@@ -123,26 +119,18 @@ impl MetricsConfig {
}
}
fn sentry_dsn_example() -> &'static str {
"https://public@host:port/1"
}
fn sentry_environment_example() -> &'static str {
"production"
}
/// Configuration related to the Sentry integration
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
pub struct SentryConfig {
/// Sentry DSN
#[schemars(url, example = "sentry_dsn_example")]
#[schemars(url, example = &"https://public@host:port/1")]
#[serde(skip_serializing_if = "Option::is_none")]
pub dsn: Option<String>,
/// Environment to use when sending events to Sentry
///
/// Defaults to `production` if not set.
#[schemars(example = "sentry_environment_example")]
#[schemars(example = &"production")]
#[serde(skip_serializing_if = "Option::is_none")]
pub environment: Option<String>,
@@ -150,14 +138,14 @@ pub struct SentryConfig {
///
/// Defaults to `1.0` if not set.
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(example = "sample_rate_example", range(min = 0.0, max = 1.0))]
#[schemars(example = 0.5, range(min = 0.0, max = 1.0))]
pub sample_rate: Option<f32>,
/// Sample rate for tracing transactions
///
/// Defaults to `0.0` if not set.
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(example = "sample_rate_example", range(min = 0.0, max = 1.0))]
#[schemars(example = 0.5, range(min = 0.0, max = 1.0))]
pub traces_sample_rate: Option<f32>,
}

View File

@@ -18,7 +18,7 @@ use tracing_subscriber::{
use crate::LogContext;
/// An event formatter usable by the [`tracing-subscriber`] crate, which
/// An event formatter usable by the [`tracing_subscriber`] crate, which
/// includes the log context and the OTEL trace ID.
#[derive(Debug, Default)]
pub struct EventFormatter;

View File

@@ -29,6 +29,7 @@ use mas_router::{
UrlBuilder,
};
use mas_templates::{ApiDocContext, Templates};
use schemars::transform::AddNullable;
use tower_http::cors::{Any, CorsLayer};
mod call_context;
@@ -171,8 +172,16 @@ where
aide::generate::infer_responses(false);
aide::generate::in_context(|ctx| {
ctx.schema =
schemars::r#gen::SchemaGenerator::new(schemars::r#gen::SchemaSettings::openapi3());
ctx.schema = schemars::generate::SchemaGenerator::new(
schemars::generate::SchemaSettings::openapi3().with(|settings| {
// Remove the transform which adds nullable fields, as it's not
// valid with OpenAPI 3.1. For some reason, aide/schemars output
// an OpenAPI 3.1 schema with this nullable transform.
settings
.transforms
.retain(|transform| !transform.is::<AddNullable>());
}),
);
});
let mut api = OpenApi::default();

View File

@@ -6,11 +6,9 @@
//! Common schema definitions
use schemars::{
JsonSchema,
r#gen::SchemaGenerator,
schema::{InstanceType, Metadata, Schema, SchemaObject, StringValidation},
};
use std::borrow::Cow;
use schemars::{JsonSchema, Schema, SchemaGenerator, json_schema};
/// A type to use for schema definitions of ULIDs
///
@@ -18,32 +16,21 @@ use schemars::{
pub struct Ulid;
impl JsonSchema for Ulid {
fn schema_name() -> String {
"ULID".to_owned()
fn schema_name() -> Cow<'static, str> {
Cow::Borrowed("ULID")
}
fn json_schema(_gen: &mut SchemaGenerator) -> Schema {
SchemaObject {
instance_type: Some(InstanceType::String.into()),
metadata: Some(Box::new(Metadata {
title: Some("ULID".into()),
description: Some("A ULID as per https://github.com/ulid/spec".into()),
examples: vec![
"01ARZ3NDEKTSV4RRFFQ69G5FAV".into(),
"01J41912SC8VGAQDD50F6APK91".into(),
json_schema!({
"type": "string",
"title": "ULID",
"description": "A ULID as per https://github.com/ulid/spec",
"examples": [
"01ARZ3NDEKTSV4RRFFQ69G5FAV",
"01J41912SC8VGAQDD50F6APK91",
],
..Metadata::default()
})),
string: Some(Box::new(StringValidation {
pattern: Some(r"^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$".into()),
..StringValidation::default()
})),
..SchemaObject::default()
}
.into()
"pattern": "^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$",
})
}
}
@@ -53,27 +40,20 @@ impl JsonSchema for Ulid {
pub struct Device;
impl JsonSchema for Device {
fn schema_name() -> String {
"DeviceID".to_owned()
fn schema_name() -> Cow<'static, str> {
Cow::Borrowed("DeviceID")
}
fn json_schema(_gen: &mut SchemaGenerator) -> Schema {
SchemaObject {
instance_type: Some(InstanceType::String.into()),
metadata: Some(Box::new(Metadata {
title: Some("Device ID".into()),
examples: vec!["AABBCCDDEE".into(), "FFGGHHIIJJ".into()],
..Metadata::default()
})),
string: Some(Box::new(StringValidation {
pattern: Some(r"^[A-Za-z0-9._~!$&'()*+,;=:&/-]+$".into()),
..StringValidation::default()
})),
..SchemaObject::default()
}
.into()
json_schema!({
"type": "string",
"title": "Device ID",
"description": "A device ID as per https://matrix.org/docs/spec/client_server/r0.6.0#device-ids",
"examples": [
"AABBCCDDEE",
"FFGGHHIIJJ",
],
"pattern": "^[A-Za-z0-9._~!$&'()*+,;=:&/-]+$",
})
}
}

View File

@@ -59,7 +59,7 @@ fn data_example() -> serde_json::Value {
#[derive(Deserialize, JsonSchema)]
#[serde(rename = "SetPolicyDataRequest")]
pub struct SetPolicyDataRequest {
#[schemars(example = "data_example")]
#[schemars(example = data_example())]
pub data: serde_json::Value,
}

View File

@@ -55,16 +55,12 @@ impl IntoResponse for RouteError {
}
}
fn password_example() -> String {
"hunter2".to_owned()
}
/// # JSON payload for the `POST /api/admin/v1/users/:id/set-password` endpoint
#[derive(Deserialize, JsonSchema)]
#[schemars(rename = "SetUserPasswordRequest")]
pub struct Request {
/// The password to set for the user
#[schemars(example = "password_example")]
#[schemars(example = &"hunter2")]
password: String,
/// Skip the password complexity check

View File

@@ -23,6 +23,7 @@ camino.workspace = true
convert_case.workspace = true
csv.workspace = true
reqwest.workspace = true
rustls.workspace = true
serde.workspace = true
tokio.workspace = true
tracing-subscriber.workspace = true

View File

@@ -165,11 +165,12 @@ pub fn json_schema_impl(
write!(
f,
r#"impl schemars::JsonSchema for {} {{
fn schema_name() -> String {{
"{}".to_owned()
fn schema_name() -> std::borrow::Cow<'static, str> {{
std::borrow::Cow::Borrowed("{}")
}}
fn json_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {{
#[allow(clippy::too_many_lines)]
fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema {{
let enums = vec!["#,
section.key, section.key,
)?;
@@ -179,20 +180,14 @@ pub fn json_schema_impl(
f,
r"
// ---
schemars::schema::SchemaObject {{",
schemars::json_schema!({{",
)?;
if let Some(description) = &member.description {
write!(
f,
r"
metadata: Some(Box::new(schemars::schema::Metadata {{
description: Some(
// ---
{}.to_owned(),
),
..Default::default()
}})),",
r#"
"description": {},"#,
raw_string(description),
)?;
}
@@ -200,34 +195,24 @@ pub fn json_schema_impl(
write!(
f,
r#"
const_value: Some("{}".into()),
..Default::default()
}}
.into(),"#,
"const": "{}",
}}),"#,
member.value
)?;
}
writeln!(
f,
r"
r#"
];
let description = {};
schemars::schema::SchemaObject {{
metadata: Some(Box::new(schemars::schema::Metadata {{
description: Some(description.to_owned()),
..Default::default()
}})),
subschemas: Some(Box::new(schemars::schema::SubschemaValidation {{
any_of: Some(enums),
..Default::default()
}})),
..Default::default()
schemars::json_schema!({{
"description": description,
"anyOf": enums,
}})
}}
.into()
}}
}}",
}}"#,
raw_string(section.doc),
)
}

View File

@@ -189,6 +189,10 @@ async fn main() -> anyhow::Result<()> {
.pretty()
.init();
rustls::crypto::aws_lc_rs::default_provider()
.install_default()
.unwrap();
#[expect(
clippy::disallowed_methods,
reason = "reqwest::Client::new should be disallowed by clippy, but for the codegen it's fine"

File diff suppressed because it is too large Load Diff

View File

@@ -79,51 +79,36 @@ impl serde::Serialize for OAuthAccessTokenType {
}
impl schemars::JsonSchema for OAuthAccessTokenType {
fn schema_name() -> String {
"OAuthAccessTokenType".to_owned()
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("OAuthAccessTokenType")
}
fn json_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
#[allow(clippy::too_many_lines)]
fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
let enums = vec![
// ---
schemars::schema::SchemaObject {
const_value: Some("Bearer".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "Bearer",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("N_A".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "N_A",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("PoP".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "PoP",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("DPoP".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "DPoP",
}),
];
let description = r"OAuth Access Token Type";
schemars::schema::SchemaObject {
metadata: Some(Box::new(schemars::schema::Metadata {
description: Some(description.to_owned()),
..Default::default()
})),
subschemas: Some(Box::new(schemars::schema::SubschemaValidation {
any_of: Some(enums),
..Default::default()
})),
..Default::default()
}
.into()
schemars::json_schema!({
"description": description,
"anyOf": enums,
})
}
}
@@ -210,75 +195,52 @@ impl serde::Serialize for OAuthAuthorizationEndpointResponseType {
}
impl schemars::JsonSchema for OAuthAuthorizationEndpointResponseType {
fn schema_name() -> String {
"OAuthAuthorizationEndpointResponseType".to_owned()
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("OAuthAuthorizationEndpointResponseType")
}
fn json_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
#[allow(clippy::too_many_lines)]
fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
let enums = vec![
// ---
schemars::schema::SchemaObject {
const_value: Some("code".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "code",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("code id_token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "code id_token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("code id_token token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "code id_token token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("code token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "code token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("id_token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "id_token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("id_token token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "id_token token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("none".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "none",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "token",
}),
];
let description = r"OAuth Authorization Endpoint Response Type";
schemars::schema::SchemaObject {
metadata: Some(Box::new(schemars::schema::Metadata {
description: Some(description.to_owned()),
..Default::default()
})),
subschemas: Some(Box::new(schemars::schema::SubschemaValidation {
any_of: Some(enums),
..Default::default()
})),
..Default::default()
}
.into()
schemars::json_schema!({
"description": description,
"anyOf": enums,
})
}
}
@@ -345,45 +307,32 @@ impl serde::Serialize for OAuthTokenTypeHint {
}
impl schemars::JsonSchema for OAuthTokenTypeHint {
fn schema_name() -> String {
"OAuthTokenTypeHint".to_owned()
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("OAuthTokenTypeHint")
}
fn json_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
#[allow(clippy::too_many_lines)]
fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
let enums = vec![
// ---
schemars::schema::SchemaObject {
const_value: Some("access_token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "access_token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("refresh_token".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "refresh_token",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("pct".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "pct",
}),
];
let description = r"OAuth Token Type Hint";
schemars::schema::SchemaObject {
metadata: Some(Box::new(schemars::schema::Metadata {
description: Some(description.to_owned()),
..Default::default()
})),
subschemas: Some(Box::new(schemars::schema::SubschemaValidation {
any_of: Some(enums),
..Default::default()
})),
..Default::default()
}
.into()
schemars::json_schema!({
"description": description,
"anyOf": enums,
})
}
}
@@ -470,69 +419,48 @@ impl serde::Serialize for OAuthClientAuthenticationMethod {
}
impl schemars::JsonSchema for OAuthClientAuthenticationMethod {
fn schema_name() -> String {
"OAuthClientAuthenticationMethod".to_owned()
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("OAuthClientAuthenticationMethod")
}
fn json_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
#[allow(clippy::too_many_lines)]
fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
let enums = vec![
// ---
schemars::schema::SchemaObject {
const_value: Some("none".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "none",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("client_secret_post".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "client_secret_post",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("client_secret_basic".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "client_secret_basic",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("client_secret_jwt".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "client_secret_jwt",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("private_key_jwt".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "private_key_jwt",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("tls_client_auth".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "tls_client_auth",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("self_signed_tls_client_auth".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "self_signed_tls_client_auth",
}),
];
let description = r"OAuth Token Endpoint Authentication Method";
schemars::schema::SchemaObject {
metadata: Some(Box::new(schemars::schema::Metadata {
description: Some(description.to_owned()),
..Default::default()
})),
subschemas: Some(Box::new(schemars::schema::SubschemaValidation {
any_of: Some(enums),
..Default::default()
})),
..Default::default()
}
.into()
schemars::json_schema!({
"description": description,
"anyOf": enums,
})
}
}
@@ -594,38 +522,27 @@ impl serde::Serialize for PkceCodeChallengeMethod {
}
impl schemars::JsonSchema for PkceCodeChallengeMethod {
fn schema_name() -> String {
"PkceCodeChallengeMethod".to_owned()
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("PkceCodeChallengeMethod")
}
fn json_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
#[allow(clippy::too_many_lines)]
fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema {
let enums = vec![
// ---
schemars::schema::SchemaObject {
const_value: Some("plain".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "plain",
}),
// ---
schemars::schema::SchemaObject {
const_value: Some("S256".into()),
..Default::default()
}
.into(),
schemars::json_schema!({
"const": "S256",
}),
];
let description = r"PKCE Code Challenge Method";
schemars::schema::SchemaObject {
metadata: Some(Box::new(schemars::schema::Metadata {
description: Some(description.to_owned()),
..Default::default()
})),
subschemas: Some(Box::new(schemars::schema::SubschemaValidation {
any_of: Some(enums),
..Default::default()
})),
..Default::default()
}
.into()
schemars::json_schema!({
"description": description,
"anyOf": enums,
})
}
}

View File

@@ -14,7 +14,7 @@ use std::path::{Path, PathBuf};
use mas_policy::model::{
AuthorizationGrantInput, ClientRegistrationInput, EmailInput, RegisterInput,
};
use schemars::{JsonSchema, r#gen::SchemaSettings};
use schemars::{JsonSchema, generate::SchemaSettings};
fn write_schema<T: JsonSchema>(out_dir: Option<&Path>, file: &str) {
let mut writer: Box<dyn std::io::Write> = if let Some(out_dir) = out_dir {
@@ -27,11 +27,7 @@ fn write_schema<T: JsonSchema>(out_dir: Option<&Path>, file: &str) {
Box::new(std::io::stdout())
};
let settings = SchemaSettings::draft07().with(|s| {
s.option_nullable = false;
s.option_add_null_type = false;
});
let generator = settings.into_generator();
let generator = SchemaSettings::draft07().into_generator();
let schema = generator.into_root_schema_for::<T>();
serde_json::to_writer_pretty(&mut writer, &schema).expect("Failed to serialize schema");
writer.flush().expect("Failed to flush writer");

View File

@@ -20,7 +20,7 @@
//! To define a new repository, you have to:
//! 1. Define a new (async) repository trait, with the methods you need
//! 2. Write an implementation of this trait for each storage backend you want
//! (currently only for [`mas-storage-pg`])
//! (currently only for `mas-storage-pg`)
//! 3. Make it accessible via the [`RepositoryAccess`] trait
//!
//! The repository trait definition should look like this:

View File

@@ -60,8 +60,6 @@ multiple-versions = "deny"
skip = [
{ name = "itertools", version = "0.13.0" }, # zxcvbn depends on this old version
{ name = "indexmap", version = "1.9.3" }, # schemars depends on this old version
{ name = "hashbrown", version = "0.12.3" }, # schemars -> indexmap depends on this old version
{ name = "hashbrown", version = "0.14.5" }, # a few crates depend on this old version
# a few dependencies depend on the 1.x version of thiserror
{ name = "thiserror", version = "1.0.69" },

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,7 @@ export type LocalazyMetadata = {
};
const localazyMetadata: LocalazyMetadata = {
projectUrl: "https://localazy.com/p/matrix-authentication-service",
projectUrl: "https://localazy.com/p/matrix-authentication-service!v1.6",
baseLocale: "en",
languages: [
{
@@ -172,21 +172,21 @@ const localazyMetadata: LocalazyMetadata = {
file: "frontend.json",
path: "",
cdnFiles: {
"cs": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/cs/frontend.json",
"da": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/da/frontend.json",
"de": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/de/frontend.json",
"en": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/en/frontend.json",
"et": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/et/frontend.json",
"fi": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fi/frontend.json",
"fr": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fr/frontend.json",
"hu": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/hu/frontend.json",
"nb_NO": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nb-NO/frontend.json",
"nl": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nl/frontend.json",
"pt": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt/frontend.json",
"ru": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/ru/frontend.json",
"sv": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/sv/frontend.json",
"uk": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/uk/frontend.json",
"zh#Hans": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/zh-Hans/frontend.json"
"cs": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/cs/frontend.json",
"da": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/da/frontend.json",
"de": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/de/frontend.json",
"en": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/en/frontend.json",
"et": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/et/frontend.json",
"fi": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fi/frontend.json",
"fr": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fr/frontend.json",
"hu": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/hu/frontend.json",
"nb_NO": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nb-NO/frontend.json",
"nl": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nl/frontend.json",
"pt": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt/frontend.json",
"ru": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/ru/frontend.json",
"sv": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/sv/frontend.json",
"uk": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/uk/frontend.json",
"zh#Hans": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/zh-Hans/frontend.json"
}
},
{
@@ -194,21 +194,21 @@ const localazyMetadata: LocalazyMetadata = {
file: "file.json",
path: "",
cdnFiles: {
"cs": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/cs/file.json",
"da": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/da/file.json",
"de": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/de/file.json",
"en": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/en/file.json",
"et": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/et/file.json",
"fi": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fi/file.json",
"fr": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fr/file.json",
"hu": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/hu/file.json",
"nb_NO": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nb-NO/file.json",
"nl": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nl/file.json",
"pt": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt/file.json",
"ru": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/ru/file.json",
"sv": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/sv/file.json",
"uk": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/uk/file.json",
"zh#Hans": "https://delivery.localazy.com/_a7686032324574572744739e0707/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/zh-Hans/file.json"
"cs": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/cs/file.json",
"da": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/da/file.json",
"de": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/de/file.json",
"en": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/en/file.json",
"et": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/et/file.json",
"fi": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fi/file.json",
"fr": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fr/file.json",
"hu": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/hu/file.json",
"nb_NO": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nb-NO/file.json",
"nl": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nl/file.json",
"pt": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt/file.json",
"ru": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/ru/file.json",
"sv": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/sv/file.json",
"uk": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/uk/file.json",
"zh#Hans": "https://delivery.localazy.com/_a67480892591190493723a576eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/zh-Hans/file.json"
}
}
]

View File

@@ -34,10 +34,10 @@
"@browser-logos/firefox": "^3.0.10",
"@browser-logos/safari": "^2.1.0",
"@graphql-codegen/cli": "^6.0.1",
"@graphql-codegen/client-preset": "^5.1.0",
"@graphql-codegen/client-preset": "^5.1.1",
"@graphql-codegen/typescript-msw": "^3.0.1",
"@storybook/addon-docs": "^9.1.13",
"@storybook/react-vite": "^9.1.13",
"@storybook/addon-docs": "^10.0.5",
"@storybook/react-vite": "^10.0.5",
"@tanstack/react-query-devtools": "^5.90.2",
"@tanstack/react-router-devtools": "^1.131.44",
"@tanstack/router-plugin": "^1.131.44",
@@ -62,10 +62,10 @@
"postcss-import": "^16.1.1",
"postcss-nesting": "^13.0.2",
"rimraf": "^6.0.1",
"storybook": "^9.1.5",
"storybook": "^10.0.5",
"tailwindcss": "^3.4.18",
"typescript": "^5.9.3",
"vite": "7.1.12",
"vite": "7.2.2",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-graphql-codegen": "^3.7.0",
"vite-plugin-manifest-sri": "^0.2.0",
@@ -1981,16 +1981,16 @@
}
},
"node_modules/@graphql-codegen/client-preset": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-5.1.0.tgz",
"integrity": "sha512-MYMy9dIlAgT3q1U8WUys6Y8yt/T9WLsm1DczRtrCpV5N11v4Rlg3hGWQmEvhJtBbWxgzfYoHZHb0TohtbLkJ+g==",
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-5.1.1.tgz",
"integrity": "sha512-d7a4KdZJBOPt/O55JneBz9WwvpWar/P5yyxfjZvvoRErXPRsWtswLp+CBKKPkRcEIz9MXfTdQ1GL3kQg16DLfg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.20.2",
"@babel/template": "^7.20.7",
"@graphql-codegen/add": "^6.0.0",
"@graphql-codegen/gql-tag-operations": "5.0.2",
"@graphql-codegen/gql-tag-operations": "5.0.3",
"@graphql-codegen/plugin-helpers": "^6.0.0",
"@graphql-codegen/typed-document-node": "^6.0.2",
"@graphql-codegen/typescript": "^5.0.2",
@@ -2048,9 +2048,9 @@
"license": "0BSD"
},
"node_modules/@graphql-codegen/gql-tag-operations": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-5.0.2.tgz",
"integrity": "sha512-iK+LFGv4ihHKeerADFPTL7Iq4iNr+J1jm2+GUMtwTSAL4nGk+BdfyruV7eR53R7Des8NFdI+9hBzKbbob7VwGQ==",
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-5.0.3.tgz",
"integrity": "sha512-G6YqeDMMuwMvAtlW+MUaQDoYgQtBuBrfp89IOSnj7YXqSc/TMOma3X5XeXM4/oeNDQyfm2A66j5H8DYf04mJZg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5134,16 +5134,16 @@
"license": "Apache-2.0"
},
"node_modules/@storybook/addon-docs": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.1.13.tgz",
"integrity": "sha512-V1nCo7bfC3kQ5VNVq0VDcHsIhQf507m+BxMA5SIYiwdJHljH2BXpW2fL3FFn9gv9Wp57AEEzhm+wh4zANaJgkg==",
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.0.5.tgz",
"integrity": "sha512-KCdvqXnBzsHSDZJNonH07FjqiHEQOEo3UtWH/Co43vYvDMEIwZTuQqswxBaO8KCXQlHyLtz5LJ4RluNW+KNJKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@mdx-js/react": "^3.0.0",
"@storybook/csf-plugin": "9.1.13",
"@storybook/icons": "^1.4.0",
"@storybook/react-dom-shim": "9.1.13",
"@storybook/csf-plugin": "10.0.5",
"@storybook/icons": "^1.6.0",
"@storybook/react-dom-shim": "10.0.5",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"ts-dedent": "^2.0.0"
@@ -5153,43 +5153,58 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^9.1.13"
"storybook": "^10.0.5"
}
},
"node_modules/@storybook/builder-vite": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.1.13.tgz",
"integrity": "sha512-pmtIjU02ASJOZKdL8DoxWXJgZnpTDgD5WmMnjKJh9FaWmc2YiCW2Y6VRxPox96OM655jYHQe5+UIbk3Cwtwb4A==",
"node_modules/@storybook/addon-docs/node_modules/@storybook/csf-plugin": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.0.5.tgz",
"integrity": "sha512-4lQ/ZFmv3vVO/9cfY79HwQBo6ZnKhq9JWwngoWrw+8vpHuBx3Ks0l9E+PrAgfPmdOkmk5FedOI5VR68l5XAhzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/csf-plugin": "9.1.13",
"ts-dedent": "^2.0.0"
"unplugin": "^2.3.5"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^9.1.13",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
"esbuild": "*",
"rollup": "*",
"storybook": "^10.0.5",
"vite": "*",
"webpack": "*"
},
"peerDependenciesMeta": {
"esbuild": {
"optional": true
},
"rollup": {
"optional": true
},
"vite": {
"optional": true
},
"webpack": {
"optional": true
}
}
},
"node_modules/@storybook/csf-plugin": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.1.13.tgz",
"integrity": "sha512-EMpzYuyt9FDcxxfBChWzfId50y8QMpdenviEQ8m+pa6c+ANx3pC5J6t7y0khD8TQu815sTy+nc6cc8PC45dPUA==",
"node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.0.5.tgz",
"integrity": "sha512-bC6pSrQWRHUVmDDxH5uYq/tf2oqIEyzGIC4+3mZl67ngOKwOgjaBatKLnHBDeWrn25pA11mymdFt1VOStbNzGQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"unplugin": "^1.3.1"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^9.1.13"
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.0.5"
}
},
"node_modules/@storybook/global": {
@@ -5200,9 +5215,9 @@
"license": "MIT"
},
"node_modules/@storybook/icons": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.4.0.tgz",
"integrity": "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.6.0.tgz",
"integrity": "sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5213,27 +5228,106 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
}
},
"node_modules/@storybook/react": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@storybook/react/-/react-9.1.13.tgz",
"integrity": "sha512-B0UpYikKf29t8QGcdmumWojSQQ0phSDy/Ne2HYdrpNIxnUvHHUVOlGpq4lFcIDt52Ip5YG5GuAwJg3+eR4LCRg==",
"node_modules/@storybook/react-vite": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.0.5.tgz",
"integrity": "sha512-YK27cKM+Znc8yg+kCrP/X6bphlCihv819mYAI9emXUcj+6tzY0+UaPXIXgYNe9jbK39V2stQML7W55N7qv9MRg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/react-dom-shim": "9.1.13"
},
"engines": {
"node": ">=20.0.0"
"@joshwooding/vite-plugin-react-docgen-typescript": "0.6.1",
"@rollup/pluginutils": "^5.0.2",
"@storybook/builder-vite": "10.0.5",
"@storybook/react": "10.0.5",
"empathic": "^2.0.0",
"magic-string": "^0.30.0",
"react-docgen": "^8.0.0",
"resolve": "^1.22.8",
"tsconfig-paths": "^4.2.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"storybook": "^9.1.13",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.0.5",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
"node_modules/@storybook/react-vite/node_modules/@storybook/builder-vite": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.0.5.tgz",
"integrity": "sha512-ukTgD1hY+00VOA85fbXGrm30eMKYZr7I69/EonAb3rX8JS7JeI2Zoxd8WRXwQUafYbwRH6GSfjJ65xLXe9BCuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/csf-plugin": "10.0.5",
"ts-dedent": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^10.0.5",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
"node_modules/@storybook/react-vite/node_modules/@storybook/builder-vite/node_modules/@storybook/csf-plugin": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.0.5.tgz",
"integrity": "sha512-4lQ/ZFmv3vVO/9cfY79HwQBo6ZnKhq9JWwngoWrw+8vpHuBx3Ks0l9E+PrAgfPmdOkmk5FedOI5VR68l5XAhzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"unplugin": "^2.3.5"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"esbuild": "*",
"rollup": "*",
"storybook": "^10.0.5",
"vite": "*",
"webpack": "*"
},
"peerDependenciesMeta": {
"esbuild": {
"optional": true
},
"rollup": {
"optional": true
},
"vite": {
"optional": true
},
"webpack": {
"optional": true
}
}
},
"node_modules/@storybook/react-vite/node_modules/@storybook/react": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.0.5.tgz",
"integrity": "sha512-FDajPP8HG4n1w3nql7lxQUNKg5+wEa+qJzAPNk583FRaeH6GuxSHlG1vUARQ1QnAZwwlrZzcmgjVNxIucms/5g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/react-dom-shim": "10.0.5"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.0.5",
"typescript": ">= 4.9.x"
},
"peerDependenciesMeta": {
@@ -5242,10 +5336,10 @@
}
}
},
"node_modules/@storybook/react-dom-shim": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.1.13.tgz",
"integrity": "sha512-/tMr9TmV3+98GEQO0S03k4gtKHGCpv9+k9Dmnv+TJK3TBz7QsaFEzMwe3gCgoTaebLACyVveDiZkWnCYAWB6NA==",
"node_modules/@storybook/react-vite/node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.0.5.tgz",
"integrity": "sha512-bC6pSrQWRHUVmDDxH5uYq/tf2oqIEyzGIC4+3mZl67ngOKwOgjaBatKLnHBDeWrn25pA11mymdFt1VOStbNzGQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5253,40 +5347,9 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"storybook": "^9.1.13"
}
},
"node_modules/@storybook/react-vite": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-9.1.13.tgz",
"integrity": "sha512-mV1bZ1bpkNQygnuDo1xMGAS5ZXuoXFF0WGmr/BzNDGmRhZ1K1HQh42kC0w3PklckFBUwCFxmP58ZwTFzf+/dJA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@joshwooding/vite-plugin-react-docgen-typescript": "0.6.1",
"@rollup/pluginutils": "^5.0.2",
"@storybook/builder-vite": "9.1.13",
"@storybook/react": "9.1.13",
"find-up": "^7.0.0",
"magic-string": "^0.30.0",
"react-docgen": "^8.0.0",
"resolve": "^1.22.8",
"tsconfig-paths": "^4.2.0"
},
"engines": {
"node": ">=20.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
"storybook": "^9.1.13",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.0.5"
}
},
"node_modules/@tanstack/history": {
@@ -5552,22 +5615,6 @@
}
}
},
"node_modules/@tanstack/router-plugin/node_modules/unplugin": {
"version": "2.3.10",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz",
"integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
"acorn": "^8.15.0",
"picomatch": "^4.0.3",
"webpack-virtual-modules": "^0.6.2"
},
"engines": {
"node": ">=18.12.0"
}
},
"node_modules/@tanstack/router-utils": {
"version": "1.131.2",
"resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.131.2.tgz",
@@ -6581,19 +6628,6 @@
"baseline-browser-mapping": "dist/cli.js"
}
},
"node_modules/better-opn": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
"integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"open": "^8.0.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -7557,16 +7591,6 @@
"node": ">=6"
}
},
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/dependency-graph": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
@@ -7762,6 +7786,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/empathic": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
"integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/encoding-sniffer": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
@@ -7885,19 +7919,6 @@
"@esbuild/win32-x64": "0.25.9"
}
},
"node_modules/esbuild-register": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
"integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.4"
},
"peerDependencies": {
"esbuild": ">=0.12 <1"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -8097,24 +8118,6 @@
"node": ">=8"
}
},
"node_modules/find-up": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
"integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^7.2.0",
"path-exists": "^5.0.0",
"unicorn-magic": "^0.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/foreground-child": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
@@ -9018,22 +9021,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true,
"license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -9186,19 +9173,6 @@
"node": ">=0.10.0"
}
},
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-docker": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -9587,22 +9561,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/locate-path": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
"integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^6.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -10321,24 +10279,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/open": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
"integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
"is-wsl": "^2.2.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/outvariant": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
@@ -10393,51 +10333,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate/node_modules/p-limit": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"yocto-queue": "^1.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate/node_modules/yocto-queue": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz",
"integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -10588,16 +10483,6 @@
"tslib": "^2.0.3"
}
},
"node_modules/path-exists": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -12044,27 +11929,26 @@
"license": "MIT"
},
"node_modules/storybook": {
"version": "9.1.13",
"resolved": "https://registry.npmjs.org/storybook/-/storybook-9.1.13.tgz",
"integrity": "sha512-G3KZ36EVzXyHds72B/qtWiJnhUpM0xOUeYlDcO9DSHL1bDTv15cW4+upBl+mcBZrDvU838cn7Bv4GpF+O5MCfw==",
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/storybook/-/storybook-10.0.5.tgz",
"integrity": "sha512-3UEwXiIcTnc8sLUIlc/J1gI7tJjKEqIAvVYhfcj+uSSeb7i+6M6zQnCF8p36emBJyUdE4S3cq6FW5cmAluOfBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/icons": "^1.6.0",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/user-event": "^14.6.1",
"@vitest/expect": "3.2.4",
"@vitest/mocker": "3.2.4",
"@vitest/spy": "3.2.4",
"better-opn": "^3.0.2",
"esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0",
"esbuild-register": "^3.5.0",
"recast": "^0.23.5",
"semver": "^7.6.2",
"ws": "^8.18.0"
},
"bin": {
"storybook": "bin/index.cjs"
"storybook": "dist/bin/dispatcher.js"
},
"funding": {
"type": "opencollective",
@@ -12880,19 +12764,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/unicorn-magic": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
"integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -12930,17 +12801,19 @@
}
},
"node_modules/unplugin": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
"integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
"version": "2.3.10",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz",
"integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==",
"dev": true,
"license": "MIT",
"dependencies": {
"acorn": "^8.14.0",
"@jridgewell/remapping": "^2.3.5",
"acorn": "^8.15.0",
"picomatch": "^4.0.3",
"webpack-virtual-modules": "^0.6.2"
},
"engines": {
"node": ">=14.0.0"
"node": ">=18.12.0"
}
},
"node_modules/until-async": {
@@ -13219,9 +13092,9 @@
}
},
"node_modules/vite": {
"version": "7.1.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz",
"integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==",
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz",
"integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
"dev": true,
"license": "MIT",
"dependencies": {

View File

@@ -44,10 +44,10 @@
"@browser-logos/firefox": "^3.0.10",
"@browser-logos/safari": "^2.1.0",
"@graphql-codegen/cli": "^6.0.1",
"@graphql-codegen/client-preset": "^5.1.0",
"@graphql-codegen/client-preset": "^5.1.1",
"@graphql-codegen/typescript-msw": "^3.0.1",
"@storybook/addon-docs": "^9.1.13",
"@storybook/react-vite": "^9.1.13",
"@storybook/addon-docs": "^10.0.5",
"@storybook/react-vite": "^10.0.5",
"@tanstack/react-query-devtools": "^5.90.2",
"@tanstack/react-router-devtools": "^1.131.44",
"@tanstack/router-plugin": "^1.131.44",
@@ -72,10 +72,10 @@
"postcss-import": "^16.1.1",
"postcss-nesting": "^13.0.2",
"rimraf": "^6.0.1",
"storybook": "^9.1.5",
"storybook": "^10.0.5",
"tailwindcss": "^3.4.18",
"typescript": "^5.9.3",
"vite": "7.1.12",
"vite": "7.2.2",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-graphql-codegen": "^3.7.0",
"vite-plugin-manifest-sri": "^0.2.0",

View File

@@ -3,15 +3,12 @@
"title": "AuthorizationGrantInput",
"description": "Input for the authorization grant policy.",
"type": "object",
"required": [
"client",
"grant_type",
"requester",
"scope"
],
"properties": {
"user": {
"type": "object",
"type": [
"object",
"null"
],
"additionalProperties": true
},
"session_counts": {
@@ -36,6 +33,12 @@
"$ref": "#/definitions/Requester"
}
},
"required": [
"client",
"scope",
"grant_type",
"requester"
],
"definitions": {
"SessionCounts": {
"description": "Information about how many sessions the user has",
@@ -83,12 +86,18 @@
"properties": {
"ip_address": {
"description": "IP address of the entity making the request",
"type": "string",
"type": [
"string",
"null"
],
"format": "ip"
},
"user_agent": {
"description": "User agent of the entity making the request",
"type": "string"
"type": [
"string",
"null"
]
}
}
}

View File

@@ -3,10 +3,6 @@
"title": "ClientRegistrationInput",
"description": "Input for the client registration policy.",
"type": "object",
"required": [
"client_metadata",
"requester"
],
"properties": {
"client_metadata": {
"type": "object",
@@ -16,6 +12,10 @@
"$ref": "#/definitions/Requester"
}
},
"required": [
"client_metadata",
"requester"
],
"definitions": {
"Requester": {
"description": "Identity of the requester",
@@ -23,12 +23,18 @@
"properties": {
"ip_address": {
"description": "IP address of the entity making the request",
"type": "string",
"type": [
"string",
"null"
],
"format": "ip"
},
"user_agent": {
"description": "User agent of the entity making the request",
"type": "string"
"type": [
"string",
"null"
]
}
}
}

View File

@@ -3,10 +3,6 @@
"title": "EmailInput",
"description": "Input for the email add policy.",
"type": "object",
"required": [
"email",
"requester"
],
"properties": {
"email": {
"type": "string"
@@ -15,6 +11,10 @@
"$ref": "#/definitions/Requester"
}
},
"required": [
"email",
"requester"
],
"definitions": {
"Requester": {
"description": "Identity of the requester",
@@ -22,12 +22,18 @@
"properties": {
"ip_address": {
"description": "IP address of the entity making the request",
"type": "string",
"type": [
"string",
"null"
],
"format": "ip"
},
"user_agent": {
"description": "User agent of the entity making the request",
"type": "string"
"type": [
"string",
"null"
]
}
}
}

View File

@@ -3,11 +3,6 @@
"title": "RegisterInput",
"description": "Input for the user registration policy.",
"type": "object",
"required": [
"registration_method",
"requester",
"username"
],
"properties": {
"registration_method": {
"$ref": "#/definitions/RegistrationMethod"
@@ -16,12 +11,20 @@
"type": "string"
},
"email": {
"type": "string"
"type": [
"string",
"null"
]
},
"requester": {
"$ref": "#/definitions/Requester"
}
},
"required": [
"registration_method",
"username",
"requester"
],
"definitions": {
"RegistrationMethod": {
"type": "string",
@@ -36,12 +39,18 @@
"properties": {
"ip_address": {
"description": "IP address of the entity making the request",
"type": "string",
"type": [
"string",
"null"
],
"format": "ip"
},
"user_agent": {
"description": "User agent of the entity making the request",
"type": "string"
"type": [
"string",
"null"
]
}
}
}