From 69e3001966282fac0705a9aef692ee94aff67126 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Tue, 10 Jun 2025 11:53:22 +0200 Subject: [PATCH 01/31] Define all the dependencies at the workspace level --- Cargo.lock | 1 - Cargo.toml | 381 ++++++++++++++++++++++++++----- crates/axum-utils/Cargo.toml | 8 +- crates/cli/Cargo.toml | 29 ++- crates/config/Cargo.toml | 37 ++- crates/context/Cargo.toml | 2 +- crates/data-model/Cargo.toml | 8 +- crates/email/Cargo.toml | 2 +- crates/handlers/Cargo.toml | 116 ++++------ crates/http/Cargo.toml | 1 + crates/i18n-scan/Cargo.toml | 6 +- crates/i18n/Cargo.toml | 30 +-- crates/iana-codegen/Cargo.toml | 8 +- crates/iana/Cargo.toml | 1 + crates/jose/Cargo.toml | 27 +-- crates/keystore/Cargo.toml | 19 +- crates/listener/Cargo.toml | 16 +- crates/matrix-synapse/Cargo.toml | 4 +- crates/matrix/Cargo.toml | 2 +- crates/oauth2-types/Cargo.toml | 15 +- crates/oidc-client/Cargo.toml | 19 +- crates/policy/Cargo.toml | 8 +- crates/router/Cargo.toml | 6 +- crates/spa/Cargo.toml | 5 +- crates/storage-pg/Cargo.toml | 23 +- crates/storage/Cargo.toml | 4 +- crates/syn2mas/Cargo.toml | 46 ++-- crates/tasks/Cargo.toml | 20 +- crates/templates/Cargo.toml | 31 ++- crates/tower/Cargo.toml | 9 +- deny.toml | 1 - 31 files changed, 555 insertions(+), 330 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3c487390b..6e845c1a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3364,7 +3364,6 @@ dependencies = [ "sha2", "sqlx", "thiserror 2.0.12", - "time", "tokio", "tokio-util", "tower", diff --git a/Cargo.toml b/Cargo.toml index 407720da8..9e3218dde 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ package.authors = ["Element Backend Team"] package.edition = "2024" package.homepage = "https://element-hq.github.io/matrix-authentication-service/" package.repository = "https://github.com/element-hq/matrix-authentication-service/" +package.publish = false [workspace.lints.rust] unsafe_code = "deny" @@ -83,6 +84,10 @@ version = "0.1.88" [workspace.dependencies.anyhow] version = "1.0.98" +# Assert that a value matches a pattern +[workspace.dependencies.assert_matches] +version = "1.5.0" + # HTTP router [workspace.dependencies.axum] version = "0.8.4" @@ -92,9 +97,29 @@ version = "0.8.4" version = "0.10.1" features = ["cookie-private", "cookie-key-expansion", "typed-header"] +# Axum macros +[workspace.dependencies.axum-macros] +version = "0.5.0" + +# AEAD (Authenticated Encryption with Associated Data) +[workspace.dependencies.aead] +version = "0.5.2" +features = ["std"] + +# Argon2 password hashing +[workspace.dependencies.argon2] +version = "0.5.3" +features = ["password-hash", "std"] + # Constant-time base64 [workspace.dependencies.base64ct] version = "1.8.0" +features = ["std"] + +# Bcrypt password hashing +[workspace.dependencies.bcrypt] +version = "0.17.0" +default-features = true # Packed bitfields [workspace.dependencies.bitflags] @@ -107,6 +132,12 @@ version = "1.10.1" # UTF-8 paths [workspace.dependencies.camino] version = "1.1.10" +features = ["serde1"] + +# ChaCha20Poly1305 AEAD +[workspace.dependencies.chacha20poly1305] +version = "0.10.1" +features = ["std"] # Memory optimisation for short strings [workspace.dependencies.compact_str] @@ -116,6 +147,12 @@ version = "0.9.0" [workspace.dependencies.console] version = "0.15.11" +# Cookie store +[workspace.dependencies.cookie_store] +version = "0.21.1" +default-features = false +features = ["serde_json"] + # Time utilities [workspace.dependencies.chrono] version = "0.4.41" @@ -127,10 +164,51 @@ features = ["serde", "clock"] version = "4.5.39" features = ["derive"] +# Object Identifiers (OIDs) as constants +[workspace.dependencies.const-oid] +version = "0.9.6" +features = ["std"] + +# Utility for converting between different cases +[workspace.dependencies.convert_case] +version = "0.8.0" + +# CRC calculation +[workspace.dependencies.crc] +version = "3.3.0" + # Cron expressions [workspace.dependencies.cron] version = "0.15.0" +# CSV parsing and writing +[workspace.dependencies.csv] +version = "1.3.1" + +# DER encoding +[workspace.dependencies.der] +version = "0.7.10" +features = ["std"] + +# Interactive CLI dialogs +[workspace.dependencies.dialoguer] +version = "0.11.0" +default-features = false +features = ["fuzzy-select", "password"] + +# Cryptographic digest algorithms +[workspace.dependencies.digest] +version = "0.10.7" + +# Load environment variables from .env files +[workspace.dependencies.dotenvy] +version = "0.15.7" + +# ECDSA algorithms +[workspace.dependencies.ecdsa] +version = "0.16.9" +features = ["signing", "verifying"] + # Elliptic curve cryptography [workspace.dependencies.elliptic-curve] version = "0.13.8" @@ -141,16 +219,28 @@ features = ["std", "pem", "sec1"] version = "0.10.19" features = ["env", "yaml", "test"] +# URL form encoding +[workspace.dependencies.form_urlencoded] +version = "1.2.1" + # Utilities for dealing with futures [workspace.dependencies.futures-util] version = "0.3.31" +# Fixed-size arrays with trait implementations +[workspace.dependencies.generic-array] +version = "0.14.7" + # Rate-limiting [workspace.dependencies.governor] version = "0.10.0" default-features = false features = ["std", "dashmap", "quanta"] +# HMAC calculation +[workspace.dependencies.hmac] +version = "0.12.1" + # HTTP headers [workspace.dependencies.headers] version = "0.4.1" @@ -174,7 +264,7 @@ version = "0.1.3" # HTTP client and server [workspace.dependencies.hyper] version = "1.6.0" -features = ["client", "http1", "http2"] +features = ["client", "server", "http1", "http2"] # Additional Hyper utilties [workspace.dependencies.hyper-util] @@ -195,16 +285,67 @@ version = "0.27.7" features = ["http1", "http2"] default-features = false +# ICU libraries for internationalization +[workspace.dependencies.icu_calendar] +version = "1.5.2" +features = ["compiled_data", "std"] +[workspace.dependencies.icu_datetime] +version = "1.5.1" +features = ["compiled_data", "std"] +[workspace.dependencies.icu_experimental] +version = "0.1.0" +features = ["compiled_data", "std"] +[workspace.dependencies.icu_locid] +version = "1.5.0" +features = ["std"] +[workspace.dependencies.icu_locid_transform] +version = "1.5.0" +features = ["compiled_data", "std"] +[workspace.dependencies.icu_normalizer] +version = "1.5.0" +[workspace.dependencies.icu_plurals] +version = "1.5.0" +features = ["compiled_data", "std"] +[workspace.dependencies.icu_provider] +version = "1.5.0" +features = ["std", "sync"] +[workspace.dependencies.icu_provider_adapters] +version = "1.5.0" +features = ["std"] + # HashMap which preserves insertion order [workspace.dependencies.indexmap] version = "2.9.0" features = ["serde"] +# Indented string literals +[workspace.dependencies.indoc] +version = "2.0.6" + # Snapshot testing [workspace.dependencies.insta] version = "1.43.1" features = ["yaml", "json"] +# IP network address types +[workspace.dependencies.ipnetwork] +version = "0.20.0" +features = ["serde", "schemars"] + +# Iterator utilities +[workspace.dependencies.itertools] +version = "0.14.0" + +# K256 elliptic curve +[workspace.dependencies.k256] +version = "0.13.4" +features = ["std"] + +# RFC 5646 language tags +[workspace.dependencies.language-tags] +version = "0.3.2" +features = ["serde"] + # Email sending [workspace.dependencies.lettre] version = "0.11.15" @@ -219,6 +360,14 @@ features = [ "sendmail-transport", ] +# Listening on passed FDs +[workspace.dependencies.listenfd] +version = "1.0.2" + +# MIME type support +[workspace.dependencies.mime] +version = "0.3.17" + # Templates [workspace.dependencies.minijinja] version = "2.10.2" @@ -233,10 +382,43 @@ features = ["pycompat"] [workspace.dependencies.nonzero_ext] version = "0.3.0" -# K256 elliptic curve -[workspace.dependencies.k256] -version = "0.13.4" -features = ["std"] +# Open Policy Agent support through WASM +[workspace.dependencies.opa-wasm] +version = "0.1.5" + +# OpenTelemetry +[workspace.dependencies.opentelemetry] +version = "0.29.1" +features = ["trace", "metrics"] +[workspace.dependencies.opentelemetry-http] +version = "0.29.0" +features = ["reqwest"] +[workspace.dependencies.opentelemetry-jaeger-propagator] +version = "0.29.0" +[workspace.dependencies.opentelemetry-otlp] +version = "0.29.0" +default-features = false +features = ["trace", "metrics", "http-proto"] +[workspace.dependencies.opentelemetry-prometheus] +version = "0.29.1" +[workspace.dependencies.opentelemetry-resource-detectors] +version = "0.8.0" +[workspace.dependencies.opentelemetry-semantic-conventions] +version = "0.29.0" +features = ["semconv_experimental"] +[workspace.dependencies.opentelemetry-stdout] +version = "0.29.0" +features = ["trace", "metrics"] +[workspace.dependencies.opentelemetry_sdk] +version = "0.29.0" +features = [ + "experimental_trace_batch_span_processor_with_async_runtime", + "experimental_metrics_periodicreader_with_async_runtime", + "rt-tokio", +] +[workspace.dependencies.tracing-opentelemetry] +version = "0.30.0" +default-features = false # P256 elliptic curve [workspace.dependencies.p256] @@ -248,11 +430,28 @@ features = ["std"] version = "0.13.1" features = ["std"] -# PEM file decoding +# Text padding utilities +[workspace.dependencies.pad] +version = "0.1.6" + +# PBKDF2 password hashing +[workspace.dependencies.pbkdf2] +version = "0.12.2" +features = ["password-hash", "std", "simple", "parallel"] + +# PEM encoding/decoding [workspace.dependencies.pem-rfc7468] version = "0.7.0" features = ["std"] +# Parser generator +[workspace.dependencies.pest] +version = "2.8.0" + +# Pest derive macros +[workspace.dependencies.pest_derive] +version = "2.8.0" + # Pin projection [workspace.dependencies.pin-project-lite] version = "0.2.16" @@ -267,6 +466,14 @@ features = ["std"] version = "0.10.2" features = ["std", "pkcs5", "encryption"] +# Public Suffix List +[workspace.dependencies.psl] +version = "2.1.119" + +# Prometheus metrics +[workspace.dependencies.prometheus] +version = "0.14.0" + # High-precision clock [workspace.dependencies.quanta] version = "0.12.5" @@ -279,12 +486,25 @@ version = "0.3.1" [workspace.dependencies.rand_core] version = "0.6.4" +# Regular expressions +[workspace.dependencies.regex] +version = "1.11.1" + # High-level HTTP client [workspace.dependencies.reqwest] version = "0.12.19" default-features = false features = ["http2", "rustls-tls-manual-roots", "charset", "json", "socks"] +# RSA cryptography +[workspace.dependencies.rsa] +version = "0.9.8" +features = ["std", "pem"] + +# Fast hash algorithm for HashMap +[workspace.dependencies.rustc-hash] +version = "2.1.1" + # Matrix-related types [workspace.dependencies.ruma-common] version = "0.15.2" @@ -293,19 +513,31 @@ version = "0.15.2" [workspace.dependencies.rustls] version = "0.23.27" +# PEM parsing for rustls +[workspace.dependencies.rustls-pemfile] +version = "2.2.0" + +# PKI types for rustls +[workspace.dependencies.rustls-pki-types] +version = "1.12.0" + # Use platform-specific verifier for TLS [workspace.dependencies.rustls-platform-verifier] version = "0.5.3" +# systemd service status notification +[workspace.dependencies.sd-notify] +version = "0.4.5" + # JSON Schema generation [workspace.dependencies.schemars] version = "0.8.22" features = ["url", "chrono", "preserve_order"] -# SHA-2 cryptographic hash algorithm -[workspace.dependencies.sha2] -version = "0.10.9" -features = ["oid"] +# SEC1 encoding format +[workspace.dependencies.sec1] +version = "0.7.3" +features = ["std"] # Query builder [workspace.dependencies.sea-query] @@ -348,6 +580,37 @@ features = ["derive"] # Most of the time, if we need serde, we need derive version = "1.0.140" features = ["preserve_order"] +# URL encoded form serialization +[workspace.dependencies.serde_urlencoded] +version = "0.7.1" + +# Custom serialization helpers +[workspace.dependencies.serde_with] +version = "3.12.0" +features = ["hex", "chrono"] + +# YAML serialization +[workspace.dependencies.serde_yaml] +version = "0.9.34" + +# SHA-2 cryptographic hash algorithm +[workspace.dependencies.sha2] +version = "0.10.9" +features = ["oid"] + +# Digital signature traits +[workspace.dependencies.signature] +version = "2.2.0" + +# Low-level socket manipulation +[workspace.dependencies.socket2] +version = "0.5.10" + +# Subject Public Key Info +[workspace.dependencies.spki] +version = "0.7.3" +features = ["std"] + # SQL database support [workspace.dependencies.sqlx] version = "0.8.6" @@ -377,6 +640,14 @@ features = ["full"] [workspace.dependencies.tokio-stream] version = "0.1.17" +# Tokio rustls integration +[workspace.dependencies.tokio-rustls] +version = "0.26.2" + +# Tokio test utilities +[workspace.dependencies.tokio-test] +version = "0.4.4" + # Useful async utilities [workspace.dependencies.tokio-util] version = "0.7.15" @@ -405,67 +676,61 @@ features = ["cors", "fs", "add-extension", "set-header"] version = "0.1.41" [workspace.dependencies.tracing-subscriber] version = "0.3.19" - -# OpenTelemetry -[workspace.dependencies.opentelemetry] -version = "0.29.1" -features = ["trace", "metrics"] - -[workspace.dependencies.opentelemetry-http] -version = "0.29.0" -features = ["reqwest"] - -[workspace.dependencies.opentelemetry-jaeger-propagator] -version = "0.29.0" - -[workspace.dependencies.opentelemetry-otlp] -version = "0.29.0" -default-features = false -features = ["trace", "metrics", "http-proto"] - -[workspace.dependencies.opentelemetry-prometheus] -version = "0.29.1" - -[workspace.dependencies.opentelemetry-resource-detectors] -version = "0.8.0" - -[workspace.dependencies.opentelemetry-semantic-conventions] -version = "0.29.0" -features = ["semconv_experimental"] - -[workspace.dependencies.opentelemetry-stdout] -version = "0.29.0" -features = ["trace", "metrics"] - -[workspace.dependencies.opentelemetry_sdk] -version = "0.29.0" -features = [ - "experimental_trace_batch_span_processor_with_async_runtime", - "experimental_metrics_periodicreader_with_async_runtime", - "rt-tokio", -] - -[workspace.dependencies.tracing-opentelemetry] -version = "0.30.0" -default-features = false - -[workspace.dependencies.prometheus] -version = "0.14.0" +features = ["env-filter"] +[workspace.dependencies.tracing-appender] +version = "0.2.3" # URL manipulation [workspace.dependencies.url] version = "2.5.4" features = ["serde"] +# URL encoding +[workspace.dependencies.urlencoding] +version = "2.1.3" + # ULID support [workspace.dependencies.ulid] -version = "=1.1.4" # Pinned to the latest version which used rand 0.8 -features = ["serde"] +version = "=1.1.4" # Pinned to the latest version which used rand 0.8 +features = ["serde", "uuid"] + +# UUID support +[workspace.dependencies.uuid] +version = "1.17.0" + +# HTML escaping +[workspace.dependencies.v_htmlescape] +version = "0.15.8" + +# Version information generation +[workspace.dependencies.vergen-gitcl] +version = "1.0.8" +features = ["rustc"] + +# Directory traversal +[workspace.dependencies.walkdir] +version = "2.5.0" # HTTP mock server [workspace.dependencies.wiremock] version = "0.6.3" +# User-agent parser +[workspace.dependencies.woothee] +version = "0.13.0" + +# String writing interface +[workspace.dependencies.writeable] +version = "0.5.5" + +# Zero memory after use +[workspace.dependencies.zeroize] +version = "1.8.1" + +# Password strength estimation +[workspace.dependencies.zxcvbn] +version = "3.1.0" + [profile.release] codegen-units = 1 # Reduce the number of codegen units to increase optimizations lto = true # Enable fat LTO diff --git a/crates/axum-utils/Cargo.toml b/crates/axum-utils/Cargo.toml index a112beb28..6084984cd 100644 --- a/crates/axum-utils/Cargo.toml +++ b/crates/axum-utils/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -19,13 +19,13 @@ base64ct.workspace = true chrono.workspace = true headers.workspace = true http.workspace = true -icu_locid = "1.5.0" -mime = "0.3.17" +icu_locid.workspace = true +mime.workspace = true rand.workspace = true reqwest.workspace = true sentry.workspace = true serde.workspace = true -serde_with = "3.12.0" +serde_with.workspace = true serde_json.workspace = true thiserror.workspace = true tokio.workspace = true diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 49dc86737..40c46897a 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true build = "build.rs" @@ -20,38 +20,35 @@ bytes.workspace = true camino.workspace = true chrono.workspace = true clap.workspace = true -console = "0.15.11" -dialoguer = { version = "0.11.0", default-features = false, features = [ - "fuzzy-select", - "password", -] } -dotenvy = "0.15.7" +console.workspace = true +dialoguer.workspace = true +dotenvy.workspace = true figment.workspace = true futures-util.workspace = true headers.workspace = true http-body-util.workspace = true hyper.workspace = true -ipnetwork = "0.20.0" -itertools = "0.14.0" -listenfd = "1.0.2" +ipnetwork.workspace = true +itertools.workspace = true +listenfd.workspace = true rand.workspace = true rand_chacha.workspace = true reqwest.workspace = true rustls.workspace = true -sd-notify = "0.4.5" +sd-notify.workspace = true serde_json.workspace = true -serde_yaml = "0.9.34" +serde_yaml.workspace = true sqlx.workspace = true tokio.workspace = true tokio-util.workspace = true tower.workspace = true tower-http.workspace = true url.workspace = true -zeroize = "1.8.1" +zeroize.workspace = true tracing.workspace = true -tracing-appender = "0.2.3" -tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing-appender.workspace = true +tracing-subscriber.workspace = true tracing-opentelemetry.workspace = true opentelemetry.workspace = true opentelemetry-http.workspace = true @@ -90,7 +87,7 @@ syn2mas.workspace = true [build-dependencies] anyhow.workspace = true -vergen-gitcl = { version = "1.0.8", features = ["rustc"] } +vergen-gitcl.workspace = true [features] # Features used for the prebuilt binaries diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index feee4a7ee..35b7f83d1 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -6,41 +6,36 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] -tokio.workspace = true -tracing.workspace = true anyhow.workspace = true -futures-util.workspace = true - -camino = { workspace = true, features = ["serde1"] } +camino.workspace = true chrono.workspace = true figment.workspace = true +futures-util.workspace = true +governor.workspace = true hex.workspace = true -ipnetwork = { version = "0.20.0", features = ["serde", "schemars"] } +indoc.workspace = true +ipnetwork.workspace = true lettre.workspace = true +pem-rfc7468.workspace = true +rand_chacha.workspace = true +rand.workspace = true +rustls-pemfile.workspace = true +rustls-pki-types.workspace = true schemars.workspace = true +serde_json.workspace = true +serde_with.workspace = true +serde.workspace = true +tokio.workspace = true +tracing.workspace = true ulid.workspace = true url.workspace = true -serde.workspace = true -serde_with = { version = "3.12.0", features = ["hex", "chrono"] } -serde_json.workspace = true - -pem-rfc7468 = "0.7.0" -rustls-pki-types = "1.12.0" -rustls-pemfile = "2.2.0" -rand.workspace = true -rand_chacha.workspace = true - -indoc = "2.0.6" - -governor.workspace = true - mas-jose.workspace = true mas-keystore.workspace = true mas-iana.workspace = true diff --git a/crates/context/Cargo.toml b/crates/context/Cargo.toml index 762985080..46adc9911 100644 --- a/crates/context/Cargo.toml +++ b/crates/context/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true diff --git a/crates/data-model/Cargo.toml b/crates/data-model/Cargo.toml index 6f0e20d0c..c4e19fcdf 100644 --- a/crates/data-model/Cargo.toml +++ b/crates/data-model/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -18,11 +18,11 @@ thiserror.workspace = true serde.workspace = true serde_json.workspace = true url.workspace = true -crc = "3.3.0" +crc.workspace = true ulid.workspace = true rand.workspace = true -regex = "1.11.1" -woothee = "0.13.0" +regex.workspace = true +woothee.workspace = true ruma-common.workspace = true mas-iana.workspace = true diff --git a/crates/email/Cargo.toml b/crates/email/Cargo.toml index adaf13c77..7b8ff94c4 100644 --- a/crates/email/Cargo.toml +++ b/crates/email/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true diff --git a/crates/handlers/Cargo.toml b/crates/handlers/Cargo.toml index c2a69b31f..4bda28ced 100644 --- a/crates/handlers/Cargo.toml +++ b/crates/handlers/Cargo.toml @@ -6,88 +6,62 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] -# Async runtime -tokio.workspace = true -tokio-util.workspace = true -futures-util.workspace = true -async-trait.workspace = true - -# Logging and tracing -tracing.workspace = true -opentelemetry.workspace = true -opentelemetry-semantic-conventions.workspace = true - -# Error management -thiserror.workspace = true -anyhow.workspace = true -sentry.workspace = true - -# Web server -hyper.workspace = true -tower.workspace = true -tower-http.workspace = true -axum.workspace = true -axum-macros = "0.5.0" -axum-extra.workspace = true -rustls.workspace = true - aide.workspace = true +anyhow.workspace = true +argon2.workspace = true async-graphql.workspace = true -schemars.workspace = true - -# HTTP client -reqwest.workspace = true - -# Emails -lettre.workspace = true - -# Database access -sqlx.workspace = true - -# Various structure (de)serialization -serde.workspace = true -serde_with = { version = "3.12.0", features = ["hex", "chrono"] } -serde_json.workspace = true -serde_urlencoded = "0.7.1" - -# Password hashing -argon2 = { version = "0.5.3", features = ["password-hash", "std"] } -bcrypt = { version = "0.17.0", default-features = true } -pbkdf2 = { version = "0.12.2", features = [ - "password-hash", - "std", - "simple", - "parallel", -] } -zeroize = "1.8.1" - -# Various data types and utilities +async-trait.workspace = true +axum-extra.workspace = true +axum-macros.workspace = true +axum.workspace = true base64ct.workspace = true +bcrypt.workspace = true camino.workspace = true chrono.workspace = true elliptic-curve.workspace = true -hex.workspace = true +futures-util.workspace = true governor.workspace = true -icu_normalizer = "1.5.0" -indexmap.workspace = true -pkcs8.workspace = true -psl = "2.1.119" -sha2.workspace = true -time = "0.3.41" -url.workspace = true -mime = "0.3.17" -minijinja.workspace = true -minijinja-contrib.workspace = true -rand.workspace = true -rand_chacha.workspace = true headers.workspace = true +hex.workspace = true +hyper.workspace = true +icu_normalizer.workspace = true +indexmap.workspace = true +lettre.workspace = true +mime.workspace = true +minijinja-contrib.workspace = true +minijinja.workspace = true +opentelemetry-semantic-conventions.workspace = true +opentelemetry.workspace = true +pbkdf2.workspace = true +pkcs8.workspace = true +psl.workspace = true +rand_chacha.workspace = true +rand.workspace = true +reqwest.workspace = true +rustls.workspace = true +schemars.workspace = true +sentry.workspace = true +serde_json.workspace = true +serde_urlencoded.workspace = true +serde_with.workspace = true +serde.workspace = true +sha2.workspace = true +sqlx.workspace = true +thiserror.workspace = true +tokio-util.workspace = true +tokio.workspace = true +tower-http.workspace = true +tower.workspace = true +tracing.workspace = true ulid.workspace = true +url.workspace = true +zeroize.workspace = true mas-axum-utils.workspace = true mas-config.workspace = true @@ -106,13 +80,11 @@ mas-storage.workspace = true mas-storage-pg.workspace = true mas-templates.workspace = true oauth2-types.workspace = true -zxcvbn = "3.1.0" +zxcvbn.workspace = true [dev-dependencies] insta.workspace = true tracing-subscriber.workspace = true -cookie_store = { version = "0.21.1", default-features = false, features = [ - "serde_json", -] } +cookie_store.workspace = true sqlx.workspace = true wiremock.workspace = true diff --git a/crates/http/Cargo.toml b/crates/http/Cargo.toml index ae3fe6e0d..3df605792 100644 --- a/crates/http/Cargo.toml +++ b/crates/http/Cargo.toml @@ -7,6 +7,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true diff --git a/crates/i18n-scan/Cargo.toml b/crates/i18n-scan/Cargo.toml index db9a27f06..c70d7b4e7 100644 --- a/crates/i18n-scan/Cargo.toml +++ b/crates/i18n-scan/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "mas-i18n-scan" version.workspace = true -license.workspace = true authors.workspace = true edition.workspace = true +license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -18,6 +18,6 @@ minijinja.workspace = true serde_json.workspace = true tracing-subscriber.workspace = true tracing.workspace = true -walkdir = "2.5.0" +walkdir.workspace = true mas-i18n.workspace = true diff --git a/crates/i18n/Cargo.toml b/crates/i18n/Cargo.toml index b654bfb5a..c73448060 100644 --- a/crates/i18n/Cargo.toml +++ b/crates/i18n/Cargo.toml @@ -1,30 +1,30 @@ [package] name = "mas-i18n" version.workspace = true -license.workspace = true authors.workspace = true edition.workspace = true +license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] camino.workspace = true -icu_calendar = { version = "1.5.2", features = ["compiled_data", "std"] } -icu_datetime = { version = "1.5.1", features = ["compiled_data", "std"] } -icu_locid = { version = "1.5.0", features = ["std"] } -icu_locid_transform = { version = "1.5.0", features = ["compiled_data", "std"] } -icu_plurals = { version = "1.5.0", features = ["compiled_data", "std"] } -icu_provider = { version = "1.5.0", features = ["std", "sync"] } -icu_provider_adapters = { version = "1.5.0", features = ["std"] } -icu_experimental = { version = "0.1.0", features = ["compiled_data", "std"] } -pad = "0.1.6" -pest = "2.8.0" -pest_derive = "2.8.0" -serde.workspace = true +icu_calendar.workspace = true +icu_datetime.workspace = true +icu_experimental.workspace = true +icu_locid_transform.workspace = true +icu_locid.workspace = true +icu_plurals.workspace = true +icu_provider_adapters.workspace = true +icu_provider.workspace = true +pad.workspace = true +pest_derive.workspace = true +pest.workspace = true serde_json.workspace = true +serde.workspace = true thiserror.workspace = true -writeable = "0.5.5" +writeable.workspace = true diff --git a/crates/iana-codegen/Cargo.toml b/crates/iana-codegen/Cargo.toml index e67d927f9..ae8f8d1ed 100644 --- a/crates/iana-codegen/Cargo.toml +++ b/crates/iana-codegen/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -15,10 +15,10 @@ workspace = true anyhow.workspace = true async-trait.workspace = true camino.workspace = true -convert_case = "0.8.0" -csv = "1.3.1" +convert_case.workspace = true +csv.workspace = true reqwest.workspace = true serde.workspace = true tokio.workspace = true -tracing.workspace = true tracing-subscriber.workspace = true +tracing.workspace = true diff --git a/crates/iana/Cargo.toml b/crates/iana/Cargo.toml index b8b2f7976..e5036ec1d 100644 --- a/crates/iana/Cargo.toml +++ b/crates/iana/Cargo.toml @@ -7,6 +7,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true diff --git a/crates/jose/Cargo.toml b/crates/jose/Cargo.toml index 10989baf5..9ca221bb3 100644 --- a/crates/jose/Cargo.toml +++ b/crates/jose/Cargo.toml @@ -7,30 +7,31 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true [dependencies] -base64ct = { version = "1.8.0", features = ["std"] } +base64ct.workspace = true chrono.workspace = true -digest = "0.10.7" -ecdsa = { version = "0.16.9", features = ["signing", "verifying"] } +digest.workspace = true +ecdsa.workspace = true elliptic-curve.workspace = true -generic-array = "0.14.7" -hmac = "0.12.1" -k256 = { version = "0.13.4", features = ["ecdsa"] } -p256 = { version = "0.13.2", features = ["ecdsa"] } -p384 = { version = "0.13.1", features = ["ecdsa"] } +generic-array.workspace = true +hmac.workspace = true +k256.workspace = true +p256.workspace = true +p384.workspace = true rand.workspace = true -rsa = "0.9.8" +rsa.workspace = true schemars.workspace = true -sec1 = "0.7.3" -serde.workspace = true +sec1.workspace = true serde_json.workspace = true -serde_with = "3.12.0" +serde_with.workspace = true +serde.workspace = true sha2.workspace = true -signature = "2.2.0" +signature.workspace = true thiserror.workspace = true url.workspace = true diff --git a/crates/keystore/Cargo.toml b/crates/keystore/Cargo.toml index a46b816f6..668d555ad 100644 --- a/crates/keystore/Cargo.toml +++ b/crates/keystore/Cargo.toml @@ -7,15 +7,19 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true [dependencies] -aead = { version = "0.5.2", features = ["std"] } -const-oid = { version = "0.9.6", features = ["std"] } -der = { version = "0.7.10", features = ["std"] } +aead.workspace = true +base64ct.workspace = true +chacha20poly1305.workspace = true +const-oid.workspace = true +der.workspace = true elliptic-curve.workspace = true +generic-array.workspace = true k256.workspace = true p256.workspace = true p384.workspace = true @@ -23,13 +27,10 @@ pem-rfc7468.workspace = true pkcs1.workspace = true pkcs8.workspace = true rand.workspace = true -rsa = { version = "0.9.8", features = ["std", "pem"] } -sec1 = { version = "0.7.3", features = ["std"] } -spki = { version = "0.7.3", features = ["std"] } +rsa.workspace = true +sec1.workspace = true +spki.workspace = true thiserror.workspace = true -generic-array = "0.14.7" -chacha20poly1305 = { version = "0.10.1", features = ["std"] } -base64ct = "1.8.0" mas-iana.workspace = true mas-jose.workspace = true diff --git a/crates/listener/Cargo.toml b/crates/listener/Cargo.toml index 1c2a336f5..14d84ea9b 100644 --- a/crates/listener/Cargo.toml +++ b/crates/listener/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -15,25 +15,25 @@ workspace = true bytes.workspace = true futures-util.workspace = true http-body.workspace = true -hyper = { workspace = true, features = ["server"] } hyper-util.workspace = true +hyper.workspace = true pin-project-lite.workspace = true -socket2 = "0.5.10" +socket2.workspace = true thiserror.workspace = true -tokio.workspace = true -tokio-rustls = "0.26.2" +tokio-rustls.workspace = true tokio-util.workspace = true -tower.workspace = true +tokio.workspace = true tower-http.workspace = true +tower.workspace = true tracing.workspace = true mas-context.workspace = true [dev-dependencies] anyhow.workspace = true -rustls-pemfile = "2.2.0" +rustls-pemfile.workspace = true +tokio-test.workspace = true tokio.workspace = true -tokio-test = "0.4.4" tracing-subscriber.workspace = true [[example]] diff --git a/crates/matrix-synapse/Cargo.toml b/crates/matrix-synapse/Cargo.toml index 27e0018ec..8e3e1841c 100644 --- a/crates/matrix-synapse/Cargo.toml +++ b/crates/matrix-synapse/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -20,7 +20,7 @@ serde.workspace = true thiserror.workspace = true tracing.workspace = true url.workspace = true -urlencoding = "2.1.3" +urlencoding.workspace = true mas-http.workspace = true mas-matrix.workspace = true diff --git a/crates/matrix/Cargo.toml b/crates/matrix/Cargo.toml index 4f194bd22..2182c6426 100644 --- a/crates/matrix/Cargo.toml +++ b/crates/matrix/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true diff --git a/crates/oauth2-types/Cargo.toml b/crates/oauth2-types/Cargo.toml index b0f4ffa69..4707bb137 100644 --- a/crates/oauth2-types/Cargo.toml +++ b/crates/oauth2-types/Cargo.toml @@ -7,25 +7,26 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true [dependencies] base64ct.workspace = true -serde.workspace = true -serde_json.workspace = true -language-tags = { version = "0.3.2", features = ["serde"] } -url.workspace = true -serde_with = { version = "3.12.0", features = ["chrono"] } chrono.workspace = true +indexmap.workspace = true +language-tags.workspace = true +serde_json.workspace = true +serde_with.workspace = true +serde.workspace = true sha2.workspace = true thiserror.workspace = true -indexmap.workspace = true +url.workspace = true mas-iana.workspace = true mas-jose.workspace = true [dev-dependencies] -assert_matches = "1.5.0" +assert_matches.workspace = true insta.workspace = true diff --git a/crates/oidc-client/Cargo.toml b/crates/oidc-client/Cargo.toml index 95f01193a..5b35ec913 100644 --- a/crates/oidc-client/Cargo.toml +++ b/crates/oidc-client/Cargo.toml @@ -7,26 +7,27 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true [dependencies] async-trait.workspace = true -base64ct = { version = "1.8.0", features = ["std"] } +base64ct.workspace = true chrono.workspace = true elliptic-curve.workspace = true -form_urlencoded = "1.2.1" +form_urlencoded.workspace = true headers.workspace = true http.workspace = true -language-tags = "0.3.2" -mime = "0.3.17" +language-tags.workspace = true +mime.workspace = true p256.workspace = true rand.workspace = true reqwest.workspace = true -serde.workspace = true serde_json.workspace = true -serde_urlencoded = "0.7.1" +serde_urlencoded.workspace = true +serde.workspace = true thiserror.workspace = true tracing.workspace = true url.workspace = true @@ -38,10 +39,10 @@ mas-keystore.workspace = true oauth2-types.workspace = true [dev-dependencies] -assert_matches = "1.5.0" +assert_matches.workspace = true bitflags.workspace = true +http-body-util.workspace = true rand_chacha.workspace = true +rustls.workspace = true tokio.workspace = true wiremock.workspace = true -http-body-util.workspace = true -rustls.workspace = true diff --git a/crates/policy/Cargo.toml b/crates/policy/Cargo.toml index 22128dd17..073d86ef5 100644 --- a/crates/policy/Cargo.toml +++ b/crates/policy/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -14,10 +14,10 @@ workspace = true [dependencies] anyhow.workspace = true arc-swap.workspace = true -opa-wasm = "0.1.5" -serde.workspace = true -serde_json.workspace = true +opa-wasm.workspace = true schemars = { workspace = true, optional = true } +serde_json.workspace = true +serde.workspace = true thiserror.workspace = true tokio.workspace = true tracing.workspace = true diff --git a/crates/router/Cargo.toml b/crates/router/Cargo.toml index cde2ad69d..b31302fc0 100644 --- a/crates/router/Cargo.toml +++ b/crates/router/Cargo.toml @@ -6,14 +6,14 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] axum.workspace = true +serde_urlencoded.workspace = true serde.workspace = true -serde_urlencoded = "0.7.1" -url.workspace = true ulid.workspace = true +url.workspace = true diff --git a/crates/spa/Cargo.toml b/crates/spa/Cargo.toml index 84155e508..292338a67 100644 --- a/crates/spa/Cargo.toml +++ b/crates/spa/Cargo.toml @@ -6,13 +6,12 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] +camino.workspace = true serde.workspace = true thiserror.workspace = true -camino = { workspace = true, features = ["serde1"] } - diff --git a/crates/storage-pg/Cargo.toml b/crates/storage-pg/Cargo.toml index 32f0ac2e0..0bf34ec0b 100644 --- a/crates/storage-pg/Cargo.toml +++ b/crates/storage-pg/Cargo.toml @@ -6,29 +6,28 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] async-trait.workspace = true -sqlx.workspace = true -sea-query.workspace = true -sea-query-binder.workspace = true chrono.workspace = true +futures-util.workspace = true +opentelemetry-semantic-conventions.workspace = true +opentelemetry.workspace = true +rand_chacha.workspace = true +rand.workspace = true +sea-query-binder.workspace = true +sea-query.workspace = true serde_json.workspace = true +sqlx.workspace = true thiserror.workspace = true tracing.workspace = true -futures-util.workspace = true -opentelemetry.workspace = true -opentelemetry-semantic-conventions.workspace = true - -rand.workspace = true -rand_chacha.workspace = true +ulid.workspace = true url.workspace = true -uuid = "1.17.0" -ulid = { workspace = true, features = ["uuid"] } +uuid.workspace = true oauth2-types.workspace = true mas-storage.workspace = true diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 447f6ec40..f22ef1d6e 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -17,8 +17,8 @@ chrono.workspace = true futures-util.workspace = true opentelemetry.workspace = true rand_core.workspace = true -serde.workspace = true serde_json.workspace = true +serde.workspace = true thiserror.workspace = true tracing-opentelemetry.workspace = true tracing.workspace = true diff --git a/crates/syn2mas/Cargo.toml b/crates/syn2mas/Cargo.toml index 544c0b245..5452c14be 100644 --- a/crates/syn2mas/Cargo.toml +++ b/crates/syn2mas/Cargo.toml @@ -6,48 +6,44 @@ authors.workspace = true edition.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lints] +workspace = true [dependencies] anyhow.workspace = true arc-swap.workspace = true bitflags.workspace = true camino.workspace = true -figment.workspace = true -serde.workspace = true -serde_json.workspace = true -thiserror.workspace = true -thiserror-ext.workspace = true -tokio.workspace = true -tokio-util.workspace = true -sqlx.workspace = true chrono.workspace = true compact_str.workspace = true -tracing.workspace = true -futures-util = "0.3.31" -rustc-hash = "2.1.1" -url.workspace = true - -rand.workspace = true -rand_chacha = "0.3.1" -uuid = "1.17.0" -ulid = { workspace = true, features = ["uuid"] } - +figment.workspace = true +futures-util.workspace = true mas-config.workspace = true mas-iana.workspace = true mas-storage.workspace = true oauth2-types.workspace = true - -opentelemetry.workspace = true opentelemetry-semantic-conventions.workspace = true +opentelemetry.workspace = true +rand_chacha.workspace = true +rand.workspace = true +rustc-hash.workspace = true +serde_json.workspace = true +serde.workspace = true +sqlx.workspace = true +thiserror-ext.workspace = true +thiserror.workspace = true +tokio-util.workspace = true +tokio.workspace = true +tracing.workspace = true +ulid.workspace = true +url.workspace = true +uuid.workspace = true [dev-dependencies] -mas-storage-pg.workspace = true - anyhow.workspace = true insta.workspace = true serde.workspace = true -[lints] -workspace = true +mas-storage-pg.workspace = true diff --git a/crates/tasks/Cargo.toml b/crates/tasks/Cargo.toml index 18eb740d5..9cd39c20b 100644 --- a/crates/tasks/Cargo.toml +++ b/crates/tasks/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true @@ -14,21 +14,21 @@ workspace = true [dependencies] anyhow.workspace = true async-trait.workspace = true -cron.workspace = true chrono.workspace = true -rand.workspace = true +cron.workspace = true +opentelemetry-semantic-conventions.workspace = true +opentelemetry.workspace = true rand_chacha.workspace = true +rand.workspace = true +serde_json.workspace = true +serde.workspace = true sqlx.workspace = true thiserror.workspace = true -tokio.workspace = true tokio-util.workspace = true -tracing.workspace = true +tokio.workspace = true tracing-opentelemetry.workspace = true -opentelemetry.workspace = true -opentelemetry-semantic-conventions.workspace = true +tracing.workspace = true ulid.workspace = true -serde.workspace = true -serde_json.workspace = true mas-context.workspace = true mas-data-model.workspace = true @@ -36,6 +36,6 @@ mas-email.workspace = true mas-i18n.workspace = true mas-matrix.workspace = true mas-router.workspace = true -mas-storage.workspace = true mas-storage-pg.workspace = true +mas-storage.workspace = true mas-templates.workspace = true diff --git a/crates/templates/Cargo.toml b/crates/templates/Cargo.toml index 68bbadb1d..a99f5ae56 100644 --- a/crates/templates/Cargo.toml +++ b/crates/templates/Cargo.toml @@ -6,33 +6,30 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true -publish = false +publish.workspace = true [lints] workspace = true [dependencies] -arc-swap.workspace = true -tracing.workspace = true -tokio.workspace = true -walkdir = "2.5.0" - anyhow.workspace = true -thiserror.workspace = true - -minijinja.workspace = true -minijinja-contrib.workspace = true -serde.workspace = true -serde_json.workspace = true -serde_urlencoded = "0.7.1" -v_htmlescape = "0.15.8" - +arc-swap.workspace = true camino.workspace = true chrono.workspace = true -url.workspace = true http.workspace = true -ulid.workspace = true +minijinja-contrib.workspace = true +minijinja.workspace = true rand.workspace = true +serde_json.workspace = true +serde_urlencoded.workspace = true +serde.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing.workspace = true +ulid.workspace = true +url.workspace = true +v_htmlescape.workspace = true +walkdir.workspace = true oauth2-types.workspace = true mas-data-model.workspace = true diff --git a/crates/tower/Cargo.toml b/crates/tower/Cargo.toml index 52ef9da13..38067f120 100644 --- a/crates/tower/Cargo.toml +++ b/crates/tower/Cargo.toml @@ -7,16 +7,17 @@ edition.workspace = true license.workspace = true homepage.workspace = true repository.workspace = true +publish.workspace = true [lints] workspace = true [dependencies] http.workspace = true -tracing.workspace = true -tracing-opentelemetry.workspace = true -tower.workspace = true -opentelemetry.workspace = true opentelemetry-http.workspace = true opentelemetry-semantic-conventions.workspace = true +opentelemetry.workspace = true pin-project-lite.workspace = true +tower.workspace = true +tracing-opentelemetry.workspace = true +tracing.workspace = true diff --git a/deny.toml b/deny.toml index 4b2704f3f..152c525e5 100644 --- a/deny.toml +++ b/deny.toml @@ -57,7 +57,6 @@ deny = [ multiple-versions = "deny" skip = [ - { name = "base64", version = "0.21.7" }, # many dependencies depends on this old version { name = "regex-syntax", version = "0.6.29" }, # tracing-subscriber[env-filter] -> matchers depends on the old version { name = "regex-automata", version = "0.1.10" }, # ^ { name = "itertools", version = "0.13.0" }, # zxcvbn depends on this old version From 8f5094ed19cf81327e0cd7ae4ae69a19385ef77a Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Tue, 10 Jun 2025 12:04:02 +0200 Subject: [PATCH 02/31] Remove optional features from the mas-policy crate --- crates/policy/Cargo.toml | 6 +---- crates/policy/src/bin/schema.rs | 24 ++++++++++-------- crates/policy/src/model.rs | 45 ++++++++++----------------------- misc/update.sh | 2 +- 4 files changed, 29 insertions(+), 48 deletions(-) diff --git a/crates/policy/Cargo.toml b/crates/policy/Cargo.toml index 073d86ef5..ca927bcc6 100644 --- a/crates/policy/Cargo.toml +++ b/crates/policy/Cargo.toml @@ -15,7 +15,7 @@ workspace = true anyhow.workspace = true arc-swap.workspace = true opa-wasm.workspace = true -schemars = { workspace = true, optional = true } +schemars.workspace = true serde_json.workspace = true serde.workspace = true thiserror.workspace = true @@ -25,9 +25,5 @@ tracing.workspace = true mas-data-model.workspace = true oauth2-types.workspace = true -[features] -jsonschema = ["dep:schemars"] - [[bin]] name = "schema" -required-features = ["jsonschema"] diff --git a/crates/policy/src/bin/schema.rs b/crates/policy/src/bin/schema.rs index d993cdbe9..3fbe09adb 100644 --- a/crates/policy/src/bin/schema.rs +++ b/crates/policy/src/bin/schema.rs @@ -4,6 +4,11 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. +#![expect( + clippy::disallowed_types, + reason = "We use Path/PathBuf instead of camino here for simplicity" +)] + use std::path::{Path, PathBuf}; use mas_policy::model::{ @@ -12,17 +17,14 @@ use mas_policy::model::{ use schemars::{JsonSchema, r#gen::SchemaSettings}; fn write_schema(out_dir: Option<&Path>, file: &str) { - let mut writer: Box = match out_dir { - Some(out_dir) => { - let path = out_dir.join(file); - eprintln!("Writing to {path:?}"); - let file = std::fs::File::create(path).expect("Failed to create file"); - Box::new(std::io::BufWriter::new(file)) - } - None => { - eprintln!("--- {file} ---"); - Box::new(std::io::stdout()) - } + let mut writer: Box = if let Some(out_dir) = out_dir { + let path = out_dir.join(file); + eprintln!("Writing to {path:?}"); + let file = std::fs::File::create(path).expect("Failed to create file"); + Box::new(std::io::BufWriter::new(file)) + } else { + eprintln!("--- {file} ---"); + Box::new(std::io::stdout()) }; let settings = SchemaSettings::draft07().with(|s| { diff --git a/crates/policy/src/model.rs b/crates/policy/src/model.rs index 4301b4165..d57a81655 100644 --- a/crates/policy/src/model.rs +++ b/crates/policy/src/model.rs @@ -13,12 +13,12 @@ use std::net::IpAddr; use mas_data_model::{Client, User}; use oauth2_types::{registration::VerifiedClientMetadata, scope::Scope}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; /// A well-known policy code. -#[derive(Deserialize, Debug, Clone, Copy)] +#[derive(Deserialize, Debug, Clone, Copy, JsonSchema)] #[serde(rename_all = "kebab-case")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub enum Code { /// The username is too short. UsernameTooShort, @@ -71,8 +71,7 @@ impl Code { } /// A single violation of a policy. -#[derive(Deserialize, Debug)] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] +#[derive(Deserialize, Debug, JsonSchema)] pub struct Violation { pub msg: String, pub redirect_uri: Option, @@ -111,9 +110,8 @@ impl EvaluationResult { } /// Identity of the requester -#[derive(Serialize, Debug, Default)] +#[derive(Serialize, Debug, Default, JsonSchema)] #[serde(rename_all = "snake_case")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub struct Requester { /// IP address of the entity making the request pub ip_address: Option, @@ -122,8 +120,7 @@ pub struct Requester { pub user_agent: Option, } -#[derive(Serialize, Debug)] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] +#[derive(Serialize, Debug, JsonSchema)] pub enum RegistrationMethod { #[serde(rename = "password")] Password, @@ -133,9 +130,8 @@ pub enum RegistrationMethod { } /// Input for the user registration policy. -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, JsonSchema)] #[serde(tag = "registration_method")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub struct RegisterInput<'a> { pub registration_method: RegistrationMethod, @@ -148,21 +144,16 @@ pub struct RegisterInput<'a> { } /// Input for the client registration policy. -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub struct ClientRegistrationInput<'a> { - #[cfg_attr( - feature = "jsonschema", - schemars(with = "std::collections::HashMap") - )] + #[schemars(with = "std::collections::HashMap")] pub client_metadata: &'a VerifiedClientMetadata, pub requester: Requester, } -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub enum GrantType { AuthorizationCode, ClientCredentials, @@ -171,23 +162,16 @@ pub enum GrantType { } /// Input for the authorization grant policy. -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub struct AuthorizationGrantInput<'a> { - #[cfg_attr( - feature = "jsonschema", - schemars(with = "Option>") - )] + #[schemars(with = "Option>")] pub user: Option<&'a User>, - #[cfg_attr( - feature = "jsonschema", - schemars(with = "std::collections::HashMap") - )] + #[schemars(with = "std::collections::HashMap")] pub client: &'a Client, - #[cfg_attr(feature = "jsonschema", schemars(with = "String"))] + #[schemars(with = "String")] pub scope: &'a Scope, pub grant_type: GrantType, @@ -196,9 +180,8 @@ pub struct AuthorizationGrantInput<'a> { } /// Input for the email add policy. -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, JsonSchema)] #[serde(rename_all = "snake_case")] -#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))] pub struct EmailInput<'a> { pub email: &'a str, diff --git a/misc/update.sh b/misc/update.sh index de9d4001c..4cbea8c31 100644 --- a/misc/update.sh +++ b/misc/update.sh @@ -14,7 +14,7 @@ cargo run -p mas-config > "${CONFIG_SCHEMA}" cargo run -p mas-handlers --bin graphql-schema > "${GRAPHQL_SCHEMA}" cargo run -p mas-handlers --bin api-schema > "${API_SCHEMA}" cargo run -p mas-i18n-scan -- --update "${BASE_DIR}/templates/" "${BASE_DIR}/translations/en.json" -OUT_DIR="${POLICIES_SCHEMA}" cargo run -p mas-policy --features jsonschema +OUT_DIR="${POLICIES_SCHEMA}" cargo run -p mas-policy cd "${BASE_DIR}/frontend" npm run format From a12b50147abbdadddd36e6336c988867229d4a9f Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Tue, 10 Jun 2025 12:07:10 +0200 Subject: [PATCH 03/31] Remove optional features from mas-iana & regenerate Also ignores 'TEMPORARY' items in the IANA registry --- crates/iana-codegen/src/generation.rs | 9 ++-- crates/iana-codegen/src/jose.rs | 9 ++++ crates/iana-codegen/src/traits.rs | 7 +++ crates/iana/Cargo.toml | 9 +--- crates/iana/src/jose.rs | 63 +++++++++++++++------------ crates/iana/src/oauth.rs | 15 ------- crates/jose/src/jwa/asymmetric.rs | 4 +- docs/config.schema.json | 8 ++++ 8 files changed, 67 insertions(+), 57 deletions(-) diff --git a/crates/iana-codegen/src/generation.rs b/crates/iana-codegen/src/generation.rs index 4f915c54c..82f67b05b 100644 --- a/crates/iana-codegen/src/generation.rs +++ b/crates/iana-codegen/src/generation.rs @@ -164,8 +164,7 @@ pub fn json_schema_impl( ) -> std::fmt::Result { write!( f, - r#"#[cfg(feature = "schemars")] -impl schemars::JsonSchema for {} {{ + r#"impl schemars::JsonSchema for {} {{ fn schema_name() -> String {{ "{}".to_owned() }} @@ -237,8 +236,7 @@ impl schemars::JsonSchema for {} {{ pub fn serde_impl(f: &mut std::fmt::Formatter<'_>, section: &Section) -> std::fmt::Result { writeln!( f, - r#"#[cfg(feature = "serde")] -impl<'de> serde::Deserialize<'de> for {} {{ + r"impl<'de> serde::Deserialize<'de> for {} {{ fn deserialize(deserializer: D) -> Result where D: serde::de::Deserializer<'de>, @@ -248,7 +246,6 @@ impl<'de> serde::Deserialize<'de> for {} {{ }} }} -#[cfg(feature = "serde")] impl serde::Serialize for {} {{ fn serialize(&self, serializer: S) -> Result where @@ -256,7 +253,7 @@ impl serde::Serialize for {} {{ {{ serializer.serialize_str(&self.to_string()) }} -}}"#, +}}", section.key, section.key, ) } diff --git a/crates/iana-codegen/src/jose.rs b/crates/iana-codegen/src/jose.rs index 8015cad41..9f94cdf81 100644 --- a/crates/iana-codegen/src/jose.rs +++ b/crates/iana-codegen/src/jose.rs @@ -31,6 +31,7 @@ enum Requirements { RecommendedMinus, Optional, Prohibited, + Deprecated, } #[allow(dead_code)] @@ -78,10 +79,18 @@ impl EnumEntry for WebEncryptionSignatureAlgorithm { if self.reference.contains("RFC7518, Section 3") || self.reference.contains("RFC8037") || self.reference.contains("RFC8812") + || (self + .reference + .contains("RFC-ietf-jose-fully-specified-algorithms") + && self.reference.contains("Section 2")) { Some("JsonWebSignatureAlg") } else if self.reference.contains("RFC7518, Section 4") || self.reference.contains("WebCryptoAPI") + || (self + .reference + .contains("RFC-ietf-jose-fully-specified-algorithms") + && self.reference.contains("Section 3")) { Some("JsonWebEncryptionAlg") } else { diff --git a/crates/iana-codegen/src/traits.rs b/crates/iana-codegen/src/traits.rs index 39fb01a5c..c080f901c 100644 --- a/crates/iana-codegen/src/traits.rs +++ b/crates/iana-codegen/src/traits.rs @@ -89,6 +89,13 @@ pub trait EnumEntry: DeserializeOwned + Send + Sync { .into_deserialize() .filter_map(|item: Result| { item.map(|item| { + if item + .description() + .is_some_and(|desc| desc.contains("TEMPORARY")) + { + return None; + } + item.key().map(|key| { ( key, diff --git a/crates/iana/Cargo.toml b/crates/iana/Cargo.toml index e5036ec1d..796abe4ba 100644 --- a/crates/iana/Cargo.toml +++ b/crates/iana/Cargo.toml @@ -13,10 +13,5 @@ publish.workspace = true workspace = true [dependencies] -serde = { workspace = true, optional = true } -schemars = { workspace = true, optional = true } - -[features] -default = ["serde", "schemars"] -serde = ["dep:serde"] -schemars = ["dep:schemars"] +serde.workspace = true +schemars.workspace = true diff --git a/crates/iana/src/jose.rs b/crates/iana/src/jose.rs index 494d3dcb9..8ffc395ca 100644 --- a/crates/iana/src/jose.rs +++ b/crates/iana/src/jose.rs @@ -62,6 +62,12 @@ pub enum JsonWebSignatureAlg { /// ECDSA using secp256k1 curve and SHA-256 Es256K, + /// EdDSA using Ed25519 curve + Ed25519, + + /// EdDSA using Ed448 curve + Ed448, + /// An unknown value. Unknown(String), } @@ -84,6 +90,8 @@ impl core::fmt::Display for JsonWebSignatureAlg { Self::None => write!(f, "none"), Self::EdDsa => write!(f, "EdDSA"), Self::Es256K => write!(f, "ES256K"), + Self::Ed25519 => write!(f, "Ed25519"), + Self::Ed448 => write!(f, "Ed448"), Self::Unknown(value) => write!(f, "{value}"), } } @@ -109,12 +117,13 @@ impl core::str::FromStr for JsonWebSignatureAlg { "none" => Ok(Self::None), "EdDSA" => Ok(Self::EdDsa), "ES256K" => Ok(Self::Es256K), + "Ed25519" => Ok(Self::Ed25519), + "Ed448" => Ok(Self::Ed448), value => Ok(Self::Unknown(value.to_owned())), } } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebSignatureAlg { fn deserialize(deserializer: D) -> Result where @@ -125,7 +134,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebSignatureAlg { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebSignatureAlg { fn serialize(&self, serializer: S) -> Result where @@ -135,7 +143,6 @@ impl serde::Serialize for JsonWebSignatureAlg { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebSignatureAlg { fn schema_name() -> String { "JsonWebSignatureAlg".to_owned() @@ -339,6 +346,32 @@ impl schemars::JsonSchema for JsonWebSignatureAlg { ..Default::default() } .into(), + // --- + schemars::schema::SchemaObject { + metadata: Some(Box::new(schemars::schema::Metadata { + description: Some( + // --- + r"EdDSA using Ed25519 curve".to_owned(), + ), + ..Default::default() + })), + const_value: Some("Ed25519".into()), + ..Default::default() + } + .into(), + // --- + schemars::schema::SchemaObject { + metadata: Some(Box::new(schemars::schema::Metadata { + description: Some( + // --- + r"EdDSA using Ed448 curve".to_owned(), + ), + ..Default::default() + })), + const_value: Some("Ed448".into()), + ..Default::default() + } + .into(), ]; let description = r#"JSON Web Signature "alg" parameter"#; @@ -480,7 +513,6 @@ impl core::str::FromStr for JsonWebEncryptionAlg { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebEncryptionAlg { fn deserialize(deserializer: D) -> Result where @@ -491,7 +523,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebEncryptionAlg { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebEncryptionAlg { fn serialize(&self, serializer: S) -> Result where @@ -501,7 +532,6 @@ impl serde::Serialize for JsonWebEncryptionAlg { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebEncryptionAlg { fn schema_name() -> String { "JsonWebEncryptionAlg".to_owned() @@ -833,7 +863,6 @@ impl core::str::FromStr for JsonWebEncryptionEnc { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebEncryptionEnc { fn deserialize(deserializer: D) -> Result where @@ -844,7 +873,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebEncryptionEnc { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebEncryptionEnc { fn serialize(&self, serializer: S) -> Result where @@ -854,7 +882,6 @@ impl serde::Serialize for JsonWebEncryptionEnc { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebEncryptionEnc { fn schema_name() -> String { "JsonWebEncryptionEnc".to_owned() @@ -992,7 +1019,6 @@ impl core::str::FromStr for JsonWebEncryptionCompressionAlgorithm { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebEncryptionCompressionAlgorithm { fn deserialize(deserializer: D) -> Result where @@ -1003,7 +1029,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebEncryptionCompressionAlgorithm { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebEncryptionCompressionAlgorithm { fn serialize(&self, serializer: S) -> Result where @@ -1013,7 +1038,6 @@ impl serde::Serialize for JsonWebEncryptionCompressionAlgorithm { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebEncryptionCompressionAlgorithm { fn schema_name() -> String { "JsonWebEncryptionCompressionAlgorithm".to_owned() @@ -1101,7 +1125,6 @@ impl core::str::FromStr for JsonWebKeyType { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebKeyType { fn deserialize(deserializer: D) -> Result where @@ -1112,7 +1135,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebKeyType { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebKeyType { fn serialize(&self, serializer: S) -> Result where @@ -1122,7 +1144,6 @@ impl serde::Serialize for JsonWebKeyType { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebKeyType { fn schema_name() -> String { "JsonWebKeyType".to_owned() @@ -1249,7 +1270,6 @@ impl core::str::FromStr for JsonWebKeyEcEllipticCurve { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebKeyEcEllipticCurve { fn deserialize(deserializer: D) -> Result where @@ -1260,7 +1280,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebKeyEcEllipticCurve { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebKeyEcEllipticCurve { fn serialize(&self, serializer: S) -> Result where @@ -1270,7 +1289,6 @@ impl serde::Serialize for JsonWebKeyEcEllipticCurve { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebKeyEcEllipticCurve { fn schema_name() -> String { "JsonWebKeyEcEllipticCurve".to_owned() @@ -1397,7 +1415,6 @@ impl core::str::FromStr for JsonWebKeyOkpEllipticCurve { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebKeyOkpEllipticCurve { fn deserialize(deserializer: D) -> Result where @@ -1408,7 +1425,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebKeyOkpEllipticCurve { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebKeyOkpEllipticCurve { fn serialize(&self, serializer: S) -> Result where @@ -1418,7 +1434,6 @@ impl serde::Serialize for JsonWebKeyOkpEllipticCurve { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebKeyOkpEllipticCurve { fn schema_name() -> String { "JsonWebKeyOkpEllipticCurve".to_owned() @@ -1535,7 +1550,6 @@ impl core::str::FromStr for JsonWebKeyUse { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebKeyUse { fn deserialize(deserializer: D) -> Result where @@ -1546,7 +1560,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebKeyUse { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebKeyUse { fn serialize(&self, serializer: S) -> Result where @@ -1556,7 +1569,6 @@ impl serde::Serialize for JsonWebKeyUse { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebKeyUse { fn schema_name() -> String { "JsonWebKeyUse".to_owned() @@ -1677,7 +1689,6 @@ impl core::str::FromStr for JsonWebKeyOperation { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for JsonWebKeyOperation { fn deserialize(deserializer: D) -> Result where @@ -1688,7 +1699,6 @@ impl<'de> serde::Deserialize<'de> for JsonWebKeyOperation { } } -#[cfg(feature = "serde")] impl serde::Serialize for JsonWebKeyOperation { fn serialize(&self, serializer: S) -> Result where @@ -1698,7 +1708,6 @@ impl serde::Serialize for JsonWebKeyOperation { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for JsonWebKeyOperation { fn schema_name() -> String { "JsonWebKeyOperation".to_owned() diff --git a/crates/iana/src/oauth.rs b/crates/iana/src/oauth.rs index 60a8d7ed0..530e4bd7b 100644 --- a/crates/iana/src/oauth.rs +++ b/crates/iana/src/oauth.rs @@ -59,7 +59,6 @@ impl core::str::FromStr for OAuthAccessTokenType { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for OAuthAccessTokenType { fn deserialize(deserializer: D) -> Result where @@ -70,7 +69,6 @@ impl<'de> serde::Deserialize<'de> for OAuthAccessTokenType { } } -#[cfg(feature = "serde")] impl serde::Serialize for OAuthAccessTokenType { fn serialize(&self, serializer: S) -> Result where @@ -80,7 +78,6 @@ impl serde::Serialize for OAuthAccessTokenType { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for OAuthAccessTokenType { fn schema_name() -> String { "OAuthAccessTokenType".to_owned() @@ -194,7 +191,6 @@ impl core::str::FromStr for OAuthAuthorizationEndpointResponseType { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for OAuthAuthorizationEndpointResponseType { fn deserialize(deserializer: D) -> Result where @@ -205,7 +201,6 @@ impl<'de> serde::Deserialize<'de> for OAuthAuthorizationEndpointResponseType { } } -#[cfg(feature = "serde")] impl serde::Serialize for OAuthAuthorizationEndpointResponseType { fn serialize(&self, serializer: S) -> Result where @@ -215,7 +210,6 @@ impl serde::Serialize for OAuthAuthorizationEndpointResponseType { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for OAuthAuthorizationEndpointResponseType { fn schema_name() -> String { "OAuthAuthorizationEndpointResponseType".to_owned() @@ -333,7 +327,6 @@ impl core::str::FromStr for OAuthTokenTypeHint { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for OAuthTokenTypeHint { fn deserialize(deserializer: D) -> Result where @@ -344,7 +337,6 @@ impl<'de> serde::Deserialize<'de> for OAuthTokenTypeHint { } } -#[cfg(feature = "serde")] impl serde::Serialize for OAuthTokenTypeHint { fn serialize(&self, serializer: S) -> Result where @@ -354,7 +346,6 @@ impl serde::Serialize for OAuthTokenTypeHint { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for OAuthTokenTypeHint { fn schema_name() -> String { "OAuthTokenTypeHint".to_owned() @@ -462,7 +453,6 @@ impl core::str::FromStr for OAuthClientAuthenticationMethod { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for OAuthClientAuthenticationMethod { fn deserialize(deserializer: D) -> Result where @@ -473,7 +463,6 @@ impl<'de> serde::Deserialize<'de> for OAuthClientAuthenticationMethod { } } -#[cfg(feature = "serde")] impl serde::Serialize for OAuthClientAuthenticationMethod { fn serialize(&self, serializer: S) -> Result where @@ -483,7 +472,6 @@ impl serde::Serialize for OAuthClientAuthenticationMethod { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for OAuthClientAuthenticationMethod { fn schema_name() -> String { "OAuthClientAuthenticationMethod".to_owned() @@ -590,7 +578,6 @@ impl core::str::FromStr for PkceCodeChallengeMethod { } } -#[cfg(feature = "serde")] impl<'de> serde::Deserialize<'de> for PkceCodeChallengeMethod { fn deserialize(deserializer: D) -> Result where @@ -601,7 +588,6 @@ impl<'de> serde::Deserialize<'de> for PkceCodeChallengeMethod { } } -#[cfg(feature = "serde")] impl serde::Serialize for PkceCodeChallengeMethod { fn serialize(&self, serializer: S) -> Result where @@ -611,7 +597,6 @@ impl serde::Serialize for PkceCodeChallengeMethod { } } -#[cfg(feature = "schemars")] impl schemars::JsonSchema for PkceCodeChallengeMethod { fn schema_name() -> String { "PkceCodeChallengeMethod".to_owned() diff --git a/crates/jose/src/jwa/asymmetric.rs b/crates/jose/src/jwa/asymmetric.rs index 15bd1e805..21472deb6 100644 --- a/crates/jose/src/jwa/asymmetric.rs +++ b/crates/jose/src/jwa/asymmetric.rs @@ -167,7 +167,7 @@ impl AsymmetricSigningKey { Ok(Self::es256k(params.try_into()?)) } - (JsonWebKeyPrivateParameters::Okp(_params), JsonWebSignatureAlg::EdDsa) => { + (JsonWebKeyPrivateParameters::Okp(_params), _) => { Err(AsymmetricKeyFromJwkError::UnsupportedAlgorithm { alg: alg.clone() }) } @@ -401,7 +401,7 @@ impl AsymmetricVerifyingKey { Ok(Self::es256k(params.try_into()?)) } - (JsonWebKeyPublicParameters::Okp(_params), JsonWebSignatureAlg::EdDsa) => { + (JsonWebKeyPublicParameters::Okp(_params), _) => { Err(AsymmetricKeyFromJwkError::UnsupportedAlgorithm { alg: alg.clone() }) } diff --git a/docs/config.schema.json b/docs/config.schema.json index 0f7f371d0..534165920 100644 --- a/docs/config.schema.json +++ b/docs/config.schema.json @@ -543,6 +543,14 @@ { "description": "ECDSA using secp256k1 curve and SHA-256", "const": "ES256K" + }, + { + "description": "EdDSA using Ed25519 curve", + "const": "Ed25519" + }, + { + "description": "EdDSA using Ed448 curve", + "const": "Ed448" } ] }, From 697333d5cb423b82850b583a3bd73ab89c0b044a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:27:38 +0000 Subject: [PATCH 04/31] build(deps): bump quanta from 0.12.5 to 0.12.6 Bumps [quanta](https://github.com/metrics-rs/quanta) from 0.12.5 to 0.12.6. - [Changelog](https://github.com/metrics-rs/quanta/blob/main/CHANGELOG.md) - [Commits](https://github.com/metrics-rs/quanta/compare/v0.12.5...v0.12.6) --- updated-dependencies: - dependency-name: quanta dependency-version: 0.12.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63c124b25..53c1d573b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4785,9 +4785,9 @@ dependencies = [ [[package]] name = "quanta" -version = "0.12.5" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" dependencies = [ "crossbeam-utils", "libc", diff --git a/Cargo.toml b/Cargo.toml index 6b561a02c..f12492591 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -269,7 +269,7 @@ features = ["std", "pkcs5", "encryption"] # High-precision clock [workspace.dependencies.quanta] -version = "0.12.5" +version = "0.12.6" # Random values [workspace.dependencies.rand] From 47b0f545a4741be9e3aedcf169525168bf91b113 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:28:52 +0000 Subject: [PATCH 05/31] build(deps): bump clap from 4.5.39 to 4.5.40 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.39 to 4.5.40. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.39...clap_complete-v4.5.40) --- updated-dependencies: - dependency-name: clap dependency-version: 4.5.40 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 ++++++------ Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 63c124b25..df0661169 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -998,9 +998,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.39" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", "clap_derive", @@ -1008,9 +1008,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.39" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstream", "anstyle", @@ -1020,9 +1020,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" dependencies = [ "heck 0.5.0", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 6b561a02c..03eeda9c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -124,7 +124,7 @@ features = ["serde", "clock"] # CLI argument parsing [workspace.dependencies.clap] -version = "4.5.39" +version = "4.5.40" features = ["derive"] # Cron expressions From dfba424283eca67d56649c8104718b558eeafe2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:58:51 +0000 Subject: [PATCH 06/31] build(deps-dev): bump @vitejs/plugin-react Bumps the vite group in /frontend with 1 update: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react). Updates `@vitejs/plugin-react` from 4.5.1 to 4.5.2 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@4.5.2/packages/plugin-react) --- updated-dependencies: - dependency-name: "@vitejs/plugin-react" dependency-version: 4.5.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: vite ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 120 ++++++++++++++++++------------------- frontend/package.json | 2 +- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c421bffad..5e6efe86f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -49,7 +49,7 @@ "@types/react": "19.1.6", "@types/react-dom": "19.1.6", "@types/swagger-ui-dist": "^3.30.5", - "@vitejs/plugin-react": "^4.5.1", + "@vitejs/plugin-react": "^4.5.2", "@vitest/coverage-v8": "^3.2.3", "autoprefixer": "^10.4.21", "browserslist-to-esbuild": "^2.1.1", @@ -211,22 +211,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -252,14 +252,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -369,15 +369,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -472,27 +472,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -919,13 +919,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -935,13 +935,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1024,17 +1024,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1043,9 +1043,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4633,9 +4633,9 @@ "license": "MIT" }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.9", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", - "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==", + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", + "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", "dev": true, "license": "MIT" }, @@ -5781,16 +5781,16 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz", - "integrity": "sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.2.tgz", + "integrity": "sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@rolldown/pluginutils": "1.0.0-beta.9", + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.11", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, @@ -5798,7 +5798,7 @@ "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "node_modules/@vitest/coverage-v8": { diff --git a/frontend/package.json b/frontend/package.json index 068803780..e7e165c12 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -59,7 +59,7 @@ "@types/react": "19.1.6", "@types/react-dom": "19.1.6", "@types/swagger-ui-dist": "^3.30.5", - "@vitejs/plugin-react": "^4.5.1", + "@vitejs/plugin-react": "^4.5.2", "@vitest/coverage-v8": "^3.2.3", "autoprefixer": "^10.4.21", "browserslist-to-esbuild": "^2.1.1", From 9e97828bdea6efbc19bee5ce2bca7f96b0cafc67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:59:26 +0000 Subject: [PATCH 07/31] build(deps-dev): bump the types group in /frontend with 2 updates Bumps the types group in /frontend with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react). Updates `@types/node` from 22.15.30 to 24.0.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `@types/react` from 19.1.6 to 19.1.7 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 24.0.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: types - dependency-name: "@types/react" dependency-version: 19.1.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: types ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 24 ++++++++++++------------ frontend/package.json | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c421bffad..1f5c2e829 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,8 +45,8 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^22.15.30", - "@types/react": "19.1.6", + "@types/node": "^24.0.0", + "@types/react": "19.1.7", "@types/react-dom": "19.1.6", "@types/swagger-ui-dist": "^3.30.5", "@vitejs/plugin-react": "^4.5.1", @@ -5659,19 +5659,19 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", - "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.0.tgz", + "integrity": "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/react": { - "version": "19.1.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz", - "integrity": "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.7.tgz", + "integrity": "sha512-BnsPLV43ddr05N71gaGzyZ5hzkCmGwhMvYc8zmvI8Ci1bRkkDSzDDVfAXfN2tk748OwI7ediiPX6PfT9p0QGVg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12888,9 +12888,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "dev": true, "license": "MIT" }, diff --git a/frontend/package.json b/frontend/package.json index 068803780..fbb1d459b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -55,8 +55,8 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^22.15.30", - "@types/react": "19.1.6", + "@types/node": "^24.0.0", + "@types/react": "19.1.7", "@types/react-dom": "19.1.6", "@types/swagger-ui-dist": "^3.30.5", "@vitejs/plugin-react": "^4.5.1", From e5ea9ebb9f707b2dc061715ff7d91b58f268b2f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:59:40 +0000 Subject: [PATCH 08/31] build(deps-dev): bump msw-storybook-addon in /frontend Bumps [msw-storybook-addon](https://github.com/mswjs/msw-storybook-addon/tree/HEAD/packages/msw-addon) from 2.0.4 to 2.0.5. - [Release notes](https://github.com/mswjs/msw-storybook-addon/releases) - [Changelog](https://github.com/mswjs/msw-storybook-addon/blob/main/packages/msw-addon/CHANGELOG.md) - [Commits](https://github.com/mswjs/msw-storybook-addon/commits/v2.0.5/packages/msw-addon) --- updated-dependencies: - dependency-name: msw-storybook-addon dependency-version: 2.0.5 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c421bffad..f3c92034f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -58,7 +58,7 @@ "i18next-parser": "^9.3.0", "knip": "^5.59.1", "msw": "^2.8.7", - "msw-storybook-addon": "^2.0.4", + "msw-storybook-addon": "^2.0.5", "postcss": "^8.5.4", "postcss-import": "^16.1.0", "postcss-nesting": "^13.0.1", @@ -9953,9 +9953,9 @@ } }, "node_modules/msw-storybook-addon": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/msw-storybook-addon/-/msw-storybook-addon-2.0.4.tgz", - "integrity": "sha512-rstO8+r01sRMg6PPP7OxM8LG5/6r4+wmp2uapHeHvm9TQQRHvpPXOU/Y9/Somysz8Oi4Ea1aummXH3JlnP2LIA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/msw-storybook-addon/-/msw-storybook-addon-2.0.5.tgz", + "integrity": "sha512-uum2gtprDBoUb8GV/rPMwPytHmB8+AUr25BQUY0MpjYey5/ujaew2Edt+4oHiXpLTd0ThyMqmEvGy/sRpDV4lg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 068803780..9b27f8ef9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -68,7 +68,7 @@ "i18next-parser": "^9.3.0", "knip": "^5.59.1", "msw": "^2.8.7", - "msw-storybook-addon": "^2.0.4", + "msw-storybook-addon": "^2.0.5", "postcss": "^8.5.4", "postcss-import": "^16.1.0", "postcss-nesting": "^13.0.1", From 4001198408d1b69d35ecd20f30a6e3f743babdc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:59:49 +0000 Subject: [PATCH 09/31] build(deps): bump valibot from 1.0.0 to 1.1.0 in /frontend Bumps [valibot](https://github.com/fabian-hiller/valibot) from 1.0.0 to 1.1.0. - [Release notes](https://github.com/fabian-hiller/valibot/releases) - [Commits](https://github.com/fabian-hiller/valibot/compare/v1.0.0...v1.1.0) --- updated-dependencies: - dependency-name: valibot dependency-version: 1.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c421bffad..44f2b4bf5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -25,7 +25,7 @@ "react-dom": "^19.1.0", "react-i18next": "^15.5.2", "swagger-ui-dist": "^5.22.0", - "valibot": "^1.0.0", + "valibot": "^1.1.0", "vaul": "^1.1.2" }, "devDependencies": { @@ -13090,9 +13090,9 @@ "license": "MIT" }, "node_modules/valibot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.0.0.tgz", - "integrity": "sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.1.0.tgz", + "integrity": "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==", "license": "MIT", "peerDependencies": { "typescript": ">=5" diff --git a/frontend/package.json b/frontend/package.json index 068803780..19808afbe 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,7 +35,7 @@ "react-dom": "^19.1.0", "react-i18next": "^15.5.2", "swagger-ui-dist": "^5.22.0", - "valibot": "^1.0.0", + "valibot": "^1.1.0", "vaul": "^1.1.2" }, "devDependencies": { From ec228bafee13e9311689bc7e5a59262724b05cfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 08:48:12 +0000 Subject: [PATCH 10/31] build(deps): bump softprops/action-gh-release from 2.2.2 to 2.3.2 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.2.2 to 2.3.2. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2.2.2...v2.3.2) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 2.3.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 7c97fa144..7ac2669e5 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -322,7 +322,7 @@ jobs: merge-multiple: true - name: Prepare a release - uses: softprops/action-gh-release@v2.2.2 + uses: softprops/action-gh-release@v2.3.2 with: generate_release_notes: true body: | @@ -391,7 +391,7 @@ jobs: await script({ core, github, context }); - name: Update unstable release - uses: softprops/action-gh-release@v2.2.2 + uses: softprops/action-gh-release@v2.3.2 with: name: "Unstable build" tag_name: unstable From 9da17b1253690f0bb496fddfa9c780e62b724d9b Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 11 Jun 2025 12:33:04 +0200 Subject: [PATCH 11/31] Allow bumping major versions in the release workflow --- .github/workflows/release-branch.yaml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-branch.yaml b/.github/workflows/release-branch.yaml index fac7624c8..8575d5975 100644 --- a/.github/workflows/release-branch.yaml +++ b/.github/workflows/release-branch.yaml @@ -1,10 +1,19 @@ name: Create a new release branch on: workflow_dispatch: + inputs: + kind: + description: Kind of release (major = v1.2.3 -> v2.0.0-rc.0, minor = v1.2.3 -> v1.3.0-rc.0) + required: true + type: choice + default: minor + options: + - major + - minor jobs: compute-version: - name: Compute the next minor RC version + name: Compute the next ${{ inputs.kind }} RC version runs-on: ubuntu-24.04 permissions: @@ -27,9 +36,11 @@ jobs: - name: Compute the new minor RC id: next + env: + BUMP: pre${{ inputs.kind }} run: | CURRENT_VERSION="$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == "mas-cli") | .version')" - NEXT_VERSION="$(npx --yes semver@7.5.4 -i preminor --preid rc "${CURRENT_VERSION}")" + NEXT_VERSION="$(npx --yes semver@7.5.4 -i "$BUMP" --preid rc "${CURRENT_VERSION}")" # compute the short minor version, e.g. 0.1.0-rc.1 -> 0.1 SHORT_VERSION="$(echo "${NEXT_VERSION}" | cut -d. -f1-2)" echo "full=${NEXT_VERSION}" >> "$GITHUB_OUTPUT" From 026415806171f7de5f85b0b61e836e87c3b3fd5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:15:33 +0000 Subject: [PATCH 12/31] build(deps): bump reqwest from 0.12.19 to 0.12.20 Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.12.19 to 0.12.20. - [Release notes](https://github.com/seanmonstar/reqwest/releases) - [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md) - [Commits](https://github.com/seanmonstar/reqwest/compare/v0.12.19...v0.12.20) --- updated-dependencies: - dependency-name: reqwest dependency-version: 0.12.20 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 19 ++----------------- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0491df366..08970a8c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5031,9 +5031,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.19" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" dependencies = [ "base64", "bytes", @@ -5048,11 +5048,9 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "ipnet", "js-sys", "log", "mime", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", @@ -5064,7 +5062,6 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-rustls", - "tokio-socks", "tower", "tower-http", "tower-service", @@ -6427,18 +6424,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-socks" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" -dependencies = [ - "either", - "futures-util", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "tokio-stream" version = "0.1.17" diff --git a/Cargo.toml b/Cargo.toml index b0571c2a2..17eb81185 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -281,7 +281,7 @@ version = "0.6.4" # High-level HTTP client [workspace.dependencies.reqwest] -version = "0.12.19" +version = "0.12.20" default-features = false features = ["http2", "rustls-tls-manual-roots", "charset", "json", "socks"] From c64086f213558d91196297c039f484d54f4d3438 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 11 Jun 2025 15:15:14 +0200 Subject: [PATCH 13/31] Release documentation --- docs/SUMMARY.md | 1 + docs/development/releasing.md | 123 ++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 docs/development/releasing.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 0b623e7b2..1857fa42b 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -40,6 +40,7 @@ # Development - [Contributing](./development/contributing.md) +- [Releasing](./development/releasing.md) - [Architecture](./development/architecture.md) - [Database](./development/database.md) - [Internal GraphQL API](./development/graphql.md) diff --git a/docs/development/releasing.md b/docs/development/releasing.md new file mode 100644 index 000000000..24863b79b --- /dev/null +++ b/docs/development/releasing.md @@ -0,0 +1,123 @@ +# Releasing + +MAS follows the same release cadence as Synapse, meaning usually one full release cycle every two weeks, with one week of release candidates. + +## GitHub Action workflows + +There are four main GitHub Action workflows involved in releasing MAS: + +### [`translations-download` workflow] + +This workflow downloads the latest translations from [Localazy] onto the target branch. +It is intended to be run before the start of each release cycle on the main branch and before each release on the release branch. + +Before running it, make sure to review pending translations in [Localazy], enabling new languages that pass the 70% threshold. + +### [`release-branch` workflow] + +This workflow starts a new major/minor release branch and bumps the version to the next major/minor pre-version. +It will tag the version, triggering the `build` workflow for it. + +The next major/minor pre-version is computed from the current version on the main branch, so it works as follows: + + - `v1.2.3` will become `v2.0.0-rc.0` for a major release + - `v1.2.3` will become `v1.3.0-rc.0` for a minor release + +The release branch will be called `release/vX.Y`, and a PR will be automatically opened to merge it into the main branch. + + +### [`release-bump` workflow] + +This workflow bumps the version on a release branch to either the next stable version or the next release candidate version. +This *cannot* be run on the main branch (and will fail if you try). + +This workflow has three meaningful inputs: + + - The release branch to bump + - Whether the release is a pre-release or not: + - If it is a pre-release, `v1.2.3-rc.0` will become `v1.2.3-rc.1`, and `v1.2.3` will become `v1.2.4-rc.0`. + - If it is not a pre-release, `v1.2.3-rc.0` will become `v1.2.3`, and `v1.2.3` will become `v1.2.4`. + - Whether the release branch should be merged back into the main branch or not. In most cases, this should be enabled unless doing a release on a previous release branch. + +### [`build` workflow] + +This workflow is automatically run in three conditions: + + - When a `v*` tag is pushed + - On the `main` branch + - When a PR is tagged with the `Z-Build-Workflow` label (**note that this doesn't work on PRs from forks**) + +In all cases, it will build and push a container image to ghcr.io and build binaries to GitHub Action assets. + +For `v*` tags: + + - It will push the container image with the `MAJOR`, `MAJOR.MINOR`, `MAJOR.MINOR.PATCH`, `sha-HASH`, and `latest` tags for stable releases. + - It will push the container image with the `MAJOR.MINOR.PATCH-rc.N` and `sha-HASH` tags for pre-releases. + - It will **draft** a release on GitHub, with generated changelogs, reference to the built container image, and pre-built binaries attached to the release. + +On the main branch: + + - It will push the container image with the `sha-HASH` and `main` tags. + - It will update the [`unstable`](https://github.com/element-hq/matrix-authentication-service/releases/tag/unstable) GitHub release with the built container image and pre-built binaries. + +When a PR is tagged with the `Z-Build-Workflow` label: + + - It will push the container image with the `sha-HASH` and `pr-NUMBER` tags. + - It will comment on the PR with the built container image. + - Pre-built binaries are available in the workflow artifacts. + + +## Changelog generation + +Changelogs are automatically generated from PR titles and labels with the GitHub tools. + +The configuration for those can be found in the `.github/release.yml`, but the main labels to be aware of are: + + - `T-Defect`: Bug fixes + - `T-Enhancement`: New features + - `A-Admin-API`: Changes to the admin API + - `A-Documentation`: Documentation + - `A-I18n`: Translations + - `T-Task`: Internal changes + - `A-Dependencies`: Dependency updates + +They are calculated based on the previous release. For release candidates, this includes the previous release candidate. + +## Undrafting releases + +Releases are manually undrafted when the release is ready to be published. +At this point, the releaser should check the changelog and ensure the "Set as pre-release" and "Set as latest release" checkboxes are checked as appropriate. + +## Full release process + + - Start a new release cycle: + 1. Run the [`translations-download` workflow] on the main branch. + 1. Wait for the [translation download PR] to be automatically merged. + 1. Run the [`release-branch` workflow] on the main branch. + 1. Wait for [CI to churn] and the [draft release to appear]. This takes about 30 minutes. + 1. Double-check the changelog on the draft release. + 1. Check the "Set as pre-release" checkbox, and publish the release. + 1. Delete the N-2 release branch on [Localazy], meaning that once the 0.16 release cycle begins, the 0.14 release branch will be deleted. + - Create new release candidates if needed: + 1. Run the `translations-download` workflow on the release branch. + 1. Wait for the [translation download PR] to be automatically merged. + 1. Run the [`release-bump` workflow] on the release branch, with the `rc` input **checked**. + 1. Wait for [CI to churn] and the [draft release to appear]. This takes about 30 minutes. + 1. Double-check the changelog on the draft release. + 1. Check the "Set as pre-release" checkbox and publish the release. + - Create a new stable release: + 1. Run the [`translations-download` workflow] on the release branch + 1. Wait for the [translation download PR] to be automatically merged + 1. Run the [`release-bump` workflow] on the release branch, with the `rc` input **unchecked**. + 1. Wait for [CI to churn] and the [draft release to appear]. This takes about 30 minutes. + 1. Double-check the changelog on the draft release. + 1. Check the "Set as latest release" checkbox and publish the release. + +[Localazy]: https://localazy.com/p/matrix-authentication-service +[`translations-download` workflow]: https://github.com/element-hq/matrix-authentication-service/actions/workflows/translations-download.yaml +[`release-branch` workflow]: https://github.com/element-hq/matrix-authentication-service/actions/workflows/release-branch.yaml +[`release-bump` workflow]: https://github.com/element-hq/matrix-authentication-service/actions/workflows/release-bump.yaml +[`build` workflow]: https://github.com/element-hq/matrix-authentication-service/actions/workflows/build +[translation download PR]: https://github.com/element-hq/matrix-authentication-service/pulls?q=is%3Apr+label%3AA-I18n +[CI to churn]: https://github.com/element-hq/matrix-authentication-service/actions/workflows/build.yaml?query=event%3Apush+actor%3Amatrixbot +[draft release to appear]: https://github.com/element-hq/matrix-authentication-service/releases From 39afbd409b253e94735bbef27ce95b700e6c1143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:28:26 +0000 Subject: [PATCH 14/31] build(deps-dev): bump the storybook group in /frontend with 3 updates Bumps the storybook group in /frontend with 3 updates: [@storybook/addon-docs](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/docs), [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) and [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/core). Updates `@storybook/addon-docs` from 9.0.6 to 9.0.8 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v9.0.8/code/addons/docs) Updates `@storybook/react-vite` from 9.0.6 to 9.0.8 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v9.0.8/code/frameworks/react-vite) Updates `storybook` from 9.0.6 to 9.0.8 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v9.0.8/code/core) --- updated-dependencies: - dependency-name: "@storybook/addon-docs" dependency-version: 9.0.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/react-vite" dependency-version: 9.0.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: storybook dependency-version: 9.0.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 70 +++++++++++++++++++------------------- frontend/package.json | 4 +-- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c70b23a38..942886491 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -37,8 +37,8 @@ "@graphql-codegen/cli": "^5.0.7", "@graphql-codegen/client-preset": "^4.8.0", "@graphql-codegen/typescript-msw": "^3.0.1", - "@storybook/addon-docs": "^9.0.6", - "@storybook/react-vite": "^9.0.6", + "@storybook/addon-docs": "^9.0.8", + "@storybook/react-vite": "^9.0.8", "@tanstack/react-query-devtools": "^5.80.6", "@tanstack/react-router-devtools": "^1.120.20", "@tanstack/router-plugin": "^1.120.20", @@ -4950,16 +4950,16 @@ "license": "Apache-2.0" }, "node_modules/@storybook/addon-docs": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.0.6.tgz", - "integrity": "sha512-Q3I++3xk0+TUouuofi2vuOi8cJweBRat2saAO8ymmaWJX2mzR2MiSp4JP46LpkTtOA8+BU1dHVq5x+LEHJQHDA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.0.8.tgz", + "integrity": "sha512-YRR8qHitwXVTJyn02YMrzd9mCKcuZWSKWt+J/ddFb8khGfLcAW+O0NohGeqMyM6XStLVDKKIKsMoTHggUwIFsA==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "9.0.6", + "@storybook/csf-plugin": "9.0.8", "@storybook/icons": "^1.2.12", - "@storybook/react-dom-shim": "9.0.6", + "@storybook/react-dom-shim": "9.0.8", "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" @@ -4969,17 +4969,17 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.6" + "storybook": "^9.0.8" } }, "node_modules/@storybook/builder-vite": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.0.6.tgz", - "integrity": "sha512-Qt/1EvECU632LjQmGFQWTNHMPbP/YkWhgN+3TDfmSdigLoO4gmgWCx9cN0lZim9uUwBlw0AIzMQXnz9UYcjDTQ==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.0.8.tgz", + "integrity": "sha512-dbwDfBUwLW8I71h0Y9r+twtEdjKC+oBP1YweS26ET78qc6qXMFsK5Tfh6lzj/vQbmxY0YhnTVrrkXgfR0erLPA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "9.0.6", + "@storybook/csf-plugin": "9.0.8", "ts-dedent": "^2.0.0" }, "funding": { @@ -4987,14 +4987,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.6", + "storybook": "^9.0.8", "vite": "^5.0.0 || ^6.0.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.0.6.tgz", - "integrity": "sha512-LAfKXQ0ebT3PPPZ+TE54/01pQfOuZGm2MMEZr8S4Z0jXs9epoF2i6IduHZFbnYeJZeiENd5OM76gn17q0KY9WQ==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.0.8.tgz", + "integrity": "sha512-mNjo4t9liAbQvhE9ni87NU2sz9tqFU4Y54ioSFDlW24wpubsvnhBi5h4z3EkeQJSzIzNMRym9SC7Elbqa3Kf+g==", "dev": true, "license": "MIT", "dependencies": { @@ -5005,7 +5005,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.6" + "storybook": "^9.0.8" } }, "node_modules/@storybook/global": { @@ -5030,14 +5030,14 @@ } }, "node_modules/@storybook/react": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-9.0.6.tgz", - "integrity": "sha512-e1GcvtPSzLxpcZLNEQOA9gbBYk5wlkXmTz7w7XRa2nt1e+QjG1rkxFvJ/CxKVW8uqMbq1NjBaRP0BNfjSDIeGA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-9.0.8.tgz", + "integrity": "sha512-in3O+lDmxKRhdcX3Wg6FbLnb2/PuqRL+rUKMz1wr1ndSkw4J1jGsvP909oEEYnDbjHOX0xnNxxbEapO4F9fgBQ==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "9.0.6" + "@storybook/react-dom-shim": "9.0.8" }, "engines": { "node": ">=20.0.0" @@ -5049,7 +5049,7 @@ "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.0.6", + "storybook": "^9.0.8", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -5059,9 +5059,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.0.6.tgz", - "integrity": "sha512-YreUzZatirM+utmc5QO88ADNRLfX11rKvMNWNX2MYuAvQF7TB+gztfk4qzfX4mcgub+XuIpfwr3LfXznwlFw6A==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.0.8.tgz", + "integrity": "sha512-SYyjRagHZx724hGEWSZcXRzj82am77OpqeA9ps6ZsCSn4cVY9FORGEeY2bnlQkpLnDUH5yjdV/oh+0fXDbl/8g==", "dev": true, "license": "MIT", "funding": { @@ -5071,20 +5071,20 @@ "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.0.6" + "storybook": "^9.0.8" } }, "node_modules/@storybook/react-vite": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-9.0.6.tgz", - "integrity": "sha512-rfLFLVAcTIsxjCuUXh34YhMxKU+QzwJZqEFi+Mixa0lqoUlSBwNclKjigDwJ4Q+9uZ8E31QfIk7NINB2kjdgHA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-9.0.8.tgz", + "integrity": "sha512-nAtT9UeOkKCBJ2kbatC7Hf/TX3Kl+e21wvc1D5xpS86ulPamzjzxLD5nW+vliBKePOo+9ZW/KQZYCLg3snRJtQ==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.6.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "9.0.6", - "@storybook/react": "9.0.6", + "@storybook/builder-vite": "9.0.8", + "@storybook/react": "9.0.8", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^8.0.0", @@ -5101,7 +5101,7 @@ "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.0.6", + "storybook": "^9.0.8", "vite": "^5.0.0 || ^6.0.0" } }, @@ -11943,9 +11943,9 @@ "license": "MIT" }, "node_modules/storybook": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.0.6.tgz", - "integrity": "sha512-qfo2dnBtgUjKZIAQSUaikr7Zgl8dYEaBpnxUq4X0s1pwbZOuB2WndEvJvsKNSnDRbL8grZvPEc0793XD8y5uCA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.0.8.tgz", + "integrity": "sha512-GlOB3HAtzRYc237+o46nnETNkc2Qckh3UrIJ1rJyAzagIlPWau/jTxjSz76sqRODEnt01m8CyIkw3PGv0q1UpQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 3c0c06538..9876897a7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -47,8 +47,8 @@ "@graphql-codegen/cli": "^5.0.7", "@graphql-codegen/client-preset": "^4.8.0", "@graphql-codegen/typescript-msw": "^3.0.1", - "@storybook/addon-docs": "^9.0.6", - "@storybook/react-vite": "^9.0.6", + "@storybook/addon-docs": "^9.0.8", + "@storybook/react-vite": "^9.0.8", "@tanstack/react-query-devtools": "^5.80.6", "@tanstack/react-router-devtools": "^1.120.20", "@tanstack/router-plugin": "^1.120.20", From f4972601616f0af20a441f93de48e1c130ff3e84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:29:39 +0000 Subject: [PATCH 15/31] build(deps-dev): bump @codecov/vite-plugin in /frontend Bumps @codecov/vite-plugin from 1.9.0 to 1.9.1. --- updated-dependencies: - dependency-name: "@codecov/vite-plugin" dependency-version: 1.9.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 29 ++++++++++++++++------------- frontend/package.json | 2 +- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c70b23a38..bcdaee278 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -33,7 +33,7 @@ "@browser-logos/chrome": "^2.0.0", "@browser-logos/firefox": "^3.0.10", "@browser-logos/safari": "^2.1.0", - "@codecov/vite-plugin": "^1.9.0", + "@codecov/vite-plugin": "^1.9.1", "@graphql-codegen/cli": "^5.0.7", "@graphql-codegen/client-preset": "^4.8.0", "@graphql-codegen/typescript-msw": "^3.0.1", @@ -96,16 +96,19 @@ } }, "node_modules/@actions/github": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz", - "integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", + "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", "dev": true, "license": "MIT", "dependencies": { "@actions/http-client": "^2.2.0", "@octokit/core": "^5.0.1", - "@octokit/plugin-paginate-rest": "^9.0.0", - "@octokit/plugin-rest-endpoint-methods": "^10.0.0" + "@octokit/plugin-paginate-rest": "^9.2.2", + "@octokit/plugin-rest-endpoint-methods": "^10.4.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "undici": "^5.28.5" } }, "node_modules/@actions/http-client": { @@ -1280,9 +1283,9 @@ } }, "node_modules/@codecov/bundler-plugin-core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@codecov/bundler-plugin-core/-/bundler-plugin-core-1.9.0.tgz", - "integrity": "sha512-UB0I5haL0gnF4ei46wxNo7ptCHqFAh3PnmcLLeXRb2zV7HeobOF8WRjOW/PwrXAphPS/6bL7PDUmh3ruVObGtg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@codecov/bundler-plugin-core/-/bundler-plugin-core-1.9.1.tgz", + "integrity": "sha512-dt3ic7gMswz4p/qdkYPVJwXlLiLsz55rBBn2I7mr0HTG8pCoLRqnANJIwo5WrqGBZgPyVSMPBqBra6VxLWfDyA==", "dev": true, "license": "MIT", "dependencies": { @@ -1298,13 +1301,13 @@ } }, "node_modules/@codecov/vite-plugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@codecov/vite-plugin/-/vite-plugin-1.9.0.tgz", - "integrity": "sha512-5+CxUGN0Rxr5F6xYqrKwug3NXTlNVBEZcI9caOCjlpErt7p2lp7J/6Qo+GRjmaVkXErnNMiyhjzXRB6rLNAjfg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@codecov/vite-plugin/-/vite-plugin-1.9.1.tgz", + "integrity": "sha512-S6Yne7comVulJ1jD3T7rCfYFHPR0zUjAYoLjUDPXNJCUrdzWJdf/ak/UepE7TicqQG+yBa6eb5WusqcPgg+1AQ==", "dev": true, "license": "MIT", "dependencies": { - "@codecov/bundler-plugin-core": "^1.9.0", + "@codecov/bundler-plugin-core": "^1.9.1", "unplugin": "^1.10.1" }, "engines": { diff --git a/frontend/package.json b/frontend/package.json index 3c0c06538..cbb44c60f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -43,7 +43,7 @@ "@browser-logos/chrome": "^2.0.0", "@browser-logos/firefox": "^3.0.10", "@browser-logos/safari": "^2.1.0", - "@codecov/vite-plugin": "^1.9.0", + "@codecov/vite-plugin": "^1.9.1", "@graphql-codegen/cli": "^5.0.7", "@graphql-codegen/client-preset": "^4.8.0", "@graphql-codegen/typescript-msw": "^3.0.1", From c41ec28aa671277c4aa1ce6c6736908a03385bac Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 11 Jun 2025 15:57:12 +0200 Subject: [PATCH 16/31] Update the contributing guidelines --- CONTRIBUTING.md | 56 ------------- docs/development/contributing.md | 136 +++++++++++++++++-------------- frontend/package.json | 2 +- 3 files changed, 77 insertions(+), 117 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34370fae2..356a702c7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,60 +2,4 @@ Thank you for taking the time to contribute to Matrix! -This is the repository for MAS (Matrix Authentication Service), an OAuth 2.0 and OpenID Provider server for Matrix. - Please see the [contributors' guide](https://element-hq.github.io/matrix-authentication-service/development/contributing.html) in our rendered documentation. - -## Sign off - -We ask that everybody who contributes to this project signs off their contributions, as explained below. - -We follow a simple 'inbound=outbound' model for contributions: the act of submitting an 'inbound' contribution means that the contributor agrees to license their contribution under the same terms as the project's overall 'outbound' license - in our case, this is Apache Software License v2 (see [LICENSE](./LICENSE)). - -In order to have a concrete record that your contribution is intentional and you agree to license it under the same terms as the project's license, we've adopted the same lightweight approach used by the [Linux Kernel](https://www.kernel.org/doc/html/latest/process/submitting-patches.html), [Docker](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), and many other projects: the [Developer Certificate of Origin](https://developercertificate.org/) (DCO). This is a simple declaration that you wrote the contribution or otherwise have the right to contribute it to Matrix: - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -If you agree to this for your contribution, then all that's needed is to include the line in your commit or pull request comment: - -``` -Signed-off-by: Your Name -``` - -Git allows you to add this signoff automatically when using the `-s` flag to `git commit`, which uses the name and email set in your `user.name` and `user.email` git configs. diff --git a/docs/development/contributing.md b/docs/development/contributing.md index 39057cb36..da7548557 100644 --- a/docs/development/contributing.md +++ b/docs/development/contributing.md @@ -2,79 +2,48 @@ This document aims to get you started with contributing to the Matrix Authentication Service! -# 1. Who can contribute to MAS? +## 1. Who can contribute to MAS? -We ask that everybody who contributes to this project signs off their contributions, as explained below. +Everyone is welcome to contribute code to [Synapse](https://github.com/element-hq/matrix-authentication-service), provided that they are willing to license their contributions to Element under a [Contributor License Agreement](https://cla-assistant.io/element-hq/matrix-authentication-service) (CLA). This ensures that their contribution will be made available under an OSI-approved open-source license, currently Affero General Public License v3 (AGPLv3). -Everyone is welcome to contribute code to [matrix.org projects](https://github.com/matrix-org), provided that they are willing to license their contributions under the same license as the project itself. We follow a simple 'inbound=outbound' model for contributions: the act of submitting an 'inbound' contribution means that the contributor agrees to license the code under the same terms as the project's overall 'outbound' license - in our case, this is almost always Apache Software License v2 (see [LICENSE](https://github.com/matrix-org/matrix-authentication-service/blob/main/LICENSE)). +Please see the [Element blog post](https://element.io/blog/synapse-now-lives-at-github-com-element-hq-synapse/) for the full rationale. -In order to have a concrete record that your contribution is intentional and you agree to license it under the same terms as the project's license, we've adopted the same lightweight approach used by the [Linux Kernel](https://www.kernel.org/doc/html/latest/process/submitting-patches.html), [Docker](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), and many other projects: the [Developer Certificate of Origin](https://developercertificate.org/) (DCO). This is a simple declaration that you wrote the contribution or otherwise have the right to contribute it to Matrix: +## 2. What can I contribute? -``` -Developer Certificate of Origin -Version 1.1 +There are two main ways to contribute to MAS: -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA +- **Code and documentation**: You can contribute code to the Matrix Authentication Service and help improve its documentation by submitting pull requests to the [GitHub repository](https://github.com/element-hq/matrix-authentication-service). +- **Translations**: You can contribute translations to the Matrix Authentication Service through [Localazy](https://localazy.com/p/matrix-authentication-service). -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -If you agree to this for your contribution, then all that's needed is to include the line in your commit or pull request comment: - -``` -Signed-off-by: Your Name -``` - -Git allows you to add this signoff automatically when using the `-s` flag to `git commit`, which uses the name and email set in your `user.name` and `user.email` git configs. - -# 2. What do I need? +## 3. What do I need? To get MAS running locally from source you will need: -- [Install Rust and Cargo](https://www.rust-lang.org/learn/get-started) -- [Install Node.js and npm](https://nodejs.org/) -- [Install Open Policy Agent](https://www.openpolicyagent.org/docs/latest/#1-download-opa) +- [Install Rust and Cargo](https://www.rust-lang.org/learn/get-started). We recommend using the latest stable version of Rust. +- [Install Node.js and npm](https://nodejs.org/). We recommend using the latest LTS version of Node.js. +- [Install Open Policy Agent](https://www.openpolicyagent.org/docs#1-download-opa) -# 3. Get the source +## 4. Get the source -- Clone this repository +The preferred and easiest way to contribute changes is to fork the relevant project on GitHub and then [create a pull request]( https://help.github.com/articles/using-pull-requests/) to ask us to pull your changes into our repo. -# 4. Build and run MAS +Please base your changes on the `main` branch. + +```sh +git clone git@github.com:YOUR_GITHUB_USER_NAME/matrix-authentication-service.git +cd matrix-authentication-service +git checkout main +``` + +If you need help getting started with git, this is beyond the scope of the document, but you can find many good git tutorials on the web. + +## 5. Build and run MAS - Build the frontend ```sh cd frontend - npm ci - npm run build + npm ci # Install the frontend dependencies + npm run build # Build the frontend cd .. ``` - Build the Open Policy Agent policies @@ -91,10 +60,57 @@ To get MAS running locally from source you will need: docker run -p 5432:5432 -e 'POSTGRES_USER=postgres' -e 'POSTGRES_PASSWORD=postgres' -e 'POSTGRES_DATABASE=postgres' postgres ``` - Update the database URI in `config.yaml` to `postgresql://postgres:postgres@localhost/postgres` -- Run the database migrations via `cargo run -- database migrate` - Run the server via `cargo run -- server -c config.yaml` - Go to -# 5. Learn about MAS +## 6. Update generated files and format your code -You can learn about the [architecture](architecture.md) and [database](database.md) of MAS here. +The project includes a few files that are automatically generated. +Most of them can be updated by running `sh misc/update.sh` at the root of the project. + +Make sure your code adheres to our Rust and TypeScript code style by running: + + - `cargo +nightly fmt` (with the nightly toolchain installed) + - `npm run format` in the `frontend` directory + +When updating SQL queries in the `crates/storage-pg/` crate, you may need to update the `sqlx` introspection data. To do this, make sure to install `cargo-sqlx` (`cargo install sqlx-cli`) and: + + - Apply the latest migrations: `cargo sqlx migrate run` from the `crates/storage-pg/` directory. + - Update the `sqlx` introspection data: `cargo sqlx prepare` from the `crates/storage-pg/` directory. + +## 7. Test, test, test! + +While you're developing and before submitting a patch, you'll want to test your code and adhere to many code style and linting guidelines. + +### Run the linters + +- Run `cargo clippy --workspace` to lint the Rust code. +- Run `npm run lint` in the `frontend` directory to lint the frontend code. + +### Run the tests + +- Run the tests to the backend by running `cargo test --workspace`. This requires a connection to a PostgreSQL database, set via the `DATABASE_URL` environment variable. +- Run the tests to the frontend by running `npm run test` in the `frontend` directory. + +## 8. Submit a pull request + +Once you've made changes, you're ready to submit a pull request. + +When the pull request is opened, you will see a few things: + + 1. Our automated CI (Continuous Integration) pipeline will run (again) the linters, the unit tests, the integration tests, and more. + 1. One or more of the developers will take a look at your pull request and offer feedback. + +From this point, you should: + + 1. Look at the results of the CI pipeline. + - If there is any error, fix the error. + 1. If a developer has requested changes, make these changes and let us know when it is ready for a developer to review again. + - A pull request is a conversation; if you disagree with the suggestions, please respond and discuss it. + 1. Create a new commit with the changes. + - Please do *not* overwrite the history. New commits make the reviewer's life easier. + - Push these commits to your pull request. + 1. Back to 1. + 1. Once the pull request is ready for review again, please **re-request review** from whichever developer did your initial review (or leave a comment in the pull request that you believe all required changes have been made). + +Once both the CI and the developers are happy, the patch will be merged into Matrix Authentication Service and released shortly! diff --git a/frontend/package.json b/frontend/package.json index 068803780..4773014bb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "generate": "graphql-codegen", + "generate": "graphql-codegen && i18next", "lint": "graphql-codegen && biome check && tsc && i18next --fail-on-warnings --fail-on-update", "format": "biome format --write", "build": "rimraf ./dist/ && vite build", From e189f89d9e6e7f474f56ec93e1481d2b23ed98ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:08:06 +0000 Subject: [PATCH 17/31] build(deps): bump psl from 2.1.119 to 2.1.120 Bumps [psl](https://github.com/addr-rs/psl) from 2.1.119 to 2.1.120. - [Release notes](https://github.com/addr-rs/psl/releases) - [Commits](https://github.com/addr-rs/psl/compare/v2.1.119...v2.1.120) --- updated-dependencies: - dependency-name: psl dependency-version: 2.1.120 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7eb8701f..6dd7c2c7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4749,9 +4749,9 @@ dependencies = [ [[package]] name = "psl" -version = "2.1.119" +version = "2.1.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e49aa528239f2ca13ad87387977c208e59c3fb8c437609f95f1b3898ec6ef1" +checksum = "bc02eae5cf5475af3fde3792e68ff74eb8625638fcaa8f1ffb91b7b98bfae4a5" dependencies = [ "psl-types", ] diff --git a/Cargo.toml b/Cargo.toml index 17adca1df..68f867595 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -468,7 +468,7 @@ features = ["std", "pkcs5", "encryption"] # Public Suffix List [workspace.dependencies.psl] -version = "2.1.119" +version = "2.1.120" # Prometheus metrics [workspace.dependencies.prometheus] From 0d566010f8847b0a2fddbd257e168a1c4f9f0278 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 11 Jun 2025 16:14:23 +0200 Subject: [PATCH 18/31] Update the README --- README.md | 41 ++++++++++++++++++----------------------- overview.png | Bin 480968 -> 0 bytes 2 files changed, 18 insertions(+), 23 deletions(-) delete mode 100644 overview.png diff --git a/README.md b/README.md index ddb3a4dbc..104bbf2f3 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,29 @@ -# OAuth2.0 + OpenID Connect Provider for Matrix Homeservers +# Matrix Authentication Service -MAS (Matrix Authentication Service) is an OAuth 2.0 and OpenID Provider server for Matrix. +MAS (Matrix Authentication Service) is a user management and authentication service for [Matrix](https://matrix.org/) homeservers, written and maintained by [Element](https://element.io/). You can directly run and manage the source code in this repository, available under an AGPL license (or alternatively under a commercial license from Element). Support is not provided by Element unless you have a subscription. -It has been created to support the migration of Matrix to an OpenID Connect (OIDC) based authentication layer as per [MSC3861](https://github.com/matrix-org/matrix-doc/pull/3861). +It has been created to support the migration of Matrix to a next-generation of auth APIs per [MSC3861](https://github.com/matrix-org/matrix-doc/pull/3861). See the [Documentation](https://element-hq.github.io/matrix-authentication-service/index.html) for information on installation and use. -You can learn more about Matrix and OIDC at [areweoidcyet.com](https://areweoidcyet.com/). +You can learn more about Matrix and next-generation auth at [areweoidcyet.com](https://areweoidcyet.com/). -![Delegated OIDC architecture with MAS overview](overview.png) +## 💬 Community room -## Features +Developers and users of Matrix Authentication Service can chat in the [#matrix-auth:matrix.org](https://matrix.to/#/#matrix-auth:matrix.org) room on Matrix. -- Supported homeservers - - ✅ Synapse -- Authentication methods: - - ✅ Upstream OIDC - - 🚧 Local password - - ‼️ [Application Services login](https://element-hq.github.io/matrix-authentication-service/as-login.html) (**Encrypted bridges**) -- Migration support - - ✅ Compatibility layer for legacy Matrix authentication - - ✅ Advisor on migration readiness - - ✅ Import users from Synapse - - ✅ Import password hashes from Synapse - - ✅ Import of external subject IDs for upstream identity providers from Synapse +## 🛠️ Installing and configuration -## Upstream Identity Providers +The best way to get a modern Element Matrix stack is through the [Element Server Suite Community Edition](https://github.com/element-hq/ess-helm), which includes MAS. -MAS is known to work with the following upstream IdPs via OIDC: +The MAS documentation describes [how to install and configure MAS](https://element-hq.github.io/matrix-authentication-service/setup/). +We recommend using the [Docker image](https://element-hq.github.io/matrix-authentication-service/setup/installation.html#using-the-docker-image) or the [pre-built binaries](https://element-hq.github.io/matrix-authentication-service/setup/installation.html#pre-built-binaries). -- [Keycloak](https://www.keycloak.org/) -- [Dex](https://dexidp.io/) -- [Google](https://developers.google.com/identity/openid-connect/openid-connect) +## 📖 Translations + +Matrix Authentication Service is available in multiple languages. +Anyone can contribute to translations through [Localazy](https://localazy.com/element-matrix-authentication-service/). + +## 🏗️ Contributing + +See the [contribution guidelines](https://element-hq.github.io/matrix-authentication-service/contributing.html) for information on how to contribute to this project. diff --git a/overview.png b/overview.png deleted file mode 100644 index adc2717eaa59b43325eee9099627880b96eca1b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480968 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:JNAr@)@)78eeq?iPHaLOA#scB1i&g~7{QX@ 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
  • Sv69mQNaUu%6 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 From f763a5ca999666a111a995a3d58dfa9d7bf0ad7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:23:47 +0000 Subject: [PATCH 19/31] build(deps): bump the tanstack-router group in /frontend with 3 updates Bumps the tanstack-router group in /frontend with 3 updates: [@tanstack/react-router](https://github.com/TanStack/router/tree/HEAD/packages/react-router), [@tanstack/react-router-devtools](https://github.com/TanStack/router/tree/HEAD/packages/react-router-devtools) and [@tanstack/router-plugin](https://github.com/TanStack/router/tree/HEAD/packages/router-plugin). Updates `@tanstack/react-router` from 1.120.20 to 1.121.0 - [Release notes](https://github.com/TanStack/router/releases) - [Commits](https://github.com/TanStack/router/commits/v1.121.0/packages/react-router) Updates `@tanstack/react-router-devtools` from 1.120.20 to 1.121.0 - [Release notes](https://github.com/TanStack/router/releases) - [Commits](https://github.com/TanStack/router/commits/v1.121.0/packages/react-router-devtools) Updates `@tanstack/router-plugin` from 1.120.20 to 1.121.0 - [Release notes](https://github.com/TanStack/router/releases) - [Commits](https://github.com/TanStack/router/commits/v1.121.0/packages/router-plugin) --- updated-dependencies: - dependency-name: "@tanstack/react-router" dependency-version: 1.121.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: tanstack-router - dependency-name: "@tanstack/react-router-devtools" dependency-version: 1.121.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: tanstack-router - dependency-name: "@tanstack/router-plugin" dependency-version: 1.121.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: tanstack-router ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 159 ++++++++++++++++++++++++------------- frontend/package.json | 6 +- 2 files changed, 105 insertions(+), 60 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 243545104..8203e1b9a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,7 +13,7 @@ "@radix-ui/react-collapsible": "^1.1.8", "@radix-ui/react-dialog": "^1.1.11", "@tanstack/react-query": "^5.80.6", - "@tanstack/react-router": "^1.120.20", + "@tanstack/react-router": "^1.121.0", "@vector-im/compound-design-tokens": "4.0.2", "@vector-im/compound-web": "^7.12.0", "@zxcvbn-ts/core": "^3.0.4", @@ -40,8 +40,8 @@ "@storybook/addon-docs": "^9.0.8", "@storybook/react-vite": "^9.0.8", "@tanstack/react-query-devtools": "^5.80.6", - "@tanstack/react-router-devtools": "^1.120.20", - "@tanstack/router-plugin": "^1.120.20", + "@tanstack/react-router-devtools": "^1.121.0", + "@tanstack/router-plugin": "^1.121.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", @@ -618,13 +618,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1002,6 +1002,46 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.27.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.3.tgz", @@ -5177,14 +5217,14 @@ } }, "node_modules/@tanstack/react-router": { - "version": "1.120.20", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.120.20.tgz", - "integrity": "sha512-+zNruUE9NsfGm9cHd22Xs7FRtBrBhDZe94pB69BEIjqjrEPZct6f5VhTV9WQ+bDZ6fRz8tUuxNFAgm/3Lm4AIg==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.121.0.tgz", + "integrity": "sha512-l+hwNPzAPuCb/V4K6E1ZwKplnk8/nYUTQrXdtfXro5xOT1zNedJOm+juZsNKyoHokvhH+uT+I1s+mrkaykctcA==", "license": "MIT", "dependencies": { "@tanstack/history": "1.120.17", "@tanstack/react-store": "^0.7.0", - "@tanstack/router-core": "1.120.19", + "@tanstack/router-core": "1.121.0", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" @@ -5202,13 +5242,13 @@ } }, "node_modules/@tanstack/react-router-devtools": { - "version": "1.120.20", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.120.20.tgz", - "integrity": "sha512-8wYUBdhaMQLo+f5GlJ31WK3T5gpQWetIG7bEGbhrgmd8Z6nZbUYfq10BtVnIwhJwiQa/39Fi9778/09N13l00A==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.121.0.tgz", + "integrity": "sha512-428xI3N40MEdGZ0Y7WLJVBpezLhG/mNZX92OEx3r0E183X1hoooi2/s9+JoF4ifDv1muoRX6oZqOqGhs4BqeRg==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/router-devtools-core": "^1.120.19", + "@tanstack/router-devtools-core": "^1.121.0", "solid-js": "^1.9.5" }, "engines": { @@ -5219,7 +5259,7 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-router": "^1.120.20", + "@tanstack/react-router": "^1.121.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } @@ -5243,9 +5283,9 @@ } }, "node_modules/@tanstack/router-core": { - "version": "1.120.19", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.120.19.tgz", - "integrity": "sha512-5JUVgkxnIM3NxMwzKt0tfz2UopZVxwq6Kl7Rp33zlFJaPjpiRs46VuRjVeAvkpJd6samo1gcH1rWqmnPUmtGcw==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.121.0.tgz", + "integrity": "sha512-EMiLgRMHbi1JHOgJOrxUSc3Ws+Jge3bGa7r03tdIgvH07dJcsY03L5ZLtuqYKvuS6YJvYeciEXA31IUIEN9dVA==", "license": "MIT", "dependencies": { "@tanstack/history": "1.120.17", @@ -5261,9 +5301,9 @@ } }, "node_modules/@tanstack/router-devtools-core": { - "version": "1.120.19", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.120.19.tgz", - "integrity": "sha512-B/8riYIxs5z+6BmkycfkllhZzRV0/jt8MEqlVHU/HDyAi+00luhi+4xwqQNxiAIUpFa6+0twmGPj4SI3SPA6nQ==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.121.0.tgz", + "integrity": "sha512-66+bkdII8j3DJWyOgnJpmuddkt+0aVSFI5UP1G6i7qUrqZAciWXBD+UlZJ5pt6S/7PVBow7xsd0YzMEZlz+lIw==", "dev": true, "license": "MIT", "dependencies": { @@ -5278,7 +5318,7 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/router-core": "^1.120.19", + "@tanstack/router-core": "^1.121.0", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" @@ -5290,14 +5330,18 @@ } }, "node_modules/@tanstack/router-generator": { - "version": "1.120.20", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.120.20.tgz", - "integrity": "sha512-tv8uOjteyMnUUDepjknkiTQ90EL6sNuDGsfeUz0wXFQ6dy/cqYqV0pXzJuBRN79ToteWFdq5sJeypqUdzOC8+w==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.121.0.tgz", + "integrity": "sha512-3JDHlL5mrdVI6RwRf92YId0fgYr6Vdh0yo/pYMUV6USkB0fRtayz176AODvTaR5IeB2BYkaiPKTK38ySyGueRw==", "dev": true, "license": "MIT", "dependencies": { + "@tanstack/router-core": "^1.121.0", + "@tanstack/router-utils": "^1.121.0", "@tanstack/virtual-file-routes": "^1.120.17", "prettier": "^3.5.0", + "recast": "^0.23.11", + "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" }, @@ -5307,20 +5351,22 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-router": "^1.120.20" - }, - "peerDependenciesMeta": { - "@tanstack/react-router": { - "optional": true - } + } + }, + "node_modules/@tanstack/router-generator/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" } }, "node_modules/@tanstack/router-plugin": { - "version": "1.120.20", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.120.20.tgz", - "integrity": "sha512-GaDcIZSVaMoLvG6pu0yRLz8C8jtFo1avV23Q1UbZzv+1i66Uk0twcfTPy/eJbB8pgRA2P5Eu7xo7L3g5HvkGRw==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.121.0.tgz", + "integrity": "sha512-A05CE2JuebgU+D7H4VHhOkWDmW1NxFbKVq82hHewiBWdq2nwODSZQV4AO+Ub7bIcILHYX/ivKuspK11s/d7k0A==", "dev": true, "license": "MIT", "dependencies": { @@ -5330,13 +5376,10 @@ "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", - "@tanstack/router-core": "^1.120.19", - "@tanstack/router-generator": "^1.120.20", - "@tanstack/router-utils": "^1.120.17", + "@tanstack/router-core": "^1.121.0", + "@tanstack/router-generator": "^1.121.0", + "@tanstack/router-utils": "^1.121.0", "@tanstack/virtual-file-routes": "^1.120.17", - "@types/babel__core": "^7.20.5", - "@types/babel__template": "^7.4.4", - "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", @@ -5351,7 +5394,7 @@ }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", - "@tanstack/react-router": "^1.120.20", + "@tanstack/react-router": "^1.121.0", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" @@ -5390,16 +5433,18 @@ } }, "node_modules/@tanstack/router-utils": { - "version": "1.120.17", - "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.120.17.tgz", - "integrity": "sha512-emgT4FthaGtTRaRg9bsr0uaq3EHdl/flS4bKLuFaetiFTt8wk8EVU2a7EZlkaaAfLLDPaiGbP1S2DDaZQ7ci+Q==", + "version": "1.121.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.121.0.tgz", + "integrity": "sha512-+gOHZdEVjOTTdk8Z7J/NVG0KdvzxFeUYjINYZEqQDRKoxEg8f+Npram0MXGy8N15OyZrsm+KHR1vMFZ2yEvZkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/generator": "^7.26.8", - "@babel/parser": "^7.26.8", - "ansis": "^3.11.0", - "diff": "^7.0.0" + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.5", + "@babel/preset-typescript": "^7.27.1", + "ansis": "^4.1.0", + "diff": "^8.0.2" }, "engines": { "node": ">=12" @@ -6125,9 +6170,9 @@ } }, "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", "dev": true, "license": "ISC", "engines": { @@ -7518,9 +7563,9 @@ "license": "Apache-2.0" }, "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "dev": true, "license": "BSD-3-Clause", "engines": { diff --git a/frontend/package.json b/frontend/package.json index f3bba4dad..0dc4c17d4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,7 +23,7 @@ "@radix-ui/react-collapsible": "^1.1.8", "@radix-ui/react-dialog": "^1.1.11", "@tanstack/react-query": "^5.80.6", - "@tanstack/react-router": "^1.120.20", + "@tanstack/react-router": "^1.121.0", "@vector-im/compound-design-tokens": "4.0.2", "@vector-im/compound-web": "^7.12.0", "@zxcvbn-ts/core": "^3.0.4", @@ -50,8 +50,8 @@ "@storybook/addon-docs": "^9.0.8", "@storybook/react-vite": "^9.0.8", "@tanstack/react-query-devtools": "^5.80.6", - "@tanstack/react-router-devtools": "^1.120.20", - "@tanstack/router-plugin": "^1.120.20", + "@tanstack/react-router-devtools": "^1.121.0", + "@tanstack/router-plugin": "^1.121.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", From d657064040c1799259c98a85743e78039e159c8d Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 11 Jun 2025 16:30:00 +0200 Subject: [PATCH 20/31] Update geenrated routes --- frontend/src/routeTree.gen.ts | 694 +++++++++--------- frontend/src/routes/_account.index.tsx | 9 +- frontend/src/routes/_account.plan.index.tsx | 4 +- .../src/routes/_account.sessions.browsers.tsx | 4 +- .../src/routes/_account.sessions.index.tsx | 3 +- frontend/src/routes/_account.tsx | 4 +- frontend/src/routes/clients.$id.tsx | 3 +- frontend/src/routes/devices.$.tsx | 4 +- frontend/src/routes/emails.$id.in-use.tsx | 4 +- frontend/src/routes/emails.$id.verify.tsx | 9 +- frontend/src/routes/password.change.index.tsx | 4 +- .../src/routes/password.change.success.tsx | 3 +- .../src/routes/password.recovery.index.tsx | 4 +- .../routes/reset-cross-signing.cancelled.tsx | 3 +- .../src/routes/reset-cross-signing.index.tsx | 4 +- .../routes/reset-cross-signing.success.tsx | 3 +- frontend/src/routes/reset-cross-signing.tsx | 8 +- frontend/src/routes/sessions.$id.tsx | 4 +- frontend/vite.config.ts | 5 +- 19 files changed, 397 insertions(+), 379 deletions(-) diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 4fa8ad0f4..f9f2aa03a 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -8,292 +8,114 @@ // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. -// Import Routes +import type { CreateFileRoute, FileRoutesByPath } from '@tanstack/react-router' -import { Route as rootRoute } from './routes/__root' -import { Route as ResetCrossSigningImport } from './routes/reset-cross-signing' -import { Route as AccountImport } from './routes/_account' -import { Route as ResetCrossSigningIndexImport } from './routes/reset-cross-signing.index' -import { Route as AccountIndexImport } from './routes/_account.index' -import { Route as SessionsIdImport } from './routes/sessions.$id' -import { Route as ResetCrossSigningSuccessImport } from './routes/reset-cross-signing.success' -import { Route as ResetCrossSigningCancelledImport } from './routes/reset-cross-signing.cancelled' -import { Route as DevicesSplatImport } from './routes/devices.$' -import { Route as ClientsIdImport } from './routes/clients.$id' -import { Route as PasswordRecoveryIndexImport } from './routes/password.recovery.index' -import { Route as PasswordChangeIndexImport } from './routes/password.change.index' -import { Route as AccountSessionsIndexImport } from './routes/_account.sessions.index' -import { Route as AccountPlanIndexImport } from './routes/_account.plan.index' -import { Route as PasswordChangeSuccessImport } from './routes/password.change.success' -import { Route as EmailsIdVerifyImport } from './routes/emails.$id.verify' -import { Route as EmailsIdInUseImport } from './routes/emails.$id.in-use' -import { Route as AccountSessionsBrowsersImport } from './routes/_account.sessions.browsers' +import { Route as rootRouteImport } from './routes/__root' +import { Route as ResetCrossSigningRouteImport } from './routes/reset-cross-signing' +import { Route as AccountRouteImport } from './routes/_account' +import { Route as ResetCrossSigningIndexRouteImport } from './routes/reset-cross-signing.index' +import { Route as AccountIndexRouteImport } from './routes/_account.index' +import { Route as SessionsIdRouteImport } from './routes/sessions.$id' +import { Route as ResetCrossSigningSuccessRouteImport } from './routes/reset-cross-signing.success' +import { Route as ResetCrossSigningCancelledRouteImport } from './routes/reset-cross-signing.cancelled' +import { Route as DevicesSplatRouteImport } from './routes/devices.$' +import { Route as ClientsIdRouteImport } from './routes/clients.$id' +import { Route as PasswordRecoveryIndexRouteImport } from './routes/password.recovery.index' +import { Route as PasswordChangeIndexRouteImport } from './routes/password.change.index' +import { Route as AccountSessionsIndexRouteImport } from './routes/_account.sessions.index' +import { Route as AccountPlanIndexRouteImport } from './routes/_account.plan.index' +import { Route as PasswordChangeSuccessRouteImport } from './routes/password.change.success' +import { Route as EmailsIdVerifyRouteImport } from './routes/emails.$id.verify' +import { Route as EmailsIdInUseRouteImport } from './routes/emails.$id.in-use' +import { Route as AccountSessionsBrowsersRouteImport } from './routes/_account.sessions.browsers' -// Create/Update Routes - -const ResetCrossSigningRoute = ResetCrossSigningImport.update({ +const ResetCrossSigningRoute = ResetCrossSigningRouteImport.update({ id: '/reset-cross-signing', path: '/reset-cross-signing', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AccountRoute = AccountImport.update({ +const AccountRoute = AccountRouteImport.update({ id: '/_account', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ResetCrossSigningIndexRoute = ResetCrossSigningIndexImport.update({ +const ResetCrossSigningIndexRoute = ResetCrossSigningIndexRouteImport.update({ id: '/', path: '/', getParentRoute: () => ResetCrossSigningRoute, } as any) - -const AccountIndexRoute = AccountIndexImport.update({ +const AccountIndexRoute = AccountIndexRouteImport.update({ id: '/', path: '/', getParentRoute: () => AccountRoute, } as any) - -const SessionsIdRoute = SessionsIdImport.update({ +const SessionsIdRoute = SessionsIdRouteImport.update({ id: '/sessions/$id', path: '/sessions/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ResetCrossSigningSuccessRoute = ResetCrossSigningSuccessImport.update({ - id: '/success', - path: '/success', - getParentRoute: () => ResetCrossSigningRoute, -} as any) - -const ResetCrossSigningCancelledRoute = ResetCrossSigningCancelledImport.update( - { +const ResetCrossSigningSuccessRoute = + ResetCrossSigningSuccessRouteImport.update({ + id: '/success', + path: '/success', + getParentRoute: () => ResetCrossSigningRoute, + } as any) +const ResetCrossSigningCancelledRoute = + ResetCrossSigningCancelledRouteImport.update({ id: '/cancelled', path: '/cancelled', getParentRoute: () => ResetCrossSigningRoute, - } as any, -) - -const DevicesSplatRoute = DevicesSplatImport.update({ + } as any) +const DevicesSplatRoute = DevicesSplatRouteImport.update({ id: '/devices/$', path: '/devices/$', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ClientsIdRoute = ClientsIdImport.update({ +const ClientsIdRoute = ClientsIdRouteImport.update({ id: '/clients/$id', path: '/clients/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const PasswordRecoveryIndexRoute = PasswordRecoveryIndexImport.update({ +const PasswordRecoveryIndexRoute = PasswordRecoveryIndexRouteImport.update({ id: '/password/recovery/', path: '/password/recovery/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const PasswordChangeIndexRoute = PasswordChangeIndexImport.update({ +const PasswordChangeIndexRoute = PasswordChangeIndexRouteImport.update({ id: '/password/change/', path: '/password/change/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AccountSessionsIndexRoute = AccountSessionsIndexImport.update({ +const AccountSessionsIndexRoute = AccountSessionsIndexRouteImport.update({ id: '/sessions/', path: '/sessions/', getParentRoute: () => AccountRoute, } as any) - -const AccountPlanIndexRoute = AccountPlanIndexImport.update({ +const AccountPlanIndexRoute = AccountPlanIndexRouteImport.update({ id: '/plan/', path: '/plan/', getParentRoute: () => AccountRoute, } as any) - -const PasswordChangeSuccessRoute = PasswordChangeSuccessImport.update({ +const PasswordChangeSuccessRoute = PasswordChangeSuccessRouteImport.update({ id: '/password/change/success', path: '/password/change/success', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const EmailsIdVerifyRoute = EmailsIdVerifyImport.update({ +const EmailsIdVerifyRoute = EmailsIdVerifyRouteImport.update({ id: '/emails/$id/verify', path: '/emails/$id/verify', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const EmailsIdInUseRoute = EmailsIdInUseImport.update({ +const EmailsIdInUseRoute = EmailsIdInUseRouteImport.update({ id: '/emails/$id/in-use', path: '/emails/$id/in-use', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const AccountSessionsBrowsersRoute = AccountSessionsBrowsersImport.update({ +const AccountSessionsBrowsersRoute = AccountSessionsBrowsersRouteImport.update({ id: '/sessions/browsers', path: '/sessions/browsers', getParentRoute: () => AccountRoute, } as any) -// Populate the FileRoutesByPath interface - -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/_account': { - id: '/_account' - path: '' - fullPath: '' - preLoaderRoute: typeof AccountImport - parentRoute: typeof rootRoute - } - '/reset-cross-signing': { - id: '/reset-cross-signing' - path: '/reset-cross-signing' - fullPath: '/reset-cross-signing' - preLoaderRoute: typeof ResetCrossSigningImport - parentRoute: typeof rootRoute - } - '/clients/$id': { - id: '/clients/$id' - path: '/clients/$id' - fullPath: '/clients/$id' - preLoaderRoute: typeof ClientsIdImport - parentRoute: typeof rootRoute - } - '/devices/$': { - id: '/devices/$' - path: '/devices/$' - fullPath: '/devices/$' - preLoaderRoute: typeof DevicesSplatImport - parentRoute: typeof rootRoute - } - '/reset-cross-signing/cancelled': { - id: '/reset-cross-signing/cancelled' - path: '/cancelled' - fullPath: '/reset-cross-signing/cancelled' - preLoaderRoute: typeof ResetCrossSigningCancelledImport - parentRoute: typeof ResetCrossSigningImport - } - '/reset-cross-signing/success': { - id: '/reset-cross-signing/success' - path: '/success' - fullPath: '/reset-cross-signing/success' - preLoaderRoute: typeof ResetCrossSigningSuccessImport - parentRoute: typeof ResetCrossSigningImport - } - '/sessions/$id': { - id: '/sessions/$id' - path: '/sessions/$id' - fullPath: '/sessions/$id' - preLoaderRoute: typeof SessionsIdImport - parentRoute: typeof rootRoute - } - '/_account/': { - id: '/_account/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof AccountIndexImport - parentRoute: typeof AccountImport - } - '/reset-cross-signing/': { - id: '/reset-cross-signing/' - path: '/' - fullPath: '/reset-cross-signing/' - preLoaderRoute: typeof ResetCrossSigningIndexImport - parentRoute: typeof ResetCrossSigningImport - } - '/_account/sessions/browsers': { - id: '/_account/sessions/browsers' - path: '/sessions/browsers' - fullPath: '/sessions/browsers' - preLoaderRoute: typeof AccountSessionsBrowsersImport - parentRoute: typeof AccountImport - } - '/emails/$id/in-use': { - id: '/emails/$id/in-use' - path: '/emails/$id/in-use' - fullPath: '/emails/$id/in-use' - preLoaderRoute: typeof EmailsIdInUseImport - parentRoute: typeof rootRoute - } - '/emails/$id/verify': { - id: '/emails/$id/verify' - path: '/emails/$id/verify' - fullPath: '/emails/$id/verify' - preLoaderRoute: typeof EmailsIdVerifyImport - parentRoute: typeof rootRoute - } - '/password/change/success': { - id: '/password/change/success' - path: '/password/change/success' - fullPath: '/password/change/success' - preLoaderRoute: typeof PasswordChangeSuccessImport - parentRoute: typeof rootRoute - } - '/_account/plan/': { - id: '/_account/plan/' - path: '/plan' - fullPath: '/plan' - preLoaderRoute: typeof AccountPlanIndexImport - parentRoute: typeof AccountImport - } - '/_account/sessions/': { - id: '/_account/sessions/' - path: '/sessions' - fullPath: '/sessions' - preLoaderRoute: typeof AccountSessionsIndexImport - parentRoute: typeof AccountImport - } - '/password/change/': { - id: '/password/change/' - path: '/password/change' - fullPath: '/password/change' - preLoaderRoute: typeof PasswordChangeIndexImport - parentRoute: typeof rootRoute - } - '/password/recovery/': { - id: '/password/recovery/' - path: '/password/recovery' - fullPath: '/password/recovery' - preLoaderRoute: typeof PasswordRecoveryIndexImport - parentRoute: typeof rootRoute - } - } -} - -// Create and export the route tree - -interface AccountRouteChildren { - AccountIndexRoute: typeof AccountIndexRoute - AccountSessionsBrowsersRoute: typeof AccountSessionsBrowsersRoute - AccountPlanIndexRoute: typeof AccountPlanIndexRoute - AccountSessionsIndexRoute: typeof AccountSessionsIndexRoute -} - -const AccountRouteChildren: AccountRouteChildren = { - AccountIndexRoute: AccountIndexRoute, - AccountSessionsBrowsersRoute: AccountSessionsBrowsersRoute, - AccountPlanIndexRoute: AccountPlanIndexRoute, - AccountSessionsIndexRoute: AccountSessionsIndexRoute, -} - -const AccountRouteWithChildren = - AccountRoute._addFileChildren(AccountRouteChildren) - -interface ResetCrossSigningRouteChildren { - ResetCrossSigningCancelledRoute: typeof ResetCrossSigningCancelledRoute - ResetCrossSigningSuccessRoute: typeof ResetCrossSigningSuccessRoute - ResetCrossSigningIndexRoute: typeof ResetCrossSigningIndexRoute -} - -const ResetCrossSigningRouteChildren: ResetCrossSigningRouteChildren = { - ResetCrossSigningCancelledRoute: ResetCrossSigningCancelledRoute, - ResetCrossSigningSuccessRoute: ResetCrossSigningSuccessRoute, - ResetCrossSigningIndexRoute: ResetCrossSigningIndexRoute, -} - -const ResetCrossSigningRouteWithChildren = - ResetCrossSigningRoute._addFileChildren(ResetCrossSigningRouteChildren) - export interface FileRoutesByFullPath { '': typeof AccountRouteWithChildren '/reset-cross-signing': typeof ResetCrossSigningRouteWithChildren @@ -313,7 +135,6 @@ export interface FileRoutesByFullPath { '/password/change': typeof PasswordChangeIndexRoute '/password/recovery': typeof PasswordRecoveryIndexRoute } - export interface FileRoutesByTo { '/clients/$id': typeof ClientsIdRoute '/devices/$': typeof DevicesSplatRoute @@ -331,9 +152,8 @@ export interface FileRoutesByTo { '/password/change': typeof PasswordChangeIndexRoute '/password/recovery': typeof PasswordRecoveryIndexRoute } - export interface FileRoutesById { - __root__: typeof rootRoute + __root__: typeof rootRouteImport '/_account': typeof AccountRouteWithChildren '/reset-cross-signing': typeof ResetCrossSigningRouteWithChildren '/clients/$id': typeof ClientsIdRoute @@ -352,7 +172,6 @@ export interface FileRoutesById { '/password/change/': typeof PasswordChangeIndexRoute '/password/recovery/': typeof PasswordRecoveryIndexRoute } - export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: @@ -411,7 +230,6 @@ export interface FileRouteTypes { | '/password/recovery/' fileRoutesById: FileRoutesById } - export interface RootRouteChildren { AccountRoute: typeof AccountRouteWithChildren ResetCrossSigningRoute: typeof ResetCrossSigningRouteWithChildren @@ -425,6 +243,316 @@ export interface RootRouteChildren { PasswordRecoveryIndexRoute: typeof PasswordRecoveryIndexRoute } +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/_account': { + id: '/_account' + path: '' + fullPath: '' + preLoaderRoute: typeof AccountRouteImport + parentRoute: typeof rootRouteImport + } + '/reset-cross-signing': { + id: '/reset-cross-signing' + path: '/reset-cross-signing' + fullPath: '/reset-cross-signing' + preLoaderRoute: typeof ResetCrossSigningRouteImport + parentRoute: typeof rootRouteImport + } + '/clients/$id': { + id: '/clients/$id' + path: '/clients/$id' + fullPath: '/clients/$id' + preLoaderRoute: typeof ClientsIdRouteImport + parentRoute: typeof rootRouteImport + } + '/devices/$': { + id: '/devices/$' + path: '/devices/$' + fullPath: '/devices/$' + preLoaderRoute: typeof DevicesSplatRouteImport + parentRoute: typeof rootRouteImport + } + '/reset-cross-signing/cancelled': { + id: '/reset-cross-signing/cancelled' + path: '/cancelled' + fullPath: '/reset-cross-signing/cancelled' + preLoaderRoute: typeof ResetCrossSigningCancelledRouteImport + parentRoute: typeof ResetCrossSigningRoute + } + '/reset-cross-signing/success': { + id: '/reset-cross-signing/success' + path: '/success' + fullPath: '/reset-cross-signing/success' + preLoaderRoute: typeof ResetCrossSigningSuccessRouteImport + parentRoute: typeof ResetCrossSigningRoute + } + '/sessions/$id': { + id: '/sessions/$id' + path: '/sessions/$id' + fullPath: '/sessions/$id' + preLoaderRoute: typeof SessionsIdRouteImport + parentRoute: typeof rootRouteImport + } + '/_account/': { + id: '/_account/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof AccountIndexRouteImport + parentRoute: typeof AccountRoute + } + '/reset-cross-signing/': { + id: '/reset-cross-signing/' + path: '/' + fullPath: '/reset-cross-signing/' + preLoaderRoute: typeof ResetCrossSigningIndexRouteImport + parentRoute: typeof ResetCrossSigningRoute + } + '/_account/sessions/browsers': { + id: '/_account/sessions/browsers' + path: '/sessions/browsers' + fullPath: '/sessions/browsers' + preLoaderRoute: typeof AccountSessionsBrowsersRouteImport + parentRoute: typeof AccountRoute + } + '/emails/$id/in-use': { + id: '/emails/$id/in-use' + path: '/emails/$id/in-use' + fullPath: '/emails/$id/in-use' + preLoaderRoute: typeof EmailsIdInUseRouteImport + parentRoute: typeof rootRouteImport + } + '/emails/$id/verify': { + id: '/emails/$id/verify' + path: '/emails/$id/verify' + fullPath: '/emails/$id/verify' + preLoaderRoute: typeof EmailsIdVerifyRouteImport + parentRoute: typeof rootRouteImport + } + '/password/change/success': { + id: '/password/change/success' + path: '/password/change/success' + fullPath: '/password/change/success' + preLoaderRoute: typeof PasswordChangeSuccessRouteImport + parentRoute: typeof rootRouteImport + } + '/_account/plan/': { + id: '/_account/plan/' + path: '/plan' + fullPath: '/plan' + preLoaderRoute: typeof AccountPlanIndexRouteImport + parentRoute: typeof AccountRoute + } + '/_account/sessions/': { + id: '/_account/sessions/' + path: '/sessions' + fullPath: '/sessions' + preLoaderRoute: typeof AccountSessionsIndexRouteImport + parentRoute: typeof AccountRoute + } + '/password/change/': { + id: '/password/change/' + path: '/password/change' + fullPath: '/password/change' + preLoaderRoute: typeof PasswordChangeIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/password/recovery/': { + id: '/password/recovery/' + path: '/password/recovery' + fullPath: '/password/recovery' + preLoaderRoute: typeof PasswordRecoveryIndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +declare module './routes/_account' { + const createFileRoute: CreateFileRoute< + '/_account', + FileRoutesByPath['/_account']['parentRoute'], + FileRoutesByPath['/_account']['id'], + FileRoutesByPath['/_account']['path'], + FileRoutesByPath['/_account']['fullPath'] + > +} +declare module './routes/reset-cross-signing' { + const createFileRoute: CreateFileRoute< + '/reset-cross-signing', + FileRoutesByPath['/reset-cross-signing']['parentRoute'], + FileRoutesByPath['/reset-cross-signing']['id'], + FileRoutesByPath['/reset-cross-signing']['path'], + FileRoutesByPath['/reset-cross-signing']['fullPath'] + > +} +declare module './routes/clients.$id' { + const createFileRoute: CreateFileRoute< + '/clients/$id', + FileRoutesByPath['/clients/$id']['parentRoute'], + FileRoutesByPath['/clients/$id']['id'], + FileRoutesByPath['/clients/$id']['path'], + FileRoutesByPath['/clients/$id']['fullPath'] + > +} +declare module './routes/devices.$' { + const createFileRoute: CreateFileRoute< + '/devices/$', + FileRoutesByPath['/devices/$']['parentRoute'], + FileRoutesByPath['/devices/$']['id'], + FileRoutesByPath['/devices/$']['path'], + FileRoutesByPath['/devices/$']['fullPath'] + > +} +declare module './routes/reset-cross-signing.cancelled' { + const createFileRoute: CreateFileRoute< + '/reset-cross-signing/cancelled', + FileRoutesByPath['/reset-cross-signing/cancelled']['parentRoute'], + FileRoutesByPath['/reset-cross-signing/cancelled']['id'], + FileRoutesByPath['/reset-cross-signing/cancelled']['path'], + FileRoutesByPath['/reset-cross-signing/cancelled']['fullPath'] + > +} +declare module './routes/reset-cross-signing.success' { + const createFileRoute: CreateFileRoute< + '/reset-cross-signing/success', + FileRoutesByPath['/reset-cross-signing/success']['parentRoute'], + FileRoutesByPath['/reset-cross-signing/success']['id'], + FileRoutesByPath['/reset-cross-signing/success']['path'], + FileRoutesByPath['/reset-cross-signing/success']['fullPath'] + > +} +declare module './routes/sessions.$id' { + const createFileRoute: CreateFileRoute< + '/sessions/$id', + FileRoutesByPath['/sessions/$id']['parentRoute'], + FileRoutesByPath['/sessions/$id']['id'], + FileRoutesByPath['/sessions/$id']['path'], + FileRoutesByPath['/sessions/$id']['fullPath'] + > +} +declare module './routes/_account.index' { + const createFileRoute: CreateFileRoute< + '/_account/', + FileRoutesByPath['/_account/']['parentRoute'], + FileRoutesByPath['/_account/']['id'], + FileRoutesByPath['/_account/']['path'], + FileRoutesByPath['/_account/']['fullPath'] + > +} +declare module './routes/reset-cross-signing.index' { + const createFileRoute: CreateFileRoute< + '/reset-cross-signing/', + FileRoutesByPath['/reset-cross-signing/']['parentRoute'], + FileRoutesByPath['/reset-cross-signing/']['id'], + FileRoutesByPath['/reset-cross-signing/']['path'], + FileRoutesByPath['/reset-cross-signing/']['fullPath'] + > +} +declare module './routes/_account.sessions.browsers' { + const createFileRoute: CreateFileRoute< + '/_account/sessions/browsers', + FileRoutesByPath['/_account/sessions/browsers']['parentRoute'], + FileRoutesByPath['/_account/sessions/browsers']['id'], + FileRoutesByPath['/_account/sessions/browsers']['path'], + FileRoutesByPath['/_account/sessions/browsers']['fullPath'] + > +} +declare module './routes/emails.$id.in-use' { + const createFileRoute: CreateFileRoute< + '/emails/$id/in-use', + FileRoutesByPath['/emails/$id/in-use']['parentRoute'], + FileRoutesByPath['/emails/$id/in-use']['id'], + FileRoutesByPath['/emails/$id/in-use']['path'], + FileRoutesByPath['/emails/$id/in-use']['fullPath'] + > +} +declare module './routes/emails.$id.verify' { + const createFileRoute: CreateFileRoute< + '/emails/$id/verify', + FileRoutesByPath['/emails/$id/verify']['parentRoute'], + FileRoutesByPath['/emails/$id/verify']['id'], + FileRoutesByPath['/emails/$id/verify']['path'], + FileRoutesByPath['/emails/$id/verify']['fullPath'] + > +} +declare module './routes/password.change.success' { + const createFileRoute: CreateFileRoute< + '/password/change/success', + FileRoutesByPath['/password/change/success']['parentRoute'], + FileRoutesByPath['/password/change/success']['id'], + FileRoutesByPath['/password/change/success']['path'], + FileRoutesByPath['/password/change/success']['fullPath'] + > +} +declare module './routes/_account.plan.index' { + const createFileRoute: CreateFileRoute< + '/_account/plan/', + FileRoutesByPath['/_account/plan/']['parentRoute'], + FileRoutesByPath['/_account/plan/']['id'], + FileRoutesByPath['/_account/plan/']['path'], + FileRoutesByPath['/_account/plan/']['fullPath'] + > +} +declare module './routes/_account.sessions.index' { + const createFileRoute: CreateFileRoute< + '/_account/sessions/', + FileRoutesByPath['/_account/sessions/']['parentRoute'], + FileRoutesByPath['/_account/sessions/']['id'], + FileRoutesByPath['/_account/sessions/']['path'], + FileRoutesByPath['/_account/sessions/']['fullPath'] + > +} +declare module './routes/password.change.index' { + const createFileRoute: CreateFileRoute< + '/password/change/', + FileRoutesByPath['/password/change/']['parentRoute'], + FileRoutesByPath['/password/change/']['id'], + FileRoutesByPath['/password/change/']['path'], + FileRoutesByPath['/password/change/']['fullPath'] + > +} +declare module './routes/password.recovery.index' { + const createFileRoute: CreateFileRoute< + '/password/recovery/', + FileRoutesByPath['/password/recovery/']['parentRoute'], + FileRoutesByPath['/password/recovery/']['id'], + FileRoutesByPath['/password/recovery/']['path'], + FileRoutesByPath['/password/recovery/']['fullPath'] + > +} + +interface AccountRouteChildren { + AccountIndexRoute: typeof AccountIndexRoute + AccountSessionsBrowsersRoute: typeof AccountSessionsBrowsersRoute + AccountPlanIndexRoute: typeof AccountPlanIndexRoute + AccountSessionsIndexRoute: typeof AccountSessionsIndexRoute +} + +const AccountRouteChildren: AccountRouteChildren = { + AccountIndexRoute: AccountIndexRoute, + AccountSessionsBrowsersRoute: AccountSessionsBrowsersRoute, + AccountPlanIndexRoute: AccountPlanIndexRoute, + AccountSessionsIndexRoute: AccountSessionsIndexRoute, +} + +const AccountRouteWithChildren = + AccountRoute._addFileChildren(AccountRouteChildren) + +interface ResetCrossSigningRouteChildren { + ResetCrossSigningCancelledRoute: typeof ResetCrossSigningCancelledRoute + ResetCrossSigningSuccessRoute: typeof ResetCrossSigningSuccessRoute + ResetCrossSigningIndexRoute: typeof ResetCrossSigningIndexRoute +} + +const ResetCrossSigningRouteChildren: ResetCrossSigningRouteChildren = { + ResetCrossSigningCancelledRoute: ResetCrossSigningCancelledRoute, + ResetCrossSigningSuccessRoute: ResetCrossSigningSuccessRoute, + ResetCrossSigningIndexRoute: ResetCrossSigningIndexRoute, +} + +const ResetCrossSigningRouteWithChildren = + ResetCrossSigningRoute._addFileChildren(ResetCrossSigningRouteChildren) + const rootRouteChildren: RootRouteChildren = { AccountRoute: AccountRouteWithChildren, ResetCrossSigningRoute: ResetCrossSigningRouteWithChildren, @@ -437,98 +565,6 @@ const rootRouteChildren: RootRouteChildren = { PasswordChangeIndexRoute: PasswordChangeIndexRoute, PasswordRecoveryIndexRoute: PasswordRecoveryIndexRoute, } - -export const routeTree = rootRoute +export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() - -/* ROUTE_MANIFEST_START -{ - "routes": { - "__root__": { - "filePath": "__root.tsx", - "children": [ - "/_account", - "/reset-cross-signing", - "/clients/$id", - "/devices/$", - "/sessions/$id", - "/emails/$id/in-use", - "/emails/$id/verify", - "/password/change/success", - "/password/change/", - "/password/recovery/" - ] - }, - "/_account": { - "filePath": "_account.tsx", - "children": [ - "/_account/", - "/_account/sessions/browsers", - "/_account/plan/", - "/_account/sessions/" - ] - }, - "/reset-cross-signing": { - "filePath": "reset-cross-signing.tsx", - "children": [ - "/reset-cross-signing/cancelled", - "/reset-cross-signing/success", - "/reset-cross-signing/" - ] - }, - "/clients/$id": { - "filePath": "clients.$id.tsx" - }, - "/devices/$": { - "filePath": "devices.$.tsx" - }, - "/reset-cross-signing/cancelled": { - "filePath": "reset-cross-signing.cancelled.tsx", - "parent": "/reset-cross-signing" - }, - "/reset-cross-signing/success": { - "filePath": "reset-cross-signing.success.tsx", - "parent": "/reset-cross-signing" - }, - "/sessions/$id": { - "filePath": "sessions.$id.tsx" - }, - "/_account/": { - "filePath": "_account.index.tsx", - "parent": "/_account" - }, - "/reset-cross-signing/": { - "filePath": "reset-cross-signing.index.tsx", - "parent": "/reset-cross-signing" - }, - "/_account/sessions/browsers": { - "filePath": "_account.sessions.browsers.tsx", - "parent": "/_account" - }, - "/emails/$id/in-use": { - "filePath": "emails.$id.in-use.tsx" - }, - "/emails/$id/verify": { - "filePath": "emails.$id.verify.tsx" - }, - "/password/change/success": { - "filePath": "password.change.success.tsx" - }, - "/_account/plan/": { - "filePath": "_account.plan.index.tsx", - "parent": "/_account" - }, - "/_account/sessions/": { - "filePath": "_account.sessions.index.tsx", - "parent": "/_account" - }, - "/password/change/": { - "filePath": "password.change.index.tsx" - }, - "/password/recovery/": { - "filePath": "password.recovery.index.tsx" - } - } -} -ROUTE_MANIFEST_END */ diff --git a/frontend/src/routes/_account.index.tsx b/frontend/src/routes/_account.index.tsx index 1237cbd93..cb086e9df 100644 --- a/frontend/src/routes/_account.index.tsx +++ b/frontend/src/routes/_account.index.tsx @@ -5,12 +5,7 @@ // Please see LICENSE in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; -import { - createFileRoute, - notFound, - redirect, - useNavigate, -} from "@tanstack/react-router"; +import { notFound, redirect, useNavigate } from "@tanstack/react-router"; import IconSignOut from "@vector-im/compound-design-tokens/assets/web/icons/sign-out"; import { Button, Text } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; @@ -93,7 +88,7 @@ const actionSchema = v.variant("action", [ ), ]); -export const Route = createFileRoute("/_account/")({ +export const Route = createFileRoute({ validateSearch: actionSchema, beforeLoad({ search }) { diff --git a/frontend/src/routes/_account.plan.index.tsx b/frontend/src/routes/_account.plan.index.tsx index d4916bfaa..ff9fa0a0f 100644 --- a/frontend/src/routes/_account.plan.index.tsx +++ b/frontend/src/routes/_account.plan.index.tsx @@ -4,7 +4,7 @@ // Please see LICENSE in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; -import { Navigate, createFileRoute, redirect } from "@tanstack/react-router"; +import { Navigate, redirect } from "@tanstack/react-router"; import { useCallback, useEffect, useMemo, useRef } from "react"; import { preload } from "react-dom"; import { graphql } from "../gql"; @@ -23,7 +23,7 @@ export const query = queryOptions({ queryFn: ({ signal }) => graphqlRequest({ query: QUERY, signal }), }); -export const Route = createFileRoute("/_account/plan/")({ +export const Route = createFileRoute({ loader: async ({ context }) => { const { siteConfig: { planManagementIframeUri }, diff --git a/frontend/src/routes/_account.sessions.browsers.tsx b/frontend/src/routes/_account.sessions.browsers.tsx index 2cb023d38..8eedfa8c9 100644 --- a/frontend/src/routes/_account.sessions.browsers.tsx +++ b/frontend/src/routes/_account.sessions.browsers.tsx @@ -5,7 +5,7 @@ // Please see LICENSE in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; -import { createFileRoute, notFound } from "@tanstack/react-router"; +import { notFound } from "@tanstack/react-router"; import { H5 } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; import * as v from "valibot"; @@ -93,7 +93,7 @@ const searchSchema = v.intersect([ anyPaginationSchema, ]); -export const Route = createFileRoute("/_account/sessions/browsers")({ +export const Route = createFileRoute({ validateSearch: searchSchema, loaderDeps: ({ search: { inactive, ...pagination } }) => ({ diff --git a/frontend/src/routes/_account.sessions.index.tsx b/frontend/src/routes/_account.sessions.index.tsx index 58d621a93..8b458200e 100644 --- a/frontend/src/routes/_account.sessions.index.tsx +++ b/frontend/src/routes/_account.sessions.index.tsx @@ -7,7 +7,6 @@ import { useSuspenseQuery } from "@tanstack/react-query"; import { queryOptions } from "@tanstack/react-query"; import { notFound } from "@tanstack/react-router"; -import { createFileRoute } from "@tanstack/react-router"; import { H3 } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; import * as v from "valibot"; @@ -112,7 +111,7 @@ const searchSchema = v.intersect([ anyPaginationSchema, ]); -export const Route = createFileRoute("/_account/sessions/")({ +export const Route = createFileRoute({ validateSearch: searchSchema, loaderDeps: ({ search: { inactive, ...pagination } }) => ({ diff --git a/frontend/src/routes/_account.tsx b/frontend/src/routes/_account.tsx index 5bbe3037e..fd023af3b 100644 --- a/frontend/src/routes/_account.tsx +++ b/frontend/src/routes/_account.tsx @@ -5,7 +5,7 @@ // Please see LICENSE in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; -import { Outlet, createFileRoute, notFound } from "@tanstack/react-router"; +import { Outlet, notFound } from "@tanstack/react-router"; import { Heading } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; import Layout from "../components/Layout"; @@ -36,7 +36,7 @@ const query = queryOptions({ queryFn: ({ signal }) => graphqlRequest({ query: QUERY, signal }), }); -export const Route = createFileRoute("/_account")({ +export const Route = createFileRoute({ loader: ({ context }) => context.queryClient.ensureQueryData(query), component: Account, }); diff --git a/frontend/src/routes/clients.$id.tsx b/frontend/src/routes/clients.$id.tsx index 8115d7e10..2b7936381 100644 --- a/frontend/src/routes/clients.$id.tsx +++ b/frontend/src/routes/clients.$id.tsx @@ -7,7 +7,6 @@ import { useSuspenseQuery } from "@tanstack/react-query"; import { queryOptions } from "@tanstack/react-query"; import { notFound } from "@tanstack/react-router"; -import { createFileRoute } from "@tanstack/react-router"; import OAuth2ClientDetail from "../components/Client/OAuth2ClientDetail"; import Layout from "../components/Layout"; import { graphql } from "../gql"; @@ -28,7 +27,7 @@ const query = (id: string) => graphqlRequest({ query: QUERY, variables: { id }, signal }), }); -export const Route = createFileRoute("/clients/$id")({ +export const Route = createFileRoute({ loader: ({ context, params }) => context.queryClient.ensureQueryData(query(params.id)), component: ClientDetail, diff --git a/frontend/src/routes/devices.$.tsx b/frontend/src/routes/devices.$.tsx index 5930323b9..69c22a3c2 100644 --- a/frontend/src/routes/devices.$.tsx +++ b/frontend/src/routes/devices.$.tsx @@ -4,7 +4,7 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -import { createFileRoute, notFound, redirect } from "@tanstack/react-router"; +import { notFound, redirect } from "@tanstack/react-router"; import { Alert } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; @@ -56,7 +56,7 @@ const query = (deviceId: string, userId: string) => }), }); -export const Route = createFileRoute("/devices/$")({ +export const Route = createFileRoute({ async loader({ context, params }) { const data = await context.queryClient.fetchQuery(currentViewerQuery); if (data.viewer.__typename !== "User") diff --git a/frontend/src/routes/emails.$id.in-use.tsx b/frontend/src/routes/emails.$id.in-use.tsx index 5f6aa44db..c52848ff4 100644 --- a/frontend/src/routes/emails.$id.in-use.tsx +++ b/frontend/src/routes/emails.$id.in-use.tsx @@ -4,7 +4,7 @@ // Please see LICENSE in the repository root for full details. import { useSuspenseQuery } from "@tanstack/react-query"; -import { createFileRoute, notFound, redirect } from "@tanstack/react-router"; +import { notFound, redirect } from "@tanstack/react-router"; import IconArrowLeft from "@vector-im/compound-design-tokens/assets/web/icons/arrow-left"; import IconErrorSolid from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; import { useTranslation } from "react-i18next"; @@ -13,7 +13,7 @@ import Layout from "../components/Layout"; import PageHeading from "../components/PageHeading"; import { query } from "./emails.$id.verify"; -export const Route = createFileRoute("/emails/$id/in-use")({ +export const Route = createFileRoute({ async loader({ context, params }): Promise { const data = await context.queryClient.ensureQueryData(query(params.id)); if (!data.userEmailAuthentication) { diff --git a/frontend/src/routes/emails.$id.verify.tsx b/frontend/src/routes/emails.$id.verify.tsx index 6c03f19c3..ddee2d9dc 100644 --- a/frontend/src/routes/emails.$id.verify.tsx +++ b/frontend/src/routes/emails.$id.verify.tsx @@ -10,12 +10,7 @@ import { useQueryClient, useSuspenseQuery, } from "@tanstack/react-query"; -import { - createFileRoute, - notFound, - redirect, - useNavigate, -} from "@tanstack/react-router"; +import { notFound, redirect, useNavigate } from "@tanstack/react-router"; import IconArrowLeft from "@vector-im/compound-design-tokens/assets/web/icons/arrow-left"; import IconSend from "@vector-im/compound-design-tokens/assets/web/icons/send-solid"; import { Alert, Button, Form } from "@vector-im/compound-web"; @@ -61,7 +56,7 @@ export const query = (id: string) => graphqlRequest({ query: QUERY, signal, variables: { id } }), }); -export const Route = createFileRoute("/emails/$id/verify")({ +export const Route = createFileRoute({ async loader({ context, params }): Promise { const data = await context.queryClient.ensureQueryData(query(params.id)); if (!data.userEmailAuthentication) { diff --git a/frontend/src/routes/password.change.index.tsx b/frontend/src/routes/password.change.index.tsx index 749d0b90b..84073a7d9 100644 --- a/frontend/src/routes/password.change.index.tsx +++ b/frontend/src/routes/password.change.index.tsx @@ -9,7 +9,7 @@ import { useMutation, useSuspenseQuery, } from "@tanstack/react-query"; -import { createFileRoute, notFound, useRouter } from "@tanstack/react-router"; +import { notFound, useRouter } from "@tanstack/react-router"; import IconLockSolid from "@vector-im/compound-design-tokens/assets/web/icons/lock-solid"; import { Alert, Form } from "@vector-im/compound-web"; import { type FormEvent, useRef } from "react"; @@ -62,7 +62,7 @@ const query = queryOptions({ queryFn: ({ signal }) => graphqlRequest({ query: QUERY, signal }), }); -export const Route = createFileRoute("/password/change/")({ +export const Route = createFileRoute({ loader: ({ context }) => context.queryClient.ensureQueryData(query), component: ChangePassword, }); diff --git a/frontend/src/routes/password.change.success.tsx b/frontend/src/routes/password.change.success.tsx index 368ca9b22..72d50987c 100644 --- a/frontend/src/routes/password.change.success.tsx +++ b/frontend/src/routes/password.change.success.tsx @@ -4,14 +4,13 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -import { createFileRoute } from "@tanstack/react-router"; import IconCheckCircle from "@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid"; import { useTranslation } from "react-i18next"; import { ButtonLink } from "../components/ButtonLink"; import Layout from "../components/Layout"; import PageHeading from "../components/PageHeading"; -export const Route = createFileRoute("/password/change/success")({ +export const Route = createFileRoute({ component: ChangePasswordSuccess, }); diff --git a/frontend/src/routes/password.recovery.index.tsx b/frontend/src/routes/password.recovery.index.tsx index 87c4f9210..735825a05 100644 --- a/frontend/src/routes/password.recovery.index.tsx +++ b/frontend/src/routes/password.recovery.index.tsx @@ -7,7 +7,7 @@ import { useMutation, useSuspenseQuery } from "@tanstack/react-query"; import { queryOptions } from "@tanstack/react-query"; import { useNavigate, useSearch } from "@tanstack/react-router"; -import { createFileRoute, notFound } from "@tanstack/react-router"; +import { notFound } from "@tanstack/react-router"; import IconErrorSolid from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; import IconLockSolid from "@vector-im/compound-design-tokens/assets/web/icons/lock-solid"; import { Alert, Button, Form } from "@vector-im/compound-web"; @@ -80,7 +80,7 @@ const schema = v.object({ ticket: v.string(), }); -export const Route = createFileRoute("/password/recovery/")({ +export const Route = createFileRoute({ validateSearch: schema, loaderDeps: ({ search: { ticket } }) => ({ ticket }), diff --git a/frontend/src/routes/reset-cross-signing.cancelled.tsx b/frontend/src/routes/reset-cross-signing.cancelled.tsx index 16be2dc27..290d721ae 100644 --- a/frontend/src/routes/reset-cross-signing.cancelled.tsx +++ b/frontend/src/routes/reset-cross-signing.cancelled.tsx @@ -3,13 +3,12 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -import { createFileRoute } from "@tanstack/react-router"; import IconKeyOffSolid from "@vector-im/compound-design-tokens/assets/web/icons/key-off-solid"; import { Text } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; import PageHeading from "../components/PageHeading"; -export const Route = createFileRoute("/reset-cross-signing/cancelled")({ +export const Route = createFileRoute({ component: () => { const { t } = useTranslation(); return ( diff --git a/frontend/src/routes/reset-cross-signing.index.tsx b/frontend/src/routes/reset-cross-signing.index.tsx index 3badc9b32..ed9370e49 100644 --- a/frontend/src/routes/reset-cross-signing.index.tsx +++ b/frontend/src/routes/reset-cross-signing.index.tsx @@ -9,7 +9,7 @@ import { useMutation, useSuspenseQuery, } from "@tanstack/react-query"; -import { createFileRoute, notFound } from "@tanstack/react-router"; +import { notFound } from "@tanstack/react-router"; import IconCheck from "@vector-im/compound-design-tokens/assets/web/icons/check"; import IconErrorSolid from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; import IconInfo from "@vector-im/compound-design-tokens/assets/web/icons/info"; @@ -46,7 +46,7 @@ const currentViewerQuery = queryOptions({ }), }); -export const Route = createFileRoute("/reset-cross-signing/")({ +export const Route = createFileRoute({ loader: ({ context }) => context.queryClient.ensureQueryData(currentViewerQuery), diff --git a/frontend/src/routes/reset-cross-signing.success.tsx b/frontend/src/routes/reset-cross-signing.success.tsx index 0cbb153ab..eb0560ed8 100644 --- a/frontend/src/routes/reset-cross-signing.success.tsx +++ b/frontend/src/routes/reset-cross-signing.success.tsx @@ -3,7 +3,6 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -import { createFileRoute } from "@tanstack/react-router"; import IconCheckCircleSolid from "@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid"; import { Text } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; @@ -13,7 +12,7 @@ import PageHeading from "../components/PageHeading"; // https://github.com/element-hq/synapse/blob/34b758644611721911a223814a7b35d8e14067e6/synapse/rest/admin/users.py#L1335 const CROSS_SIGNING_REPLACEMENT_PERIOD_MS = 10 * 60 * 1000; // 10 minutes -export const Route = createFileRoute("/reset-cross-signing/success")({ +export const Route = createFileRoute({ component: () => { const { t } = useTranslation(); return ( diff --git a/frontend/src/routes/reset-cross-signing.tsx b/frontend/src/routes/reset-cross-signing.tsx index e17a1cf32..c5a3469e2 100644 --- a/frontend/src/routes/reset-cross-signing.tsx +++ b/frontend/src/routes/reset-cross-signing.tsx @@ -3,11 +3,7 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -import { - type ErrorComponentProps, - Outlet, - createFileRoute, -} from "@tanstack/react-router"; +import { type ErrorComponentProps, Outlet } from "@tanstack/react-router"; import IconErrorSolid from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; import { Button, Text } from "@vector-im/compound-web"; import * as v from "valibot"; @@ -20,7 +16,7 @@ const searchSchema = v.object({ deepLink: v.optional(v.boolean()), }); -export const Route = createFileRoute("/reset-cross-signing")({ +export const Route = createFileRoute({ validateSearch: searchSchema, component: () => ( diff --git a/frontend/src/routes/sessions.$id.tsx b/frontend/src/routes/sessions.$id.tsx index 6db9ecd79..956516414 100644 --- a/frontend/src/routes/sessions.$id.tsx +++ b/frontend/src/routes/sessions.$id.tsx @@ -5,7 +5,7 @@ // Please see LICENSE in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; -import { createFileRoute, notFound } from "@tanstack/react-router"; +import { notFound } from "@tanstack/react-router"; import { Alert } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; import Layout from "../components/Layout"; @@ -41,7 +41,7 @@ const query = (id: string) => graphqlRequest({ query: QUERY, signal, variables: { id } }), }); -export const Route = createFileRoute("/sessions/$id")({ +export const Route = createFileRoute({ loader: ({ context, params }) => context.queryClient.ensureQueryData(query(params.id)), notFoundComponent: NotFound, diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 58e8b70cb..872cf1e66 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -8,7 +8,7 @@ import { readFile, writeFile } from "node:fs/promises"; import { resolve } from "node:path"; import { codecovVitePlugin } from "@codecov/vite-plugin"; -import { TanStackRouterVite as tanStackRouter } from "@tanstack/router-plugin/vite"; +import { tanstackRouter } from "@tanstack/router-plugin/vite"; import react from "@vitejs/plugin-react"; import browserslistToEsbuild from "browserslist-to-esbuild"; import type { Manifest, PluginOption } from "vite"; @@ -66,9 +66,10 @@ export default defineConfig((env) => ({ plugins: [ codegen(), - tanStackRouter({ + tanstackRouter({ target: "react", autoCodeSplitting: true, + verboseFileRoutes: false, }), react(), From 66957730355207952e666b70c3ccdb8a517e96d3 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 09:11:03 +0200 Subject: [PATCH 21/31] Apply suggestions from code review Co-authored-by: Will Lewis <1543626+wrjlewis@users.noreply.github.com> --- docs/development/contributing.md | 2 +- docs/development/releasing.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/development/contributing.md b/docs/development/contributing.md index da7548557..83edcfba2 100644 --- a/docs/development/contributing.md +++ b/docs/development/contributing.md @@ -17,7 +17,7 @@ There are two main ways to contribute to MAS: ## 3. What do I need? -To get MAS running locally from source you will need: +To get MAS running locally from source you will need to: - [Install Rust and Cargo](https://www.rust-lang.org/learn/get-started). We recommend using the latest stable version of Rust. - [Install Node.js and npm](https://nodejs.org/). We recommend using the latest LTS version of Node.js. diff --git a/docs/development/releasing.md b/docs/development/releasing.md index 24863b79b..723815437 100644 --- a/docs/development/releasing.md +++ b/docs/development/releasing.md @@ -69,7 +69,7 @@ When a PR is tagged with the `Z-Build-Workflow` label: ## Changelog generation -Changelogs are automatically generated from PR titles and labels with the GitHub tools. +Changelogs are automatically generated from PR titles and labels. The configuration for those can be found in the `.github/release.yml`, but the main labels to be aware of are: From 579646130025cf0cabff3b8bcc9ea4a95f04421f Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 09:29:07 +0200 Subject: [PATCH 22/31] Fix link to contributing guidelines in the README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 104bbf2f3..8afa6d439 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,4 @@ Anyone can contribute to translations through [Localazy](https://localazy.com/el ## 🏗️ Contributing -See the [contribution guidelines](https://element-hq.github.io/matrix-authentication-service/contributing.html) for information on how to contribute to this project. +See the [contribution guidelines](https://element-hq.github.io/matrix-authentication-service/development/contributing.html) for information on how to contribute to this project. From 3cf74c3f64c368c46d6c694552eb32c11c372526 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 4 Feb 2025 16:58:53 +0000 Subject: [PATCH 23/31] make dual license explicit --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 8afa6d439..8bd75b2a9 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,15 @@ Anyone can contribute to translations through [Localazy](https://localazy.com/el ## 🏗️ Contributing See the [contribution guidelines](https://element-hq.github.io/matrix-authentication-service/development/contributing.html) for information on how to contribute to this project. + +## ⚖️ Copyright & License + +Copyright 2024, 2025 New Vector Ltd. +Copyright 2021-2024 The Matrix.org Foundation C.I.C. + +This software is dual-licensed by New Vector Ltd (Element). It can be used either: + +(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR + +(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to). +Unless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses. From a656b023168a5b5992ea95735108789aa18c135e Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 4 Feb 2025 16:59:29 +0000 Subject: [PATCH 24/31] dual licence --- LICENSE-COMMERCIAL | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 LICENSE-COMMERCIAL diff --git a/LICENSE-COMMERCIAL b/LICENSE-COMMERCIAL new file mode 100644 index 000000000..173e03e0c --- /dev/null +++ b/LICENSE-COMMERCIAL @@ -0,0 +1,6 @@ +Licensees holding a valid commercial license with Element may use this +software in accordance with the terms contained in a written agreement +between you and Element. + +To purchase a commercial license please contact our sales team at +licensing@element.io From 52b0a9b2ba9037a0af4f530777f3a543427b533c Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 10:26:28 +0200 Subject: [PATCH 25/31] Update license headers to match the actual license --- .github/scripts/cleanup-pr.cjs | 4 +- .github/scripts/commit-and-tag.cjs | 4 +- .github/scripts/create-release-branch.cjs | 4 +- .github/scripts/create-version-tag.cjs | 4 +- .github/scripts/merge-back.cjs | 4 +- .github/scripts/update-release-branch.cjs | 4 +- .github/scripts/update-unstable-tag.cjs | 4 +- crates/axum-utils/src/client_authorization.rs | 4 +- crates/axum-utils/src/cookies.rs | 4 +- crates/axum-utils/src/csrf.rs | 6 +-- crates/axum-utils/src/error_wrapper.rs | 6 +-- crates/axum-utils/src/fancy_error.rs | 6 +-- crates/axum-utils/src/jwt.rs | 6 +-- crates/axum-utils/src/language_detection.rs | 6 +-- crates/axum-utils/src/lib.rs | 6 +-- crates/axum-utils/src/sentry.rs | 6 +-- crates/axum-utils/src/session.rs | 6 +-- crates/axum-utils/src/user_authorization.rs | 4 +- crates/cli/build.rs | 4 +- crates/cli/src/app_state.rs | 6 +-- crates/cli/src/commands/config.rs | 6 +-- crates/cli/src/commands/database.rs | 6 +-- crates/cli/src/commands/debug.rs | 4 +- crates/cli/src/commands/doctor.rs | 6 +-- crates/cli/src/commands/manage.rs | 6 +-- crates/cli/src/commands/mod.rs | 6 +-- crates/cli/src/commands/server.rs | 6 +-- crates/cli/src/commands/syn2mas.rs | 4 +- crates/cli/src/commands/templates.rs | 6 +-- crates/cli/src/commands/worker.rs | 6 +-- crates/cli/src/lifecycle.rs | 4 +- crates/cli/src/main.rs | 6 +-- crates/cli/src/server.rs | 4 +- crates/cli/src/sync.rs | 6 +-- crates/cli/src/telemetry.rs | 6 +-- crates/cli/src/telemetry/tokio.rs | 4 +- crates/cli/src/util.rs | 6 +-- crates/config/src/bin/schema.rs | 6 +-- crates/config/src/lib.rs | 6 +-- crates/config/src/schema.rs | 6 +-- crates/config/src/sections/account.rs | 6 +-- crates/config/src/sections/branding.rs | 6 +-- crates/config/src/sections/captcha.rs | 6 +-- crates/config/src/sections/clients.rs | 6 +-- crates/config/src/sections/database.rs | 6 +-- crates/config/src/sections/email.rs | 6 +-- crates/config/src/sections/experimental.rs | 6 +-- crates/config/src/sections/http.rs | 6 +-- crates/config/src/sections/matrix.rs | 6 +-- crates/config/src/sections/mod.rs | 6 +-- crates/config/src/sections/passwords.rs | 6 +-- crates/config/src/sections/policy.rs | 6 +-- crates/config/src/sections/rate_limiting.rs | 4 +- crates/config/src/sections/secrets.rs | 6 +-- crates/config/src/sections/telemetry.rs | 6 +-- crates/config/src/sections/templates.rs | 6 +-- crates/config/src/sections/upstream_oauth2.rs | 6 +-- crates/config/src/util.rs | 6 +-- crates/context/src/fmt.rs | 4 +- crates/context/src/future.rs | 4 +- crates/context/src/layer.rs | 4 +- crates/context/src/lib.rs | 4 +- crates/context/src/service.rs | 4 +- crates/data-model/examples/ua-parser.rs | 6 +-- crates/data-model/src/compat/device.rs | 6 +-- crates/data-model/src/compat/mod.rs | 6 +-- crates/data-model/src/compat/session.rs | 6 +-- crates/data-model/src/compat/sso_login.rs | 6 +-- crates/data-model/src/lib.rs | 6 +-- .../src/oauth2/authorization_grant.rs | 6 +-- crates/data-model/src/oauth2/client.rs | 6 +-- .../src/oauth2/device_code_grant.rs | 6 +-- crates/data-model/src/oauth2/mod.rs | 6 +-- crates/data-model/src/oauth2/session.rs | 6 +-- crates/data-model/src/policy_data.rs | 4 +- crates/data-model/src/site_config.rs | 6 +-- crates/data-model/src/tokens.rs | 4 +- crates/data-model/src/upstream_oauth2/link.rs | 6 +-- crates/data-model/src/upstream_oauth2/mod.rs | 6 +-- .../src/upstream_oauth2/provider.rs | 6 +-- .../data-model/src/upstream_oauth2/session.rs | 6 +-- crates/data-model/src/user_agent.rs | 6 +-- crates/data-model/src/users.rs | 6 +-- crates/email/src/lib.rs | 6 +-- crates/email/src/mailer.rs | 6 +-- crates/email/src/transport.rs | 6 +-- crates/handlers/src/activity_tracker/bound.rs | 6 +-- crates/handlers/src/activity_tracker/mod.rs | 6 +-- .../handlers/src/activity_tracker/worker.rs | 6 +-- crates/handlers/src/admin/call_context.rs | 4 +- crates/handlers/src/admin/mod.rs | 6 +-- crates/handlers/src/admin/model.rs | 6 +-- crates/handlers/src/admin/params.rs | 6 +-- crates/handlers/src/admin/response.rs | 6 +-- crates/handlers/src/admin/schema.rs | 6 +-- .../src/admin/v1/compat_sessions/get.rs | 4 +- .../src/admin/v1/compat_sessions/list.rs | 4 +- .../src/admin/v1/compat_sessions/mod.rs | 4 +- crates/handlers/src/admin/v1/mod.rs | 6 +-- .../src/admin/v1/oauth2_sessions/get.rs | 6 +-- .../src/admin/v1/oauth2_sessions/list.rs | 6 +-- .../src/admin/v1/oauth2_sessions/mod.rs | 6 +-- .../handlers/src/admin/v1/policy_data/get.rs | 3 +- .../src/admin/v1/policy_data/get_latest.rs | 3 +- .../handlers/src/admin/v1/policy_data/mod.rs | 4 +- .../handlers/src/admin/v1/policy_data/set.rs | 3 +- .../src/admin/v1/upstream_oauth_links/add.rs | 4 +- .../admin/v1/upstream_oauth_links/delete.rs | 4 +- .../src/admin/v1/upstream_oauth_links/get.rs | 4 +- .../src/admin/v1/upstream_oauth_links/list.rs | 4 +- .../src/admin/v1/upstream_oauth_links/mod.rs | 4 +- .../handlers/src/admin/v1/user_emails/add.rs | 4 +- .../src/admin/v1/user_emails/delete.rs | 4 +- .../handlers/src/admin/v1/user_emails/get.rs | 4 +- .../handlers/src/admin/v1/user_emails/list.rs | 6 +-- .../handlers/src/admin/v1/user_emails/mod.rs | 4 +- .../admin/v1/user_registration_tokens/add.rs | 5 ++- .../admin/v1/user_registration_tokens/get.rs | 5 ++- .../admin/v1/user_registration_tokens/list.rs | 5 ++- .../admin/v1/user_registration_tokens/mod.rs | 5 ++- .../v1/user_registration_tokens/revoke.rs | 5 ++- .../v1/user_registration_tokens/unrevoke.rs | 5 ++- .../v1/user_registration_tokens/update.rs | 5 ++- .../src/admin/v1/user_sessions/get.rs | 4 +- .../src/admin/v1/user_sessions/list.rs | 4 +- .../src/admin/v1/user_sessions/mod.rs | 4 +- crates/handlers/src/admin/v1/users/add.rs | 6 +-- .../src/admin/v1/users/by_username.rs | 6 +-- .../handlers/src/admin/v1/users/deactivate.rs | 6 +-- crates/handlers/src/admin/v1/users/get.rs | 6 +-- crates/handlers/src/admin/v1/users/list.rs | 6 +-- crates/handlers/src/admin/v1/users/lock.rs | 6 +-- crates/handlers/src/admin/v1/users/mod.rs | 6 +-- .../handlers/src/admin/v1/users/set_admin.rs | 6 +-- .../src/admin/v1/users/set_password.rs | 6 +-- crates/handlers/src/admin/v1/users/unlock.rs | 6 +-- crates/handlers/src/bin/api-schema.rs | 4 +- crates/handlers/src/bin/graphql-schema.rs | 6 +-- crates/handlers/src/captcha.rs | 6 +-- crates/handlers/src/compat/login.rs | 6 +-- .../handlers/src/compat/login_sso_complete.rs | 6 +-- .../handlers/src/compat/login_sso_redirect.rs | 6 +-- crates/handlers/src/compat/logout.rs | 6 +-- crates/handlers/src/compat/logout_all.rs | 4 +- crates/handlers/src/compat/mod.rs | 4 +- crates/handlers/src/compat/refresh.rs | 6 +-- crates/handlers/src/graphql/mod.rs | 4 +- .../src/graphql/model/browser_sessions.rs | 6 +-- .../src/graphql/model/compat_sessions.rs | 6 +-- crates/handlers/src/graphql/model/cursor.rs | 6 +-- crates/handlers/src/graphql/model/matrix.rs | 6 +-- crates/handlers/src/graphql/model/mod.rs | 4 +- crates/handlers/src/graphql/model/node.rs | 4 +- crates/handlers/src/graphql/model/oauth.rs | 6 +-- .../handlers/src/graphql/model/site_config.rs | 6 +-- .../src/graphql/model/upstream_oauth.rs | 6 +-- crates/handlers/src/graphql/model/users.rs | 4 +- .../src/graphql/model/viewer/anonymous.rs | 6 +-- .../handlers/src/graphql/model/viewer/mod.rs | 6 +-- .../src/graphql/mutations/browser_session.rs | 6 +-- .../src/graphql/mutations/compat_session.rs | 6 +-- .../handlers/src/graphql/mutations/matrix.rs | 6 +-- crates/handlers/src/graphql/mutations/mod.rs | 6 +-- .../src/graphql/mutations/oauth2_session.rs | 6 +-- crates/handlers/src/graphql/mutations/user.rs | 4 +- .../src/graphql/mutations/user_email.rs | 6 +-- crates/handlers/src/graphql/query/mod.rs | 4 +- crates/handlers/src/graphql/query/session.rs | 6 +-- .../src/graphql/query/upstream_oauth.rs | 6 +-- crates/handlers/src/graphql/query/user.rs | 6 +-- crates/handlers/src/graphql/query/viewer.rs | 6 +-- crates/handlers/src/graphql/state.rs | 4 +- crates/handlers/src/graphql/tests.rs | 6 +-- crates/handlers/src/health.rs | 6 +-- crates/handlers/src/lib.rs | 4 +- .../src/oauth2/authorization/callback.rs | 6 +-- .../src/oauth2/authorization/consent.rs | 4 +- .../handlers/src/oauth2/authorization/mod.rs | 6 +-- .../handlers/src/oauth2/device/authorize.rs | 6 +-- crates/handlers/src/oauth2/device/consent.rs | 6 +-- crates/handlers/src/oauth2/device/link.rs | 6 +-- crates/handlers/src/oauth2/device/mod.rs | 6 +-- crates/handlers/src/oauth2/discovery.rs | 6 +-- crates/handlers/src/oauth2/introspection.rs | 6 +-- crates/handlers/src/oauth2/keys.rs | 6 +-- crates/handlers/src/oauth2/mod.rs | 6 +-- crates/handlers/src/oauth2/registration.rs | 6 +-- crates/handlers/src/oauth2/revoke.rs | 6 +-- crates/handlers/src/oauth2/token.rs | 6 +-- crates/handlers/src/oauth2/userinfo.rs | 6 +-- crates/handlers/src/oauth2/webfinger.rs | 6 +-- crates/handlers/src/passwords.rs | 4 +- crates/handlers/src/preferred_language.rs | 4 +- crates/handlers/src/rate_limit.rs | 6 +-- crates/handlers/src/session.rs | 4 +- crates/handlers/src/test_utils.rs | 4 +- .../handlers/src/upstream_oauth2/authorize.rs | 6 +-- crates/handlers/src/upstream_oauth2/cache.rs | 6 +-- .../handlers/src/upstream_oauth2/callback.rs | 6 +-- crates/handlers/src/upstream_oauth2/cookie.rs | 6 +-- crates/handlers/src/upstream_oauth2/link.rs | 6 +-- crates/handlers/src/upstream_oauth2/mod.rs | 6 +-- .../handlers/src/upstream_oauth2/template.rs | 6 +-- crates/handlers/src/views/app.rs | 6 +-- crates/handlers/src/views/index.rs | 6 +-- crates/handlers/src/views/login.rs | 6 +-- crates/handlers/src/views/logout.rs | 6 +-- crates/handlers/src/views/mod.rs | 6 +-- crates/handlers/src/views/recovery/mod.rs | 6 +-- .../handlers/src/views/recovery/progress.rs | 6 +-- crates/handlers/src/views/recovery/start.rs | 6 +-- crates/handlers/src/views/register/cookie.rs | 4 +- crates/handlers/src/views/register/mod.rs | 6 +-- .../handlers/src/views/register/password.rs | 6 +-- .../src/views/register/steps/display_name.rs | 4 +- .../src/views/register/steps/finish.rs | 4 +- .../handlers/src/views/register/steps/mod.rs | 4 +- .../register/steps/registration_token.rs | 4 +- .../src/views/register/steps/verify_email.rs | 4 +- crates/handlers/src/views/shared.rs | 6 +-- crates/http/src/ext.rs | 6 +-- crates/http/src/lib.rs | 6 +-- crates/http/src/reqwest.rs | 6 +-- crates/i18n-scan/src/key.rs | 6 +-- crates/i18n-scan/src/main.rs | 6 +-- crates/i18n-scan/src/minijinja.rs | 6 +-- crates/i18n/src/lib.rs | 6 +-- crates/i18n/src/sprintf/argument.rs | 6 +-- crates/i18n/src/sprintf/formatter.rs | 6 +-- crates/i18n/src/sprintf/grammar.pest | 2 +- crates/i18n/src/sprintf/message.rs | 6 +-- crates/i18n/src/sprintf/mod.rs | 6 +-- crates/i18n/src/sprintf/parser.rs | 6 +-- crates/i18n/src/translations.rs | 6 +-- crates/i18n/src/translator.rs | 6 +-- crates/iana-codegen/src/generation.rs | 6 +-- crates/iana-codegen/src/jose.rs | 6 +-- crates/iana-codegen/src/main.rs | 8 ++-- crates/iana-codegen/src/oauth.rs | 6 +-- crates/iana-codegen/src/traits.rs | 6 +-- crates/iana/src/jose.rs | 6 +-- crates/iana/src/lib.rs | 6 +-- crates/iana/src/oauth.rs | 6 +-- crates/jose/src/base64.rs | 5 +++ crates/jose/src/claims.rs | 6 +-- crates/jose/src/constraints.rs | 6 +-- crates/jose/src/jwa/asymmetric.rs | 6 +-- crates/jose/src/jwa/hmac.rs | 6 +-- crates/jose/src/jwa/mod.rs | 6 +-- crates/jose/src/jwa/signature.rs | 6 +-- crates/jose/src/jwa/symmetric.rs | 6 +-- crates/jose/src/jwk/mod.rs | 6 +-- crates/jose/src/jwk/private_parameters.rs | 6 +-- crates/jose/src/jwk/public_parameters.rs | 6 +-- crates/jose/src/jwt/header.rs | 6 +-- crates/jose/src/jwt/mod.rs | 6 +-- crates/jose/src/jwt/raw.rs | 6 +-- crates/jose/src/jwt/signed.rs | 6 +-- crates/jose/src/lib.rs | 6 +-- crates/jose/tests/generate.py | 5 +++ crates/jose/tests/jws.rs | 6 +-- crates/keystore/src/encrypter.rs | 6 +-- crates/keystore/src/lib.rs | 6 +-- crates/keystore/tests/keystore.rs | 6 +-- crates/listener/examples/demo/main.rs | 6 +-- crates/listener/src/lib.rs | 6 +-- crates/listener/src/maybe_tls.rs | 6 +-- .../listener/src/proxy_protocol/acceptor.rs | 6 +-- crates/listener/src/proxy_protocol/maybe.rs | 6 +-- crates/listener/src/proxy_protocol/mod.rs | 6 +-- crates/listener/src/proxy_protocol/v1.rs | 6 +-- crates/listener/src/server.rs | 6 +-- crates/listener/src/unix_or_tcp.rs | 6 +-- crates/matrix-synapse/src/error.rs | 6 +-- crates/matrix-synapse/src/lib.rs | 6 +-- crates/matrix/src/lib.rs | 6 +-- crates/matrix/src/mock.rs | 6 +-- crates/matrix/src/readonly.rs | 4 +- crates/oauth2-types/src/errors.rs | 6 +-- crates/oauth2-types/src/lib.rs | 6 +-- crates/oauth2-types/src/oidc.rs | 6 +-- crates/oauth2-types/src/pkce.rs | 6 +-- .../src/registration/client_metadata_serde.rs | 6 +-- crates/oauth2-types/src/registration/mod.rs | 6 +-- crates/oauth2-types/src/requests.rs | 6 +-- crates/oauth2-types/src/response_type.rs | 6 +-- crates/oauth2-types/src/scope.rs | 6 +-- crates/oauth2-types/src/test_utils.rs | 6 +-- crates/oauth2-types/src/webfinger.rs | 6 +-- crates/oidc-client/src/error.rs | 6 +-- crates/oidc-client/src/lib.rs | 6 +-- .../src/requests/authorization_code.rs | 6 +-- .../src/requests/client_credentials.rs | 6 +-- crates/oidc-client/src/requests/discovery.rs | 6 +-- crates/oidc-client/src/requests/jose.rs | 6 +-- crates/oidc-client/src/requests/mod.rs | 6 +-- .../oidc-client/src/requests/refresh_token.rs | 6 +-- crates/oidc-client/src/requests/token.rs | 6 +-- crates/oidc-client/src/requests/userinfo.rs | 6 +-- .../src/types/client_credentials.rs | 6 +-- crates/oidc-client/src/types/mod.rs | 6 +-- crates/oidc-client/tests/it/main.rs | 6 +-- .../tests/it/requests/authorization_code.rs | 6 +-- .../tests/it/requests/client_credentials.rs | 6 +-- .../tests/it/requests/discovery.rs | 6 +-- crates/oidc-client/tests/it/requests/jose.rs | 6 +-- crates/oidc-client/tests/it/requests/mod.rs | 6 +-- .../tests/it/requests/refresh_token.rs | 6 +-- .../oidc-client/tests/it/requests/userinfo.rs | 6 +-- .../tests/it/types/client_credentials.rs | 6 +-- crates/oidc-client/tests/it/types/mod.rs | 6 +-- crates/policy/src/bin/schema.rs | 6 +-- crates/policy/src/lib.rs | 6 +-- crates/policy/src/model.rs | 6 +-- crates/router/src/endpoints.rs | 6 +-- crates/router/src/lib.rs | 6 +-- crates/router/src/traits.rs | 6 +-- crates/router/src/url_builder.rs | 6 +-- crates/spa/src/lib.rs | 6 +-- crates/spa/src/vite.rs | 6 +-- crates/storage-pg/build.rs | 6 +-- crates/storage-pg/src/app_session.rs | 6 +-- crates/storage-pg/src/compat/access_token.rs | 6 +-- crates/storage-pg/src/compat/mod.rs | 6 +-- crates/storage-pg/src/compat/refresh_token.rs | 6 +-- crates/storage-pg/src/compat/session.rs | 6 +-- crates/storage-pg/src/compat/sso_login.rs | 6 +-- crates/storage-pg/src/errors.rs | 6 +-- crates/storage-pg/src/filter.rs | 6 +-- crates/storage-pg/src/iden.rs | 4 +- crates/storage-pg/src/lib.rs | 6 +-- crates/storage-pg/src/oauth2/access_token.rs | 6 +-- .../src/oauth2/authorization_grant.rs | 6 +-- crates/storage-pg/src/oauth2/client.rs | 6 +-- .../src/oauth2/device_code_grant.rs | 6 +-- crates/storage-pg/src/oauth2/mod.rs | 6 +-- crates/storage-pg/src/oauth2/refresh_token.rs | 6 +-- crates/storage-pg/src/oauth2/session.rs | 6 +-- crates/storage-pg/src/pagination.rs | 6 +-- crates/storage-pg/src/policy_data.rs | 4 +- crates/storage-pg/src/queue/job.rs | 6 +-- crates/storage-pg/src/queue/mod.rs | 6 +-- crates/storage-pg/src/queue/schedule.rs | 6 +-- crates/storage-pg/src/queue/worker.rs | 6 +-- crates/storage-pg/src/repository.rs | 6 +-- crates/storage-pg/src/telemetry.rs | 4 +- crates/storage-pg/src/tracing.rs | 6 +-- crates/storage-pg/src/upstream_oauth2/link.rs | 6 +-- crates/storage-pg/src/upstream_oauth2/mod.rs | 6 +-- .../src/upstream_oauth2/provider.rs | 6 +-- .../storage-pg/src/upstream_oauth2/session.rs | 6 +-- crates/storage-pg/src/user/email.rs | 4 +- crates/storage-pg/src/user/mod.rs | 6 +-- crates/storage-pg/src/user/password.rs | 6 +-- crates/storage-pg/src/user/recovery.rs | 6 +-- crates/storage-pg/src/user/registration.rs | 4 +- .../storage-pg/src/user/registration_token.rs | 4 +- crates/storage-pg/src/user/session.rs | 6 +-- crates/storage-pg/src/user/terms.rs | 6 +-- crates/storage-pg/src/user/tests.rs | 4 +- crates/storage/src/app_session.rs | 6 +-- crates/storage/src/clock.rs | 6 +-- crates/storage/src/compat/access_token.rs | 6 +-- crates/storage/src/compat/mod.rs | 6 +-- crates/storage/src/compat/refresh_token.rs | 6 +-- crates/storage/src/compat/session.rs | 6 +-- crates/storage/src/compat/sso_login.rs | 6 +-- crates/storage/src/lib.rs | 6 +-- crates/storage/src/oauth2/access_token.rs | 6 +-- .../storage/src/oauth2/authorization_grant.rs | 6 +-- crates/storage/src/oauth2/client.rs | 6 +-- .../storage/src/oauth2/device_code_grant.rs | 6 +-- crates/storage/src/oauth2/mod.rs | 6 +-- crates/storage/src/oauth2/refresh_token.rs | 6 +-- crates/storage/src/oauth2/session.rs | 6 +-- crates/storage/src/pagination.rs | 6 +-- crates/storage/src/policy_data.rs | 4 +- crates/storage/src/queue/job.rs | 6 +-- crates/storage/src/queue/mod.rs | 6 +-- crates/storage/src/queue/schedule.rs | 6 +-- crates/storage/src/queue/tasks.rs | 4 +- crates/storage/src/queue/worker.rs | 6 +-- crates/storage/src/repository.rs | 6 +-- crates/storage/src/upstream_oauth2/link.rs | 6 +-- crates/storage/src/upstream_oauth2/mod.rs | 6 +-- .../storage/src/upstream_oauth2/provider.rs | 6 +-- crates/storage/src/upstream_oauth2/session.rs | 6 +-- crates/storage/src/user/email.rs | 4 +- crates/storage/src/user/mod.rs | 6 +-- crates/storage/src/user/password.rs | 6 +-- crates/storage/src/user/recovery.rs | 6 +-- crates/storage/src/user/registration.rs | 4 +- crates/storage/src/user/registration_token.rs | 4 +- crates/storage/src/user/session.rs | 6 +-- crates/storage/src/user/terms.rs | 6 +-- crates/storage/src/utils.rs | 6 +-- crates/syn2mas/src/lib.rs | 6 +-- crates/syn2mas/src/mas_writer/checks.rs | 4 +- .../src/mas_writer/constraint_pausing.rs | 4 +- .../mas_writer/fixtures/upstream_provider.sql | 2 +- crates/syn2mas/src/mas_writer/locking.rs | 4 +- crates/syn2mas/src/mas_writer/mod.rs | 4 +- .../syn2mas_revert_temporary_tables.sql | 2 +- .../mas_writer/syn2mas_temporary_tables.sql | 2 +- crates/syn2mas/src/migration.rs | 6 +-- crates/syn2mas/src/progress.rs | 4 +- crates/syn2mas/src/synapse_reader/checks.rs | 4 +- .../syn2mas/src/synapse_reader/config/mod.rs | 4 +- .../syn2mas/src/synapse_reader/config/oidc.rs | 4 +- .../fixtures/access_token_alice.sql | 2 +- .../access_token_alice_with_puppet.sql | 2 +- .../access_token_alice_with_refresh_token.sql | 2 +- ..._token_alice_with_unused_refresh_token.sql | 2 +- .../synapse_reader/fixtures/devices_alice.sql | 2 +- .../fixtures/external_ids_alice.sql | 2 +- .../fixtures/threepids_alice.sql | 2 +- .../synapse_reader/fixtures/user_alice.sql | 2 +- crates/syn2mas/src/synapse_reader/mod.rs | 6 +-- crates/syn2mas/src/telemetry.rs | 4 +- .../20250117064958_users.sql | 37 +++++++++---------- .../20250128141011_threepids.sql | 2 +- .../20250128162513_external_ids.sql | 2 +- ...250128201100_access_and_refresh_tokens.sql | 2 +- .../20250129140230_devices.sql | 2 +- crates/tasks/src/database.rs | 6 +-- crates/tasks/src/email.rs | 4 +- crates/tasks/src/lib.rs | 4 +- crates/tasks/src/matrix.rs | 6 +-- crates/tasks/src/new_queue.rs | 6 +-- crates/tasks/src/recovery.rs | 6 +-- crates/tasks/src/sessions.rs | 4 +- crates/tasks/src/user.rs | 6 +-- crates/templates/src/context.rs | 4 +- crates/templates/src/context/branding.rs | 6 +-- crates/templates/src/context/captcha.rs | 6 +-- crates/templates/src/context/ext.rs | 6 +-- crates/templates/src/context/features.rs | 6 +-- crates/templates/src/forms.rs | 6 +-- crates/templates/src/functions.rs | 6 +-- crates/templates/src/lib.rs | 6 +-- crates/templates/src/macros.rs | 6 +-- crates/tower/src/lib.rs | 6 +-- crates/tower/src/metrics/duration.rs | 6 +-- crates/tower/src/metrics/in_flight.rs | 6 +-- crates/tower/src/metrics/make_attributes.rs | 6 +-- crates/tower/src/metrics/mod.rs | 6 +-- crates/tower/src/trace_context.rs | 6 +-- crates/tower/src/tracing/enrich_span.rs | 6 +-- crates/tower/src/tracing/future.rs | 6 +-- crates/tower/src/tracing/layer.rs | 6 +-- crates/tower/src/tracing/make_span.rs | 6 +-- crates/tower/src/tracing/mod.rs | 6 +-- crates/tower/src/tracing/service.rs | 6 +-- crates/tower/src/utils.rs | 6 +-- frontend/.storybook/main.ts | 6 +-- frontend/.storybook/preview.tsx | 6 +-- frontend/codegen.ts | 6 +-- frontend/i18next-parser.config.ts | 6 +-- frontend/index.html | 6 +-- frontend/knip.config.ts | 6 +-- frontend/src/@types/i18next.d.ts | 6 +-- .../src/components/AccountDeleteButton.tsx | 4 +- ...ccountManagementPasswordPreview.module.css | 10 ++--- .../AccountManagementPasswordPreview.tsx | 6 +-- .../AccountManagementPasswordPreview/index.ts | 6 +-- frontend/src/components/BrowserSession.tsx | 6 +-- frontend/src/components/ButtonLink.module.css | 6 +-- frontend/src/components/ButtonLink.tsx | 6 +-- .../Client/OAuth2ClientDetail.test.tsx | 6 +-- .../components/Client/OAuth2ClientDetail.tsx | 4 +- .../Collapsible/Collapsible.module.css | 4 +- .../Collapsible/Collapsible.stories.tsx | 4 +- .../components/Collapsible/Collapsible.tsx | 6 +-- frontend/src/components/Collapsible/index.ts | 6 +-- .../src/components/CompatSession.test.tsx | 8 ++-- frontend/src/components/CompatSession.tsx | 4 +- frontend/src/components/DateTime.stories.tsx | 6 +-- frontend/src/components/DateTime.tsx | 6 +-- .../src/components/Dialog/Dialog.module.css | 10 ++--- .../src/components/Dialog/Dialog.stories.tsx | 6 +-- frontend/src/components/Dialog/Dialog.tsx | 6 +-- frontend/src/components/Dialog/index.ts | 6 +-- .../EmptyState/EmptyState.module.css | 10 ++--- .../EmptyState/EmptyState.stories.tsx | 6 +-- .../src/components/EmptyState/EmptyState.tsx | 6 +-- frontend/src/components/EmptyState/index.ts | 6 +-- frontend/src/components/ErrorBoundary.tsx | 6 +-- .../ExternalLink/ExternalLink.module.css | 10 ++--- .../components/ExternalLink/ExternalLink.tsx | 6 +-- .../src/components/Filter/Filter.module.css | 10 ++--- .../src/components/Filter/Filter.stories.tsx | 6 +-- frontend/src/components/Filter/Filter.tsx | 6 +-- frontend/src/components/Filter/index.ts | 6 +-- .../src/components/Footer/Footer.module.css | 10 ++--- .../src/components/Footer/Footer.stories.tsx | 6 +-- frontend/src/components/Footer/Footer.tsx | 6 +-- frontend/src/components/Footer/index.ts | 6 +-- .../src/components/GenericError.module.css | 10 ++--- frontend/src/components/GenericError.tsx | 6 +-- .../src/components/Layout/Layout.module.css | 10 ++--- frontend/src/components/Layout/Layout.tsx | 6 +-- frontend/src/components/Layout/index.ts | 6 +-- frontend/src/components/Link.tsx | 6 +-- .../LoadingScreen/LoadingScreen.module.css | 10 ++--- .../LoadingScreen/LoadingScreen.stories.tsx | 6 +-- .../LoadingScreen/LoadingScreen.test.tsx | 6 +-- .../LoadingScreen/LoadingScreen.tsx | 6 +-- .../src/components/LoadingScreen/index.ts | 6 +-- .../LoadingSpinner/LoadingSpinner.module.css | 10 ++--- .../LoadingSpinner/LoadingSpinner.stories.tsx | 6 +-- .../LoadingSpinner/LoadingSpinner.tsx | 6 +-- .../src/components/LoadingSpinner/index.ts | 6 +-- .../src/components/NavBar/NavBar.module.css | 10 ++--- .../src/components/NavBar/NavBar.stories.tsx | 6 +-- frontend/src/components/NavBar/NavBar.tsx | 6 +-- frontend/src/components/NavBar/index.ts | 6 +-- .../src/components/NavItem/NavItem.module.css | 10 ++--- frontend/src/components/NavItem/NavItem.tsx | 6 +-- frontend/src/components/NavItem/index.ts | 6 +-- frontend/src/components/NotFound.tsx | 6 +-- .../src/components/OAuth2Session.test.tsx | 6 +-- frontend/src/components/OAuth2Session.tsx | 5 +++ .../PageHeading/PageHeading.module.css | 10 ++--- .../components/PageHeading/PageHeading.tsx | 6 +-- frontend/src/components/PageHeading/index.ts | 6 +-- .../src/components/PaginationControls.tsx | 6 +-- .../src/components/PasswordConfirmation.tsx | 4 +- .../PasswordCreationDoubleInput.tsx | 6 +-- .../components/Separator/Separator.module.css | 4 +- .../src/components/Separator/Separator.tsx | 4 +- frontend/src/components/Separator/index.tsx | 4 +- .../Session/ClientAvatar.module.css | 10 ++--- .../components/Session/ClientAvatar.test.tsx | 6 +-- .../src/components/Session/ClientAvatar.tsx | 6 +-- .../Session/DeviceTypeIcon.module.css | 10 ++--- .../Session/DeviceTypeIcon.stories.tsx | 6 +-- .../Session/DeviceTypeIcon.test.tsx | 6 +-- .../src/components/Session/DeviceTypeIcon.tsx | 6 +-- .../Session/EndBrowserSessionButton.tsx | 4 +- .../Session/EndCompatSessionButton.tsx | 5 +++ .../Session/EndOAuth2SessionButton.tsx | 4 +- .../components/Session/EndSessionButton.tsx | 4 +- .../components/Session/LastActive.module.css | 10 ++--- .../components/Session/LastActive.stories.tsx | 6 +-- .../components/Session/LastActive.test.tsx | 6 +-- .../src/components/Session/LastActive.tsx | 6 +-- .../SessionCard/SessionCard.module.css | 10 ++--- .../SessionCard/SessionCard.stories.tsx | 6 +-- .../components/SessionCard/SessionCard.tsx | 6 +-- frontend/src/components/SessionCard/index.ts | 6 +-- .../SessionDetail/BrowserSessionDetail.tsx | 4 +- .../CompatSessionDetail.test.tsx | 6 +-- .../SessionDetail/CompatSessionDetail.tsx | 4 +- .../SessionDetail/EditSessionName.tsx | 4 +- .../OAuth2SessionDetail.test.tsx | 6 +-- .../SessionDetail/OAuth2SessionDetail.tsx | 4 +- .../SessionDetail/SessionHeader.module.css | 10 ++--- .../SessionDetail/SessionHeader.stories.tsx | 6 +-- .../SessionDetail/SessionHeader.test.tsx | 6 +-- .../SessionDetail/SessionHeader.tsx | 6 +-- .../components/SessionDetail/SessionInfo.tsx | 4 +- .../src/components/Typography.stories.tsx | 6 +-- frontend/src/components/Typography.tsx | 6 +-- .../components/UserEmail/UserEmail.module.css | 10 ++--- .../src/components/UserEmail/UserEmail.tsx | 4 +- frontend/src/components/UserEmail/index.ts | 6 +-- .../UserGreeting/UserGreeting.module.css | 10 ++--- .../UserGreeting/UserGreeting.stories.tsx | 6 +-- .../components/UserGreeting/UserGreeting.tsx | 6 +-- frontend/src/components/UserGreeting/index.ts | 6 +-- .../components/UserProfile/AddEmailForm.tsx | 4 +- .../components/UserProfile/UserEmailList.tsx | 4 +- .../BrowserSessionsOverview.module.css | 10 ++--- .../BrowserSessionsOverview.stories.tsx | 6 +-- .../BrowserSessionsOverview.test.tsx | 6 +-- .../BrowserSessionsOverview.tsx | 6 +-- frontend/src/config.ts | 6 +-- frontend/src/graphql.ts | 6 +-- frontend/src/i18n.ts | 6 +-- frontend/src/i18n/password_changes.ts | 6 +-- frontend/src/main.tsx | 6 +-- frontend/src/pagination.ts | 6 +-- frontend/src/router.tsx | 6 +-- frontend/src/routes/__root.tsx | 6 +-- frontend/src/routes/_account.index.tsx | 4 +- frontend/src/routes/_account.plan.index.tsx | 4 +- .../src/routes/_account.sessions.browsers.tsx | 4 +- .../src/routes/_account.sessions.index.tsx | 4 +- frontend/src/routes/_account.tsx | 4 +- frontend/src/routes/clients.$id.tsx | 4 +- frontend/src/routes/devices.$.tsx | 6 +-- frontend/src/routes/emails.$id.in-use.tsx | 4 +- frontend/src/routes/emails.$id.verify.tsx | 4 +- frontend/src/routes/password.change.index.tsx | 4 +- .../src/routes/password.change.success.tsx | 4 +- .../src/routes/password.recovery.index.tsx | 4 +- .../routes/reset-cross-signing.cancelled.tsx | 6 +-- .../src/routes/reset-cross-signing.index.tsx | 6 +-- .../routes/reset-cross-signing.success.tsx | 6 +-- frontend/src/routes/reset-cross-signing.tsx | 6 +-- frontend/src/routes/sessions.$id.tsx | 4 +- frontend/src/shared.css | 10 ++--- frontend/src/styles/cpd-button.css | 10 ++--- frontend/src/styles/cpd-checkbox-control.css | 10 ++--- frontend/src/styles/cpd-form.css | 10 ++--- frontend/src/styles/cpd-link.css | 10 ++--- frontend/src/styles/cpd-mfa-control.css | 10 ++--- frontend/src/styles/cpd-text-control.css | 10 ++--- frontend/src/swagger.ts | 4 +- frontend/src/templates.css | 10 ++--- frontend/src/test-utils/mockLocale.ts | 6 +-- frontend/src/test-utils/render.tsx | 6 +-- frontend/src/test-utils/router.tsx | 6 +-- frontend/src/utils/dates.ts | 6 +-- frontend/src/utils/deviceIdFromScope.test.ts | 6 +-- frontend/src/utils/deviceIdFromScope.ts | 6 +-- .../src/utils/password_complexity/index.ts | 6 +-- frontend/src/utils/simplifyUrl.ts | 4 +- frontend/src/vite-env.d.ts | 6 +-- frontend/stories/routes/app.tsx | 5 +++ frontend/stories/routes/index.stories.tsx | 6 +-- .../routes/reset-cross-signing.stories.tsx | 6 +-- frontend/tailwind.config.cjs | 6 +-- frontend/tests/mocks/handlers.ts | 4 +- frontend/tests/routes/account/index.test.tsx | 6 +-- frontend/tests/routes/render.tsx | 6 +-- .../tests/routes/reset-cross-signing.test.tsx | 6 +-- frontend/tests/routes/types.d.ts | 6 +-- frontend/vite.config.ts | 4 +- frontend/vitest.global-setup.ts | 6 +-- frontend/vitest.setup.ts | 6 +-- templates/app.html | 6 +-- templates/base.html | 6 +-- templates/components/back_to_client.html | 6 +-- templates/components/button.html | 6 +-- templates/components/captcha.html | 6 +-- templates/components/errors.html | 6 +-- templates/components/field.html | 6 +-- templates/components/footer.html | 6 +-- templates/components/icon.html | 6 +-- templates/components/idp_brand.html | 6 +-- templates/components/logout.html | 6 +-- templates/components/scope.html | 6 +-- templates/device_name.txt | 4 +- templates/emails/recovery.html | 6 +-- templates/emails/recovery.subject | 6 +-- templates/emails/recovery.txt | 6 +-- templates/emails/verification.html | 4 +- templates/emails/verification.subject | 4 +- templates/emails/verification.txt | 4 +- templates/form_post.html | 6 +-- templates/pages/404.html | 6 +-- templates/pages/account/deactivated.html | 4 +- templates/pages/account/locked.html | 4 +- templates/pages/account/logged_out.html | 4 +- templates/pages/consent.html | 6 +-- templates/pages/device_consent.html | 6 +-- templates/pages/device_link.html | 6 +-- templates/pages/error.html | 6 +-- templates/pages/index.html | 6 +-- templates/pages/login.html | 6 +-- templates/pages/policy_violation.html | 6 +-- templates/pages/reauth.html | 6 +-- templates/pages/recovery/consumed.html | 6 +-- templates/pages/recovery/disabled.html | 6 +-- templates/pages/recovery/expired.html | 6 +-- templates/pages/recovery/finish.html | 6 +-- templates/pages/recovery/progress.html | 6 +-- templates/pages/recovery/start.html | 6 +-- templates/pages/register/index.html | 6 +-- templates/pages/register/password.html | 6 +-- .../pages/register/steps/display_name.html | 4 +- .../pages/register/steps/email_in_use.html | 4 +- .../register/steps/registration_token.html | 4 +- .../pages/register/steps/verify_email.html | 6 +-- templates/pages/sso.html | 6 +-- .../pages/upstream_oauth2/do_register.html | 6 +-- .../pages/upstream_oauth2/link_mismatch.html | 6 +-- .../pages/upstream_oauth2/suggest_link.html | 6 +-- templates/swagger/doc.html | 6 +-- templates/swagger/oauth2-redirect.html | 6 +-- 681 files changed, 1957 insertions(+), 1925 deletions(-) diff --git a/.github/scripts/cleanup-pr.cjs b/.github/scripts/cleanup-pr.cjs index e5189cec8..43db85727 100644 --- a/.github/scripts/cleanup-pr.cjs +++ b/.github/scripts/cleanup-pr.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/.github/scripts/commit-and-tag.cjs b/.github/scripts/commit-and-tag.cjs index b95782541..086e1b83e 100644 --- a/.github/scripts/commit-and-tag.cjs +++ b/.github/scripts/commit-and-tag.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/.github/scripts/create-release-branch.cjs b/.github/scripts/create-release-branch.cjs index c7c0018a3..2508765ff 100644 --- a/.github/scripts/create-release-branch.cjs +++ b/.github/scripts/create-release-branch.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/.github/scripts/create-version-tag.cjs b/.github/scripts/create-version-tag.cjs index 97536c5ff..47e00ecb1 100644 --- a/.github/scripts/create-version-tag.cjs +++ b/.github/scripts/create-version-tag.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/.github/scripts/merge-back.cjs b/.github/scripts/merge-back.cjs index 30b08329d..d3948398e 100644 --- a/.github/scripts/merge-back.cjs +++ b/.github/scripts/merge-back.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/.github/scripts/update-release-branch.cjs b/.github/scripts/update-release-branch.cjs index 0a94aa217..78dbb4686 100644 --- a/.github/scripts/update-release-branch.cjs +++ b/.github/scripts/update-release-branch.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/.github/scripts/update-unstable-tag.cjs b/.github/scripts/update-unstable-tag.cjs index 1958adcec..765e85d6a 100644 --- a/.github/scripts/update-unstable-tag.cjs +++ b/.github/scripts/update-unstable-tag.cjs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/crates/axum-utils/src/client_authorization.rs b/crates/axum-utils/src/client_authorization.rs index 19d6c9e7a..edc660431 100644 --- a/crates/axum-utils/src/client_authorization.rs +++ b/crates/axum-utils/src/client_authorization.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/axum-utils/src/cookies.rs b/crates/axum-utils/src/cookies.rs index c3572a266..97f1db830 100644 --- a/crates/axum-utils/src/cookies.rs +++ b/crates/axum-utils/src/cookies.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Private (encrypted) cookie jar, based on axum-extra's cookie jar diff --git a/crates/axum-utils/src/csrf.rs b/crates/axum-utils/src/csrf.rs index bf94e4ce9..677a81062 100644 --- a/crates/axum-utils/src/csrf.rs +++ b/crates/axum-utils/src/csrf.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use base64ct::{Base64UrlUnpadded, Encoding}; use chrono::{DateTime, Duration, Utc}; diff --git a/crates/axum-utils/src/error_wrapper.rs b/crates/axum-utils/src/error_wrapper.rs index 2bfd448fc..0865768d6 100644 --- a/crates/axum-utils/src/error_wrapper.rs +++ b/crates/axum-utils/src/error_wrapper.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::response::{IntoResponse, Response}; diff --git a/crates/axum-utils/src/fancy_error.rs b/crates/axum-utils/src/fancy_error.rs index 98c2a3c51..cb6d4e5eb 100644 --- a/crates/axum-utils/src/fancy_error.rs +++ b/crates/axum-utils/src/fancy_error.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ Extension, diff --git a/crates/axum-utils/src/jwt.rs b/crates/axum-utils/src/jwt.rs index 14e966c0d..f7747828c 100644 --- a/crates/axum-utils/src/jwt.rs +++ b/crates/axum-utils/src/jwt.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::response::{IntoResponse, Response}; use axum_extra::typed_header::TypedHeader; diff --git a/crates/axum-utils/src/language_detection.rs b/crates/axum-utils/src/language_detection.rs index efb148f74..057453a0a 100644 --- a/crates/axum-utils/src/language_detection.rs +++ b/crates/axum-utils/src/language_detection.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::cmp::Reverse; diff --git a/crates/axum-utils/src/lib.rs b/crates/axum-utils/src/lib.rs index a3dc31cca..a4e769dcd 100644 --- a/crates/axum-utils/src/lib.rs +++ b/crates/axum-utils/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(clippy::future_not_send)] #![allow(clippy::module_name_repetitions)] diff --git a/crates/axum-utils/src/sentry.rs b/crates/axum-utils/src/sentry.rs index 2744accff..9cf26301e 100644 --- a/crates/axum-utils/src/sentry.rs +++ b/crates/axum-utils/src/sentry.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::convert::Infallible; diff --git a/crates/axum-utils/src/session.rs b/crates/axum-utils/src/session.rs index 98cbd4865..b5ed670ae 100644 --- a/crates/axum-utils/src/session.rs +++ b/crates/axum-utils/src/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_data_model::BrowserSession; use mas_storage::RepositoryAccess; diff --git a/crates/axum-utils/src/user_authorization.rs b/crates/axum-utils/src/user_authorization.rs index 52e901c5c..fb6d233c0 100644 --- a/crates/axum-utils/src/user_authorization.rs +++ b/crates/axum-utils/src/user_authorization.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, error::Error}; diff --git a/crates/cli/build.rs b/crates/cli/build.rs index 2615b1284..7bad5d337 100644 --- a/crates/cli/build.rs +++ b/crates/cli/build.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use vergen_gitcl::{Emitter, GitclBuilder, RustcBuilder}; diff --git a/crates/cli/src/app_state.rs b/crates/cli/src/app_state.rs index 55b592aea..dd7dd6c99 100644 --- a/crates/cli/src/app_state.rs +++ b/crates/cli/src/app_state.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{convert::Infallible, net::IpAddr, sync::Arc}; diff --git a/crates/cli/src/commands/config.rs b/crates/cli/src/commands/config.rs index 00600026c..f253f6cd5 100644 --- a/crates/cli/src/commands/config.rs +++ b/crates/cli/src/commands/config.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::process::ExitCode; diff --git a/crates/cli/src/commands/database.rs b/crates/cli/src/commands/database.rs index 0283e5049..740c5c53c 100644 --- a/crates/cli/src/commands/database.rs +++ b/crates/cli/src/commands/database.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::process::ExitCode; diff --git a/crates/cli/src/commands/debug.rs b/crates/cli/src/commands/debug.rs index 2c004974f..b57034b42 100644 --- a/crates/cli/src/commands/debug.rs +++ b/crates/cli/src/commands/debug.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::process::ExitCode; diff --git a/crates/cli/src/commands/doctor.rs b/crates/cli/src/commands/doctor.rs index 28ab4e919..521ade442 100644 --- a/crates/cli/src/commands/doctor.rs +++ b/crates/cli/src/commands/doctor.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Diagnostic utility to check the health of the deployment //! diff --git a/crates/cli/src/commands/manage.rs b/crates/cli/src/commands/manage.rs index d2f13f0c5..97c019175 100644 --- a/crates/cli/src/commands/manage.rs +++ b/crates/cli/src/commands/manage.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::BTreeMap, process::ExitCode}; diff --git a/crates/cli/src/commands/mod.rs b/crates/cli/src/commands/mod.rs index 9f0938083..e8cef3b1f 100644 --- a/crates/cli/src/commands/mod.rs +++ b/crates/cli/src/commands/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::process::ExitCode; diff --git a/crates/cli/src/commands/server.rs b/crates/cli/src/commands/server.rs index dcdbca0d3..bce10710b 100644 --- a/crates/cli/src/commands/server.rs +++ b/crates/cli/src/commands/server.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::BTreeSet, process::ExitCode, sync::Arc, time::Duration}; diff --git a/crates/cli/src/commands/syn2mas.rs b/crates/cli/src/commands/syn2mas.rs index 22194953e..741e4f976 100644 --- a/crates/cli/src/commands/syn2mas.rs +++ b/crates/cli/src/commands/syn2mas.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, process::ExitCode, time::Duration}; diff --git a/crates/cli/src/commands/templates.rs b/crates/cli/src/commands/templates.rs index 153565df7..6a6da318a 100644 --- a/crates/cli/src/commands/templates.rs +++ b/crates/cli/src/commands/templates.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::process::ExitCode; diff --git a/crates/cli/src/commands/worker.rs b/crates/cli/src/commands/worker.rs index f13a1ae3c..4a6f17bbf 100644 --- a/crates/cli/src/commands/worker.rs +++ b/crates/cli/src/commands/worker.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{process::ExitCode, time::Duration}; diff --git a/crates/cli/src/lifecycle.rs b/crates/cli/src/lifecycle.rs index 4a2c429d1..e44162936 100644 --- a/crates/cli/src/lifecycle.rs +++ b/crates/cli/src/lifecycle.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{process::ExitCode, time::Duration}; diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index f0da47c09..59279589b 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::module_name_repetitions)] diff --git a/crates/cli/src/server.rs b/crates/cli/src/server.rs index eefd7211c..8fb85a703 100644 --- a/crates/cli/src/server.rs +++ b/crates/cli/src/server.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, TcpListener, ToSocketAddrs}, diff --git a/crates/cli/src/sync.rs b/crates/cli/src/sync.rs index 0c1063607..aa99e1d35 100644 --- a/crates/cli/src/sync.rs +++ b/crates/cli/src/sync.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Utilities to synchronize the configuration file with the database. diff --git a/crates/cli/src/telemetry.rs b/crates/cli/src/telemetry.rs index a09207e44..630dcbfca 100644 --- a/crates/cli/src/telemetry.rs +++ b/crates/cli/src/telemetry.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod tokio; diff --git a/crates/cli/src/telemetry/tokio.rs b/crates/cli/src/telemetry/tokio.rs index 49c7ac0ef..921582ee3 100644 --- a/crates/cli/src/telemetry/tokio.rs +++ b/crates/cli/src/telemetry/tokio.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use opentelemetry::KeyValue; use tokio::runtime::RuntimeMetrics; diff --git a/crates/cli/src/util.rs b/crates/cli/src/util.rs index b6725a0eb..7284e6197 100644 --- a/crates/cli/src/util.rs +++ b/crates/cli/src/util.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{sync::Arc, time::Duration}; diff --git a/crates/config/src/bin/schema.rs b/crates/config/src/bin/schema.rs index 3f409d406..83a28c8c9 100644 --- a/crates/config/src/bin/schema.rs +++ b/crates/config/src/bin/schema.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// 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; diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index d8230a9fb..cdf68e420 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(missing_docs, rustdoc::missing_crate_level_docs)] #![allow(clippy::module_name_repetitions)] diff --git a/crates/config/src/schema.rs b/crates/config/src/schema.rs index 2a9aaa914..a3c732419 100644 --- a/crates/config/src/schema.rs +++ b/crates/config/src/schema.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Useful JSON Schema definitions diff --git a/crates/config/src/sections/account.rs b/crates/config/src/sections/account.rs index a9d51afbb..47efa0162 100644 --- a/crates/config/src/sections/account.rs +++ b/crates/config/src/sections/account.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/crates/config/src/sections/branding.rs b/crates/config/src/sections/branding.rs index 91bba2cf9..ec36f1612 100644 --- a/crates/config/src/sections/branding.rs +++ b/crates/config/src/sections/branding.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use schemars::JsonSchema; use serde::{Deserialize, Serialize}; diff --git a/crates/config/src/sections/captcha.rs b/crates/config/src/sections/captcha.rs index 58b30799d..264bb47b1 100644 --- a/crates/config/src/sections/captcha.rs +++ b/crates/config/src/sections/captcha.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use schemars::JsonSchema; use serde::{Deserialize, Serialize, de::Error}; diff --git a/crates/config/src/sections/clients.rs b/crates/config/src/sections/clients.rs index 2a0469677..fdec32f47 100644 --- a/crates/config/src/sections/clients.rs +++ b/crates/config/src/sections/clients.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::ops::Deref; diff --git a/crates/config/src/sections/database.rs b/crates/config/src/sections/database.rs index e2b701c60..399053d41 100644 --- a/crates/config/src/sections/database.rs +++ b/crates/config/src/sections/database.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{num::NonZeroU32, time::Duration}; diff --git a/crates/config/src/sections/email.rs b/crates/config/src/sections/email.rs index 18f86df13..8a809bed3 100644 --- a/crates/config/src/sections/email.rs +++ b/crates/config/src/sections/email.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(deprecated)] diff --git a/crates/config/src/sections/experimental.rs b/crates/config/src/sections/experimental.rs index 35e29e0de..c6c50e88d 100644 --- a/crates/config/src/sections/experimental.rs +++ b/crates/config/src/sections/experimental.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::Duration; use schemars::JsonSchema; diff --git a/crates/config/src/sections/http.rs b/crates/config/src/sections/http.rs index 8bf4a7588..51bce2d38 100644 --- a/crates/config/src/sections/http.rs +++ b/crates/config/src/sections/http.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(deprecated)] diff --git a/crates/config/src/sections/matrix.rs b/crates/config/src/sections/matrix.rs index d5e35907e..1cead9ffd 100644 --- a/crates/config/src/sections/matrix.rs +++ b/crates/config/src/sections/matrix.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use rand::{ Rng, diff --git a/crates/config/src/sections/mod.rs b/crates/config/src/sections/mod.rs index 9a9fc9de8..f1f880594 100644 --- a/crates/config/src/sections/mod.rs +++ b/crates/config/src/sections/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use rand::Rng; use schemars::JsonSchema; diff --git a/crates/config/src/sections/passwords.rs b/crates/config/src/sections/passwords.rs index a72f2efd7..2870894b6 100644 --- a/crates/config/src/sections/passwords.rs +++ b/crates/config/src/sections/passwords.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::cmp::Reverse; diff --git a/crates/config/src/sections/policy.rs b/crates/config/src/sections/policy.rs index 03ec09e44..37d052ade 100644 --- a/crates/config/src/sections/policy.rs +++ b/crates/config/src/sections/policy.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use camino::Utf8PathBuf; use schemars::JsonSchema; diff --git a/crates/config/src/sections/rate_limiting.rs b/crates/config/src/sections/rate_limiting.rs index d95a2ab28..b3ef6fdbd 100644 --- a/crates/config/src/sections/rate_limiting.rs +++ b/crates/config/src/sections/rate_limiting.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{num::NonZeroU32, time::Duration}; diff --git a/crates/config/src/sections/secrets.rs b/crates/config/src/sections/secrets.rs index e93817b68..98e2f808a 100644 --- a/crates/config/src/sections/secrets.rs +++ b/crates/config/src/sections/secrets.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::borrow::Cow; diff --git a/crates/config/src/sections/telemetry.rs b/crates/config/src/sections/telemetry.rs index 0c11e0285..f42e29f52 100644 --- a/crates/config/src/sections/telemetry.rs +++ b/crates/config/src/sections/telemetry.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use schemars::JsonSchema; use serde::{Deserialize, Serialize, de::Error as _}; diff --git a/crates/config/src/sections/templates.rs b/crates/config/src/sections/templates.rs index dca53f0e7..5656de44b 100644 --- a/crates/config/src/sections/templates.rs +++ b/crates/config/src/sections/templates.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use camino::Utf8PathBuf; use schemars::JsonSchema; diff --git a/crates/config/src/sections/upstream_oauth2.rs b/crates/config/src/sections/upstream_oauth2.rs index aa6a27254..a2e62036a 100644 --- a/crates/config/src/sections/upstream_oauth2.rs +++ b/crates/config/src/sections/upstream_oauth2.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::BTreeMap; diff --git a/crates/config/src/util.rs b/crates/config/src/util.rs index c2ffd037b..d7aa4829b 100644 --- a/crates/config/src/util.rs +++ b/crates/config/src/util.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use figment::{Figment, error::Error as FigmentError}; use serde::de::DeserializeOwned; diff --git a/crates/context/src/fmt.rs b/crates/context/src/fmt.rs index b074a9c34..579ea63a9 100644 --- a/crates/context/src/fmt.rs +++ b/crates/context/src/fmt.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use console::{Color, Style}; use opentelemetry::{ diff --git a/crates/context/src/future.rs b/crates/context/src/future.rs index 9e93af4fa..67c77fe67 100644 --- a/crates/context/src/future.rs +++ b/crates/context/src/future.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ pin::Pin, diff --git a/crates/context/src/layer.rs b/crates/context/src/layer.rs index 0ce6e3497..eb3f92bf6 100644 --- a/crates/context/src/layer.rs +++ b/crates/context/src/layer.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::borrow::Cow; diff --git a/crates/context/src/lib.rs b/crates/context/src/lib.rs index 655d407e9..c9644282d 100644 --- a/crates/context/src/lib.rs +++ b/crates/context/src/lib.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod fmt; mod future; diff --git a/crates/context/src/service.rs b/crates/context/src/service.rs index 98a1d1184..8d875cc0c 100644 --- a/crates/context/src/service.rs +++ b/crates/context/src/service.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ borrow::Cow, diff --git a/crates/data-model/examples/ua-parser.rs b/crates/data-model/examples/ua-parser.rs index af2ec9179..98a4d7893 100644 --- a/crates/data-model/examples/ua-parser.rs +++ b/crates/data-model/examples/ua-parser.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_data_model::UserAgent; diff --git a/crates/data-model/src/compat/device.rs b/crates/data-model/src/compat/device.rs index ca34ff2ac..209aeb5a4 100644 --- a/crates/data-model/src/compat/device.rs +++ b/crates/data-model/src/compat/device.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use oauth2_types::scope::ScopeToken; use rand::{ diff --git a/crates/data-model/src/compat/mod.rs b/crates/data-model/src/compat/mod.rs index c50d74261..be38154f3 100644 --- a/crates/data-model/src/compat/mod.rs +++ b/crates/data-model/src/compat/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use ulid::Ulid; diff --git a/crates/data-model/src/compat/session.rs b/crates/data-model/src/compat/session.rs index 91b48cea0..24a8e18a7 100644 --- a/crates/data-model/src/compat/session.rs +++ b/crates/data-model/src/compat/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/data-model/src/compat/sso_login.rs b/crates/data-model/src/compat/sso_login.rs index 448601a92..a42dfcb1d 100644 --- a/crates/data-model/src/compat/sso_login.rs +++ b/crates/data-model/src/compat/sso_login.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use serde::Serialize; diff --git a/crates/data-model/src/lib.rs b/crates/data-model/src/lib.rs index af4d0be37..ce9631068 100644 --- a/crates/data-model/src/lib.rs +++ b/crates/data-model/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::module_name_repetitions)] diff --git a/crates/data-model/src/oauth2/authorization_grant.rs b/crates/data-model/src/oauth2/authorization_grant.rs index 1d71f0170..383701bcb 100644 --- a/crates/data-model/src/oauth2/authorization_grant.rs +++ b/crates/data-model/src/oauth2/authorization_grant.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use mas_iana::oauth::PkceCodeChallengeMethod; diff --git a/crates/data-model/src/oauth2/client.rs b/crates/data-model/src/oauth2/client.rs index c184d6fce..ce28445f3 100644 --- a/crates/data-model/src/oauth2/client.rs +++ b/crates/data-model/src/oauth2/client.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use mas_iana::{jose::JsonWebSignatureAlg, oauth::OAuthClientAuthenticationMethod}; diff --git a/crates/data-model/src/oauth2/device_code_grant.rs b/crates/data-model/src/oauth2/device_code_grant.rs index 794cc460b..aaf7df594 100644 --- a/crates/data-model/src/oauth2/device_code_grant.rs +++ b/crates/data-model/src/oauth2/device_code_grant.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/data-model/src/oauth2/mod.rs b/crates/data-model/src/oauth2/mod.rs index 0126392c1..6221a32fc 100644 --- a/crates/data-model/src/oauth2/mod.rs +++ b/crates/data-model/src/oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod authorization_grant; mod client; diff --git a/crates/data-model/src/oauth2/session.rs b/crates/data-model/src/oauth2/session.rs index 8a55aa863..c6c9346e9 100644 --- a/crates/data-model/src/oauth2/session.rs +++ b/crates/data-model/src/oauth2/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/data-model/src/policy_data.rs b/crates/data-model/src/policy_data.rs index 8836c2c0c..b732aca8d 100644 --- a/crates/data-model/src/policy_data.rs +++ b/crates/data-model/src/policy_data.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use serde::Serialize; diff --git a/crates/data-model/src/site_config.rs b/crates/data-model/src/site_config.rs index c441ba06f..ac0d7e6b8 100644 --- a/crates/data-model/src/site_config.rs +++ b/crates/data-model/src/site_config.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::Duration; use url::Url; diff --git a/crates/data-model/src/tokens.rs b/crates/data-model/src/tokens.rs index a98ba94e3..1ea5be6be 100644 --- a/crates/data-model/src/tokens.rs +++ b/crates/data-model/src/tokens.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use base64ct::{Base64UrlUnpadded, Encoding}; use chrono::{DateTime, Utc}; diff --git a/crates/data-model/src/upstream_oauth2/link.rs b/crates/data-model/src/upstream_oauth2/link.rs index e932b7384..421793ce2 100644 --- a/crates/data-model/src/upstream_oauth2/link.rs +++ b/crates/data-model/src/upstream_oauth2/link.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use serde::Serialize; diff --git a/crates/data-model/src/upstream_oauth2/mod.rs b/crates/data-model/src/upstream_oauth2/mod.rs index 8f4228839..1ed54e337 100644 --- a/crates/data-model/src/upstream_oauth2/mod.rs +++ b/crates/data-model/src/upstream_oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod link; mod provider; diff --git a/crates/data-model/src/upstream_oauth2/provider.rs b/crates/data-model/src/upstream_oauth2/provider.rs index 7362d807b..c4e990102 100644 --- a/crates/data-model/src/upstream_oauth2/provider.rs +++ b/crates/data-model/src/upstream_oauth2/provider.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use mas_iana::jose::JsonWebSignatureAlg; diff --git a/crates/data-model/src/upstream_oauth2/session.rs b/crates/data-model/src/upstream_oauth2/session.rs index c5b45234c..e1d0695fc 100644 --- a/crates/data-model/src/upstream_oauth2/session.rs +++ b/crates/data-model/src/upstream_oauth2/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use serde::Serialize; diff --git a/crates/data-model/src/user_agent.rs b/crates/data-model/src/user_agent.rs index 2ac4b06bd..4efb4ff9f 100644 --- a/crates/data-model/src/user_agent.rs +++ b/crates/data-model/src/user_agent.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/data-model/src/users.rs b/crates/data-model/src/users.rs index fc6ed2695..c2addf8a3 100644 --- a/crates/data-model/src/users.rs +++ b/crates/data-model/src/users.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/email/src/lib.rs b/crates/email/src/lib.rs index 49e940638..ee731f744 100644 --- a/crates/email/src/lib.rs +++ b/crates/email/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Helps sending emails to users, with different email backends diff --git a/crates/email/src/mailer.rs b/crates/email/src/mailer.rs index 443859a3b..d31fe96ab 100644 --- a/crates/email/src/mailer.rs +++ b/crates/email/src/mailer.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Send emails to users diff --git a/crates/email/src/transport.rs b/crates/email/src/transport.rs index 21291a1b1..9161d76e5 100644 --- a/crates/email/src/transport.rs +++ b/crates/email/src/transport.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Email transport backends diff --git a/crates/handlers/src/activity_tracker/bound.rs b/crates/handlers/src/activity_tracker/bound.rs index c4e2f7cce..86286ebf8 100644 --- a/crates/handlers/src/activity_tracker/bound.rs +++ b/crates/handlers/src/activity_tracker/bound.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/handlers/src/activity_tracker/mod.rs b/crates/handlers/src/activity_tracker/mod.rs index 56785e236..6f8bf41d6 100644 --- a/crates/handlers/src/activity_tracker/mod.rs +++ b/crates/handlers/src/activity_tracker/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod bound; mod worker; diff --git a/crates/handlers/src/activity_tracker/worker.rs b/crates/handlers/src/activity_tracker/worker.rs index 4787964ee..46cc84ccd 100644 --- a/crates/handlers/src/activity_tracker/worker.rs +++ b/crates/handlers/src/activity_tracker/worker.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, net::IpAddr}; diff --git a/crates/handlers/src/admin/call_context.rs b/crates/handlers/src/admin/call_context.rs index 95340b160..d5a5f4b94 100644 --- a/crates/handlers/src/admin/call_context.rs +++ b/crates/handlers/src/admin/call_context.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::convert::Infallible; diff --git a/crates/handlers/src/admin/mod.rs b/crates/handlers/src/admin/mod.rs index 6890848ac..c0a0cf9ac 100644 --- a/crates/handlers/src/admin/mod.rs +++ b/crates/handlers/src/admin/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/handlers/src/admin/model.rs b/crates/handlers/src/admin/model.rs index 03fd72ad0..55965f0e2 100644 --- a/crates/handlers/src/admin/model.rs +++ b/crates/handlers/src/admin/model.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/handlers/src/admin/params.rs b/crates/handlers/src/admin/params.rs index 749bc62b3..633917d9a 100644 --- a/crates/handlers/src/admin/params.rs +++ b/crates/handlers/src/admin/params.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // Generated code from schemars violates this rule #![allow(clippy::str_to_string)] diff --git a/crates/handlers/src/admin/response.rs b/crates/handlers/src/admin/response.rs index 753260961..19f0e8040 100644 --- a/crates/handlers/src/admin/response.rs +++ b/crates/handlers/src/admin/response.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::module_name_repetitions)] diff --git a/crates/handlers/src/admin/schema.rs b/crates/handlers/src/admin/schema.rs index 99f1c20b7..068c68977 100644 --- a/crates/handlers/src/admin/schema.rs +++ b/crates/handlers/src/admin/schema.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Common schema definitions diff --git a/crates/handlers/src/admin/v1/compat_sessions/get.rs b/crates/handlers/src/admin/v1/compat_sessions/get.rs index 3d471d0ce..c77432d07 100644 --- a/crates/handlers/src/admin/v1/compat_sessions/get.rs +++ b/crates/handlers/src/admin/v1/compat_sessions/get.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/compat_sessions/list.rs b/crates/handlers/src/admin/v1/compat_sessions/list.rs index adf15d190..debb2a304 100644 --- a/crates/handlers/src/admin/v1/compat_sessions/list.rs +++ b/crates/handlers/src/admin/v1/compat_sessions/list.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{ diff --git a/crates/handlers/src/admin/v1/compat_sessions/mod.rs b/crates/handlers/src/admin/v1/compat_sessions/mod.rs index 23c05c416..18ffe5af6 100644 --- a/crates/handlers/src/admin/v1/compat_sessions/mod.rs +++ b/crates/handlers/src/admin/v1/compat_sessions/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod get; mod list; diff --git a/crates/handlers/src/admin/v1/mod.rs b/crates/handlers/src/admin/v1/mod.rs index 02586368b..c1d29aad5 100644 --- a/crates/handlers/src/admin/v1/mod.rs +++ b/crates/handlers/src/admin/v1/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/handlers/src/admin/v1/oauth2_sessions/get.rs b/crates/handlers/src/admin/v1/oauth2_sessions/get.rs index 88f46ecff..653bb69b2 100644 --- a/crates/handlers/src/admin/v1/oauth2_sessions/get.rs +++ b/crates/handlers/src/admin/v1/oauth2_sessions/get.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/oauth2_sessions/list.rs b/crates/handlers/src/admin/v1/oauth2_sessions/list.rs index 49b429243..52b597edc 100644 --- a/crates/handlers/src/admin/v1/oauth2_sessions/list.rs +++ b/crates/handlers/src/admin/v1/oauth2_sessions/list.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::str::FromStr; diff --git a/crates/handlers/src/admin/v1/oauth2_sessions/mod.rs b/crates/handlers/src/admin/v1/oauth2_sessions/mod.rs index 84a9efde5..9b6272cef 100644 --- a/crates/handlers/src/admin/v1/oauth2_sessions/mod.rs +++ b/crates/handlers/src/admin/v1/oauth2_sessions/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod get; mod list; diff --git a/crates/handlers/src/admin/v1/policy_data/get.rs b/crates/handlers/src/admin/v1/policy_data/get.rs index 51d8c7849..1ba0517fc 100644 --- a/crates/handlers/src/admin/v1/policy_data/get.rs +++ b/crates/handlers/src/admin/v1/policy_data/get.rs @@ -1,6 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/policy_data/get_latest.rs b/crates/handlers/src/admin/v1/policy_data/get_latest.rs index f217b30dc..102c578f1 100644 --- a/crates/handlers/src/admin/v1/policy_data/get_latest.rs +++ b/crates/handlers/src/admin/v1/policy_data/get_latest.rs @@ -1,6 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/policy_data/mod.rs b/crates/handlers/src/admin/v1/policy_data/mod.rs index 9143a2e11..f8952e711 100644 --- a/crates/handlers/src/admin/v1/policy_data/mod.rs +++ b/crates/handlers/src/admin/v1/policy_data/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod get; mod get_latest; diff --git a/crates/handlers/src/admin/v1/policy_data/set.rs b/crates/handlers/src/admin/v1/policy_data/set.rs index bc28e96e3..93260f9ac 100644 --- a/crates/handlers/src/admin/v1/policy_data/set.rs +++ b/crates/handlers/src/admin/v1/policy_data/set.rs @@ -1,6 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/handlers/src/admin/v1/upstream_oauth_links/add.rs b/crates/handlers/src/admin/v1/upstream_oauth_links/add.rs index 3cdbc783f..ba59d4419 100644 --- a/crates/handlers/src/admin/v1/upstream_oauth_links/add.rs +++ b/crates/handlers/src/admin/v1/upstream_oauth_links/add.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{NoApi, OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/upstream_oauth_links/delete.rs b/crates/handlers/src/admin/v1/upstream_oauth_links/delete.rs index 403c1bc33..3c7905a4c 100644 --- a/crates/handlers/src/admin/v1/upstream_oauth_links/delete.rs +++ b/crates/handlers/src/admin/v1/upstream_oauth_links/delete.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/upstream_oauth_links/get.rs b/crates/handlers/src/admin/v1/upstream_oauth_links/get.rs index 4fd5158d3..483d90891 100644 --- a/crates/handlers/src/admin/v1/upstream_oauth_links/get.rs +++ b/crates/handlers/src/admin/v1/upstream_oauth_links/get.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/upstream_oauth_links/list.rs b/crates/handlers/src/admin/v1/upstream_oauth_links/list.rs index e46b85820..59efe6541 100644 --- a/crates/handlers/src/admin/v1/upstream_oauth_links/list.rs +++ b/crates/handlers/src/admin/v1/upstream_oauth_links/list.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{ diff --git a/crates/handlers/src/admin/v1/upstream_oauth_links/mod.rs b/crates/handlers/src/admin/v1/upstream_oauth_links/mod.rs index 6696a7109..9d2e6599c 100644 --- a/crates/handlers/src/admin/v1/upstream_oauth_links/mod.rs +++ b/crates/handlers/src/admin/v1/upstream_oauth_links/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod add; mod delete; diff --git a/crates/handlers/src/admin/v1/user_emails/add.rs b/crates/handlers/src/admin/v1/user_emails/add.rs index f3a39e20a..55038a591 100644 --- a/crates/handlers/src/admin/v1/user_emails/add.rs +++ b/crates/handlers/src/admin/v1/user_emails/add.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::str::FromStr as _; diff --git a/crates/handlers/src/admin/v1/user_emails/delete.rs b/crates/handlers/src/admin/v1/user_emails/delete.rs index ad7df7acb..844edbff2 100644 --- a/crates/handlers/src/admin/v1/user_emails/delete.rs +++ b/crates/handlers/src/admin/v1/user_emails/delete.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{NoApi, OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_emails/get.rs b/crates/handlers/src/admin/v1/user_emails/get.rs index 9232b0663..826cb8c25 100644 --- a/crates/handlers/src/admin/v1/user_emails/get.rs +++ b/crates/handlers/src/admin/v1/user_emails/get.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_emails/list.rs b/crates/handlers/src/admin/v1/user_emails/list.rs index f7adb23da..92dfe12c2 100644 --- a/crates/handlers/src/admin/v1/user_emails/list.rs +++ b/crates/handlers/src/admin/v1/user_emails/list.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{ diff --git a/crates/handlers/src/admin/v1/user_emails/mod.rs b/crates/handlers/src/admin/v1/user_emails/mod.rs index 136c132ba..38f3ec989 100644 --- a/crates/handlers/src/admin/v1/user_emails/mod.rs +++ b/crates/handlers/src/admin/v1/user_emails/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod add; mod delete; diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/add.rs b/crates/handlers/src/admin/v1/user_registration_tokens/add.rs index afa409a67..7bc2b0593 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/add.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/add.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{NoApi, OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/get.rs b/crates/handlers/src/admin/v1/user_registration_tokens/get.rs index 833e3b17c..187c19032 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/get.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/get.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/list.rs b/crates/handlers/src/admin/v1/user_registration_tokens/list.rs index 85a1a1945..f9b0e714c 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/list.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/list.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{ diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs b/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs index 3d61e10e6..42d16af7b 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod add; mod get; diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/revoke.rs b/crates/handlers/src/admin/v1/user_registration_tokens/revoke.rs index e649cfef8..9e442640f 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/revoke.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/revoke.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/unrevoke.rs b/crates/handlers/src/admin/v1/user_registration_tokens/unrevoke.rs index 53cbfcf95..212b7cdf9 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/unrevoke.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/unrevoke.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/update.rs b/crates/handlers/src/admin/v1/user_registration_tokens/update.rs index 444c7ae6b..d5eaa7342 100644 --- a/crates/handlers/src/admin/v1/user_registration_tokens/update.rs +++ b/crates/handlers/src/admin/v1/user_registration_tokens/update.rs @@ -1,7 +1,8 @@ +// Copyright 2025 New Vector Ltd. // Copyright 2025 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_sessions/get.rs b/crates/handlers/src/admin/v1/user_sessions/get.rs index a59b10d0e..0a65c80c1 100644 --- a/crates/handlers/src/admin/v1/user_sessions/get.rs +++ b/crates/handlers/src/admin/v1/user_sessions/get.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/user_sessions/list.rs b/crates/handlers/src/admin/v1/user_sessions/list.rs index a04bf057f..28a52edf2 100644 --- a/crates/handlers/src/admin/v1/user_sessions/list.rs +++ b/crates/handlers/src/admin/v1/user_sessions/list.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{ diff --git a/crates/handlers/src/admin/v1/user_sessions/mod.rs b/crates/handlers/src/admin/v1/user_sessions/mod.rs index 23c05c416..18ffe5af6 100644 --- a/crates/handlers/src/admin/v1/user_sessions/mod.rs +++ b/crates/handlers/src/admin/v1/user_sessions/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod get; mod list; diff --git a/crates/handlers/src/admin/v1/users/add.rs b/crates/handlers/src/admin/v1/users/add.rs index 9867b06ec..b8bd9ccf0 100644 --- a/crates/handlers/src/admin/v1/users/add.rs +++ b/crates/handlers/src/admin/v1/users/add.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/handlers/src/admin/v1/users/by_username.rs b/crates/handlers/src/admin/v1/users/by_username.rs index 98ddb8b3c..2ba122039 100644 --- a/crates/handlers/src/admin/v1/users/by_username.rs +++ b/crates/handlers/src/admin/v1/users/by_username.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, extract::Path, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/users/deactivate.rs b/crates/handlers/src/admin/v1/users/deactivate.rs index fad2f5257..55194a613 100644 --- a/crates/handlers/src/admin/v1/users/deactivate.rs +++ b/crates/handlers/src/admin/v1/users/deactivate.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{NoApi, OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/users/get.rs b/crates/handlers/src/admin/v1/users/get.rs index 59d221fbb..afc177011 100644 --- a/crates/handlers/src/admin/v1/users/get.rs +++ b/crates/handlers/src/admin/v1/users/get.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/users/list.rs b/crates/handlers/src/admin/v1/users/list.rs index 9bc04ab4a..021e39f37 100644 --- a/crates/handlers/src/admin/v1/users/list.rs +++ b/crates/handlers/src/admin/v1/users/list.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{ diff --git a/crates/handlers/src/admin/v1/users/lock.rs b/crates/handlers/src/admin/v1/users/lock.rs index 13ffdc071..ed99b6a75 100644 --- a/crates/handlers/src/admin/v1/users/lock.rs +++ b/crates/handlers/src/admin/v1/users/lock.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/users/mod.rs b/crates/handlers/src/admin/v1/users/mod.rs index ff610f167..b9c0b5ea6 100644 --- a/crates/handlers/src/admin/v1/users/mod.rs +++ b/crates/handlers/src/admin/v1/users/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod add; mod by_username; diff --git a/crates/handlers/src/admin/v1/users/set_admin.rs b/crates/handlers/src/admin/v1/users/set_admin.rs index 72df1f71b..455fa7988 100644 --- a/crates/handlers/src/admin/v1/users/set_admin.rs +++ b/crates/handlers/src/admin/v1/users/set_admin.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{OperationIo, transform::TransformOperation}; use axum::{Json, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/users/set_password.rs b/crates/handlers/src/admin/v1/users/set_password.rs index 06797c3f8..fbcc48588 100644 --- a/crates/handlers/src/admin/v1/users/set_password.rs +++ b/crates/handlers/src/admin/v1/users/set_password.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use aide::{NoApi, OperationIo, transform::TransformOperation}; use axum::{Json, extract::State, response::IntoResponse}; diff --git a/crates/handlers/src/admin/v1/users/unlock.rs b/crates/handlers/src/admin/v1/users/unlock.rs index e1811378c..6e0311eec 100644 --- a/crates/handlers/src/admin/v1/users/unlock.rs +++ b/crates/handlers/src/admin/v1/users/unlock.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/handlers/src/bin/api-schema.rs b/crates/handlers/src/bin/api-schema.rs index a3f59c4c6..ee736de2a 100644 --- a/crates/handlers/src/bin/api-schema.rs +++ b/crates/handlers/src/bin/api-schema.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![forbid(unsafe_code)] #![deny( diff --git a/crates/handlers/src/bin/graphql-schema.rs b/crates/handlers/src/bin/graphql-schema.rs index d2ac8a642..45bdcc175 100644 --- a/crates/handlers/src/bin/graphql-schema.rs +++ b/crates/handlers/src/bin/graphql-schema.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![forbid(unsafe_code)] #![deny( diff --git a/crates/handlers/src/captcha.rs b/crates/handlers/src/captcha.rs index 740995145..c206df5cf 100644 --- a/crates/handlers/src/captcha.rs +++ b/crates/handlers/src/captcha.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/handlers/src/compat/login.rs b/crates/handlers/src/compat/login.rs index 32bdfacd3..251030c0d 100644 --- a/crates/handlers/src/compat/login.rs +++ b/crates/handlers/src/compat/login.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock}; diff --git a/crates/handlers/src/compat/login_sso_complete.rs b/crates/handlers/src/compat/login_sso_complete.rs index 15da5fb4d..2c3b612b4 100644 --- a/crates/handlers/src/compat/login_sso_complete.rs +++ b/crates/handlers/src/compat/login_sso_complete.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/handlers/src/compat/login_sso_redirect.rs b/crates/handlers/src/compat/login_sso_redirect.rs index 583f24e9b..3662da849 100644 --- a/crates/handlers/src/compat/login_sso_redirect.rs +++ b/crates/handlers/src/compat/login_sso_redirect.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Query, State}, diff --git a/crates/handlers/src/compat/logout.rs b/crates/handlers/src/compat/logout.rs index 7b2ea7d52..27b67b768 100644 --- a/crates/handlers/src/compat/logout.rs +++ b/crates/handlers/src/compat/logout.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/handlers/src/compat/logout_all.rs b/crates/handlers/src/compat/logout_all.rs index 489521313..9cf14e428 100644 --- a/crates/handlers/src/compat/logout_all.rs +++ b/crates/handlers/src/compat/logout_all.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/handlers/src/compat/mod.rs b/crates/handlers/src/compat/mod.rs index abf02a28c..1c30d5e04 100644 --- a/crates/handlers/src/compat/mod.rs +++ b/crates/handlers/src/compat/mod.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ Json, diff --git a/crates/handlers/src/compat/refresh.rs b/crates/handlers/src/compat/refresh.rs index 7511e0e99..02e623eb4 100644 --- a/crates/handlers/src/compat/refresh.rs +++ b/crates/handlers/src/compat/refresh.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{Json, extract::State, response::IntoResponse}; use chrono::Duration; diff --git a/crates/handlers/src/graphql/mod.rs b/crates/handlers/src/graphql/mod.rs index cfedd69e9..7dcf81b5d 100644 --- a/crates/handlers/src/graphql/mod.rs +++ b/crates/handlers/src/graphql/mod.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::module_name_repetitions)] diff --git a/crates/handlers/src/graphql/model/browser_sessions.rs b/crates/handlers/src/graphql/model/browser_sessions.rs index 5e15644e2..925288067 100644 --- a/crates/handlers/src/graphql/model/browser_sessions.rs +++ b/crates/handlers/src/graphql/model/browser_sessions.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{ Context, Description, ID, Object, diff --git a/crates/handlers/src/graphql/model/compat_sessions.rs b/crates/handlers/src/graphql/model/compat_sessions.rs index 90adb61fe..fbbd4ab1f 100644 --- a/crates/handlers/src/graphql/model/compat_sessions.rs +++ b/crates/handlers/src/graphql/model/compat_sessions.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Description, Enum, ID, Object}; diff --git a/crates/handlers/src/graphql/model/cursor.rs b/crates/handlers/src/graphql/model/cursor.rs index 6dba9f4db..b7b498d0f 100644 --- a/crates/handlers/src/graphql/model/cursor.rs +++ b/crates/handlers/src/graphql/model/cursor.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::connection::OpaqueCursor; use serde::{Deserialize, Serialize}; diff --git a/crates/handlers/src/graphql/model/matrix.rs b/crates/handlers/src/graphql/model/matrix.rs index 930742285..08e583d74 100644 --- a/crates/handlers/src/graphql/model/matrix.rs +++ b/crates/handlers/src/graphql/model/matrix.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::SimpleObject; use mas_matrix::HomeserverConnection; diff --git a/crates/handlers/src/graphql/model/mod.rs b/crates/handlers/src/graphql/model/mod.rs index 5a3137edf..063a63fb0 100644 --- a/crates/handlers/src/graphql/model/mod.rs +++ b/crates/handlers/src/graphql/model/mod.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{Enum, Interface, Object, SimpleObject}; use chrono::{DateTime, Utc}; diff --git a/crates/handlers/src/graphql/model/node.rs b/crates/handlers/src/graphql/model/node.rs index aa61f4b62..e63d2b387 100644 --- a/crates/handlers/src/graphql/model/node.rs +++ b/crates/handlers/src/graphql/model/node.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{ID, Interface}; use serde::{Deserialize, Serialize}; diff --git a/crates/handlers/src/graphql/model/oauth.rs b/crates/handlers/src/graphql/model/oauth.rs index 9ec94c288..4f628e8bd 100644 --- a/crates/handlers/src/graphql/model/oauth.rs +++ b/crates/handlers/src/graphql/model/oauth.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Description, Enum, ID, Object}; diff --git a/crates/handlers/src/graphql/model/site_config.rs b/crates/handlers/src/graphql/model/site_config.rs index 3a958d495..d6966907e 100644 --- a/crates/handlers/src/graphql/model/site_config.rs +++ b/crates/handlers/src/graphql/model/site_config.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::str_to_string)] // ComplexObject macro uses &str.to_string() diff --git a/crates/handlers/src/graphql/model/upstream_oauth.rs b/crates/handlers/src/graphql/model/upstream_oauth.rs index a2061210b..faa30a755 100644 --- a/crates/handlers/src/graphql/model/upstream_oauth.rs +++ b/crates/handlers/src/graphql/model/upstream_oauth.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, ID, Object}; diff --git a/crates/handlers/src/graphql/model/users.rs b/crates/handlers/src/graphql/model/users.rs index fb54580a0..11522c6b4 100644 --- a/crates/handlers/src/graphql/model/users.rs +++ b/crates/handlers/src/graphql/model/users.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{ diff --git a/crates/handlers/src/graphql/model/viewer/anonymous.rs b/crates/handlers/src/graphql/model/viewer/anonymous.rs index e3b4e5273..56506d959 100644 --- a/crates/handlers/src/graphql/model/viewer/anonymous.rs +++ b/crates/handlers/src/graphql/model/viewer/anonymous.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{ID, Object}; diff --git a/crates/handlers/src/graphql/model/viewer/mod.rs b/crates/handlers/src/graphql/model/viewer/mod.rs index 4623f8a3e..4eec8c77b 100644 --- a/crates/handlers/src/graphql/model/viewer/mod.rs +++ b/crates/handlers/src/graphql/model/viewer/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::Union; diff --git a/crates/handlers/src/graphql/mutations/browser_session.rs b/crates/handlers/src/graphql/mutations/browser_session.rs index 688e17dcb..551775dbf 100644 --- a/crates/handlers/src/graphql/mutations/browser_session.rs +++ b/crates/handlers/src/graphql/mutations/browser_session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{Context, Enum, ID, InputObject, Object}; use mas_storage::RepositoryAccess; diff --git a/crates/handlers/src/graphql/mutations/compat_session.rs b/crates/handlers/src/graphql/mutations/compat_session.rs index 3930b5670..ec8993942 100644 --- a/crates/handlers/src/graphql/mutations/compat_session.rs +++ b/crates/handlers/src/graphql/mutations/compat_session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Enum, ID, InputObject, Object}; diff --git a/crates/handlers/src/graphql/mutations/matrix.rs b/crates/handlers/src/graphql/mutations/matrix.rs index 8788b493c..16c4916c3 100644 --- a/crates/handlers/src/graphql/mutations/matrix.rs +++ b/crates/handlers/src/graphql/mutations/matrix.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Description, Enum, ID, InputObject, Object}; diff --git a/crates/handlers/src/graphql/mutations/mod.rs b/crates/handlers/src/graphql/mutations/mod.rs index 21fca3d6c..af6caab62 100644 --- a/crates/handlers/src/graphql/mutations/mod.rs +++ b/crates/handlers/src/graphql/mutations/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod browser_session; mod compat_session; diff --git a/crates/handlers/src/graphql/mutations/oauth2_session.rs b/crates/handlers/src/graphql/mutations/oauth2_session.rs index 1d0282014..560fb17e1 100644 --- a/crates/handlers/src/graphql/mutations/oauth2_session.rs +++ b/crates/handlers/src/graphql/mutations/oauth2_session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Description, Enum, ID, InputObject, Object}; diff --git a/crates/handlers/src/graphql/mutations/user.rs b/crates/handlers/src/graphql/mutations/user.rs index f4ae549b9..a403d95ce 100644 --- a/crates/handlers/src/graphql/mutations/user.rs +++ b/crates/handlers/src/graphql/mutations/user.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Description, Enum, ID, InputObject, Object}; diff --git a/crates/handlers/src/graphql/mutations/user_email.rs b/crates/handlers/src/graphql/mutations/user_email.rs index 6f24f1ed4..63b825566 100644 --- a/crates/handlers/src/graphql/mutations/user_email.rs +++ b/crates/handlers/src/graphql/mutations/user_email.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use async_graphql::{Context, Description, Enum, ID, InputObject, Object}; diff --git a/crates/handlers/src/graphql/query/mod.rs b/crates/handlers/src/graphql/query/mod.rs index eb86150e5..66e6b38bb 100644 --- a/crates/handlers/src/graphql/query/mod.rs +++ b/crates/handlers/src/graphql/query/mod.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{Context, ID, MergedObject, Object}; diff --git a/crates/handlers/src/graphql/query/session.rs b/crates/handlers/src/graphql/query/session.rs index 1115bed00..5fcfd82b1 100644 --- a/crates/handlers/src/graphql/query/session.rs +++ b/crates/handlers/src/graphql/query/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{Context, ID, Object, Union}; use mas_data_model::Device; diff --git a/crates/handlers/src/graphql/query/upstream_oauth.rs b/crates/handlers/src/graphql/query/upstream_oauth.rs index b007425aa..f52c21f82 100644 --- a/crates/handlers/src/graphql/query/upstream_oauth.rs +++ b/crates/handlers/src/graphql/query/upstream_oauth.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{ Context, ID, Object, diff --git a/crates/handlers/src/graphql/query/user.rs b/crates/handlers/src/graphql/query/user.rs index 9a2eeef45..364319e57 100644 --- a/crates/handlers/src/graphql/query/user.rs +++ b/crates/handlers/src/graphql/query/user.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{ Context, Enum, ID, Object, diff --git a/crates/handlers/src/graphql/query/viewer.rs b/crates/handlers/src/graphql/query/viewer.rs index 6985dfd2e..defcb5571 100644 --- a/crates/handlers/src/graphql/query/viewer.rs +++ b/crates/handlers/src/graphql/query/viewer.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{Context, Object}; diff --git a/crates/handlers/src/graphql/state.rs b/crates/handlers/src/graphql/state.rs index 737f43340..600fd232e 100644 --- a/crates/handlers/src/graphql/state.rs +++ b/crates/handlers/src/graphql/state.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_graphql::{Response, ServerError}; use mas_data_model::SiteConfig; diff --git a/crates/handlers/src/graphql/tests.rs b/crates/handlers/src/graphql/tests.rs index 08567314f..df4b5b80b 100644 --- a/crates/handlers/src/graphql/tests.rs +++ b/crates/handlers/src/graphql/tests.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::http::Request; use hyper::StatusCode; diff --git a/crates/handlers/src/health.rs b/crates/handlers/src/health.rs index b1dfbf993..916df60df 100644 --- a/crates/handlers/src/health.rs +++ b/crates/handlers/src/health.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{extract::State, response::IntoResponse}; use mas_axum_utils::InternalError; diff --git a/crates/handlers/src/lib.rs b/crates/handlers/src/lib.rs index 0605d6cd6..51dde981b 100644 --- a/crates/handlers/src/lib.rs +++ b/crates/handlers/src/lib.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(clippy::future_not_send)] #![allow( diff --git a/crates/handlers/src/oauth2/authorization/callback.rs b/crates/handlers/src/oauth2/authorization/callback.rs index beb0868d7..01f59d602 100644 --- a/crates/handlers/src/oauth2/authorization/callback.rs +++ b/crates/handlers/src/oauth2/authorization/callback.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::module_name_repetitions)] diff --git a/crates/handlers/src/oauth2/authorization/consent.rs b/crates/handlers/src/oauth2/authorization/consent.rs index 14dfd0e7f..7588a8e99 100644 --- a/crates/handlers/src/oauth2/authorization/consent.rs +++ b/crates/handlers/src/oauth2/authorization/consent.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Form, Path, State}, diff --git a/crates/handlers/src/oauth2/authorization/mod.rs b/crates/handlers/src/oauth2/authorization/mod.rs index c3b080eae..a3aa24bdc 100644 --- a/crates/handlers/src/oauth2/authorization/mod.rs +++ b/crates/handlers/src/oauth2/authorization/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Form, State}, diff --git a/crates/handlers/src/oauth2/device/authorize.rs b/crates/handlers/src/oauth2/device/authorize.rs index 1feec8c3e..b4651f4b8 100644 --- a/crates/handlers/src/oauth2/device/authorize.rs +++ b/crates/handlers/src/oauth2/device/authorize.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{Json, extract::State, response::IntoResponse}; use axum_extra::typed_header::TypedHeader; diff --git a/crates/handlers/src/oauth2/device/consent.rs b/crates/handlers/src/oauth2/device/consent.rs index 05e1d502d..c8114c3a0 100644 --- a/crates/handlers/src/oauth2/device/consent.rs +++ b/crates/handlers/src/oauth2/device/consent.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context; use axum::{ diff --git a/crates/handlers/src/oauth2/device/link.rs b/crates/handlers/src/oauth2/device/link.rs index 0e3c8bd2c..538aed3c6 100644 --- a/crates/handlers/src/oauth2/device/link.rs +++ b/crates/handlers/src/oauth2/device/link.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Query, State}, diff --git a/crates/handlers/src/oauth2/device/mod.rs b/crates/handlers/src/oauth2/device/mod.rs index d874cf19b..565ce5df5 100644 --- a/crates/handlers/src/oauth2/device/mod.rs +++ b/crates/handlers/src/oauth2/device/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub mod authorize; pub mod consent; diff --git a/crates/handlers/src/oauth2/discovery.rs b/crates/handlers/src/oauth2/discovery.rs index bdefa3e62..b1e2000a5 100644 --- a/crates/handlers/src/oauth2/discovery.rs +++ b/crates/handlers/src/oauth2/discovery.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{Json, extract::State, response::IntoResponse}; use mas_iana::oauth::{ diff --git a/crates/handlers/src/oauth2/introspection.rs b/crates/handlers/src/oauth2/introspection.rs index 3ae4a3a1c..b1a7a99ea 100644 --- a/crates/handlers/src/oauth2/introspection.rs +++ b/crates/handlers/src/oauth2/introspection.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/handlers/src/oauth2/keys.rs b/crates/handlers/src/oauth2/keys.rs index bcb419969..04e4135e3 100644 --- a/crates/handlers/src/oauth2/keys.rs +++ b/crates/handlers/src/oauth2/keys.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{Json, extract::State, response::IntoResponse}; use mas_keystore::Keystore; diff --git a/crates/handlers/src/oauth2/mod.rs b/crates/handlers/src/oauth2/mod.rs index f15a1ae9d..cbe81072f 100644 --- a/crates/handlers/src/oauth2/mod.rs +++ b/crates/handlers/src/oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/handlers/src/oauth2/registration.rs b/crates/handlers/src/oauth2/registration.rs index f3f91d754..09ace7351 100644 --- a/crates/handlers/src/oauth2/registration.rs +++ b/crates/handlers/src/oauth2/registration.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/handlers/src/oauth2/revoke.rs b/crates/handlers/src/oauth2/revoke.rs index 758f0d647..4889257b4 100644 --- a/crates/handlers/src/oauth2/revoke.rs +++ b/crates/handlers/src/oauth2/revoke.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{Json, extract::State, response::IntoResponse}; use hyper::StatusCode; diff --git a/crates/handlers/src/oauth2/token.rs b/crates/handlers/src/oauth2/token.rs index 3c8c9db20..1634e8f2e 100644 --- a/crates/handlers/src/oauth2/token.rs +++ b/crates/handlers/src/oauth2/token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock}; diff --git a/crates/handlers/src/oauth2/userinfo.rs b/crates/handlers/src/oauth2/userinfo.rs index 064196e3d..338e98ec7 100644 --- a/crates/handlers/src/oauth2/userinfo.rs +++ b/crates/handlers/src/oauth2/userinfo.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ Json, diff --git a/crates/handlers/src/oauth2/webfinger.rs b/crates/handlers/src/oauth2/webfinger.rs index 5c4b3c96b..8289e495c 100644 --- a/crates/handlers/src/oauth2/webfinger.rs +++ b/crates/handlers/src/oauth2/webfinger.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ Json, diff --git a/crates/handlers/src/passwords.rs b/crates/handlers/src/passwords.rs index f4ce10adb..0a9e41807 100644 --- a/crates/handlers/src/passwords.rs +++ b/crates/handlers/src/passwords.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, sync::Arc}; diff --git a/crates/handlers/src/preferred_language.rs b/crates/handlers/src/preferred_language.rs index cfa0e106d..8ea38c990 100644 --- a/crates/handlers/src/preferred_language.rs +++ b/crates/handlers/src/preferred_language.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{convert::Infallible, sync::Arc}; diff --git a/crates/handlers/src/rate_limit.rs b/crates/handlers/src/rate_limit.rs index bb5642036..1714d4fed 100644 --- a/crates/handlers/src/rate_limit.rs +++ b/crates/handlers/src/rate_limit.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{net::IpAddr, sync::Arc, time::Duration}; diff --git a/crates/handlers/src/session.rs b/crates/handlers/src/session.rs index 9eac19307..75638f5cd 100644 --- a/crates/handlers/src/session.rs +++ b/crates/handlers/src/session.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Utilities for showing proposer HTML fallbacks when the user is logged out, //! locked or deactivated diff --git a/crates/handlers/src/test_utils.rs b/crates/handlers/src/test_utils.rs index f5a7403da..4abd09506 100644 --- a/crates/handlers/src/test_utils.rs +++ b/crates/handlers/src/test_utils.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ convert::Infallible, diff --git a/crates/handlers/src/upstream_oauth2/authorize.rs b/crates/handlers/src/upstream_oauth2/authorize.rs index 43403c137..4168fc49e 100644 --- a/crates/handlers/src/upstream_oauth2/authorize.rs +++ b/crates/handlers/src/upstream_oauth2/authorize.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Path, Query, State}, diff --git a/crates/handlers/src/upstream_oauth2/cache.rs b/crates/handlers/src/upstream_oauth2/cache.rs index 6c1b7de63..d93743bc3 100644 --- a/crates/handlers/src/upstream_oauth2/cache.rs +++ b/crates/handlers/src/upstream_oauth2/cache.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, sync::Arc}; diff --git a/crates/handlers/src/upstream_oauth2/callback.rs b/crates/handlers/src/upstream_oauth2/callback.rs index 75e8d63a0..e6b207490 100644 --- a/crates/handlers/src/upstream_oauth2/callback.rs +++ b/crates/handlers/src/upstream_oauth2/callback.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/handlers/src/upstream_oauth2/cookie.rs b/crates/handlers/src/upstream_oauth2/cookie.rs index cbcfb5148..b978ddaa9 100644 --- a/crates/handlers/src/upstream_oauth2/cookie.rs +++ b/crates/handlers/src/upstream_oauth2/cookie.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // TODO: move that to a standalone cookie manager diff --git a/crates/handlers/src/upstream_oauth2/link.rs b/crates/handlers/src/upstream_oauth2/link.rs index d95854faa..610fdf3e0 100644 --- a/crates/handlers/src/upstream_oauth2/link.rs +++ b/crates/handlers/src/upstream_oauth2/link.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock}; diff --git a/crates/handlers/src/upstream_oauth2/mod.rs b/crates/handlers/src/upstream_oauth2/mod.rs index c387aca1b..e4fa88d6f 100644 --- a/crates/handlers/src/upstream_oauth2/mod.rs +++ b/crates/handlers/src/upstream_oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::string::FromUtf8Error; diff --git a/crates/handlers/src/upstream_oauth2/template.rs b/crates/handlers/src/upstream_oauth2/template.rs index cdd193f09..fcf24473a 100644 --- a/crates/handlers/src/upstream_oauth2/template.rs +++ b/crates/handlers/src/upstream_oauth2/template.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, sync::Arc}; diff --git a/crates/handlers/src/views/app.rs b/crates/handlers/src/views/app.rs index 47b657436..b0bb3e31c 100644 --- a/crates/handlers/src/views/app.rs +++ b/crates/handlers/src/views/app.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Query, State}, diff --git a/crates/handlers/src/views/index.rs b/crates/handlers/src/views/index.rs index c05f4e307..bc6b19f37 100644 --- a/crates/handlers/src/views/index.rs +++ b/crates/handlers/src/views/index.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::State, diff --git a/crates/handlers/src/views/login.rs b/crates/handlers/src/views/login.rs index 1db44285a..f684f32ad 100644 --- a/crates/handlers/src/views/login.rs +++ b/crates/handlers/src/views/login.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock}; diff --git a/crates/handlers/src/views/logout.rs b/crates/handlers/src/views/logout.rs index 66bd28311..731071c8b 100644 --- a/crates/handlers/src/views/logout.rs +++ b/crates/handlers/src/views/logout.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Form, State}, diff --git a/crates/handlers/src/views/mod.rs b/crates/handlers/src/views/mod.rs index 5d5c615e8..bc070cda7 100644 --- a/crates/handlers/src/views/mod.rs +++ b/crates/handlers/src/views/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub mod app; pub mod index; diff --git a/crates/handlers/src/views/recovery/mod.rs b/crates/handlers/src/views/recovery/mod.rs index fefae9890..630e9905d 100644 --- a/crates/handlers/src/views/recovery/mod.rs +++ b/crates/handlers/src/views/recovery/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub mod progress; pub mod start; diff --git a/crates/handlers/src/views/recovery/progress.rs b/crates/handlers/src/views/recovery/progress.rs index ea56e6cb1..75c342b1e 100644 --- a/crates/handlers/src/views/recovery/progress.rs +++ b/crates/handlers/src/views/recovery/progress.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ Form, diff --git a/crates/handlers/src/views/recovery/start.rs b/crates/handlers/src/views/recovery/start.rs index 72d0bc666..df52549b3 100644 --- a/crates/handlers/src/views/recovery/start.rs +++ b/crates/handlers/src/views/recovery/start.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::str::FromStr; diff --git a/crates/handlers/src/views/register/cookie.rs b/crates/handlers/src/views/register/cookie.rs index 7e3eb8173..d00d11109 100644 --- a/crates/handlers/src/views/register/cookie.rs +++ b/crates/handlers/src/views/register/cookie.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // TODO: move that to a standalone cookie manager diff --git a/crates/handlers/src/views/register/mod.rs b/crates/handlers/src/views/register/mod.rs index 3afe24573..f78a3df2e 100644 --- a/crates/handlers/src/views/register/mod.rs +++ b/crates/handlers/src/views/register/mod.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use axum::{ extract::{Query, State}, diff --git a/crates/handlers/src/views/register/password.rs b/crates/handlers/src/views/register/password.rs index 0745567a9..a94cecddc 100644 --- a/crates/handlers/src/views/register/password.rs +++ b/crates/handlers/src/views/register/password.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{str::FromStr, sync::Arc}; diff --git a/crates/handlers/src/views/register/steps/display_name.rs b/crates/handlers/src/views/register/steps/display_name.rs index fa029475a..dd1a846d0 100644 --- a/crates/handlers/src/views/register/steps/display_name.rs +++ b/crates/handlers/src/views/register/steps/display_name.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use axum::{ diff --git a/crates/handlers/src/views/register/steps/finish.rs b/crates/handlers/src/views/register/steps/finish.rs index 55fb47e71..2bf0d36ee 100644 --- a/crates/handlers/src/views/register/steps/finish.rs +++ b/crates/handlers/src/views/register/steps/finish.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock}; diff --git a/crates/handlers/src/views/register/steps/mod.rs b/crates/handlers/src/views/register/steps/mod.rs index ae57f5a0c..715934d9f 100644 --- a/crates/handlers/src/views/register/steps/mod.rs +++ b/crates/handlers/src/views/register/steps/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub(crate) mod display_name; pub(crate) mod finish; diff --git a/crates/handlers/src/views/register/steps/registration_token.rs b/crates/handlers/src/views/register/steps/registration_token.rs index eacf343a3..9697214fe 100644 --- a/crates/handlers/src/views/register/steps/registration_token.rs +++ b/crates/handlers/src/views/register/steps/registration_token.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context as _; use axum::{ diff --git a/crates/handlers/src/views/register/steps/verify_email.rs b/crates/handlers/src/views/register/steps/verify_email.rs index bd291d5f0..bf464f8d6 100644 --- a/crates/handlers/src/views/register/steps/verify_email.rs +++ b/crates/handlers/src/views/register/steps/verify_email.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context; use axum::{ diff --git a/crates/handlers/src/views/shared.rs b/crates/handlers/src/views/shared.rs index 8a304ff83..05b494de8 100644 --- a/crates/handlers/src/views/shared.rs +++ b/crates/handlers/src/views/shared.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context; use mas_router::{PostAuthAction, Route, UrlBuilder}; diff --git a/crates/http/src/ext.rs b/crates/http/src/ext.rs index 838531df4..00c8a3013 100644 --- a/crates/http/src/ext.rs +++ b/crates/http/src/ext.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::OnceLock; diff --git a/crates/http/src/lib.rs b/crates/http/src/lib.rs index 72c64aaba..02d1864da 100644 --- a/crates/http/src/lib.rs +++ b/crates/http/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Utilities to do HTTP requests diff --git a/crates/http/src/reqwest.rs b/crates/http/src/reqwest.rs index 561fb100f..5ee863ab1 100644 --- a/crates/http/src/reqwest.rs +++ b/crates/http/src/reqwest.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ str::FromStr, diff --git a/crates/i18n-scan/src/key.rs b/crates/i18n-scan/src/key.rs index 8f5663d07..2a3b276d8 100644 --- a/crates/i18n-scan/src/key.rs +++ b/crates/i18n-scan/src/key.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_i18n::{Message, translations::TranslationTree}; use minijinja::machinery::Span; diff --git a/crates/i18n-scan/src/main.rs b/crates/i18n-scan/src/main.rs index f514d9c09..7f0824c36 100644 --- a/crates/i18n-scan/src/main.rs +++ b/crates/i18n-scan/src/main.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // Without the custom_syntax feature, the `SyntaxConfig` is a unit struct // which is annoying with this clippy lint diff --git a/crates/i18n-scan/src/minijinja.rs b/crates/i18n-scan/src/minijinja.rs index 51910783a..b6e9dda51 100644 --- a/crates/i18n-scan/src/minijinja.rs +++ b/crates/i18n-scan/src/minijinja.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub use minijinja::machinery::parse; use minijinja::{ diff --git a/crates/i18n/src/lib.rs b/crates/i18n/src/lib.rs index 44fb06a5e..a4dfc7e2a 100644 --- a/crates/i18n/src/lib.rs +++ b/crates/i18n/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub mod sprintf; pub mod translations; diff --git a/crates/i18n/src/sprintf/argument.rs b/crates/i18n/src/sprintf/argument.rs index 486aee58f..c83ac0e2d 100644 --- a/crates/i18n/src/sprintf/argument.rs +++ b/crates/i18n/src/sprintf/argument.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/i18n/src/sprintf/formatter.rs b/crates/i18n/src/sprintf/formatter.rs index a0846e46f..8f940c26e 100644 --- a/crates/i18n/src/sprintf/formatter.rs +++ b/crates/i18n/src/sprintf/formatter.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::fmt::Formatter; diff --git a/crates/i18n/src/sprintf/grammar.pest b/crates/i18n/src/sprintf/grammar.pest index 8620b0edd..aa81de02f 100644 --- a/crates/i18n/src/sprintf/grammar.pest +++ b/crates/i18n/src/sprintf/grammar.pest @@ -2,7 +2,7 @@ // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // // SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// Please see LICENSE files in the repository root for full details. message = _{ (text | percent | placeholder)* ~ EOI } diff --git a/crates/i18n/src/sprintf/message.rs b/crates/i18n/src/sprintf/message.rs index e78e4f908..f92041ac5 100644 --- a/crates/i18n/src/sprintf/message.rs +++ b/crates/i18n/src/sprintf/message.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use serde::{Deserialize, Serialize}; diff --git a/crates/i18n/src/sprintf/mod.rs b/crates/i18n/src/sprintf/mod.rs index 7fd062204..72ca75373 100644 --- a/crates/i18n/src/sprintf/mod.rs +++ b/crates/i18n/src/sprintf/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(unused_macros)] diff --git a/crates/i18n/src/sprintf/parser.rs b/crates/i18n/src/sprintf/parser.rs index cadb23ed7..ab5aaf87b 100644 --- a/crates/i18n/src/sprintf/parser.rs +++ b/crates/i18n/src/sprintf/parser.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::result_large_err)] diff --git a/crates/i18n/src/translations.rs b/crates/i18n/src/translations.rs index 8e90b5204..9bde8fa05 100644 --- a/crates/i18n/src/translations.rs +++ b/crates/i18n/src/translations.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ collections::{BTreeMap, BTreeSet}, diff --git a/crates/i18n/src/translator.rs b/crates/i18n/src/translator.rs index 68afb1793..cd36a6c4b 100644 --- a/crates/i18n/src/translator.rs +++ b/crates/i18n/src/translator.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, fs::File, io::BufReader, str::FromStr}; diff --git a/crates/iana-codegen/src/generation.rs b/crates/iana-codegen/src/generation.rs index 82f67b05b..28343ee4f 100644 --- a/crates/iana-codegen/src/generation.rs +++ b/crates/iana-codegen/src/generation.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use crate::traits::{EnumMember, Section}; diff --git a/crates/iana-codegen/src/jose.rs b/crates/iana-codegen/src/jose.rs index 9f94cdf81..36d00de74 100644 --- a/crates/iana-codegen/src/jose.rs +++ b/crates/iana-codegen/src/jose.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use serde::Deserialize; diff --git a/crates/iana-codegen/src/main.rs b/crates/iana-codegen/src/main.rs index b5b1c28eb..9fc06ef34 100644 --- a/crates/iana-codegen/src/main.rs +++ b/crates/iana-codegen/src/main.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, fmt::Display}; @@ -79,7 +79,7 @@ impl Display for File { // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // // SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// Please see LICENSE files in the repository root for full details. #![allow(clippy::doc_markdown)] diff --git a/crates/iana-codegen/src/oauth.rs b/crates/iana-codegen/src/oauth.rs index 9afc62659..2809bb7db 100644 --- a/crates/iana-codegen/src/oauth.rs +++ b/crates/iana-codegen/src/oauth.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use serde::Deserialize; diff --git a/crates/iana-codegen/src/traits.rs b/crates/iana-codegen/src/traits.rs index c080f901c..c5a2617e6 100644 --- a/crates/iana-codegen/src/traits.rs +++ b/crates/iana-codegen/src/traits.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context; use async_trait::async_trait; diff --git a/crates/iana/src/jose.rs b/crates/iana/src/jose.rs index 8ffc395ca..a60b309af 100644 --- a/crates/iana/src/jose.rs +++ b/crates/iana/src/jose.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::doc_markdown)] diff --git a/crates/iana/src/lib.rs b/crates/iana/src/lib.rs index 59f8b3bf1..657e7375c 100644 --- a/crates/iana/src/lib.rs +++ b/crates/iana/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Values from IANA registries, generated by the `mas-iana-codegen` crate diff --git a/crates/iana/src/oauth.rs b/crates/iana/src/oauth.rs index 530e4bd7b..5dfbf1fb7 100644 --- a/crates/iana/src/oauth.rs +++ b/crates/iana/src/oauth.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::doc_markdown)] diff --git a/crates/jose/src/base64.rs b/crates/jose/src/base64.rs index b5b0b2386..5886368ab 100644 --- a/crates/jose/src/base64.rs +++ b/crates/jose/src/base64.rs @@ -1,3 +1,8 @@ +// Copyright 2025 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. + //! Transparent base64 encoding / decoding as part of (de)serialization. use std::{borrow::Cow, fmt, marker::PhantomData, str}; diff --git a/crates/jose/src/claims.rs b/crates/jose/src/claims.rs index 455be2ff9..8115d2a76 100644 --- a/crates/jose/src/claims.rs +++ b/crates/jose/src/claims.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, convert::Infallible, marker::PhantomData, ops::Deref}; diff --git a/crates/jose/src/constraints.rs b/crates/jose/src/constraints.rs index 23e0ec712..16859c889 100644 --- a/crates/jose/src/constraints.rs +++ b/crates/jose/src/constraints.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashSet; diff --git a/crates/jose/src/jwa/asymmetric.rs b/crates/jose/src/jwa/asymmetric.rs index 21472deb6..b490d5796 100644 --- a/crates/jose/src/jwa/asymmetric.rs +++ b/crates/jose/src/jwa/asymmetric.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use digest::Digest; use mas_iana::jose::{JsonWebKeyEcEllipticCurve, JsonWebSignatureAlg}; diff --git a/crates/jose/src/jwa/hmac.rs b/crates/jose/src/jwa/hmac.rs index af7bd59d9..ba24ee960 100644 --- a/crates/jose/src/jwa/hmac.rs +++ b/crates/jose/src/jwa/hmac.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::marker::PhantomData; diff --git a/crates/jose/src/jwa/mod.rs b/crates/jose/src/jwa/mod.rs index 690b57993..f01308575 100644 --- a/crates/jose/src/jwa/mod.rs +++ b/crates/jose/src/jwa/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_iana::jose::JsonWebSignatureAlg; use sha2::{Sha256, Sha384, Sha512}; diff --git a/crates/jose/src/jwa/signature.rs b/crates/jose/src/jwa/signature.rs index af72f3fcc..35c3cb978 100644 --- a/crates/jose/src/jwa/signature.rs +++ b/crates/jose/src/jwa/signature.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use signature::SignatureEncoding as _; diff --git a/crates/jose/src/jwa/symmetric.rs b/crates/jose/src/jwa/symmetric.rs index b5d821dbc..3e45b6ab0 100644 --- a/crates/jose/src/jwa/symmetric.rs +++ b/crates/jose/src/jwa/symmetric.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_iana::jose::JsonWebSignatureAlg; use thiserror::Error; diff --git a/crates/jose/src/jwk/mod.rs b/crates/jose/src/jwk/mod.rs index 8c397239c..27ac929e9 100644 --- a/crates/jose/src/jwk/mod.rs +++ b/crates/jose/src/jwk/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Ref: diff --git a/crates/jose/src/jwk/private_parameters.rs b/crates/jose/src/jwk/private_parameters.rs index d0ac8be87..6518e5ba4 100644 --- a/crates/jose/src/jwk/private_parameters.rs +++ b/crates/jose/src/jwk/private_parameters.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_iana::jose::{ JsonWebKeyEcEllipticCurve, JsonWebKeyOkpEllipticCurve, JsonWebKeyType, JsonWebSignatureAlg, diff --git a/crates/jose/src/jwk/public_parameters.rs b/crates/jose/src/jwk/public_parameters.rs index 1b5eaadbf..1bc29604d 100644 --- a/crates/jose/src/jwk/public_parameters.rs +++ b/crates/jose/src/jwk/public_parameters.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_iana::jose::{ JsonWebKeyEcEllipticCurve, JsonWebKeyOkpEllipticCurve, JsonWebKeyType, JsonWebSignatureAlg, diff --git a/crates/jose/src/jwt/header.rs b/crates/jose/src/jwt/header.rs index 56aaef6d8..c35e9fdb4 100644 --- a/crates/jose/src/jwt/header.rs +++ b/crates/jose/src/jwt/header.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_iana::jose::JsonWebSignatureAlg; use serde::{Deserialize, Serialize}; diff --git a/crates/jose/src/jwt/mod.rs b/crates/jose/src/jwt/mod.rs index 15cf20f2f..50a777195 100644 --- a/crates/jose/src/jwt/mod.rs +++ b/crates/jose/src/jwt/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod header; mod raw; diff --git a/crates/jose/src/jwt/raw.rs b/crates/jose/src/jwt/raw.rs index 869150346..46193f993 100644 --- a/crates/jose/src/jwt/raw.rs +++ b/crates/jose/src/jwt/raw.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{borrow::Cow, ops::Deref}; diff --git a/crates/jose/src/jwt/signed.rs b/crates/jose/src/jwt/signed.rs index ba7a552c8..3d632c05b 100644 --- a/crates/jose/src/jwt/signed.rs +++ b/crates/jose/src/jwt/signed.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use base64ct::{Base64UrlUnpadded, Encoding}; use rand::thread_rng; diff --git a/crates/jose/src/lib.rs b/crates/jose/src/lib.rs index 9f9bf2348..3384d9f1c 100644 --- a/crates/jose/src/lib.rs +++ b/crates/jose/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(rustdoc::broken_intra_doc_links)] #![allow(clippy::module_name_repetitions)] diff --git a/crates/jose/tests/generate.py b/crates/jose/tests/generate.py index d66f55369..e70f5725c 100644 --- a/crates/jose/tests/generate.py +++ b/crates/jose/tests/generate.py @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # Generates test keys, JWKS and JWTs # Required the `openssl` binary and the `authlib` python library diff --git a/crates/jose/tests/jws.rs b/crates/jose/tests/jws.rs index e6947d5a0..d7068cdad 100644 --- a/crates/jose/tests/jws.rs +++ b/crates/jose/tests/jws.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. static HS256_JWT: &str = include_str!("./jwts/hs256.jwt"); static HS384_JWT: &str = include_str!("./jwts/hs384.jwt"); diff --git a/crates/keystore/src/encrypter.rs b/crates/keystore/src/encrypter.rs index d4d61154d..a2cb738e0 100644 --- a/crates/keystore/src/encrypter.rs +++ b/crates/keystore/src/encrypter.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/keystore/src/lib.rs b/crates/keystore/src/lib.rs index 639afcb0d..66de683f0 100644 --- a/crates/keystore/src/lib.rs +++ b/crates/keystore/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A crate to store keys which can then be used to sign and verify JWTs. diff --git a/crates/keystore/tests/keystore.rs b/crates/keystore/tests/keystore.rs index 6bdbe8286..08ad2ddc2 100644 --- a/crates/keystore/tests/keystore.rs +++ b/crates/keystore/tests/keystore.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use der::pem::LineEnding; use mas_iana::jose::JsonWebSignatureAlg; diff --git a/crates/listener/examples/demo/main.rs b/crates/listener/examples/demo/main.rs index 1a950fa6d..2a0462309 100644 --- a/crates/listener/examples/demo/main.rs +++ b/crates/listener/examples/demo/main.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ convert::Infallible, diff --git a/crates/listener/src/lib.rs b/crates/listener/src/lib.rs index 74ded2388..1618365b1 100644 --- a/crates/listener/src/lib.rs +++ b/crates/listener/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(rustdoc::missing_crate_level_docs)] #![allow(clippy::module_name_repetitions)] diff --git a/crates/listener/src/maybe_tls.rs b/crates/listener/src/maybe_tls.rs index 635141cbc..02fec8946 100644 --- a/crates/listener/src/maybe_tls.rs +++ b/crates/listener/src/maybe_tls.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ pin::Pin, diff --git a/crates/listener/src/proxy_protocol/acceptor.rs b/crates/listener/src/proxy_protocol/acceptor.rs index 7ca24bd56..d62ab6182 100644 --- a/crates/listener/src/proxy_protocol/acceptor.rs +++ b/crates/listener/src/proxy_protocol/acceptor.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use bytes::BytesMut; use thiserror::Error; diff --git a/crates/listener/src/proxy_protocol/maybe.rs b/crates/listener/src/proxy_protocol/maybe.rs index 29e47f047..47c4860e8 100644 --- a/crates/listener/src/proxy_protocol/maybe.rs +++ b/crates/listener/src/proxy_protocol/maybe.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use tokio::io::AsyncRead; diff --git a/crates/listener/src/proxy_protocol/mod.rs b/crates/listener/src/proxy_protocol/mod.rs index 820ef428a..5f9929fed 100644 --- a/crates/listener/src/proxy_protocol/mod.rs +++ b/crates/listener/src/proxy_protocol/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod acceptor; mod maybe; diff --git a/crates/listener/src/proxy_protocol/v1.rs b/crates/listener/src/proxy_protocol/v1.rs index 93a5dabd1..c993d8b77 100644 --- a/crates/listener/src/proxy_protocol/v1.rs +++ b/crates/listener/src/proxy_protocol/v1.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ net::{AddrParseError, Ipv4Addr, Ipv6Addr, SocketAddr}, diff --git a/crates/listener/src/server.rs b/crates/listener/src/server.rs index f0b66820d..50775cfbb 100644 --- a/crates/listener/src/server.rs +++ b/crates/listener/src/server.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ pin::Pin, diff --git a/crates/listener/src/unix_or_tcp.rs b/crates/listener/src/unix_or_tcp.rs index 565adec4d..4b1552393 100644 --- a/crates/listener/src/unix_or_tcp.rs +++ b/crates/listener/src/unix_or_tcp.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A listener which can listen on either TCP sockets or on UNIX domain sockets diff --git a/crates/matrix-synapse/src/error.rs b/crates/matrix-synapse/src/error.rs index bcb31157b..01f01a3ce 100644 --- a/crates/matrix-synapse/src/error.rs +++ b/crates/matrix-synapse/src/error.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::fmt::Display; diff --git a/crates/matrix-synapse/src/lib.rs b/crates/matrix-synapse/src/lib.rs index 5ca7daa9e..54a6c0aeb 100644 --- a/crates/matrix-synapse/src/lib.rs +++ b/crates/matrix-synapse/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashSet, time::Duration}; diff --git a/crates/matrix/src/lib.rs b/crates/matrix/src/lib.rs index ae8a4e563..9c0f81bd3 100644 --- a/crates/matrix/src/lib.rs +++ b/crates/matrix/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod mock; mod readonly; diff --git a/crates/matrix/src/mock.rs b/crates/matrix/src/mock.rs index 7c7973ce0..7969fee3c 100644 --- a/crates/matrix/src/mock.rs +++ b/crates/matrix/src/mock.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::{HashMap, HashSet}; diff --git a/crates/matrix/src/readonly.rs b/crates/matrix/src/readonly.rs index 530c3cd89..10a0642c2 100644 --- a/crates/matrix/src/readonly.rs +++ b/crates/matrix/src/readonly.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashSet; diff --git a/crates/oauth2-types/src/errors.rs b/crates/oauth2-types/src/errors.rs index f5e349c82..b3077636c 100644 --- a/crates/oauth2-types/src/errors.rs +++ b/crates/oauth2-types/src/errors.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Error types returned by an authorization server. diff --git a/crates/oauth2-types/src/lib.rs b/crates/oauth2-types/src/lib.rs index 0f1729ec8..e937288ff 100644 --- a/crates/oauth2-types/src/lib.rs +++ b/crates/oauth2-types/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! [OAuth 2.0] and [OpenID Connect] types. //! diff --git a/crates/oauth2-types/src/oidc.rs b/crates/oauth2-types/src/oidc.rs index 5cbdf2e4b..25518ab75 100644 --- a/crates/oauth2-types/src/oidc.rs +++ b/crates/oauth2-types/src/oidc.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Types to interact with the [OpenID Connect] specification. //! diff --git a/crates/oauth2-types/src/pkce.rs b/crates/oauth2-types/src/pkce.rs index 0682cb149..d806ae7f6 100644 --- a/crates/oauth2-types/src/pkce.rs +++ b/crates/oauth2-types/src/pkce.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Types for the [Proof Key for Code Exchange]. //! diff --git a/crates/oauth2-types/src/registration/client_metadata_serde.rs b/crates/oauth2-types/src/registration/client_metadata_serde.rs index 8ccefe36f..8edfcc6ca 100644 --- a/crates/oauth2-types/src/registration/client_metadata_serde.rs +++ b/crates/oauth2-types/src/registration/client_metadata_serde.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::borrow::Cow; diff --git a/crates/oauth2-types/src/registration/mod.rs b/crates/oauth2-types/src/registration/mod.rs index 27d99c2a8..7ca0d93a3 100644 --- a/crates/oauth2-types/src/registration/mod.rs +++ b/crates/oauth2-types/src/registration/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Types for [Dynamic Client Registration]. //! diff --git a/crates/oauth2-types/src/requests.rs b/crates/oauth2-types/src/requests.rs index 36ee36da6..ac0770411 100644 --- a/crates/oauth2-types/src/requests.rs +++ b/crates/oauth2-types/src/requests.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests and response types to interact with the [OAuth 2.0] specification. //! diff --git a/crates/oauth2-types/src/response_type.rs b/crates/oauth2-types/src/response_type.rs index 1b4c4da03..669036c28 100644 --- a/crates/oauth2-types/src/response_type.rs +++ b/crates/oauth2-types/src/response_type.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! [Response types] in the OpenID Connect specification. //! diff --git a/crates/oauth2-types/src/scope.rs b/crates/oauth2-types/src/scope.rs index a13719e54..1b4deba55 100644 --- a/crates/oauth2-types/src/scope.rs +++ b/crates/oauth2-types/src/scope.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Types to define an [access token's scope]. //! diff --git a/crates/oauth2-types/src/test_utils.rs b/crates/oauth2-types/src/test_utils.rs index a1bdb30d5..69e58f9ea 100644 --- a/crates/oauth2-types/src/test_utils.rs +++ b/crates/oauth2-types/src/test_utils.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::fmt::Debug; diff --git a/crates/oauth2-types/src/webfinger.rs b/crates/oauth2-types/src/webfinger.rs index 17d7557c4..34e132324 100644 --- a/crates/oauth2-types/src/webfinger.rs +++ b/crates/oauth2-types/src/webfinger.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Types for provider discovery using [Webfinger]. //! diff --git a/crates/oidc-client/src/error.rs b/crates/oidc-client/src/error.rs index 1642054e7..0f424464f 100644 --- a/crates/oidc-client/src/error.rs +++ b/crates/oidc-client/src/error.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! The error types used in this crate. diff --git a/crates/oidc-client/src/lib.rs b/crates/oidc-client/src/lib.rs index 24da41909..2b35896be 100644 --- a/crates/oidc-client/src/lib.rs +++ b/crates/oidc-client/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! An [OpenID Connect] client library for the [Matrix] specification. //! diff --git a/crates/oidc-client/src/requests/authorization_code.rs b/crates/oidc-client/src/requests/authorization_code.rs index 9271fe33c..4965e13d0 100644 --- a/crates/oidc-client/src/requests/authorization_code.rs +++ b/crates/oidc-client/src/requests/authorization_code.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests for the [Authorization Code flow]. //! diff --git a/crates/oidc-client/src/requests/client_credentials.rs b/crates/oidc-client/src/requests/client_credentials.rs index aebf412b8..539d1a715 100644 --- a/crates/oidc-client/src/requests/client_credentials.rs +++ b/crates/oidc-client/src/requests/client_credentials.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests for the [Client Credentials flow]. //! diff --git a/crates/oidc-client/src/requests/discovery.rs b/crates/oidc-client/src/requests/discovery.rs index 1d724b553..e3807c412 100644 --- a/crates/oidc-client/src/requests/discovery.rs +++ b/crates/oidc-client/src/requests/discovery.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests for OpenID Connect Provider [Discovery]. //! diff --git a/crates/oidc-client/src/requests/jose.rs b/crates/oidc-client/src/requests/jose.rs index a4c858359..12915caab 100644 --- a/crates/oidc-client/src/requests/jose.rs +++ b/crates/oidc-client/src/requests/jose.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests and method related to JSON Object Signing and Encryption. diff --git a/crates/oidc-client/src/requests/mod.rs b/crates/oidc-client/src/requests/mod.rs index 757b3d527..24cc9e27d 100644 --- a/crates/oidc-client/src/requests/mod.rs +++ b/crates/oidc-client/src/requests/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Methods to interact with OpenID Connect and OAuth2.0 endpoints. diff --git a/crates/oidc-client/src/requests/refresh_token.rs b/crates/oidc-client/src/requests/refresh_token.rs index 8b9e7719a..9af088b0c 100644 --- a/crates/oidc-client/src/requests/refresh_token.rs +++ b/crates/oidc-client/src/requests/refresh_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests for using [Refresh Tokens]. //! diff --git a/crates/oidc-client/src/requests/token.rs b/crates/oidc-client/src/requests/token.rs index 38e988495..774ab93dd 100644 --- a/crates/oidc-client/src/requests/token.rs +++ b/crates/oidc-client/src/requests/token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests for the Token endpoint. diff --git a/crates/oidc-client/src/requests/userinfo.rs b/crates/oidc-client/src/requests/userinfo.rs index fbcd27039..e10526fcf 100644 --- a/crates/oidc-client/src/requests/userinfo.rs +++ b/crates/oidc-client/src/requests/userinfo.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Requests for obtaining [Claims] about an end-user. //! diff --git a/crates/oidc-client/src/types/client_credentials.rs b/crates/oidc-client/src/types/client_credentials.rs index ca8d2a8f6..5ddeb9982 100644 --- a/crates/oidc-client/src/types/client_credentials.rs +++ b/crates/oidc-client/src/types/client_credentials.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Types and methods for client credentials. diff --git a/crates/oidc-client/src/types/mod.rs b/crates/oidc-client/src/types/mod.rs index 9f4e79f8c..79fe33a1c 100644 --- a/crates/oidc-client/src/types/mod.rs +++ b/crates/oidc-client/src/types/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! OAuth 2.0 and OpenID Connect types. diff --git a/crates/oidc-client/tests/it/main.rs b/crates/oidc-client/tests/it/main.rs index 270ab8a20..ce595661d 100644 --- a/crates/oidc-client/tests/it/main.rs +++ b/crates/oidc-client/tests/it/main.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/oidc-client/tests/it/requests/authorization_code.rs b/crates/oidc-client/tests/it/requests/authorization_code.rs index d0eb2a8c1..cc3f5b210 100644 --- a/crates/oidc-client/tests/it/requests/authorization_code.rs +++ b/crates/oidc-client/tests/it/requests/authorization_code.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, num::NonZeroU32}; diff --git a/crates/oidc-client/tests/it/requests/client_credentials.rs b/crates/oidc-client/tests/it/requests/client_credentials.rs index a6da9e0ff..00b3c774f 100644 --- a/crates/oidc-client/tests/it/requests/client_credentials.rs +++ b/crates/oidc-client/tests/it/requests/client_credentials.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/oidc-client/tests/it/requests/discovery.rs b/crates/oidc-client/tests/it/requests/discovery.rs index 4b2c9d18c..cacdf7d2e 100644 --- a/crates/oidc-client/tests/it/requests/discovery.rs +++ b/crates/oidc-client/tests/it/requests/discovery.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use assert_matches::assert_matches; use mas_iana::oauth::{OAuthAuthorizationEndpointResponseType, PkceCodeChallengeMethod}; diff --git a/crates/oidc-client/tests/it/requests/jose.rs b/crates/oidc-client/tests/it/requests/jose.rs index d45358f28..dcca40252 100644 --- a/crates/oidc-client/tests/it/requests/jose.rs +++ b/crates/oidc-client/tests/it/requests/jose.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/oidc-client/tests/it/requests/mod.rs b/crates/oidc-client/tests/it/requests/mod.rs index ee2bde285..fce40a2e0 100644 --- a/crates/oidc-client/tests/it/requests/mod.rs +++ b/crates/oidc-client/tests/it/requests/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod authorization_code; mod client_credentials; diff --git a/crates/oidc-client/tests/it/requests/refresh_token.rs b/crates/oidc-client/tests/it/requests/refresh_token.rs index ebda10a10..9b6e7c390 100644 --- a/crates/oidc-client/tests/it/requests/refresh_token.rs +++ b/crates/oidc-client/tests/it/requests/refresh_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/oidc-client/tests/it/requests/userinfo.rs b/crates/oidc-client/tests/it/requests/userinfo.rs index 2b3f9cfbd..f7d979ab0 100644 --- a/crates/oidc-client/tests/it/requests/userinfo.rs +++ b/crates/oidc-client/tests/it/requests/userinfo.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_oidc_client::requests::userinfo::fetch_userinfo; use serde_json::json; diff --git a/crates/oidc-client/tests/it/types/client_credentials.rs b/crates/oidc-client/tests/it/types/client_credentials.rs index b1939f40c..f07888473 100644 --- a/crates/oidc-client/tests/it/types/client_credentials.rs +++ b/crates/oidc-client/tests/it/types/client_credentials.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashMap; diff --git a/crates/oidc-client/tests/it/types/mod.rs b/crates/oidc-client/tests/it/types/mod.rs index a45ac15bd..a09d66a7b 100644 --- a/crates/oidc-client/tests/it/types/mod.rs +++ b/crates/oidc-client/tests/it/types/mod.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 Kévin Commaille. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod client_credentials; diff --git a/crates/policy/src/bin/schema.rs b/crates/policy/src/bin/schema.rs index 3fbe09adb..11cbb1fdc 100644 --- a/crates/policy/src/bin/schema.rs +++ b/crates/policy/src/bin/schema.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![expect( clippy::disallowed_types, diff --git a/crates/policy/src/lib.rs b/crates/policy/src/lib.rs index 5a714e9a2..8b8ede25b 100644 --- a/crates/policy/src/lib.rs +++ b/crates/policy/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub mod model; diff --git a/crates/policy/src/model.rs b/crates/policy/src/model.rs index d57a81655..2f54ae8bb 100644 --- a/crates/policy/src/model.rs +++ b/crates/policy/src/model.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Input and output types for policy evaluation. //! diff --git a/crates/router/src/endpoints.rs b/crates/router/src/endpoints.rs index 896f17a52..c285a36e1 100644 --- a/crates/router/src/endpoints.rs +++ b/crates/router/src/endpoints.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use serde::{Deserialize, Serialize}; use ulid::Ulid; diff --git a/crates/router/src/lib.rs b/crates/router/src/lib.rs index 5a06f1891..0308fdfcd 100644 --- a/crates/router/src/lib.rs +++ b/crates/router/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. pub(crate) mod endpoints; pub(crate) mod traits; diff --git a/crates/router/src/traits.rs b/crates/router/src/traits.rs index 53bb40678..5e7f13bdb 100644 --- a/crates/router/src/traits.rs +++ b/crates/router/src/traits.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::borrow::Cow; diff --git a/crates/router/src/url_builder.rs b/crates/router/src/url_builder.rs index d3a2f6f64..f216fb343 100644 --- a/crates/router/src/url_builder.rs +++ b/crates/router/src/url_builder.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Utility to build URLs diff --git a/crates/spa/src/lib.rs b/crates/spa/src/lib.rs index 91fc183d0..af3be8def 100644 --- a/crates/spa/src/lib.rs +++ b/crates/spa/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(rustdoc::missing_crate_level_docs)] diff --git a/crates/spa/src/vite.rs b/crates/spa/src/vite.rs index 31d5d3c7e..e2706d512 100644 --- a/crates/spa/src/vite.rs +++ b/crates/spa/src/vite.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::{BTreeSet, HashMap}; diff --git a/crates/storage-pg/build.rs b/crates/storage-pg/build.rs index d13fb1c76..007c4622f 100644 --- a/crates/storage-pg/build.rs +++ b/crates/storage-pg/build.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. fn main() { // trigger recompilation when a new migration is added diff --git a/crates/storage-pg/src/app_session.rs b/crates/storage-pg/src/app_session.rs index cd5e40b53..d11cb01d6 100644 --- a/crates/storage-pg/src/app_session.rs +++ b/crates/storage-pg/src/app_session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing PostgreSQL implementation of repositories for sessions diff --git a/crates/storage-pg/src/compat/access_token.rs b/crates/storage-pg/src/compat/access_token.rs index 852b0e934..2ca36fc9a 100644 --- a/crates/storage-pg/src/compat/access_token.rs +++ b/crates/storage-pg/src/compat/access_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Duration, Utc}; diff --git a/crates/storage-pg/src/compat/mod.rs b/crates/storage-pg/src/compat/mod.rs index 60332fd50..32f26303f 100644 --- a/crates/storage-pg/src/compat/mod.rs +++ b/crates/storage-pg/src/compat/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing PostgreSQL implementation of repositories for the //! compatibility layer diff --git a/crates/storage-pg/src/compat/refresh_token.rs b/crates/storage-pg/src/compat/refresh_token.rs index 41188e010..67a2b839e 100644 --- a/crates/storage-pg/src/compat/refresh_token.rs +++ b/crates/storage-pg/src/compat/refresh_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/compat/session.rs b/crates/storage-pg/src/compat/session.rs index 31f012477..19e6366d6 100644 --- a/crates/storage-pg/src/compat/session.rs +++ b/crates/storage-pg/src/compat/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage-pg/src/compat/sso_login.rs b/crates/storage-pg/src/compat/sso_login.rs index 2c794921b..822812ae5 100644 --- a/crates/storage-pg/src/compat/sso_login.rs +++ b/crates/storage-pg/src/compat/sso_login.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/errors.rs b/crates/storage-pg/src/errors.rs index 80fb9fa66..4c50557ff 100644 --- a/crates/storage-pg/src/errors.rs +++ b/crates/storage-pg/src/errors.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use sqlx::postgres::PgQueryResult; use thiserror::Error; diff --git a/crates/storage-pg/src/filter.rs b/crates/storage-pg/src/filter.rs index e0771fc4e..d8bf3e930 100644 --- a/crates/storage-pg/src/filter.rs +++ b/crates/storage-pg/src/filter.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. /// A filter which can be applied to a query pub(crate) trait Filter { diff --git a/crates/storage-pg/src/iden.rs b/crates/storage-pg/src/iden.rs index 6692c7a75..d401ca144 100644 --- a/crates/storage-pg/src/iden.rs +++ b/crates/storage-pg/src/iden.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Table and column identifiers used by [`sea_query`] diff --git a/crates/storage-pg/src/lib.rs b/crates/storage-pg/src/lib.rs index 30882cfa8..108248537 100644 --- a/crates/storage-pg/src/lib.rs +++ b/crates/storage-pg/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! An implementation of the storage traits for a PostgreSQL database //! diff --git a/crates/storage-pg/src/oauth2/access_token.rs b/crates/storage-pg/src/oauth2/access_token.rs index de652739f..fb5406285 100644 --- a/crates/storage-pg/src/oauth2/access_token.rs +++ b/crates/storage-pg/src/oauth2/access_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Duration, Utc}; diff --git a/crates/storage-pg/src/oauth2/authorization_grant.rs b/crates/storage-pg/src/oauth2/authorization_grant.rs index 59c5c2338..f58cfa69b 100644 --- a/crates/storage-pg/src/oauth2/authorization_grant.rs +++ b/crates/storage-pg/src/oauth2/authorization_grant.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/oauth2/client.rs b/crates/storage-pg/src/oauth2/client.rs index 60e1ebb54..2bcd51fe5 100644 --- a/crates/storage-pg/src/oauth2/client.rs +++ b/crates/storage-pg/src/oauth2/client.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{ collections::{BTreeMap, BTreeSet}, diff --git a/crates/storage-pg/src/oauth2/device_code_grant.rs b/crates/storage-pg/src/oauth2/device_code_grant.rs index ebed4d859..d7b3f0977 100644 --- a/crates/storage-pg/src/oauth2/device_code_grant.rs +++ b/crates/storage-pg/src/oauth2/device_code_grant.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage-pg/src/oauth2/mod.rs b/crates/storage-pg/src/oauth2/mod.rs index 3f70fd5cc..547128d10 100644 --- a/crates/storage-pg/src/oauth2/mod.rs +++ b/crates/storage-pg/src/oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementations of the OAuth2-related //! repositories diff --git a/crates/storage-pg/src/oauth2/refresh_token.rs b/crates/storage-pg/src/oauth2/refresh_token.rs index 742d3ae68..225bccaa8 100644 --- a/crates/storage-pg/src/oauth2/refresh_token.rs +++ b/crates/storage-pg/src/oauth2/refresh_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/oauth2/session.rs b/crates/storage-pg/src/oauth2/session.rs index d2fbd8130..3aa3877b1 100644 --- a/crates/storage-pg/src/oauth2/session.rs +++ b/crates/storage-pg/src/oauth2/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage-pg/src/pagination.rs b/crates/storage-pg/src/pagination.rs index 34f317a73..8e83c2372 100644 --- a/crates/storage-pg/src/pagination.rs +++ b/crates/storage-pg/src/pagination.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Utilities to manage paginated queries. diff --git a/crates/storage-pg/src/policy_data.rs b/crates/storage-pg/src/policy_data.rs index 65615b348..0ce9b15fa 100644 --- a/crates/storage-pg/src/policy_data.rs +++ b/crates/storage-pg/src/policy_data.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the policy data //! storage. diff --git a/crates/storage-pg/src/queue/job.rs b/crates/storage-pg/src/queue/job.rs index 6a7d81e01..c2208c515 100644 --- a/crates/storage-pg/src/queue/job.rs +++ b/crates/storage-pg/src/queue/job.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the //! [`QueueJobRepository`]. diff --git a/crates/storage-pg/src/queue/mod.rs b/crates/storage-pg/src/queue/mod.rs index 1c00e1d7d..d3570e59f 100644 --- a/crates/storage-pg/src/queue/mod.rs +++ b/crates/storage-pg/src/queue/mod.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the job queue diff --git a/crates/storage-pg/src/queue/schedule.rs b/crates/storage-pg/src/queue/schedule.rs index afd09a8e3..fd28ef141 100644 --- a/crates/storage-pg/src/queue/schedule.rs +++ b/crates/storage-pg/src/queue/schedule.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the //! [`QueueScheduleRepository`]. diff --git a/crates/storage-pg/src/queue/worker.rs b/crates/storage-pg/src/queue/worker.rs index 6c4a8e6c5..3aa21d5ce 100644 --- a/crates/storage-pg/src/queue/worker.rs +++ b/crates/storage-pg/src/queue/worker.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the //! [`QueueWorkerRepository`]. diff --git a/crates/storage-pg/src/repository.rs b/crates/storage-pg/src/repository.rs index 8dc02b9bb..7911cd2b6 100644 --- a/crates/storage-pg/src/repository.rs +++ b/crates/storage-pg/src/repository.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::ops::{Deref, DerefMut}; diff --git a/crates/storage-pg/src/telemetry.rs b/crates/storage-pg/src/telemetry.rs index 93c74e74f..4771f22cc 100644 --- a/crates/storage-pg/src/telemetry.rs +++ b/crates/storage-pg/src/telemetry.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/storage-pg/src/tracing.rs b/crates/storage-pg/src/tracing.rs index 137bf036c..4cab1fd79 100644 --- a/crates/storage-pg/src/tracing.rs +++ b/crates/storage-pg/src/tracing.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use opentelemetry_semantic_conventions::attribute::DB_QUERY_TEXT; use tracing::Span; diff --git a/crates/storage-pg/src/upstream_oauth2/link.rs b/crates/storage-pg/src/upstream_oauth2/link.rs index 390029f1f..4d04cb68e 100644 --- a/crates/storage-pg/src/upstream_oauth2/link.rs +++ b/crates/storage-pg/src/upstream_oauth2/link.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/upstream_oauth2/mod.rs b/crates/storage-pg/src/upstream_oauth2/mod.rs index a5cda570b..23f73481c 100644 --- a/crates/storage-pg/src/upstream_oauth2/mod.rs +++ b/crates/storage-pg/src/upstream_oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the repositories //! related to the upstream OAuth 2.0 providers diff --git a/crates/storage-pg/src/upstream_oauth2/provider.rs b/crates/storage-pg/src/upstream_oauth2/provider.rs index 879d7c658..4cdb35a11 100644 --- a/crates/storage-pg/src/upstream_oauth2/provider.rs +++ b/crates/storage-pg/src/upstream_oauth2/provider.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/upstream_oauth2/session.rs b/crates/storage-pg/src/upstream_oauth2/session.rs index 594f3be4c..e1dc6deb1 100644 --- a/crates/storage-pg/src/upstream_oauth2/session.rs +++ b/crates/storage-pg/src/upstream_oauth2/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/user/email.rs b/crates/storage-pg/src/user/email.rs index ad8afd6a8..0ab19ee73 100644 --- a/crates/storage-pg/src/user/email.rs +++ b/crates/storage-pg/src/user/email.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/user/mod.rs b/crates/storage-pg/src/user/mod.rs index 8e755188d..14957ba5f 100644 --- a/crates/storage-pg/src/user/mod.rs +++ b/crates/storage-pg/src/user/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing the PostgreSQL implementation of the user-related //! repositories diff --git a/crates/storage-pg/src/user/password.rs b/crates/storage-pg/src/user/password.rs index 6a1b19f0a..ad59a99b4 100644 --- a/crates/storage-pg/src/user/password.rs +++ b/crates/storage-pg/src/user/password.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/user/recovery.rs b/crates/storage-pg/src/user/recovery.rs index bc108b52a..25de80a38 100644 --- a/crates/storage-pg/src/user/recovery.rs +++ b/crates/storage-pg/src/user/recovery.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage-pg/src/user/registration.rs b/crates/storage-pg/src/user/registration.rs index 7f123b361..e8c228771 100644 --- a/crates/storage-pg/src/user/registration.rs +++ b/crates/storage-pg/src/user/registration.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage-pg/src/user/registration_token.rs b/crates/storage-pg/src/user/registration_token.rs index f7a9ab54e..1a8ed0ae7 100644 --- a/crates/storage-pg/src/user/registration_token.rs +++ b/crates/storage-pg/src/user/registration_token.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage-pg/src/user/session.rs b/crates/storage-pg/src/user/session.rs index 3bea6781c..9922cef9a 100644 --- a/crates/storage-pg/src/user/session.rs +++ b/crates/storage-pg/src/user/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage-pg/src/user/terms.rs b/crates/storage-pg/src/user/terms.rs index 9efa1f008..b40716569 100644 --- a/crates/storage-pg/src/user/terms.rs +++ b/crates/storage-pg/src/user/terms.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::User; diff --git a/crates/storage-pg/src/user/tests.rs b/crates/storage-pg/src/user/tests.rs index c37c7ff8e..de17fdeb5 100644 --- a/crates/storage-pg/src/user/tests.rs +++ b/crates/storage-pg/src/user/tests.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::Duration; use mas_storage::{ diff --git a/crates/storage/src/app_session.rs b/crates/storage/src/app_session.rs index fd1850d3d..65e5669b4 100644 --- a/crates/storage/src/app_session.rs +++ b/crates/storage/src/app_session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repositories to interact with all kinds of sessions diff --git a/crates/storage/src/clock.rs b/crates/storage/src/clock.rs index 6af9926e1..df32114bb 100644 --- a/crates/storage/src/clock.rs +++ b/crates/storage/src/clock.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A [`Clock`] is a way to get the current date and time. //! diff --git a/crates/storage/src/compat/access_token.rs b/crates/storage/src/compat/access_token.rs index 87d244f4d..c554a8d79 100644 --- a/crates/storage/src/compat/access_token.rs +++ b/crates/storage/src/compat/access_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::Duration; diff --git a/crates/storage/src/compat/mod.rs b/crates/storage/src/compat/mod.rs index 3bb11717b..8c518d423 100644 --- a/crates/storage/src/compat/mod.rs +++ b/crates/storage/src/compat/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repositories to interact with entities of the compatibility layer diff --git a/crates/storage/src/compat/refresh_token.rs b/crates/storage/src/compat/refresh_token.rs index ff568ec9f..ca37278cc 100644 --- a/crates/storage/src/compat/refresh_token.rs +++ b/crates/storage/src/compat/refresh_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{CompatAccessToken, CompatRefreshToken, CompatSession}; diff --git a/crates/storage/src/compat/session.rs b/crates/storage/src/compat/session.rs index e935e986b..2b964ba22 100644 --- a/crates/storage/src/compat/session.rs +++ b/crates/storage/src/compat/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage/src/compat/sso_login.rs b/crates/storage/src/compat/sso_login.rs index 08e8c5491..90cc42750 100644 --- a/crates/storage/src/compat/sso_login.rs +++ b/crates/storage/src/compat/sso_login.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{BrowserSession, CompatSession, CompatSsoLogin, User}; diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 07d8bd97c..11191e092 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Interactions with the storage backend //! diff --git a/crates/storage/src/oauth2/access_token.rs b/crates/storage/src/oauth2/access_token.rs index 9a128bbdb..1ffc4d82d 100644 --- a/crates/storage/src/oauth2/access_token.rs +++ b/crates/storage/src/oauth2/access_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::Duration; diff --git a/crates/storage/src/oauth2/authorization_grant.rs b/crates/storage/src/oauth2/authorization_grant.rs index cb4802a92..f61f6b8c0 100644 --- a/crates/storage/src/oauth2/authorization_grant.rs +++ b/crates/storage/src/oauth2/authorization_grant.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{AuthorizationCode, AuthorizationGrant, Client, Session}; diff --git a/crates/storage/src/oauth2/client.rs b/crates/storage/src/oauth2/client.rs index 33b92d189..2a3356938 100644 --- a/crates/storage/src/oauth2/client.rs +++ b/crates/storage/src/oauth2/client.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::{BTreeMap, BTreeSet}; diff --git a/crates/storage/src/oauth2/device_code_grant.rs b/crates/storage/src/oauth2/device_code_grant.rs index 762e854cc..89bcb61f1 100644 --- a/crates/storage/src/oauth2/device_code_grant.rs +++ b/crates/storage/src/oauth2/device_code_grant.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage/src/oauth2/mod.rs b/crates/storage/src/oauth2/mod.rs index 8f6b86056..a2d172567 100644 --- a/crates/storage/src/oauth2/mod.rs +++ b/crates/storage/src/oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repositories to interact with entities related to the OAuth 2.0 protocol diff --git a/crates/storage/src/oauth2/refresh_token.rs b/crates/storage/src/oauth2/refresh_token.rs index 7f3928906..b50295e4f 100644 --- a/crates/storage/src/oauth2/refresh_token.rs +++ b/crates/storage/src/oauth2/refresh_token.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{AccessToken, RefreshToken, Session}; diff --git a/crates/storage/src/oauth2/session.rs b/crates/storage/src/oauth2/session.rs index 07f91a2b0..faf933a7f 100644 --- a/crates/storage/src/oauth2/session.rs +++ b/crates/storage/src/oauth2/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage/src/pagination.rs b/crates/storage/src/pagination.rs index 318caff70..01b8ed197 100644 --- a/crates/storage/src/pagination.rs +++ b/crates/storage/src/pagination.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Utilities to manage paginated queries. diff --git a/crates/storage/src/policy_data.rs b/crates/storage/src/policy_data.rs index 6c7e5d89f..ec3b29c5a 100644 --- a/crates/storage/src/policy_data.rs +++ b/crates/storage/src/policy_data.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repositories to interact with the policy data saved in the storage backend. diff --git a/crates/storage/src/queue/job.rs b/crates/storage/src/queue/job.rs index bc07c3b83..30a5368c9 100644 --- a/crates/storage/src/queue/job.rs +++ b/crates/storage/src/queue/job.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repository to interact with jobs in the job queue diff --git a/crates/storage/src/queue/mod.rs b/crates/storage/src/queue/mod.rs index 03d969bbb..958ae13d0 100644 --- a/crates/storage/src/queue/mod.rs +++ b/crates/storage/src/queue/mod.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! A module containing repositories for the job queue diff --git a/crates/storage/src/queue/schedule.rs b/crates/storage/src/queue/schedule.rs index aaa83e5d2..32c225eca 100644 --- a/crates/storage/src/queue/schedule.rs +++ b/crates/storage/src/queue/schedule.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repository to interact with recurrent scheduled jobs in the job queue diff --git a/crates/storage/src/queue/tasks.rs b/crates/storage/src/queue/tasks.rs index b0075f319..eb16f6e29 100644 --- a/crates/storage/src/queue/tasks.rs +++ b/crates/storage/src/queue/tasks.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use chrono::{DateTime, Utc}; use mas_data_model::{ diff --git a/crates/storage/src/queue/worker.rs b/crates/storage/src/queue/worker.rs index 23fa96104..d2d96ecfa 100644 --- a/crates/storage/src/queue/worker.rs +++ b/crates/storage/src/queue/worker.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repository to interact with workers in the job queue diff --git a/crates/storage/src/repository.rs b/crates/storage/src/repository.rs index a02edb4ad..518769eb1 100644 --- a/crates/storage/src/repository.rs +++ b/crates/storage/src/repository.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use futures_util::future::BoxFuture; diff --git a/crates/storage/src/upstream_oauth2/link.rs b/crates/storage/src/upstream_oauth2/link.rs index cca070d86..a3672f361 100644 --- a/crates/storage/src/upstream_oauth2/link.rs +++ b/crates/storage/src/upstream_oauth2/link.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{UpstreamOAuthLink, UpstreamOAuthProvider, User}; diff --git a/crates/storage/src/upstream_oauth2/mod.rs b/crates/storage/src/upstream_oauth2/mod.rs index c2f72f278..3fd6666b4 100644 --- a/crates/storage/src/upstream_oauth2/mod.rs +++ b/crates/storage/src/upstream_oauth2/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repositories to interact with entities related to the upstream OAuth 2.0 //! providers diff --git a/crates/storage/src/upstream_oauth2/provider.rs b/crates/storage/src/upstream_oauth2/provider.rs index ac6553b88..d28ed5c73 100644 --- a/crates/storage/src/upstream_oauth2/provider.rs +++ b/crates/storage/src/upstream_oauth2/provider.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::marker::PhantomData; diff --git a/crates/storage/src/upstream_oauth2/session.rs b/crates/storage/src/upstream_oauth2/session.rs index c563fce5e..6aadb673f 100644 --- a/crates/storage/src/upstream_oauth2/session.rs +++ b/crates/storage/src/upstream_oauth2/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{UpstreamOAuthAuthorizationSession, UpstreamOAuthLink, UpstreamOAuthProvider}; diff --git a/crates/storage/src/user/email.rs b/crates/storage/src/user/email.rs index 4cdc8d665..1da14d9de 100644 --- a/crates/storage/src/user/email.rs +++ b/crates/storage/src/user/email.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{ diff --git a/crates/storage/src/user/mod.rs b/crates/storage/src/user/mod.rs index 17852f0e9..64b1d6d79 100644 --- a/crates/storage/src/user/mod.rs +++ b/crates/storage/src/user/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Repositories to interact with entities related to user accounts diff --git a/crates/storage/src/user/password.rs b/crates/storage/src/user/password.rs index fe7115d97..a4e01957f 100644 --- a/crates/storage/src/user/password.rs +++ b/crates/storage/src/user/password.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::{Password, User}; diff --git a/crates/storage/src/user/recovery.rs b/crates/storage/src/user/recovery.rs index a5361e795..81f17acc7 100644 --- a/crates/storage/src/user/recovery.rs +++ b/crates/storage/src/user/recovery.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage/src/user/registration.rs b/crates/storage/src/user/registration.rs index 49fd01fdc..de7b6ef1b 100644 --- a/crates/storage/src/user/registration.rs +++ b/crates/storage/src/user/registration.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage/src/user/registration_token.rs b/crates/storage/src/user/registration_token.rs index e3913b5d8..ef37c7a84 100644 --- a/crates/storage/src/user/registration_token.rs +++ b/crates/storage/src/user/registration_token.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::{DateTime, Utc}; diff --git a/crates/storage/src/user/session.rs b/crates/storage/src/user/session.rs index 2421ff009..79b377c94 100644 --- a/crates/storage/src/user/session.rs +++ b/crates/storage/src/user/session.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::net::IpAddr; diff --git a/crates/storage/src/user/terms.rs b/crates/storage/src/user/terms.rs index 34a6d3a6b..d24f9272b 100644 --- a/crates/storage/src/user/terms.rs +++ b/crates/storage/src/user/terms.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use mas_data_model::User; diff --git a/crates/storage/src/utils.rs b/crates/storage/src/utils.rs index 9f5d7ab98..ad1aacbb7 100644 --- a/crates/storage/src/utils.rs +++ b/crates/storage/src/utils.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Wrappers and useful type aliases diff --git a/crates/syn2mas/src/lib.rs b/crates/syn2mas/src/lib.rs index 703e53150..3593858d7 100644 --- a/crates/syn2mas/src/lib.rs +++ b/crates/syn2mas/src/lib.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod mas_writer; mod synapse_reader; diff --git a/crates/syn2mas/src/mas_writer/checks.rs b/crates/syn2mas/src/mas_writer/checks.rs index 288156d8c..ae0964bff 100644 --- a/crates/syn2mas/src/mas_writer/checks.rs +++ b/crates/syn2mas/src/mas_writer/checks.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! # MAS Database Checks //! diff --git a/crates/syn2mas/src/mas_writer/constraint_pausing.rs b/crates/syn2mas/src/mas_writer/constraint_pausing.rs index 49fd4a8e3..3bfef602f 100644 --- a/crates/syn2mas/src/mas_writer/constraint_pausing.rs +++ b/crates/syn2mas/src/mas_writer/constraint_pausing.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::time::Instant; diff --git a/crates/syn2mas/src/mas_writer/fixtures/upstream_provider.sql b/crates/syn2mas/src/mas_writer/fixtures/upstream_provider.sql index 9da09b174..957cedcb3 100644 --- a/crates/syn2mas/src/mas_writer/fixtures/upstream_provider.sql +++ b/crates/syn2mas/src/mas_writer/fixtures/upstream_provider.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO upstream_oauth_providers ( diff --git a/crates/syn2mas/src/mas_writer/locking.rs b/crates/syn2mas/src/mas_writer/locking.rs index 8200924d4..96fd2d30f 100644 --- a/crates/syn2mas/src/mas_writer/locking.rs +++ b/crates/syn2mas/src/mas_writer/locking.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/syn2mas/src/mas_writer/mod.rs b/crates/syn2mas/src/mas_writer/mod.rs index f36851dfd..6d59ec4b9 100644 --- a/crates/syn2mas/src/mas_writer/mod.rs +++ b/crates/syn2mas/src/mas_writer/mod.rs @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! # MAS Writer //! diff --git a/crates/syn2mas/src/mas_writer/syn2mas_revert_temporary_tables.sql b/crates/syn2mas/src/mas_writer/syn2mas_revert_temporary_tables.sql index e1df06f94..73f4cfe52 100644 --- a/crates/syn2mas/src/mas_writer/syn2mas_revert_temporary_tables.sql +++ b/crates/syn2mas/src/mas_writer/syn2mas_revert_temporary_tables.sql @@ -1,7 +1,7 @@ -- Copyright 2024 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. -- This script should revert what `syn2mas_temporary_tables.sql` does. diff --git a/crates/syn2mas/src/mas_writer/syn2mas_temporary_tables.sql b/crates/syn2mas/src/mas_writer/syn2mas_temporary_tables.sql index 9cda82881..873ceeb7e 100644 --- a/crates/syn2mas/src/mas_writer/syn2mas_temporary_tables.sql +++ b/crates/syn2mas/src/mas_writer/syn2mas_temporary_tables.sql @@ -1,7 +1,7 @@ -- Copyright 2024 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. -- # syn2mas Temporary Tables diff --git a/crates/syn2mas/src/migration.rs b/crates/syn2mas/src/migration.rs index 2a906d933..358470034 100644 --- a/crates/syn2mas/src/migration.rs +++ b/crates/syn2mas/src/migration.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! # Migration //! diff --git a/crates/syn2mas/src/progress.rs b/crates/syn2mas/src/progress.rs index 3c67825ce..cdd7ab417 100644 --- a/crates/syn2mas/src/progress.rs +++ b/crates/syn2mas/src/progress.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock, atomic::AtomicU32}; diff --git a/crates/syn2mas/src/synapse_reader/checks.rs b/crates/syn2mas/src/synapse_reader/checks.rs index a78f18b1d..6ae5ce530 100644 --- a/crates/syn2mas/src/synapse_reader/checks.rs +++ b/crates/syn2mas/src/synapse_reader/checks.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! # Synapse Checks //! diff --git a/crates/syn2mas/src/synapse_reader/config/mod.rs b/crates/syn2mas/src/synapse_reader/config/mod.rs index 25a4c0d93..d837bff2c 100644 --- a/crates/syn2mas/src/synapse_reader/config/mod.rs +++ b/crates/syn2mas/src/synapse_reader/config/mod.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod oidc; diff --git a/crates/syn2mas/src/synapse_reader/config/oidc.rs b/crates/syn2mas/src/synapse_reader/config/oidc.rs index 9eea0a9be..d59c185d3 100644 --- a/crates/syn2mas/src/synapse_reader/config/oidc.rs +++ b/crates/syn2mas/src/synapse_reader/config/oidc.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::BTreeMap, str::FromStr as _}; diff --git a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice.sql b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice.sql index e92fd21bf..4926445b9 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO access_tokens ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_puppet.sql b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_puppet.sql index c8b2850ac..6029f94fe 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_puppet.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_puppet.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO access_tokens ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_refresh_token.sql b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_refresh_token.sql index 180a58810..bba684b1a 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_refresh_token.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_refresh_token.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO access_tokens ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_unused_refresh_token.sql b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_unused_refresh_token.sql index 8c7d1c695..e1de6b287 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_unused_refresh_token.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/access_token_alice_with_unused_refresh_token.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO access_tokens ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/devices_alice.sql b/crates/syn2mas/src/synapse_reader/fixtures/devices_alice.sql index 8eb50a3ba..411c6ba30 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/devices_alice.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/devices_alice.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO devices ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/external_ids_alice.sql b/crates/syn2mas/src/synapse_reader/fixtures/external_ids_alice.sql index a365faf05..651f03cf9 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/external_ids_alice.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/external_ids_alice.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO user_external_ids ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/threepids_alice.sql b/crates/syn2mas/src/synapse_reader/fixtures/threepids_alice.sql index 4bf680cce..5b643a462 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/threepids_alice.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/threepids_alice.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO user_threepids ( diff --git a/crates/syn2mas/src/synapse_reader/fixtures/user_alice.sql b/crates/syn2mas/src/synapse_reader/fixtures/user_alice.sql index dc77d5859..825213402 100644 --- a/crates/syn2mas/src/synapse_reader/fixtures/user_alice.sql +++ b/crates/syn2mas/src/synapse_reader/fixtures/user_alice.sql @@ -1,7 +1,7 @@ -- Copyright 2024, 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. INSERT INTO users ( diff --git a/crates/syn2mas/src/synapse_reader/mod.rs b/crates/syn2mas/src/synapse_reader/mod.rs index 0b753e33b..b5b691495 100644 --- a/crates/syn2mas/src/synapse_reader/mod.rs +++ b/crates/syn2mas/src/synapse_reader/mod.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! # Synapse Database Reader //! diff --git a/crates/syn2mas/src/telemetry.rs b/crates/syn2mas/src/telemetry.rs index e9a3385fb..8d67d4bf4 100644 --- a/crates/syn2mas/src/telemetry.rs +++ b/crates/syn2mas/src/telemetry.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::LazyLock; diff --git a/crates/syn2mas/test_synapse_migrations/20250117064958_users.sql b/crates/syn2mas/test_synapse_migrations/20250117064958_users.sql index 5c67dc097..72cc46dab 100644 --- a/crates/syn2mas/test_synapse_migrations/20250117064958_users.sql +++ b/crates/syn2mas/test_synapse_migrations/20250117064958_users.sql @@ -1,26 +1,23 @@ -- Copyright 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. - +-- Please see LICENSE files in the repository root for full details. -- Brings in the `users` table from Synapse - CREATE TABLE users ( - name text, - password_hash text, - creation_ts bigint, - admin smallint DEFAULT 0 NOT NULL, - upgrade_ts bigint, - is_guest smallint DEFAULT 0 NOT NULL, - appservice_id text, - consent_version text, - consent_server_notice_sent text, - user_type text, - deactivated smallint DEFAULT 0 NOT NULL, - shadow_banned boolean, - consent_ts bigint, - approved boolean, - locked boolean DEFAULT false NOT NULL, - suspended boolean DEFAULT false NOT NULL + name text, + password_hash text, + creation_ts bigint, + admin smallint DEFAULT 0 NOT NULL, + upgrade_ts bigint, + is_guest smallint DEFAULT 0 NOT NULL, + appservice_id text, + consent_version text, + consent_server_notice_sent text, + user_type text, + deactivated smallint DEFAULT 0 NOT NULL, + shadow_banned boolean, + consent_ts bigint, + approved boolean, + locked boolean DEFAULT false NOT NULL, + suspended boolean DEFAULT false NOT NULL ); - diff --git a/crates/syn2mas/test_synapse_migrations/20250128141011_threepids.sql b/crates/syn2mas/test_synapse_migrations/20250128141011_threepids.sql index 2ff655979..3ee382b35 100644 --- a/crates/syn2mas/test_synapse_migrations/20250128141011_threepids.sql +++ b/crates/syn2mas/test_synapse_migrations/20250128141011_threepids.sql @@ -1,7 +1,7 @@ -- Copyright 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. -- Brings in the `user_threepids` table from Synapse diff --git a/crates/syn2mas/test_synapse_migrations/20250128162513_external_ids.sql b/crates/syn2mas/test_synapse_migrations/20250128162513_external_ids.sql index 09eec8430..9054accd3 100644 --- a/crates/syn2mas/test_synapse_migrations/20250128162513_external_ids.sql +++ b/crates/syn2mas/test_synapse_migrations/20250128162513_external_ids.sql @@ -1,7 +1,7 @@ -- Copyright 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. -- Brings in the `user_external_ids` table from Synapse diff --git a/crates/syn2mas/test_synapse_migrations/20250128201100_access_and_refresh_tokens.sql b/crates/syn2mas/test_synapse_migrations/20250128201100_access_and_refresh_tokens.sql index fef25bbbb..8b1ed58ea 100644 --- a/crates/syn2mas/test_synapse_migrations/20250128201100_access_and_refresh_tokens.sql +++ b/crates/syn2mas/test_synapse_migrations/20250128201100_access_and_refresh_tokens.sql @@ -1,7 +1,7 @@ -- Copyright 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. -- Brings in the `access_tokens` and `refresh_tokens` tables from Synapse diff --git a/crates/syn2mas/test_synapse_migrations/20250129140230_devices.sql b/crates/syn2mas/test_synapse_migrations/20250129140230_devices.sql index 8f9ae723b..129df1b68 100644 --- a/crates/syn2mas/test_synapse_migrations/20250129140230_devices.sql +++ b/crates/syn2mas/test_synapse_migrations/20250129140230_devices.sql @@ -1,7 +1,7 @@ -- Copyright 2025 New Vector Ltd. -- -- SPDX-License-Identifier: AGPL-3.0-only --- Please see LICENSE in the repository root for full details. +-- Please see LICENSE files in the repository root for full details. -- Brings in the `devices` table from Synapse CREATE TABLE devices ( diff --git a/crates/tasks/src/database.rs b/crates/tasks/src/database.rs index fa424d7df..a659eb265 100644 --- a/crates/tasks/src/database.rs +++ b/crates/tasks/src/database.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Database-related tasks diff --git a/crates/tasks/src/email.rs b/crates/tasks/src/email.rs index 4eacdfaf6..99170d2eb 100644 --- a/crates/tasks/src/email.rs +++ b/crates/tasks/src/email.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use async_trait::async_trait; use chrono::Duration; diff --git a/crates/tasks/src/lib.rs b/crates/tasks/src/lib.rs index cb1b16469..58737574b 100644 --- a/crates/tasks/src/lib.rs +++ b/crates/tasks/src/lib.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::{Arc, LazyLock}; diff --git a/crates/tasks/src/matrix.rs b/crates/tasks/src/matrix.rs index 3060b3d7b..40e38899c 100644 --- a/crates/tasks/src/matrix.rs +++ b/crates/tasks/src/matrix.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashSet; diff --git a/crates/tasks/src/new_queue.rs b/crates/tasks/src/new_queue.rs index 1c83b1720..dcb578011 100644 --- a/crates/tasks/src/new_queue.rs +++ b/crates/tasks/src/new_queue.rs @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, sync::Arc}; diff --git a/crates/tasks/src/recovery.rs b/crates/tasks/src/recovery.rs index 9d68dad66..ab51e420b 100644 --- a/crates/tasks/src/recovery.rs +++ b/crates/tasks/src/recovery.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context; use async_trait::async_trait; diff --git a/crates/tasks/src/sessions.rs b/crates/tasks/src/sessions.rs index fc7f89796..f457fe04f 100644 --- a/crates/tasks/src/sessions.rs +++ b/crates/tasks/src/sessions.rs @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::collections::HashSet; diff --git a/crates/tasks/src/user.rs b/crates/tasks/src/user.rs index 4dfa081c4..9c9db9097 100644 --- a/crates/tasks/src/user.rs +++ b/crates/tasks/src/user.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use anyhow::Context; use async_trait::async_trait; diff --git a/crates/templates/src/context.rs b/crates/templates/src/context.rs index c21096ee6..d6bf86585 100644 --- a/crates/templates/src/context.rs +++ b/crates/templates/src/context.rs @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. //! Contexts used in templates diff --git a/crates/templates/src/context/branding.rs b/crates/templates/src/context/branding.rs index d9a451c4d..eb7e3546a 100644 --- a/crates/templates/src/context/branding.rs +++ b/crates/templates/src/context/branding.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/templates/src/context/captcha.rs b/crates/templates/src/context/captcha.rs index 38d723ca0..442cea4f8 100644 --- a/crates/templates/src/context/captcha.rs +++ b/crates/templates/src/context/captcha.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/templates/src/context/ext.rs b/crates/templates/src/context/ext.rs index 5a94430a7..e4ae3886c 100644 --- a/crates/templates/src/context/ext.rs +++ b/crates/templates/src/context/ext.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use mas_data_model::SiteConfig; diff --git a/crates/templates/src/context/features.rs b/crates/templates/src/context/features.rs index a493e0cee..d514b5c63 100644 --- a/crates/templates/src/context/features.rs +++ b/crates/templates/src/context/features.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::sync::Arc; diff --git a/crates/templates/src/forms.rs b/crates/templates/src/forms.rs index 2b769e122..94e20be3a 100644 --- a/crates/templates/src/forms.rs +++ b/crates/templates/src/forms.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::{collections::HashMap, hash::Hash}; diff --git a/crates/templates/src/functions.rs b/crates/templates/src/functions.rs index 3229cde28..631e4742e 100644 --- a/crates/templates/src/functions.rs +++ b/crates/templates/src/functions.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // This is needed to make the Environment::add* functions work #![allow(clippy::needless_pass_by_value)] diff --git a/crates/templates/src/lib.rs b/crates/templates/src/lib.rs index 88a72225a..8eca3d579 100644 --- a/crates/templates/src/lib.rs +++ b/crates/templates/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![deny(missing_docs)] #![allow(clippy::module_name_repetitions)] diff --git a/crates/templates/src/macros.rs b/crates/templates/src/macros.rs index a3166b2bb..e0b203735 100644 --- a/crates/templates/src/macros.rs +++ b/crates/templates/src/macros.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2021-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. /// Count the number of tokens. Used to have a fixed-sized array for the /// templates list. diff --git a/crates/tower/src/lib.rs b/crates/tower/src/lib.rs index 7c3bd077b..72fd97c9e 100644 --- a/crates/tower/src/lib.rs +++ b/crates/tower/src/lib.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. #![allow(clippy::module_name_repetitions)] diff --git a/crates/tower/src/metrics/duration.rs b/crates/tower/src/metrics/duration.rs index e0664fb31..d8f3cc52f 100644 --- a/crates/tower/src/metrics/duration.rs +++ b/crates/tower/src/metrics/duration.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::time::Instant; diff --git a/crates/tower/src/metrics/in_flight.rs b/crates/tower/src/metrics/in_flight.rs index 8f362c6cb..02a21540f 100644 --- a/crates/tower/src/metrics/in_flight.rs +++ b/crates/tower/src/metrics/in_flight.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use opentelemetry::{KeyValue, metrics::UpDownCounter}; use pin_project_lite::pin_project; diff --git a/crates/tower/src/metrics/make_attributes.rs b/crates/tower/src/metrics/make_attributes.rs index a6e38378d..e4bc3ca68 100644 --- a/crates/tower/src/metrics/make_attributes.rs +++ b/crates/tower/src/metrics/make_attributes.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use opentelemetry::{KeyValue, Value}; diff --git a/crates/tower/src/metrics/mod.rs b/crates/tower/src/metrics/mod.rs index da919af01..9b9094c77 100644 --- a/crates/tower/src/metrics/mod.rs +++ b/crates/tower/src/metrics/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod duration; mod in_flight; diff --git a/crates/tower/src/trace_context.rs b/crates/tower/src/trace_context.rs index 3621490c5..9180201c6 100644 --- a/crates/tower/src/trace_context.rs +++ b/crates/tower/src/trace_context.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use http::Request; use opentelemetry::propagation::Injector; diff --git a/crates/tower/src/tracing/enrich_span.rs b/crates/tower/src/tracing/enrich_span.rs index 9d2b83c84..1c726ba3b 100644 --- a/crates/tower/src/tracing/enrich_span.rs +++ b/crates/tower/src/tracing/enrich_span.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use tracing::{Span, Value}; diff --git a/crates/tower/src/tracing/future.rs b/crates/tower/src/tracing/future.rs index aeec33f39..bac624281 100644 --- a/crates/tower/src/tracing/future.rs +++ b/crates/tower/src/tracing/future.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use std::task::ready; diff --git a/crates/tower/src/tracing/layer.rs b/crates/tower/src/tracing/layer.rs index 70ad27954..1da80e90d 100644 --- a/crates/tower/src/tracing/layer.rs +++ b/crates/tower/src/tracing/layer.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use tower::Layer; use tracing::Span; diff --git a/crates/tower/src/tracing/make_span.rs b/crates/tower/src/tracing/make_span.rs index f84cab73e..ba03f47e6 100644 --- a/crates/tower/src/tracing/make_span.rs +++ b/crates/tower/src/tracing/make_span.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use tracing::Span; diff --git a/crates/tower/src/tracing/mod.rs b/crates/tower/src/tracing/mod.rs index bcd34fad8..0c355e654 100644 --- a/crates/tower/src/tracing/mod.rs +++ b/crates/tower/src/tracing/mod.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. mod enrich_span; mod future; diff --git a/crates/tower/src/tracing/service.rs b/crates/tower/src/tracing/service.rs index 8a292ad83..9c3484519 100644 --- a/crates/tower/src/tracing/service.rs +++ b/crates/tower/src/tracing/service.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use tower::Service; diff --git a/crates/tower/src/utils.rs b/crates/tower/src/utils.rs index b0c7a5b18..c9a6e9e4f 100644 --- a/crates/tower/src/utils.rs +++ b/crates/tower/src/utils.rs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. use opentelemetry::{KeyValue, Value}; use tower::{Layer, Service}; diff --git a/frontend/.storybook/main.ts b/frontend/.storybook/main.ts index acfd7491f..d895a0bc9 100644 --- a/frontend/.storybook/main.ts +++ b/frontend/.storybook/main.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { StorybookConfig } from "@storybook/react-vite"; diff --git a/frontend/.storybook/preview.tsx b/frontend/.storybook/preview.tsx index 1f0b019a5..a9abadc7d 100644 --- a/frontend/.storybook/preview.tsx +++ b/frontend/.storybook/preview.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { ArgTypes, diff --git a/frontend/codegen.ts b/frontend/codegen.ts index 76a256465..2020638e0 100644 --- a/frontend/codegen.ts +++ b/frontend/codegen.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { CodegenConfig } from "@graphql-codegen/cli"; diff --git a/frontend/i18next-parser.config.ts b/frontend/i18next-parser.config.ts index 4b003ccbd..1fa452605 100644 --- a/frontend/i18next-parser.config.ts +++ b/frontend/i18next-parser.config.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { UserConfig } from "i18next-parser"; diff --git a/frontend/index.html b/frontend/index.html index 789ad52a7..e482ec272 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,9 +1,9 @@ diff --git a/frontend/knip.config.ts b/frontend/knip.config.ts index a6a4c76cf..8dc64e9fc 100644 --- a/frontend/knip.config.ts +++ b/frontend/knip.config.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { KnipConfig } from "knip"; diff --git a/frontend/src/@types/i18next.d.ts b/frontend/src/@types/i18next.d.ts index cf32447c2..def4ce458 100644 --- a/frontend/src/@types/i18next.d.ts +++ b/frontend/src/@types/i18next.d.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import "i18next"; import type translation from "../../locales/en.json"; diff --git a/frontend/src/components/AccountDeleteButton.tsx b/frontend/src/components/AccountDeleteButton.tsx index cb42edc81..da39f522e 100644 --- a/frontend/src/components/AccountDeleteButton.tsx +++ b/frontend/src/components/AccountDeleteButton.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation } from "@tanstack/react-query"; import IconDelete from "@vector-im/compound-design-tokens/assets/web/icons/delete"; diff --git a/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.module.css b/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.module.css index 51a12c9b5..b2d613a67 100644 --- a/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.module.css +++ b/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .link { diff --git a/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.tsx b/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.tsx index 6bb9ad587..c52a61ee5 100644 --- a/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.tsx +++ b/frontend/src/components/AccountManagementPasswordPreview/AccountManagementPasswordPreview.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Link } from "@tanstack/react-router"; import { Form } from "@vector-im/compound-web"; diff --git a/frontend/src/components/AccountManagementPasswordPreview/index.ts b/frontend/src/components/AccountManagementPasswordPreview/index.ts index 8597fdffa..723421535 100644 --- a/frontend/src/components/AccountManagementPasswordPreview/index.ts +++ b/frontend/src/components/AccountManagementPasswordPreview/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./AccountManagementPasswordPreview"; diff --git a/frontend/src/components/BrowserSession.tsx b/frontend/src/components/BrowserSession.tsx index 3b2e7a58a..e4cf861c8 100644 --- a/frontend/src/components/BrowserSession.tsx +++ b/frontend/src/components/BrowserSession.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconChrome from "@browser-logos/chrome/chrome_64x64.png?url"; import IconFirefox from "@browser-logos/firefox/firefox_64x64.png?url"; diff --git a/frontend/src/components/ButtonLink.module.css b/frontend/src/components/ButtonLink.module.css index 70300b40d..821188520 100644 --- a/frontend/src/components/ButtonLink.module.css +++ b/frontend/src/components/ButtonLink.module.css @@ -1,7 +1,7 @@ -/* Copyright 2024 New Vector Ltd. +/* Copyright 2024, 2025 New Vector Ltd. * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ /* The weird selector is to have higher specificity than compound-web's button-link */ diff --git a/frontend/src/components/ButtonLink.tsx b/frontend/src/components/ButtonLink.tsx index 2a0a6b8b8..d8dc8de72 100644 --- a/frontend/src/components/ButtonLink.tsx +++ b/frontend/src/components/ButtonLink.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { createLink } from "@tanstack/react-router"; import { Button } from "@vector-im/compound-web"; diff --git a/frontend/src/components/Client/OAuth2ClientDetail.test.tsx b/frontend/src/components/Client/OAuth2ClientDetail.test.tsx index 70a9a58f8..ba3e920a0 100644 --- a/frontend/src/components/Client/OAuth2ClientDetail.test.tsx +++ b/frontend/src/components/Client/OAuth2ClientDetail.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/Client/OAuth2ClientDetail.tsx b/frontend/src/components/Client/OAuth2ClientDetail.tsx index 1c8d019c2..0720da560 100644 --- a/frontend/src/components/Client/OAuth2ClientDetail.tsx +++ b/frontend/src/components/Client/OAuth2ClientDetail.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { H3 } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/components/Collapsible/Collapsible.module.css b/frontend/src/components/Collapsible/Collapsible.module.css index 5da9b4ed8..f8aec80d9 100644 --- a/frontend/src/components/Collapsible/Collapsible.module.css +++ b/frontend/src/components/Collapsible/Collapsible.module.css @@ -1,8 +1,8 @@ /* Copyright 2024, 2025 New Vector Ltd. * Copyright 2024 The Matrix.org Foundation C.I.C. * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .root { diff --git a/frontend/src/components/Collapsible/Collapsible.stories.tsx b/frontend/src/components/Collapsible/Collapsible.stories.tsx index 392b98c14..95c7a8e7e 100644 --- a/frontend/src/components/Collapsible/Collapsible.stories.tsx +++ b/frontend/src/components/Collapsible/Collapsible.stories.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import * as Collapsible from "./Collapsible"; diff --git a/frontend/src/components/Collapsible/Collapsible.tsx b/frontend/src/components/Collapsible/Collapsible.tsx index fb3181445..67f585c7a 100644 --- a/frontend/src/components/Collapsible/Collapsible.tsx +++ b/frontend/src/components/Collapsible/Collapsible.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import * as Collapsible from "@radix-ui/react-collapsible"; import IconChevronUp from "@vector-im/compound-design-tokens/assets/web/icons/chevron-up"; diff --git a/frontend/src/components/Collapsible/index.ts b/frontend/src/components/Collapsible/index.ts index 70e50b537..c1e0960db 100644 --- a/frontend/src/components/Collapsible/index.ts +++ b/frontend/src/components/Collapsible/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export * from "./Collapsible"; diff --git a/frontend/src/components/CompatSession.test.tsx b/frontend/src/components/CompatSession.test.tsx index 8e48de140..35430c4ce 100644 --- a/frontend/src/components/CompatSession.test.tsx +++ b/frontend/src/components/CompatSession.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. -// Copyright 2023-2024 The Matrix.org Foundation C.I.C. +// Copyright 2024, 2025 New Vector Ltd. +// Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/CompatSession.tsx b/frontend/src/components/CompatSession.tsx index 2770993ad..c52295baf 100644 --- a/frontend/src/components/CompatSession.tsx +++ b/frontend/src/components/CompatSession.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { parseISO } from "date-fns"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/components/DateTime.stories.tsx b/frontend/src/components/DateTime.stories.tsx index a561cf224..4ed54f7a6 100644 --- a/frontend/src/components/DateTime.stories.tsx +++ b/frontend/src/components/DateTime.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import { sub } from "date-fns"; diff --git a/frontend/src/components/DateTime.tsx b/frontend/src/components/DateTime.tsx index 8a901cf84..bd7e904e2 100644 --- a/frontend/src/components/DateTime.tsx +++ b/frontend/src/components/DateTime.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { differenceInHours, diff --git a/frontend/src/components/Dialog/Dialog.module.css b/frontend/src/components/Dialog/Dialog.module.css index ac59007e9..cd5f1840a 100644 --- a/frontend/src/components/Dialog/Dialog.module.css +++ b/frontend/src/components/Dialog/Dialog.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .overlay, diff --git a/frontend/src/components/Dialog/Dialog.stories.tsx b/frontend/src/components/Dialog/Dialog.stories.tsx index 2059288f5..a1732a712 100644 --- a/frontend/src/components/Dialog/Dialog.stories.tsx +++ b/frontend/src/components/Dialog/Dialog.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import { action } from "storybook/actions"; diff --git a/frontend/src/components/Dialog/Dialog.tsx b/frontend/src/components/Dialog/Dialog.tsx index 7f227d24e..fd354c872 100644 --- a/frontend/src/components/Dialog/Dialog.tsx +++ b/frontend/src/components/Dialog/Dialog.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Close, diff --git a/frontend/src/components/Dialog/index.ts b/frontend/src/components/Dialog/index.ts index 8ce19f439..db7bc83d5 100644 --- a/frontend/src/components/Dialog/index.ts +++ b/frontend/src/components/Dialog/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { Close, Dialog, Title, Description } from "./Dialog"; diff --git a/frontend/src/components/EmptyState/EmptyState.module.css b/frontend/src/components/EmptyState/EmptyState.module.css index 7a882aab1..e83a56df5 100644 --- a/frontend/src/components/EmptyState/EmptyState.module.css +++ b/frontend/src/components/EmptyState/EmptyState.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .empty-state { diff --git a/frontend/src/components/EmptyState/EmptyState.stories.tsx b/frontend/src/components/EmptyState/EmptyState.stories.tsx index b153ce212..33b32b3a5 100644 --- a/frontend/src/components/EmptyState/EmptyState.stories.tsx +++ b/frontend/src/components/EmptyState/EmptyState.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/EmptyState/EmptyState.tsx b/frontend/src/components/EmptyState/EmptyState.tsx index dbeae0d75..b40e3e885 100644 --- a/frontend/src/components/EmptyState/EmptyState.tsx +++ b/frontend/src/components/EmptyState/EmptyState.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import classNames from "classnames"; import { forwardRef } from "react"; diff --git a/frontend/src/components/EmptyState/index.ts b/frontend/src/components/EmptyState/index.ts index dde4804fe..6acdbdfdd 100644 --- a/frontend/src/components/EmptyState/index.ts +++ b/frontend/src/components/EmptyState/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { EmptyState as default } from "./EmptyState"; diff --git a/frontend/src/components/ErrorBoundary.tsx b/frontend/src/components/ErrorBoundary.tsx index 3d8122a93..ad460f875 100644 --- a/frontend/src/components/ErrorBoundary.tsx +++ b/frontend/src/components/ErrorBoundary.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { type ErrorInfo, PureComponent, type ReactNode } from "react"; diff --git a/frontend/src/components/ExternalLink/ExternalLink.module.css b/frontend/src/components/ExternalLink/ExternalLink.module.css index 0555143e0..2d02ce33e 100644 --- a/frontend/src/components/ExternalLink/ExternalLink.module.css +++ b/frontend/src/components/ExternalLink/ExternalLink.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .external-link { diff --git a/frontend/src/components/ExternalLink/ExternalLink.tsx b/frontend/src/components/ExternalLink/ExternalLink.tsx index 98865667e..7b75891f0 100644 --- a/frontend/src/components/ExternalLink/ExternalLink.tsx +++ b/frontend/src/components/ExternalLink/ExternalLink.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Link } from "@vector-im/compound-web"; import classNames from "classnames"; diff --git a/frontend/src/components/Filter/Filter.module.css b/frontend/src/components/Filter/Filter.module.css index e9c8561e9..6bd2e392f 100644 --- a/frontend/src/components/Filter/Filter.module.css +++ b/frontend/src/components/Filter/Filter.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .filter { diff --git a/frontend/src/components/Filter/Filter.stories.tsx b/frontend/src/components/Filter/Filter.stories.tsx index 1393020b3..a9d8fa3d8 100644 --- a/frontend/src/components/Filter/Filter.stories.tsx +++ b/frontend/src/components/Filter/Filter.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/Filter/Filter.tsx b/frontend/src/components/Filter/Filter.tsx index 187c75d5d..a7c10800f 100644 --- a/frontend/src/components/Filter/Filter.tsx +++ b/frontend/src/components/Filter/Filter.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { createLink } from "@tanstack/react-router"; import CloseIcon from "@vector-im/compound-design-tokens/assets/web/icons/close"; diff --git a/frontend/src/components/Filter/index.ts b/frontend/src/components/Filter/index.ts index 521f0b4b4..e544ba38b 100644 --- a/frontend/src/components/Filter/index.ts +++ b/frontend/src/components/Filter/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { Filter as default } from "./Filter"; diff --git a/frontend/src/components/Footer/Footer.module.css b/frontend/src/components/Footer/Footer.module.css index 43f80286c..65b482986 100644 --- a/frontend/src/components/Footer/Footer.module.css +++ b/frontend/src/components/Footer/Footer.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .legal-footer { diff --git a/frontend/src/components/Footer/Footer.stories.tsx b/frontend/src/components/Footer/Footer.stories.tsx index 812f9a9f2..82e01a93b 100644 --- a/frontend/src/components/Footer/Footer.stories.tsx +++ b/frontend/src/components/Footer/Footer.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/Footer/Footer.tsx b/frontend/src/components/Footer/Footer.tsx index 7fbbc9d2d..d6e05d2ad 100644 --- a/frontend/src/components/Footer/Footer.tsx +++ b/frontend/src/components/Footer/Footer.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Link } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/components/Footer/index.ts b/frontend/src/components/Footer/index.ts index eb0958197..7db230d90 100644 --- a/frontend/src/components/Footer/index.ts +++ b/frontend/src/components/Footer/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./Footer"; diff --git a/frontend/src/components/GenericError.module.css b/frontend/src/components/GenericError.module.css index 7d7d417b6..e349b24c8 100644 --- a/frontend/src/components/GenericError.module.css +++ b/frontend/src/components/GenericError.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .details { diff --git a/frontend/src/components/GenericError.tsx b/frontend/src/components/GenericError.tsx index c54a5b049..c12bd70c5 100644 --- a/frontend/src/components/GenericError.tsx +++ b/frontend/src/components/GenericError.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconErrorSolid from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; import { Button } from "@vector-im/compound-web"; diff --git a/frontend/src/components/Layout/Layout.module.css b/frontend/src/components/Layout/Layout.module.css index 04f36211e..ca51ed2ff 100644 --- a/frontend/src/components/Layout/Layout.module.css +++ b/frontend/src/components/Layout/Layout.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .layout-container { diff --git a/frontend/src/components/Layout/Layout.tsx b/frontend/src/components/Layout/Layout.tsx index 207478cc7..039bee28a 100644 --- a/frontend/src/components/Layout/Layout.tsx +++ b/frontend/src/components/Layout/Layout.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import cx from "classnames"; diff --git a/frontend/src/components/Layout/index.ts b/frontend/src/components/Layout/index.ts index 303e6cf06..042bd5da2 100644 --- a/frontend/src/components/Layout/index.ts +++ b/frontend/src/components/Layout/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default, query } from "./Layout"; diff --git a/frontend/src/components/Link.tsx b/frontend/src/components/Link.tsx index d9b791ae3..8dabc17f9 100644 --- a/frontend/src/components/Link.tsx +++ b/frontend/src/components/Link.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { createLink } from "@tanstack/react-router"; import { Link as CompoundLink } from "@vector-im/compound-web"; diff --git a/frontend/src/components/LoadingScreen/LoadingScreen.module.css b/frontend/src/components/LoadingScreen/LoadingScreen.module.css index b3be023a1..4c2f04354 100644 --- a/frontend/src/components/LoadingScreen/LoadingScreen.module.css +++ b/frontend/src/components/LoadingScreen/LoadingScreen.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .loading-screen { diff --git a/frontend/src/components/LoadingScreen/LoadingScreen.stories.tsx b/frontend/src/components/LoadingScreen/LoadingScreen.stories.tsx index d794b4c07..3c018c4ab 100644 --- a/frontend/src/components/LoadingScreen/LoadingScreen.stories.tsx +++ b/frontend/src/components/LoadingScreen/LoadingScreen.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/LoadingScreen/LoadingScreen.test.tsx b/frontend/src/components/LoadingScreen/LoadingScreen.test.tsx index b4fdae354..b5b3b8219 100644 --- a/frontend/src/components/LoadingScreen/LoadingScreen.test.tsx +++ b/frontend/src/components/LoadingScreen/LoadingScreen.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/LoadingScreen/LoadingScreen.tsx b/frontend/src/components/LoadingScreen/LoadingScreen.tsx index 6195ce4b8..a514470ba 100644 --- a/frontend/src/components/LoadingScreen/LoadingScreen.tsx +++ b/frontend/src/components/LoadingScreen/LoadingScreen.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import LoadingSpinner from "../LoadingSpinner"; diff --git a/frontend/src/components/LoadingScreen/index.ts b/frontend/src/components/LoadingScreen/index.ts index 31f80223f..d7b64615b 100644 --- a/frontend/src/components/LoadingScreen/index.ts +++ b/frontend/src/components/LoadingScreen/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./LoadingScreen"; diff --git a/frontend/src/components/LoadingSpinner/LoadingSpinner.module.css b/frontend/src/components/LoadingSpinner/LoadingSpinner.module.css index cb15b455a..48fe727b2 100644 --- a/frontend/src/components/LoadingSpinner/LoadingSpinner.module.css +++ b/frontend/src/components/LoadingSpinner/LoadingSpinner.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ @keyframes spin { diff --git a/frontend/src/components/LoadingSpinner/LoadingSpinner.stories.tsx b/frontend/src/components/LoadingSpinner/LoadingSpinner.stories.tsx index c175984ec..33e978698 100644 --- a/frontend/src/components/LoadingSpinner/LoadingSpinner.stories.tsx +++ b/frontend/src/components/LoadingSpinner/LoadingSpinner.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx b/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx index 96a879d37..8177b87a6 100644 --- a/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx +++ b/frontend/src/components/LoadingSpinner/LoadingSpinner.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import cx from "classnames"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/components/LoadingSpinner/index.ts b/frontend/src/components/LoadingSpinner/index.ts index cbc3a1932..72580588e 100644 --- a/frontend/src/components/LoadingSpinner/index.ts +++ b/frontend/src/components/LoadingSpinner/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./LoadingSpinner"; diff --git a/frontend/src/components/NavBar/NavBar.module.css b/frontend/src/components/NavBar/NavBar.module.css index dc4309efa..59a79706f 100644 --- a/frontend/src/components/NavBar/NavBar.module.css +++ b/frontend/src/components/NavBar/NavBar.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .nav-bar { diff --git a/frontend/src/components/NavBar/NavBar.stories.tsx b/frontend/src/components/NavBar/NavBar.stories.tsx index 831ea6617..194007c13 100644 --- a/frontend/src/components/NavBar/NavBar.stories.tsx +++ b/frontend/src/components/NavBar/NavBar.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/NavBar/NavBar.tsx b/frontend/src/components/NavBar/NavBar.tsx index 7751b509b..e35bf76a0 100644 --- a/frontend/src/components/NavBar/NavBar.tsx +++ b/frontend/src/components/NavBar/NavBar.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import styles from "./NavBar.module.css"; diff --git a/frontend/src/components/NavBar/index.ts b/frontend/src/components/NavBar/index.ts index 98b14f2c1..e8b54d06a 100644 --- a/frontend/src/components/NavBar/index.ts +++ b/frontend/src/components/NavBar/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./NavBar"; diff --git a/frontend/src/components/NavItem/NavItem.module.css b/frontend/src/components/NavItem/NavItem.module.css index 45f354ca7..a07515e16 100644 --- a/frontend/src/components/NavItem/NavItem.module.css +++ b/frontend/src/components/NavItem/NavItem.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .nav-tab { diff --git a/frontend/src/components/NavItem/NavItem.tsx b/frontend/src/components/NavItem/NavItem.tsx index 404425227..9af4d98fa 100644 --- a/frontend/src/components/NavItem/NavItem.tsx +++ b/frontend/src/components/NavItem/NavItem.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Link } from "@tanstack/react-router"; diff --git a/frontend/src/components/NavItem/index.ts b/frontend/src/components/NavItem/index.ts index 653f04a4f..91f7b6ed8 100644 --- a/frontend/src/components/NavItem/index.ts +++ b/frontend/src/components/NavItem/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./NavItem"; diff --git a/frontend/src/components/NotFound.tsx b/frontend/src/components/NotFound.tsx index e56852d78..ab92f25a5 100644 --- a/frontend/src/components/NotFound.tsx +++ b/frontend/src/components/NotFound.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Alert } from "@vector-im/compound-web"; import type { ReactNode } from "react"; diff --git a/frontend/src/components/OAuth2Session.test.tsx b/frontend/src/components/OAuth2Session.test.tsx index 9d6d840b2..575e4a2ab 100644 --- a/frontend/src/components/OAuth2Session.test.tsx +++ b/frontend/src/components/OAuth2Session.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/OAuth2Session.tsx b/frontend/src/components/OAuth2Session.tsx index a72fa4aba..3cac3a399 100644 --- a/frontend/src/components/OAuth2Session.tsx +++ b/frontend/src/components/OAuth2Session.tsx @@ -1,3 +1,8 @@ +// Copyright 2025 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. + import { parseISO } from "date-fns"; import { useTranslation } from "react-i18next"; import { type FragmentType, graphql, useFragment } from "../gql"; diff --git a/frontend/src/components/PageHeading/PageHeading.module.css b/frontend/src/components/PageHeading/PageHeading.module.css index df8ed4900..42e0b4774 100644 --- a/frontend/src/components/PageHeading/PageHeading.module.css +++ b/frontend/src/components/PageHeading/PageHeading.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .page-heading { diff --git a/frontend/src/components/PageHeading/PageHeading.tsx b/frontend/src/components/PageHeading/PageHeading.tsx index 72efbb1e0..1d2436472 100644 --- a/frontend/src/components/PageHeading/PageHeading.tsx +++ b/frontend/src/components/PageHeading/PageHeading.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import cx from "classnames"; diff --git a/frontend/src/components/PageHeading/index.ts b/frontend/src/components/PageHeading/index.ts index 0c481b4a2..4a572d8fe 100644 --- a/frontend/src/components/PageHeading/index.ts +++ b/frontend/src/components/PageHeading/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./PageHeading"; diff --git a/frontend/src/components/PaginationControls.tsx b/frontend/src/components/PaginationControls.tsx index dc198152e..ad569cf78 100644 --- a/frontend/src/components/PaginationControls.tsx +++ b/frontend/src/components/PaginationControls.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Button } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/components/PasswordConfirmation.tsx b/frontend/src/components/PasswordConfirmation.tsx index 9d3accb80..ce84ee3de 100644 --- a/frontend/src/components/PasswordConfirmation.tsx +++ b/frontend/src/components/PasswordConfirmation.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Button, Form } from "@vector-im/compound-web"; import type React from "react"; diff --git a/frontend/src/components/PasswordCreationDoubleInput.tsx b/frontend/src/components/PasswordCreationDoubleInput.tsx index 284cb7001..6724463c5 100644 --- a/frontend/src/components/PasswordCreationDoubleInput.tsx +++ b/frontend/src/components/PasswordCreationDoubleInput.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Form, Progress } from "@vector-im/compound-web"; import { useDeferredValue, useEffect, useRef, useState } from "react"; diff --git a/frontend/src/components/Separator/Separator.module.css b/frontend/src/components/Separator/Separator.module.css index cf7f0c3ff..3d43fb831 100644 --- a/frontend/src/components/Separator/Separator.module.css +++ b/frontend/src/components/Separator/Separator.module.css @@ -1,7 +1,7 @@ /* Copyright 2025 New Vector Ltd. * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .separator { diff --git a/frontend/src/components/Separator/Separator.tsx b/frontend/src/components/Separator/Separator.tsx index 97e00e13e..3a3b8d245 100644 --- a/frontend/src/components/Separator/Separator.tsx +++ b/frontend/src/components/Separator/Separator.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import cx from "classnames"; import { forwardRef } from "react"; diff --git a/frontend/src/components/Separator/index.tsx b/frontend/src/components/Separator/index.tsx index 68edc7a90..e47366c88 100644 --- a/frontend/src/components/Separator/index.tsx +++ b/frontend/src/components/Separator/index.tsx @@ -1,6 +1,6 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./Separator"; diff --git a/frontend/src/components/Session/ClientAvatar.module.css b/frontend/src/components/Session/ClientAvatar.module.css index c209a5ad4..af0f48557 100644 --- a/frontend/src/components/Session/ClientAvatar.module.css +++ b/frontend/src/components/Session/ClientAvatar.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .avatar { diff --git a/frontend/src/components/Session/ClientAvatar.test.tsx b/frontend/src/components/Session/ClientAvatar.test.tsx index 9573221a9..11a0cab01 100644 --- a/frontend/src/components/Session/ClientAvatar.test.tsx +++ b/frontend/src/components/Session/ClientAvatar.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/Session/ClientAvatar.tsx b/frontend/src/components/Session/ClientAvatar.tsx index 08709d820..3c0ad0b99 100644 --- a/frontend/src/components/Session/ClientAvatar.tsx +++ b/frontend/src/components/Session/ClientAvatar.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { CSSProperties } from "react"; diff --git a/frontend/src/components/Session/DeviceTypeIcon.module.css b/frontend/src/components/Session/DeviceTypeIcon.module.css index 5bf772c26..a3ce3b771 100644 --- a/frontend/src/components/Session/DeviceTypeIcon.module.css +++ b/frontend/src/components/Session/DeviceTypeIcon.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .device-type-icon { diff --git a/frontend/src/components/Session/DeviceTypeIcon.stories.tsx b/frontend/src/components/Session/DeviceTypeIcon.stories.tsx index 4c3baec7e..1214d2dae 100644 --- a/frontend/src/components/Session/DeviceTypeIcon.stories.tsx +++ b/frontend/src/components/Session/DeviceTypeIcon.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/Session/DeviceTypeIcon.test.tsx b/frontend/src/components/Session/DeviceTypeIcon.test.tsx index 2f9da8562..d207b0a6f 100644 --- a/frontend/src/components/Session/DeviceTypeIcon.test.tsx +++ b/frontend/src/components/Session/DeviceTypeIcon.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/Session/DeviceTypeIcon.tsx b/frontend/src/components/Session/DeviceTypeIcon.tsx index dc0158364..c5b2f96c0 100644 --- a/frontend/src/components/Session/DeviceTypeIcon.tsx +++ b/frontend/src/components/Session/DeviceTypeIcon.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconComputer from "@vector-im/compound-design-tokens/assets/web/icons/computer"; import IconMobile from "@vector-im/compound-design-tokens/assets/web/icons/mobile"; diff --git a/frontend/src/components/Session/EndBrowserSessionButton.tsx b/frontend/src/components/Session/EndBrowserSessionButton.tsx index f04a9298c..308a44c71 100644 --- a/frontend/src/components/Session/EndBrowserSessionButton.tsx +++ b/frontend/src/components/Session/EndBrowserSessionButton.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { type UseMutationResult, diff --git a/frontend/src/components/Session/EndCompatSessionButton.tsx b/frontend/src/components/Session/EndCompatSessionButton.tsx index 68f67b91b..37deff3b4 100644 --- a/frontend/src/components/Session/EndCompatSessionButton.tsx +++ b/frontend/src/components/Session/EndCompatSessionButton.tsx @@ -1,3 +1,8 @@ +// Copyright 2025 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. + import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; import { type FragmentType, graphql, useFragment } from "../../gql"; diff --git a/frontend/src/components/Session/EndOAuth2SessionButton.tsx b/frontend/src/components/Session/EndOAuth2SessionButton.tsx index 245ddad12..bdc135946 100644 --- a/frontend/src/components/Session/EndOAuth2SessionButton.tsx +++ b/frontend/src/components/Session/EndOAuth2SessionButton.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/components/Session/EndSessionButton.tsx b/frontend/src/components/Session/EndSessionButton.tsx index 4b311066f..43834ab51 100644 --- a/frontend/src/components/Session/EndSessionButton.tsx +++ b/frontend/src/components/Session/EndSessionButton.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { UseMutationResult } from "@tanstack/react-query"; import IconDelete from "@vector-im/compound-design-tokens/assets/web/icons/delete"; diff --git a/frontend/src/components/Session/LastActive.module.css b/frontend/src/components/Session/LastActive.module.css index 58864ae08..841d064ad 100644 --- a/frontend/src/components/Session/LastActive.module.css +++ b/frontend/src/components/Session/LastActive.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .active { diff --git a/frontend/src/components/Session/LastActive.stories.tsx b/frontend/src/components/Session/LastActive.stories.tsx index d94b77d04..3caffb6f7 100644 --- a/frontend/src/components/Session/LastActive.stories.tsx +++ b/frontend/src/components/Session/LastActive.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import { parseISO, subDays, subHours } from "date-fns"; diff --git a/frontend/src/components/Session/LastActive.test.tsx b/frontend/src/components/Session/LastActive.test.tsx index 57d886a49..8146a1375 100644 --- a/frontend/src/components/Session/LastActive.test.tsx +++ b/frontend/src/components/Session/LastActive.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/Session/LastActive.tsx b/frontend/src/components/Session/LastActive.tsx index b6d81df53..0a55f02b3 100644 --- a/frontend/src/components/Session/LastActive.tsx +++ b/frontend/src/components/Session/LastActive.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import cx from "classnames"; import { differenceInSeconds, parseISO } from "date-fns"; diff --git a/frontend/src/components/SessionCard/SessionCard.module.css b/frontend/src/components/SessionCard/SessionCard.module.css index ce3f02052..53468a123 100644 --- a/frontend/src/components/SessionCard/SessionCard.module.css +++ b/frontend/src/components/SessionCard/SessionCard.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .session-card-root { diff --git a/frontend/src/components/SessionCard/SessionCard.stories.tsx b/frontend/src/components/SessionCard/SessionCard.stories.tsx index 4d2b0835e..e123ac880 100644 --- a/frontend/src/components/SessionCard/SessionCard.stories.tsx +++ b/frontend/src/components/SessionCard/SessionCard.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import IconSignOut from "@vector-im/compound-design-tokens/assets/web/icons/sign-out"; diff --git a/frontend/src/components/SessionCard/SessionCard.tsx b/frontend/src/components/SessionCard/SessionCard.tsx index 801f43bce..cee3d100a 100644 --- a/frontend/src/components/SessionCard/SessionCard.tsx +++ b/frontend/src/components/SessionCard/SessionCard.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { createLink } from "@tanstack/react-router"; import cx from "classnames"; diff --git a/frontend/src/components/SessionCard/index.ts b/frontend/src/components/SessionCard/index.ts index 8d0c1940e..076e7c696 100644 --- a/frontend/src/components/SessionCard/index.ts +++ b/frontend/src/components/SessionCard/index.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { Root, diff --git a/frontend/src/components/SessionDetail/BrowserSessionDetail.tsx b/frontend/src/components/SessionDetail/BrowserSessionDetail.tsx index 2fe2db3f9..ceb29f727 100644 --- a/frontend/src/components/SessionDetail/BrowserSessionDetail.tsx +++ b/frontend/src/components/SessionDetail/BrowserSessionDetail.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Badge } from "@vector-im/compound-web"; import { parseISO } from "date-fns"; diff --git a/frontend/src/components/SessionDetail/CompatSessionDetail.test.tsx b/frontend/src/components/SessionDetail/CompatSessionDetail.test.tsx index 9645c9e71..6d9193da0 100644 --- a/frontend/src/components/SessionDetail/CompatSessionDetail.test.tsx +++ b/frontend/src/components/SessionDetail/CompatSessionDetail.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/SessionDetail/CompatSessionDetail.tsx b/frontend/src/components/SessionDetail/CompatSessionDetail.tsx index 17101a07b..3b88302cb 100644 --- a/frontend/src/components/SessionDetail/CompatSessionDetail.tsx +++ b/frontend/src/components/SessionDetail/CompatSessionDetail.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useQueryClient } from "@tanstack/react-query"; import { VisualList } from "@vector-im/compound-web"; diff --git a/frontend/src/components/SessionDetail/EditSessionName.tsx b/frontend/src/components/SessionDetail/EditSessionName.tsx index 4a57c34e8..39082302f 100644 --- a/frontend/src/components/SessionDetail/EditSessionName.tsx +++ b/frontend/src/components/SessionDetail/EditSessionName.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconEdit from "@vector-im/compound-design-tokens/assets/web/icons/edit"; import { Button, Form, IconButton, Tooltip } from "@vector-im/compound-web"; diff --git a/frontend/src/components/SessionDetail/OAuth2SessionDetail.test.tsx b/frontend/src/components/SessionDetail/OAuth2SessionDetail.test.tsx index 8aa60c6bd..43c7f9ee6 100644 --- a/frontend/src/components/SessionDetail/OAuth2SessionDetail.test.tsx +++ b/frontend/src/components/SessionDetail/OAuth2SessionDetail.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/SessionDetail/OAuth2SessionDetail.tsx b/frontend/src/components/SessionDetail/OAuth2SessionDetail.tsx index 2dc850d43..4575874ce 100644 --- a/frontend/src/components/SessionDetail/OAuth2SessionDetail.tsx +++ b/frontend/src/components/SessionDetail/OAuth2SessionDetail.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useQueryClient } from "@tanstack/react-query"; import { parseISO } from "date-fns"; diff --git a/frontend/src/components/SessionDetail/SessionHeader.module.css b/frontend/src/components/SessionDetail/SessionHeader.module.css index c727e3de5..cd2933c72 100644 --- a/frontend/src/components/SessionDetail/SessionHeader.module.css +++ b/frontend/src/components/SessionDetail/SessionHeader.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .header { diff --git a/frontend/src/components/SessionDetail/SessionHeader.stories.tsx b/frontend/src/components/SessionDetail/SessionHeader.stories.tsx index 9cc2fcfd9..5717b1aaf 100644 --- a/frontend/src/components/SessionDetail/SessionHeader.stories.tsx +++ b/frontend/src/components/SessionDetail/SessionHeader.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import type { PropsWithChildren } from "react"; diff --git a/frontend/src/components/SessionDetail/SessionHeader.test.tsx b/frontend/src/components/SessionDetail/SessionHeader.test.tsx index 6781575b5..ff2f51739 100644 --- a/frontend/src/components/SessionDetail/SessionHeader.test.tsx +++ b/frontend/src/components/SessionDetail/SessionHeader.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/SessionDetail/SessionHeader.tsx b/frontend/src/components/SessionDetail/SessionHeader.tsx index 4f714b19c..9686371c6 100644 --- a/frontend/src/components/SessionDetail/SessionHeader.tsx +++ b/frontend/src/components/SessionDetail/SessionHeader.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Link } from "@tanstack/react-router"; import IconChevronLeft from "@vector-im/compound-design-tokens/assets/web/icons/chevron-left"; diff --git a/frontend/src/components/SessionDetail/SessionInfo.tsx b/frontend/src/components/SessionDetail/SessionInfo.tsx index fed9a801d..e170e9487 100644 --- a/frontend/src/components/SessionDetail/SessionInfo.tsx +++ b/frontend/src/components/SessionDetail/SessionInfo.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconChat from "@vector-im/compound-design-tokens/assets/web/icons/chat"; import IconComputer from "@vector-im/compound-design-tokens/assets/web/icons/computer"; diff --git a/frontend/src/components/Typography.stories.tsx b/frontend/src/components/Typography.stories.tsx index 4854450bd..13f8c2462 100644 --- a/frontend/src/components/Typography.stories.tsx +++ b/frontend/src/components/Typography.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/Typography.tsx b/frontend/src/components/Typography.tsx index af9dcb423..27d398371 100644 --- a/frontend/src/components/Typography.tsx +++ b/frontend/src/components/Typography.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { Children, createElement } from "react"; diff --git a/frontend/src/components/UserEmail/UserEmail.module.css b/frontend/src/components/UserEmail/UserEmail.module.css index 69bac1368..f506a9bde 100644 --- a/frontend/src/components/UserEmail/UserEmail.module.css +++ b/frontend/src/components/UserEmail/UserEmail.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .user-email { diff --git a/frontend/src/components/UserEmail/UserEmail.tsx b/frontend/src/components/UserEmail/UserEmail.tsx index 725fb9e3b..23f07fb63 100644 --- a/frontend/src/components/UserEmail/UserEmail.tsx +++ b/frontend/src/components/UserEmail/UserEmail.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useQueryClient } from "@tanstack/react-query"; import IconDelete from "@vector-im/compound-design-tokens/assets/web/icons/delete"; diff --git a/frontend/src/components/UserEmail/index.ts b/frontend/src/components/UserEmail/index.ts index 96a9b6799..d01842e07 100644 --- a/frontend/src/components/UserEmail/index.ts +++ b/frontend/src/components/UserEmail/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./UserEmail"; diff --git a/frontend/src/components/UserGreeting/UserGreeting.module.css b/frontend/src/components/UserGreeting/UserGreeting.module.css index d8cd123d2..06d9b2c92 100644 --- a/frontend/src/components/UserGreeting/UserGreeting.module.css +++ b/frontend/src/components/UserGreeting/UserGreeting.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .user { diff --git a/frontend/src/components/UserGreeting/UserGreeting.stories.tsx b/frontend/src/components/UserGreeting/UserGreeting.stories.tsx index 4de5f3f19..c8cada411 100644 --- a/frontend/src/components/UserGreeting/UserGreeting.stories.tsx +++ b/frontend/src/components/UserGreeting/UserGreeting.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; diff --git a/frontend/src/components/UserGreeting/UserGreeting.tsx b/frontend/src/components/UserGreeting/UserGreeting.tsx index 9216534fc..cf2ee043f 100644 --- a/frontend/src/components/UserGreeting/UserGreeting.tsx +++ b/frontend/src/components/UserGreeting/UserGreeting.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useQueryClient } from "@tanstack/react-query"; import IconClose from "@vector-im/compound-design-tokens/assets/web/icons/close"; diff --git a/frontend/src/components/UserGreeting/index.ts b/frontend/src/components/UserGreeting/index.ts index 38108f200..e2903712a 100644 --- a/frontend/src/components/UserGreeting/index.ts +++ b/frontend/src/components/UserGreeting/index.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export { default } from "./UserGreeting"; diff --git a/frontend/src/components/UserProfile/AddEmailForm.tsx b/frontend/src/components/UserProfile/AddEmailForm.tsx index 8e8ab7962..3a4c42458 100644 --- a/frontend/src/components/UserProfile/AddEmailForm.tsx +++ b/frontend/src/components/UserProfile/AddEmailForm.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useQueryClient } from "@tanstack/react-query"; import { diff --git a/frontend/src/components/UserProfile/UserEmailList.tsx b/frontend/src/components/UserProfile/UserEmailList.tsx index 8c7394379..b902d6602 100644 --- a/frontend/src/components/UserProfile/UserEmailList.tsx +++ b/frontend/src/components/UserProfile/UserEmailList.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import { notFound } from "@tanstack/react-router"; diff --git a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.module.css b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.module.css index 3759d8dbf..a3b24ea5a 100644 --- a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.module.css +++ b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.module.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .browser-sessions-overview { diff --git a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.stories.tsx b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.stories.tsx index c4ce71bcd..ee2c708be 100644 --- a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.stories.tsx +++ b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.stories.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; diff --git a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.test.tsx b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.test.tsx index 7de0afb99..a17b09616 100644 --- a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.test.tsx +++ b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.test.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.tsx b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.tsx index 71f44618a..c4c1a912f 100644 --- a/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.tsx +++ b/frontend/src/components/UserSessionsOverview/BrowserSessionsOverview.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { H5, Text } from "@vector-im/compound-web"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/config.ts b/frontend/src/config.ts index 177817178..2019620c6 100644 --- a/frontend/src/config.ts +++ b/frontend/src/config.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. type AppConfig = { root: string; diff --git a/frontend/src/graphql.ts b/frontend/src/graphql.ts index 6788f2898..7401a7220 100644 --- a/frontend/src/graphql.ts +++ b/frontend/src/graphql.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { QueryClient } from "@tanstack/react-query"; import type { ExecutionResult } from "graphql"; diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index 71fc00226..445644602 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { type BackendModule, diff --git a/frontend/src/i18n/password_changes.ts b/frontend/src/i18n/password_changes.ts index 7df1e0a16..0dc2b9554 100644 --- a/frontend/src/i18n/password_changes.ts +++ b/frontend/src/i18n/password_changes.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { TFunction } from "i18next"; diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 0ff4f4762..a52a58af6 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { QueryClientProvider } from "@tanstack/react-query"; import { RouterProvider } from "@tanstack/react-router"; diff --git a/frontend/src/pagination.ts b/frontend/src/pagination.ts index 9468d32e4..4e1eaa47b 100644 --- a/frontend/src/pagination.ts +++ b/frontend/src/pagination.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useState } from "react"; import * as v from "valibot"; diff --git a/frontend/src/router.tsx b/frontend/src/router.tsx index db2076e0a..d9d3ca2ac 100644 --- a/frontend/src/router.tsx +++ b/frontend/src/router.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { createRouter } from "@tanstack/react-router"; import LoadingScreen from "./components/LoadingScreen"; diff --git a/frontend/src/routes/__root.tsx b/frontend/src/routes/__root.tsx index a4a58506e..9be779b74 100644 --- a/frontend/src/routes/__root.tsx +++ b/frontend/src/routes/__root.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { QueryClient } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; diff --git a/frontend/src/routes/_account.index.tsx b/frontend/src/routes/_account.index.tsx index cb086e9df..b59fab9fa 100644 --- a/frontend/src/routes/_account.index.tsx +++ b/frontend/src/routes/_account.index.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import { notFound, redirect, useNavigate } from "@tanstack/react-router"; diff --git a/frontend/src/routes/_account.plan.index.tsx b/frontend/src/routes/_account.plan.index.tsx index ff9fa0a0f..9ae338842 100644 --- a/frontend/src/routes/_account.plan.index.tsx +++ b/frontend/src/routes/_account.plan.index.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import { Navigate, redirect } from "@tanstack/react-router"; diff --git a/frontend/src/routes/_account.sessions.browsers.tsx b/frontend/src/routes/_account.sessions.browsers.tsx index 8eedfa8c9..b7da5d0f4 100644 --- a/frontend/src/routes/_account.sessions.browsers.tsx +++ b/frontend/src/routes/_account.sessions.browsers.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import { notFound } from "@tanstack/react-router"; diff --git a/frontend/src/routes/_account.sessions.index.tsx b/frontend/src/routes/_account.sessions.index.tsx index 8b458200e..d628a55cb 100644 --- a/frontend/src/routes/_account.sessions.index.tsx +++ b/frontend/src/routes/_account.sessions.index.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useSuspenseQuery } from "@tanstack/react-query"; import { queryOptions } from "@tanstack/react-query"; diff --git a/frontend/src/routes/_account.tsx b/frontend/src/routes/_account.tsx index fd023af3b..9d804d52b 100644 --- a/frontend/src/routes/_account.tsx +++ b/frontend/src/routes/_account.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import { Outlet, notFound } from "@tanstack/react-router"; diff --git a/frontend/src/routes/clients.$id.tsx b/frontend/src/routes/clients.$id.tsx index 2b7936381..361385a32 100644 --- a/frontend/src/routes/clients.$id.tsx +++ b/frontend/src/routes/clients.$id.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useSuspenseQuery } from "@tanstack/react-query"; import { queryOptions } from "@tanstack/react-query"; diff --git a/frontend/src/routes/devices.$.tsx b/frontend/src/routes/devices.$.tsx index 69c22a3c2..57b0e1962 100644 --- a/frontend/src/routes/devices.$.tsx +++ b/frontend/src/routes/devices.$.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { notFound, redirect } from "@tanstack/react-router"; import { Alert } from "@vector-im/compound-web"; diff --git a/frontend/src/routes/emails.$id.in-use.tsx b/frontend/src/routes/emails.$id.in-use.tsx index c52848ff4..d873d54d3 100644 --- a/frontend/src/routes/emails.$id.in-use.tsx +++ b/frontend/src/routes/emails.$id.in-use.tsx @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useSuspenseQuery } from "@tanstack/react-query"; import { notFound, redirect } from "@tanstack/react-router"; diff --git a/frontend/src/routes/emails.$id.verify.tsx b/frontend/src/routes/emails.$id.verify.tsx index ddee2d9dc..472f3e11b 100644 --- a/frontend/src/routes/emails.$id.verify.tsx +++ b/frontend/src/routes/emails.$id.verify.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, diff --git a/frontend/src/routes/password.change.index.tsx b/frontend/src/routes/password.change.index.tsx index 84073a7d9..373d6456b 100644 --- a/frontend/src/routes/password.change.index.tsx +++ b/frontend/src/routes/password.change.index.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, diff --git a/frontend/src/routes/password.change.success.tsx b/frontend/src/routes/password.change.success.tsx index 72d50987c..ba9476b04 100644 --- a/frontend/src/routes/password.change.success.tsx +++ b/frontend/src/routes/password.change.success.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconCheckCircle from "@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid"; import { useTranslation } from "react-i18next"; diff --git a/frontend/src/routes/password.recovery.index.tsx b/frontend/src/routes/password.recovery.index.tsx index 735825a05..a16c294c8 100644 --- a/frontend/src/routes/password.recovery.index.tsx +++ b/frontend/src/routes/password.recovery.index.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { useMutation, useSuspenseQuery } from "@tanstack/react-query"; import { queryOptions } from "@tanstack/react-query"; diff --git a/frontend/src/routes/reset-cross-signing.cancelled.tsx b/frontend/src/routes/reset-cross-signing.cancelled.tsx index 290d721ae..9ef8211a1 100644 --- a/frontend/src/routes/reset-cross-signing.cancelled.tsx +++ b/frontend/src/routes/reset-cross-signing.cancelled.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconKeyOffSolid from "@vector-im/compound-design-tokens/assets/web/icons/key-off-solid"; import { Text } from "@vector-im/compound-web"; diff --git a/frontend/src/routes/reset-cross-signing.index.tsx b/frontend/src/routes/reset-cross-signing.index.tsx index ed9370e49..92afed9fe 100644 --- a/frontend/src/routes/reset-cross-signing.index.tsx +++ b/frontend/src/routes/reset-cross-signing.index.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, diff --git a/frontend/src/routes/reset-cross-signing.success.tsx b/frontend/src/routes/reset-cross-signing.success.tsx index eb0560ed8..4a7e099e9 100644 --- a/frontend/src/routes/reset-cross-signing.success.tsx +++ b/frontend/src/routes/reset-cross-signing.success.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import IconCheckCircleSolid from "@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid"; import { Text } from "@vector-im/compound-web"; diff --git a/frontend/src/routes/reset-cross-signing.tsx b/frontend/src/routes/reset-cross-signing.tsx index c5a3469e2..5f840d066 100644 --- a/frontend/src/routes/reset-cross-signing.tsx +++ b/frontend/src/routes/reset-cross-signing.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { type ErrorComponentProps, Outlet } from "@tanstack/react-router"; import IconErrorSolid from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; diff --git a/frontend/src/routes/sessions.$id.tsx b/frontend/src/routes/sessions.$id.tsx index 956516414..a926b7397 100644 --- a/frontend/src/routes/sessions.$id.tsx +++ b/frontend/src/routes/sessions.$id.tsx @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { queryOptions, useSuspenseQuery } from "@tanstack/react-query"; import { notFound } from "@tanstack/react-router"; diff --git a/frontend/src/shared.css b/frontend/src/shared.css index bcda8d79c..5ed96957a 100644 --- a/frontend/src/shared.css +++ b/frontend/src/shared.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ @import url("@fontsource/inter/400.css"); diff --git a/frontend/src/styles/cpd-button.css b/frontend/src/styles/cpd-button.css index 66e459420..6cdd414b9 100644 --- a/frontend/src/styles/cpd-button.css +++ b/frontend/src/styles/cpd-button.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .cpd-button { diff --git a/frontend/src/styles/cpd-checkbox-control.css b/frontend/src/styles/cpd-checkbox-control.css index 02ed3e389..8b46dc6b5 100644 --- a/frontend/src/styles/cpd-checkbox-control.css +++ b/frontend/src/styles/cpd-checkbox-control.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .cpd-checkbox-container { diff --git a/frontend/src/styles/cpd-form.css b/frontend/src/styles/cpd-form.css index c4afd1cb5..07cd073f1 100644 --- a/frontend/src/styles/cpd-form.css +++ b/frontend/src/styles/cpd-form.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.cpd-form-org Foundation C.cpd-form-I.cpd-form-C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.cpd-form-org Foundation C.cpd-form-I.cpd-form-C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ /** diff --git a/frontend/src/styles/cpd-link.css b/frontend/src/styles/cpd-link.css index b5770501b..6331a1b21 100644 --- a/frontend/src/styles/cpd-link.css +++ b/frontend/src/styles/cpd-link.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .cpd-link { diff --git a/frontend/src/styles/cpd-mfa-control.css b/frontend/src/styles/cpd-mfa-control.css index 9f1eca41f..8d3b03726 100644 --- a/frontend/src/styles/cpd-mfa-control.css +++ b/frontend/src/styles/cpd-mfa-control.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .cpd-mfa-container { diff --git a/frontend/src/styles/cpd-text-control.css b/frontend/src/styles/cpd-text-control.css index 5d8de3f7f..d6f17c802 100644 --- a/frontend/src/styles/cpd-text-control.css +++ b/frontend/src/styles/cpd-text-control.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ .cpd-text-control { diff --git a/frontend/src/swagger.ts b/frontend/src/swagger.ts index f64f5cd13..7ec3d78d9 100644 --- a/frontend/src/swagger.ts +++ b/frontend/src/swagger.ts @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { SwaggerUIBundle } from "swagger-ui-dist"; import "swagger-ui-dist/swagger-ui.css"; diff --git a/frontend/src/templates.css b/frontend/src/templates.css index 00572eafa..9d332a4ed 100644 --- a/frontend/src/templates.css +++ b/frontend/src/templates.css @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. -* Copyright 2022-2024 The Matrix.org Foundation C.I.C. -* -* SPDX-License-Identifier: AGPL-3.0-only -* Please see LICENSE in the repository root for full details. +/* Copyright 2024, 2025 New Vector Ltd. + * Copyright 2022-2024 The Matrix.org Foundation C.I.C. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ @import url("./styles/cpd-button.css"); diff --git a/frontend/src/test-utils/mockLocale.ts b/frontend/src/test-utils/mockLocale.ts index 7bf0f9bf0..2eb89ce60 100644 --- a/frontend/src/test-utils/mockLocale.ts +++ b/frontend/src/test-utils/mockLocale.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { vi } from "vitest"; diff --git a/frontend/src/test-utils/render.tsx b/frontend/src/test-utils/render.tsx index 00bbaa450..f22520868 100644 --- a/frontend/src/test-utils/render.tsx +++ b/frontend/src/test-utils/render.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { render as testingLibraryRender } from "@testing-library/react"; diff --git a/frontend/src/test-utils/router.tsx b/frontend/src/test-utils/router.tsx index 487e1bd49..e8019c761 100644 --- a/frontend/src/test-utils/router.tsx +++ b/frontend/src/test-utils/router.tsx @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { RouterContextProvider, diff --git a/frontend/src/utils/dates.ts b/frontend/src/utils/dates.ts index 1631e3ed6..5ea14e762 100644 --- a/frontend/src/utils/dates.ts +++ b/frontend/src/utils/dates.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. /** Compute what the date was 90 days ago, rouding down to the start of the day */ export const getNinetyDaysAgo = (): string => { diff --git a/frontend/src/utils/deviceIdFromScope.test.ts b/frontend/src/utils/deviceIdFromScope.test.ts index 5992cc91a..aa9f26d52 100644 --- a/frontend/src/utils/deviceIdFromScope.test.ts +++ b/frontend/src/utils/deviceIdFromScope.test.ts @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. +/* Copyright 2024, 2025 New Vector Ltd. * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ import { describe, expect, it } from "vitest"; diff --git a/frontend/src/utils/deviceIdFromScope.ts b/frontend/src/utils/deviceIdFromScope.ts index ac79171d6..bc08da85a 100644 --- a/frontend/src/utils/deviceIdFromScope.ts +++ b/frontend/src/utils/deviceIdFromScope.ts @@ -1,8 +1,8 @@ -/* Copyright 2024 New Vector Ltd. +/* Copyright 2024, 2025 New Vector Ltd. * Copyright 2023, 2024 The Matrix.org Foundation C.I.C. * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. */ const DEVICE_PREFIX = "urn:matrix:org.matrix.msc2967.client:device:"; diff --git a/frontend/src/utils/password_complexity/index.ts b/frontend/src/utils/password_complexity/index.ts index ba01af2e0..1cb25c60c 100644 --- a/frontend/src/utils/password_complexity/index.ts +++ b/frontend/src/utils/password_complexity/index.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { zxcvbnAsync, zxcvbnOptions } from "@zxcvbn-ts/core"; import * as zxcvbnCommonPackage from "@zxcvbn-ts/language-common"; diff --git a/frontend/src/utils/simplifyUrl.ts b/frontend/src/utils/simplifyUrl.ts index 2319ebfb0..0ee25ec74 100644 --- a/frontend/src/utils/simplifyUrl.ts +++ b/frontend/src/utils/simplifyUrl.ts @@ -1,7 +1,7 @@ // Copyright 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. /** * Simplify a URL by removing the protocol, search params and hash. diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts index 9bb9540fd..96de83f3a 100644 --- a/frontend/src/vite-env.d.ts +++ b/frontend/src/vite-env.d.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. /// diff --git a/frontend/stories/routes/app.tsx b/frontend/stories/routes/app.tsx index 0fc565cae..6965594dd 100644 --- a/frontend/stories/routes/app.tsx +++ b/frontend/stories/routes/app.tsx @@ -1,3 +1,8 @@ +// Copyright 2025 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. + import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { RouterProvider, diff --git a/frontend/stories/routes/index.stories.tsx b/frontend/stories/routes/index.stories.tsx index 20aabebc3..2289f8b4f 100644 --- a/frontend/stories/routes/index.stories.tsx +++ b/frontend/stories/routes/index.stories.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import i18n from "i18next"; diff --git a/frontend/stories/routes/reset-cross-signing.stories.tsx b/frontend/stories/routes/reset-cross-signing.stories.tsx index e2da12e19..47dfe1f56 100644 --- a/frontend/stories/routes/reset-cross-signing.stories.tsx +++ b/frontend/stories/routes/reset-cross-signing.stories.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import type { Meta, StoryObj } from "@storybook/react-vite"; import { HttpResponse, delay } from "msw"; diff --git a/frontend/tailwind.config.cjs b/frontend/tailwind.config.cjs index 7e4840f00..d87a6a28d 100644 --- a/frontend/tailwind.config.cjs +++ b/frontend/tailwind.config.cjs @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @ts-check diff --git a/frontend/tests/mocks/handlers.ts b/frontend/tests/mocks/handlers.ts index c2753d186..ea11d14d8 100644 --- a/frontend/tests/mocks/handlers.ts +++ b/frontend/tests/mocks/handlers.ts @@ -1,7 +1,7 @@ // Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { HttpResponse } from "msw"; import { diff --git a/frontend/tests/routes/account/index.test.tsx b/frontend/tests/routes/account/index.test.tsx index 7d14c17da..6732372d0 100644 --- a/frontend/tests/routes/account/index.test.tsx +++ b/frontend/tests/routes/account/index.test.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/tests/routes/render.tsx b/frontend/tests/routes/render.tsx index 8e8402f7c..f9457d39a 100644 --- a/frontend/tests/routes/render.tsx +++ b/frontend/tests/routes/render.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { RouterProvider, createMemoryHistory } from "@tanstack/react-router"; diff --git a/frontend/tests/routes/reset-cross-signing.test.tsx b/frontend/tests/routes/reset-cross-signing.test.tsx index 1837b03fe..d230635ac 100644 --- a/frontend/tests/routes/reset-cross-signing.test.tsx +++ b/frontend/tests/routes/reset-cross-signing.test.tsx @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. // @vitest-environment happy-dom diff --git a/frontend/tests/routes/types.d.ts b/frontend/tests/routes/types.d.ts index a50c2f990..5735a1131 100644 --- a/frontend/tests/routes/types.d.ts +++ b/frontend/tests/routes/types.d.ts @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. /// /// diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 872cf1e66..fdc00cab7 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,8 +1,8 @@ // Copyright 2024, 2025 New Vector Ltd. // Copyright 2022-2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import { readFile, writeFile } from "node:fs/promises"; import { resolve } from "node:path"; diff --git a/frontend/vitest.global-setup.ts b/frontend/vitest.global-setup.ts index ca7fbe32c..7c8c05483 100644 --- a/frontend/vitest.global-setup.ts +++ b/frontend/vitest.global-setup.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. export const setup = (): void => { process.env.TZ = "UTC"; diff --git a/frontend/vitest.setup.ts b/frontend/vitest.setup.ts index b8263d16c..f423ebaa0 100644 --- a/frontend/vitest.setup.ts +++ b/frontend/vitest.setup.ts @@ -1,8 +1,8 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only -// Please see LICENSE in the repository root for full details. +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. import "@testing-library/jest-dom/vitest"; import { cleanup } from "@testing-library/react"; diff --git a/templates/app.html b/templates/app.html index 52a6243a0..fb4aa3644 100644 --- a/templates/app.html +++ b/templates/app.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {# Must be kept in sync with frontend/index.html #} diff --git a/templates/base.html b/templates/base.html index 51cb70dad..c7fb7e063 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% set _ = translator(lang) %} diff --git a/templates/components/back_to_client.html b/templates/components/back_to_client.html index d767dd579..67417584d 100644 --- a/templates/components/back_to_client.html +++ b/templates/components/back_to_client.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro link(text, uri, mode, params, type="button", kind="primary", destructive=False) %} diff --git a/templates/components/button.html b/templates/components/button.html index 3b037f2f5..15e1c3417 100644 --- a/templates/components/button.html +++ b/templates/components/button.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro link(text, href="#", class="", size="lg") %} diff --git a/templates/components/captcha.html b/templates/components/captcha.html index 09bb91938..b21fa5f67 100644 --- a/templates/components/captcha.html +++ b/templates/components/captcha.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro form(class="") -%} diff --git a/templates/components/errors.html b/templates/components/errors.html index e622fdc12..e357b7dc8 100644 --- a/templates/components/errors.html +++ b/templates/components/errors.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro form_error_message(error) -%} diff --git a/templates/components/field.html b/templates/components/field.html index 455206854..4ad59f44c 100644 --- a/templates/components/field.html +++ b/templates/components/field.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% set cnt = counter() %} diff --git a/templates/components/footer.html b/templates/components/footer.html index 02c0d31d3..34bb5592f 100644 --- a/templates/components/footer.html +++ b/templates/components/footer.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#}

    diff --git a/templates/components/icon.html b/templates/components/icon.html index 7781b2f87..b1d10a638 100644 --- a/templates/components/icon.html +++ b/templates/components/icon.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {# Regenerate with the following shell script: diff --git a/templates/components/idp_brand.html b/templates/components/idp_brand.html index e0226c053..dd49d823c 100644 --- a/templates/components/idp_brand.html +++ b/templates/components/idp_brand.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro logo(brand, class="") -%} diff --git a/templates/components/logout.html b/templates/components/logout.html index ef4daa40a..de4ee17dc 100644 --- a/templates/components/logout.html +++ b/templates/components/logout.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro button(text, csrf_token, as_link=false, post_logout_action={}) %} diff --git a/templates/components/scope.html b/templates/components/scope.html index 2f0ae107c..712926939 100644 --- a/templates/components/scope.html +++ b/templates/components/scope.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% macro list(scopes) %} diff --git a/templates/device_name.txt b/templates/device_name.txt index 2c5e0b16f..83a814464 100644 --- a/templates/device_name.txt +++ b/templates/device_name.txt @@ -2,8 +2,8 @@ Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/emails/recovery.html b/templates/emails/recovery.html index 0567ba7b8..303354ff5 100644 --- a/templates/emails/recovery.html +++ b/templates/emails/recovery.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/emails/recovery.subject b/templates/emails/recovery.subject index a4c158d0c..e6a2c1ebc 100644 --- a/templates/emails/recovery.subject +++ b/templates/emails/recovery.subject @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/emails/recovery.txt b/templates/emails/recovery.txt index 51d8f9d76..b20a6a48c 100644 --- a/templates/emails/recovery.txt +++ b/templates/emails/recovery.txt @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/emails/verification.html b/templates/emails/verification.html index 58378dc27..d64d5a5b7 100644 --- a/templates/emails/verification.html +++ b/templates/emails/verification.html @@ -2,8 +2,8 @@ Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/emails/verification.subject b/templates/emails/verification.subject index d4ed1b387..528497e19 100644 --- a/templates/emails/verification.subject +++ b/templates/emails/verification.subject @@ -2,8 +2,8 @@ Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/emails/verification.txt b/templates/emails/verification.txt index 7afb408ff..afbd59f2d 100644 --- a/templates/emails/verification.txt +++ b/templates/emails/verification.txt @@ -2,8 +2,8 @@ Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {%- set _ = translator(lang) -%} diff --git a/templates/form_post.html b/templates/form_post.html index 2fb62ead9..1d0267e9f 100644 --- a/templates/form_post.html +++ b/templates/form_post.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/404.html b/templates/pages/404.html index fbd707a7f..ea38b3292 100644 --- a/templates/pages/404.html +++ b/templates/pages/404.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/account/deactivated.html b/templates/pages/account/deactivated.html index cc3f52081..4a45b5f19 100644 --- a/templates/pages/account/deactivated.html +++ b/templates/pages/account/deactivated.html @@ -1,8 +1,8 @@ {# Copyright 2025 New Vector Ltd. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/account/locked.html b/templates/pages/account/locked.html index 24b7a8cd3..ed6e0b808 100644 --- a/templates/pages/account/locked.html +++ b/templates/pages/account/locked.html @@ -1,8 +1,8 @@ {# Copyright 2025 New Vector Ltd. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/account/logged_out.html b/templates/pages/account/logged_out.html index e625a4c73..3e629c09e 100644 --- a/templates/pages/account/logged_out.html +++ b/templates/pages/account/logged_out.html @@ -1,8 +1,8 @@ {# Copyright 2025 New Vector Ltd. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/consent.html b/templates/pages/consent.html index 7b02f76da..0eac9dc8b 100644 --- a/templates/pages/consent.html +++ b/templates/pages/consent.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% set consent_page = true %} diff --git a/templates/pages/device_consent.html b/templates/pages/device_consent.html index abd853976..548e14e31 100644 --- a/templates/pages/device_consent.html +++ b/templates/pages/device_consent.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% set consent_page = true %} diff --git a/templates/pages/device_link.html b/templates/pages/device_link.html index c77219fd0..851b1bf96 100644 --- a/templates/pages/device_link.html +++ b/templates/pages/device_link.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2023, 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/error.html b/templates/pages/error.html index d0785637a..e082140df 100644 --- a/templates/pages/error.html +++ b/templates/pages/error.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {# Sometimes we don't have the language set, so we default to english #} diff --git a/templates/pages/index.html b/templates/pages/index.html index 03fb476cf..b8a0d7547 100644 --- a/templates/pages/index.html +++ b/templates/pages/index.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/login.html b/templates/pages/login.html index 637b0a79a..57bccd03e 100644 --- a/templates/pages/login.html +++ b/templates/pages/login.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/policy_violation.html b/templates/pages/policy_violation.html index cca0365c4..1e3320118 100644 --- a/templates/pages/policy_violation.html +++ b/templates/pages/policy_violation.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/reauth.html b/templates/pages/reauth.html index 3a71a10e6..ddebaa595 100644 --- a/templates/pages/reauth.html +++ b/templates/pages/reauth.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/recovery/consumed.html b/templates/pages/recovery/consumed.html index e289f3fed..f03b75b2f 100644 --- a/templates/pages/recovery/consumed.html +++ b/templates/pages/recovery/consumed.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/recovery/disabled.html b/templates/pages/recovery/disabled.html index a4a942c0c..c74d0f831 100644 --- a/templates/pages/recovery/disabled.html +++ b/templates/pages/recovery/disabled.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/recovery/expired.html b/templates/pages/recovery/expired.html index 29004445a..2d6faa946 100644 --- a/templates/pages/recovery/expired.html +++ b/templates/pages/recovery/expired.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/recovery/finish.html b/templates/pages/recovery/finish.html index 923aee9c7..644ef9d61 100644 --- a/templates/pages/recovery/finish.html +++ b/templates/pages/recovery/finish.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/recovery/progress.html b/templates/pages/recovery/progress.html index e929e63dc..9a00a52cd 100644 --- a/templates/pages/recovery/progress.html +++ b/templates/pages/recovery/progress.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/recovery/start.html b/templates/pages/recovery/start.html index 96e9ea306..e8e732dd3 100644 --- a/templates/pages/recovery/start.html +++ b/templates/pages/recovery/start.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/register/index.html b/templates/pages/register/index.html index 1f1d16ed6..21c14cdc7 100644 --- a/templates/pages/register/index.html +++ b/templates/pages/register/index.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/register/password.html b/templates/pages/register/password.html index 8769c36c4..5178445de 100644 --- a/templates/pages/register/password.html +++ b/templates/pages/register/password.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2021-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/register/steps/display_name.html b/templates/pages/register/steps/display_name.html index b4e774ca5..e241bb90b 100644 --- a/templates/pages/register/steps/display_name.html +++ b/templates/pages/register/steps/display_name.html @@ -1,8 +1,8 @@ {# Copyright 2025 New Vector Ltd. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/register/steps/email_in_use.html b/templates/pages/register/steps/email_in_use.html index ce9a0bdb0..3e7ecc689 100644 --- a/templates/pages/register/steps/email_in_use.html +++ b/templates/pages/register/steps/email_in_use.html @@ -1,8 +1,8 @@ {# Copyright 2025 New Vector Ltd. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/register/steps/registration_token.html b/templates/pages/register/steps/registration_token.html index d58c82e7f..3439cb9d2 100644 --- a/templates/pages/register/steps/registration_token.html +++ b/templates/pages/register/steps/registration_token.html @@ -1,8 +1,8 @@ {# Copyright 2025 New Vector Ltd. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/register/steps/verify_email.html b/templates/pages/register/steps/verify_email.html index 39b1c9abb..b59116237 100644 --- a/templates/pages/register/steps/verify_email.html +++ b/templates/pages/register/steps/verify_email.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/sso.html b/templates/pages/sso.html index 5104dc594..b4dcc9c8e 100644 --- a/templates/pages/sso.html +++ b/templates/pages/sso.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/upstream_oauth2/do_register.html b/templates/pages/upstream_oauth2/do_register.html index c9b893542..6e147600f 100644 --- a/templates/pages/upstream_oauth2/do_register.html +++ b/templates/pages/upstream_oauth2/do_register.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/upstream_oauth2/link_mismatch.html b/templates/pages/upstream_oauth2/link_mismatch.html index 4ab1dc80d..7c6d12255 100644 --- a/templates/pages/upstream_oauth2/link_mismatch.html +++ b/templates/pages/upstream_oauth2/link_mismatch.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/pages/upstream_oauth2/suggest_link.html b/templates/pages/upstream_oauth2/suggest_link.html index a226092db..2dd2bb0ec 100644 --- a/templates/pages/upstream_oauth2/suggest_link.html +++ b/templates/pages/upstream_oauth2/suggest_link.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2022-2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {% extends "base.html" %} diff --git a/templates/swagger/doc.html b/templates/swagger/doc.html index 59a776343..e22893c70 100644 --- a/templates/swagger/doc.html +++ b/templates/swagger/doc.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} diff --git a/templates/swagger/oauth2-redirect.html b/templates/swagger/oauth2-redirect.html index e00644e1c..831e518ec 100644 --- a/templates/swagger/oauth2-redirect.html +++ b/templates/swagger/oauth2-redirect.html @@ -1,9 +1,9 @@ {# -Copyright 2024 New Vector Ltd. +Copyright 2024, 2025 New Vector Ltd. Copyright 2024 The Matrix.org Foundation C.I.C. -SPDX-License-Identifier: AGPL-3.0-only -Please see LICENSE in the repository root for full details. +SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. -#} {# This is taken from the swagger-ui/dist/oauth2-redirect.html file #} From b771e3d9ffdee63ef8a1c1de47aea910bed0ad74 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 10:43:55 +0200 Subject: [PATCH 26/31] Remove unused devcontainer setup --- .devcontainer/.env | 1 - .devcontainer/Dockerfile | 10 -------- .devcontainer/devcontainer.json | 40 -------------------------------- .devcontainer/docker-compose.yml | 34 --------------------------- 4 files changed, 85 deletions(-) delete mode 100644 .devcontainer/.env delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 .devcontainer/docker-compose.yml diff --git a/.devcontainer/.env b/.devcontainer/.env deleted file mode 100644 index 91c93d91d..000000000 --- a/.devcontainer/.env +++ /dev/null @@ -1 +0,0 @@ -MAS_OAUTH2_ISSUER="https://${CODESPACE_NAME}-8080.githubpreview.dev/" \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 421130224..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM mcr.microsoft.com/vscode/devcontainers/rust:0-1 - -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends postgresql-client - -COPY .env /.env - -# TODO: pre-build custom images, those take too much time -#RUN cargo install sqlx-cli --no-default-features --features postgres -#RUN cargo install cargo-edit \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index b063e5bd5..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "Rust", - "dockerComposeFile": "docker-compose.yml", - "service": "app", - "workspaceFolder": "/workspace", - - "postCreateCommand": "SQLX_OFFLINE=1 cargo run -- database migrate", - "settings": { - "lldb.executable": "/usr/bin/lldb", - "sqltools.connections": [{ - "name": "Container database", - "driver": "PostgreSQL", - "previewLimit": 50, - "server": "localhost", - "port": 5432, - "database": "postgres", - "username": "postgres", - "password": "postgres" - }], - "files.watcherExclude": { - "**/target/**": true - } - }, - - "forwardPorts": [8080], - "portsAttributes": { - "8080": { - "label": "Application" - } - }, - - "extensions": [ - "bungcip.better-toml", - "vadimcn.vscode-lldb", - "mutantdino.resourcemonitor", - "matklad.rust-analyzer", - "mtxr.sqltools", - "mtxr.sqltools-driver-pg" - ] -} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml deleted file mode 100644 index 30c6f9e7f..000000000 --- a/.devcontainer/docker-compose.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: '3' - -services: - app: - build: - context: . - dockerfile: Dockerfile - volumes: - - ..:/workspace:cached - - environment: - # FIXME: sqlx-cli and the app use different URIs - DATABASE_URL: postgresql://postgres:postgres@localhost/postgres - MAS_DATABASE_URI: postgresql://postgres:postgres@localhost/postgres - MAS_COOKIES_SECRET: a093e76c2ddc87d9de7afc1f9059d60a12176b2cdf8966029c00bc2146518a61 - - # Overrides default command so things don't shut down after the process ends. - command: sleep infinity - - # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. - network_mode: service:db - - db: - image: postgres:latest - restart: unless-stopped - volumes: - - postgres-data:/var/lib/postgresql/data - environment: - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - POSTGRES_DB: postgres - -volumes: - postgres-data: \ No newline at end of file From 6421d9d1f516aac78acb6b2b1ace6a486811b4f5 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 11:01:07 +0200 Subject: [PATCH 27/31] Add license headers in most files that missed them --- .cargo/config.toml | 5 +++++ .codecov.yml | 5 +++++ .config/nextest.toml | 5 +++++ .dockerignore | 5 +++++ .editorconfig | 5 +++++ .gitattributes | 1 - .github/actions/build-frontend/action.yml | 7 ++++++- .github/actions/build-policies/action.yml | 5 +++++ .github/dependabot.yml | 5 +++++ .github/release.yml | 5 +++++ .github/scripts/.gitignore | 5 +++++ .github/workflows/build.yaml | 5 +++++ .github/workflows/ci.yaml | 5 +++++ .github/workflows/coverage.yaml | 5 +++++ .github/workflows/docs.yaml | 9 +++++++-- .github/workflows/merge-back.yaml | 5 +++++ .github/workflows/release-branch.yaml | 5 +++++ .github/workflows/release-bump.yaml | 5 +++++ .github/workflows/tag.yaml | 5 +++++ .github/workflows/translations-download.yaml | 5 +++++ .github/workflows/translations-upload.yaml | 5 +++++ .gitignore | 5 +++++ .rustfmt.toml | 5 +++++ Cargo.toml | 5 +++++ Dockerfile | 4 ++++ book.toml | 5 +++++ clippy.toml | 5 +++++ crates/axum-utils/Cargo.toml | 5 +++++ crates/cli/Cargo.toml | 5 +++++ crates/config/Cargo.toml | 5 +++++ crates/context/Cargo.toml | 5 +++++ crates/data-model/Cargo.toml | 5 +++++ crates/email/Cargo.toml | 5 +++++ crates/handlers/Cargo.toml | 5 +++++ crates/http/Cargo.toml | 5 +++++ crates/i18n-scan/Cargo.toml | 5 +++++ crates/i18n/Cargo.toml | 5 +++++ crates/iana-codegen/Cargo.toml | 5 +++++ crates/iana/Cargo.toml | 5 +++++ crates/jose/Cargo.toml | 5 +++++ crates/keystore/Cargo.toml | 5 +++++ crates/keystore/tests/generate.sh | 4 ++++ crates/listener/Cargo.toml | 5 +++++ crates/listener/examples/demo/certs/gen.sh | 4 ++++ crates/matrix-synapse/Cargo.toml | 5 +++++ crates/matrix/Cargo.toml | 5 +++++ crates/oauth2-types/Cargo.toml | 5 +++++ crates/oidc-client/Cargo.toml | 5 +++++ crates/policy/Cargo.toml | 5 +++++ crates/router/Cargo.toml | 5 +++++ crates/spa/Cargo.toml | 5 +++++ crates/storage-pg/Cargo.toml | 5 +++++ crates/storage/Cargo.toml | 5 +++++ crates/syn2mas/Cargo.toml | 5 +++++ crates/tasks/Cargo.toml | 5 +++++ crates/templates/Cargo.toml | 5 +++++ crates/tower/Cargo.toml | 5 +++++ deny.toml | 5 +++++ docker-bake.hcl | 5 +++++ frontend/.editorconfig | 11 ----------- frontend/.gitignore | 5 +++++ misc/build-docs.sh | 5 +++++ misc/sqlx_update.sh | 9 +++++++-- misc/update.sh | 6 +++++- policies/.gitignore | 5 +++++ policies/.regal/config.yaml | 5 +++++ policies/Makefile | 5 +++++ policies/authorization_grant/authorization_grant.rego | 5 +++++ .../authorization_grant/authorization_grant_test.rego | 5 +++++ policies/client_registration/client_registration.rego | 5 +++++ .../client_registration/client_registration_test.rego | 5 +++++ policies/common/common.rego | 5 +++++ policies/common/common_test.rego | 5 +++++ policies/email/email.rego | 5 +++++ policies/email/email_test.rego | 5 +++++ policies/register/register.rego | 5 +++++ policies/register/register_test.rego | 5 +++++ policies/util/coveralls.rego | 5 +++++ 78 files changed, 382 insertions(+), 18 deletions(-) delete mode 100644 .gitattributes delete mode 100644 frontend/.editorconfig diff --git a/.cargo/config.toml b/.cargo/config.toml index 307bcfe43..18f6fb282 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [build] rustflags = ["--cfg", "tokio_unstable"] diff --git a/.codecov.yml b/.codecov.yml index 54f4aaf72..a946b3cea 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + comment: false flag_management: diff --git a/.config/nextest.toml b/.config/nextest.toml index 351fb92d7..7ed06faa5 100644 --- a/.config/nextest.toml +++ b/.config/nextest.toml @@ -1,2 +1,7 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [profile.default] retries = 1 diff --git a/.dockerignore b/.dockerignore index e016faae8..01fcc861a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + target/ crates/*/target crates/*/node_modules diff --git a/.editorconfig b/.editorconfig index 23e144851..ccbe6ed4b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + root = true [*] diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 7e11055a9..000000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.wasm binary diff --git a/.github/actions/build-frontend/action.yml b/.github/actions/build-frontend/action.yml index a7a1fe2c5..417f1f9ae 100644 --- a/.github/actions/build-frontend/action.yml +++ b/.github/actions/build-frontend/action.yml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Build the frontend assets description: Installs Node.js and builds the frontend assets from the frontend directory @@ -7,7 +12,7 @@ runs: - name: Install Node uses: actions/setup-node@v4.2.0 with: - node-version: '22' + node-version: "22" - name: Install dependencies run: npm ci diff --git a/.github/actions/build-policies/action.yml b/.github/actions/build-policies/action.yml index 274aa8134..0eba08e6e 100644 --- a/.github/actions/build-policies/action.yml +++ b/.github/actions/build-policies/action.yml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Build the Open Policy Agent policies description: Installs OPA and builds the policies diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a98d07e09..8b67a1414 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + version: 2 updates: - package-ecosystem: "cargo" diff --git a/.github/release.yml b/.github/release.yml index 8b25ed964..3633ae68a 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + changelog: categories: - title: Bug Fixes diff --git a/.github/scripts/.gitignore b/.github/scripts/.gitignore index 504afef81..efa4841d7 100644 --- a/.github/scripts/.gitignore +++ b/.github/scripts/.gitignore @@ -1,2 +1,7 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + node_modules/ package-lock.json diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 7ac2669e5..f2c1f0b36 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Build on: diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b3f438f5f..d3c87d0e3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: CI on: diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 12f2419b3..ca3860aaa 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Coverage on: diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 811a35b9b..84170931e 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -1,10 +1,15 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Build and deploy the documentation on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/merge-back.yaml b/.github/workflows/merge-back.yaml index 04884e2be..5cb8ebdf1 100644 --- a/.github/workflows/merge-back.yaml +++ b/.github/workflows/merge-back.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Merge back a reference to main on: workflow_call: diff --git a/.github/workflows/release-branch.yaml b/.github/workflows/release-branch.yaml index fac7624c8..43015c972 100644 --- a/.github/workflows/release-branch.yaml +++ b/.github/workflows/release-branch.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Create a new release branch on: workflow_dispatch: diff --git a/.github/workflows/release-bump.yaml b/.github/workflows/release-bump.yaml index 841893d50..3b147a2ce 100644 --- a/.github/workflows/release-bump.yaml +++ b/.github/workflows/release-bump.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Bump the version on a release branch on: workflow_dispatch: diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index 02555f5e1..631221145 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Tag a new version on: workflow_call: diff --git a/.github/workflows/translations-download.yaml b/.github/workflows/translations-download.yaml index d2380c0df..130a76d38 100644 --- a/.github/workflows/translations-download.yaml +++ b/.github/workflows/translations-download.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Download translation files from Localazy on: workflow_dispatch: diff --git a/.github/workflows/translations-upload.yaml b/.github/workflows/translations-upload.yaml index 2c5a27c3e..9fbe53c00 100644 --- a/.github/workflows/translations-upload.yaml +++ b/.github/workflows/translations-upload.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + name: Upload translation files to Localazy on: push: diff --git a/.gitignore b/.gitignore index 1046cc35a..04c077e49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # Rust target/ diff --git a/.rustfmt.toml b/.rustfmt.toml index 0e4510bbb..72a97f569 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + max_width = 100 comment_width = 80 wrap_comments = true diff --git a/Cargo.toml b/Cargo.toml index 68f867595..07bc5d1ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [workspace] default-members = ["crates/cli"] members = ["crates/*"] diff --git a/Dockerfile b/Dockerfile index 085504530..354f5fada 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,8 @@ # syntax = docker/dockerfile:1.7.1 +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. # Builds a minimal image with the binary only. It is multi-arch capable, # cross-building to aarch64 and x86_64. When cross-compiling, Docker sets two diff --git a/book.toml b/book.toml index e21f37eca..88f5e8263 100644 --- a/book.toml +++ b/book.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # Documentation for possible options in this file is at # https://rust-lang.github.io/mdBook/format/config.html [book] diff --git a/clippy.toml b/clippy.toml index 3cbf7c74c..2d1274857 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + doc-valid-idents = ["OpenID", "OAuth", "..", "PostgreSQL", "SQLite"] disallowed-methods = [ diff --git a/crates/axum-utils/Cargo.toml b/crates/axum-utils/Cargo.toml index 6084984cd..ceb47a4c7 100644 --- a/crates/axum-utils/Cargo.toml +++ b/crates/axum-utils/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-axum-utils" version.workspace = true diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 40c46897a..22def30c7 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-cli" version.workspace = true diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 35b7f83d1..c6eb76d7c 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-config" version.workspace = true diff --git a/crates/context/Cargo.toml b/crates/context/Cargo.toml index 46adc9911..ad86d1426 100644 --- a/crates/context/Cargo.toml +++ b/crates/context/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-context" version.workspace = true diff --git a/crates/data-model/Cargo.toml b/crates/data-model/Cargo.toml index c4e19fcdf..6474d46ae 100644 --- a/crates/data-model/Cargo.toml +++ b/crates/data-model/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-data-model" version.workspace = true diff --git a/crates/email/Cargo.toml b/crates/email/Cargo.toml index 7b8ff94c4..eba4ea6fa 100644 --- a/crates/email/Cargo.toml +++ b/crates/email/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-email" version.workspace = true diff --git a/crates/handlers/Cargo.toml b/crates/handlers/Cargo.toml index 4bda28ced..35f3e79f5 100644 --- a/crates/handlers/Cargo.toml +++ b/crates/handlers/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-handlers" version.workspace = true diff --git a/crates/http/Cargo.toml b/crates/http/Cargo.toml index 3df605792..66eaac607 100644 --- a/crates/http/Cargo.toml +++ b/crates/http/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-http" description = "HTTP utilities for the Matrix Authentication Service" diff --git a/crates/i18n-scan/Cargo.toml b/crates/i18n-scan/Cargo.toml index c70d7b4e7..cfb1bd66b 100644 --- a/crates/i18n-scan/Cargo.toml +++ b/crates/i18n-scan/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-i18n-scan" version.workspace = true diff --git a/crates/i18n/Cargo.toml b/crates/i18n/Cargo.toml index c73448060..8d04dc731 100644 --- a/crates/i18n/Cargo.toml +++ b/crates/i18n/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-i18n" version.workspace = true diff --git a/crates/iana-codegen/Cargo.toml b/crates/iana-codegen/Cargo.toml index ae8f8d1ed..0f30c8c31 100644 --- a/crates/iana-codegen/Cargo.toml +++ b/crates/iana-codegen/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-iana-codegen" version.workspace = true diff --git a/crates/iana/Cargo.toml b/crates/iana/Cargo.toml index 796abe4ba..d646bac19 100644 --- a/crates/iana/Cargo.toml +++ b/crates/iana/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-iana" description = "IANA registry data for JOSE and OAuth 2.0" diff --git a/crates/jose/Cargo.toml b/crates/jose/Cargo.toml index 9ca221bb3..ac9c4d96a 100644 --- a/crates/jose/Cargo.toml +++ b/crates/jose/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-jose" description = "JSON Object Signing and Encryption (JWT & co) utilities" diff --git a/crates/keystore/Cargo.toml b/crates/keystore/Cargo.toml index 668d555ad..0b97e5d88 100644 --- a/crates/keystore/Cargo.toml +++ b/crates/keystore/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-keystore" description = "Secret keys store used by the Matrix Authentication Service" diff --git a/crates/keystore/tests/generate.sh b/crates/keystore/tests/generate.sh index c2de69c9f..b6cbe1082 100644 --- a/crates/keystore/tests/generate.sh +++ b/crates/keystore/tests/generate.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. set -eux diff --git a/crates/listener/Cargo.toml b/crates/listener/Cargo.toml index 14d84ea9b..5171e86b4 100644 --- a/crates/listener/Cargo.toml +++ b/crates/listener/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-listener" version.workspace = true diff --git a/crates/listener/examples/demo/certs/gen.sh b/crates/listener/examples/demo/certs/gen.sh index 4ce16dcc3..019279ec1 100644 --- a/crates/listener/examples/demo/certs/gen.sh +++ b/crates/listener/examples/demo/certs/gen.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. # Script to regenerate the server and client certificate diff --git a/crates/matrix-synapse/Cargo.toml b/crates/matrix-synapse/Cargo.toml index 8e3e1841c..34c08e9c9 100644 --- a/crates/matrix-synapse/Cargo.toml +++ b/crates/matrix-synapse/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-matrix-synapse" version.workspace = true diff --git a/crates/matrix/Cargo.toml b/crates/matrix/Cargo.toml index 2182c6426..a041fee5e 100644 --- a/crates/matrix/Cargo.toml +++ b/crates/matrix/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-matrix" version.workspace = true diff --git a/crates/oauth2-types/Cargo.toml b/crates/oauth2-types/Cargo.toml index 4707bb137..2432e34f5 100644 --- a/crates/oauth2-types/Cargo.toml +++ b/crates/oauth2-types/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "oauth2-types" description = "OAuth 2.0 types used by the Matrix Authentication Service" diff --git a/crates/oidc-client/Cargo.toml b/crates/oidc-client/Cargo.toml index 5b35ec913..3fffd584c 100644 --- a/crates/oidc-client/Cargo.toml +++ b/crates/oidc-client/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-oidc-client" description = "OpenID Connect client library used by the Matrix Authentication Service" diff --git a/crates/policy/Cargo.toml b/crates/policy/Cargo.toml index ca927bcc6..7496f2726 100644 --- a/crates/policy/Cargo.toml +++ b/crates/policy/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-policy" version.workspace = true diff --git a/crates/router/Cargo.toml b/crates/router/Cargo.toml index b31302fc0..07cd3a913 100644 --- a/crates/router/Cargo.toml +++ b/crates/router/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-router" version.workspace = true diff --git a/crates/spa/Cargo.toml b/crates/spa/Cargo.toml index 292338a67..5287abf15 100644 --- a/crates/spa/Cargo.toml +++ b/crates/spa/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-spa" version.workspace = true diff --git a/crates/storage-pg/Cargo.toml b/crates/storage-pg/Cargo.toml index 0bf34ec0b..149e92fc6 100644 --- a/crates/storage-pg/Cargo.toml +++ b/crates/storage-pg/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-storage-pg" version.workspace = true diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index f22ef1d6e..07f4330c6 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-storage" version.workspace = true diff --git a/crates/syn2mas/Cargo.toml b/crates/syn2mas/Cargo.toml index 5452c14be..9dfee658b 100644 --- a/crates/syn2mas/Cargo.toml +++ b/crates/syn2mas/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "syn2mas" version.workspace = true diff --git a/crates/tasks/Cargo.toml b/crates/tasks/Cargo.toml index 9cd39c20b..5c2a31536 100644 --- a/crates/tasks/Cargo.toml +++ b/crates/tasks/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-tasks" version.workspace = true diff --git a/crates/templates/Cargo.toml b/crates/templates/Cargo.toml index a99f5ae56..ffe2dbf74 100644 --- a/crates/templates/Cargo.toml +++ b/crates/templates/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-templates" version.workspace = true diff --git a/crates/tower/Cargo.toml b/crates/tower/Cargo.toml index 38067f120..44a17c670 100644 --- a/crates/tower/Cargo.toml +++ b/crates/tower/Cargo.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [package] name = "mas-tower" description = "Tower layers used by the Matrix Authentication Service" diff --git a/deny.toml b/deny.toml index 152c525e5..62f8dab87 100644 --- a/deny.toml +++ b/deny.toml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + [graph] targets = [ { triple = "x86_64-unknown-linux-gnu" }, diff --git a/docker-bake.hcl b/docker-bake.hcl index cfa6b8353..3c3cac3af 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. +# // This is used to set the version reported by the binary through an environment // variable. This is mainly useful when building out of a git context, like in // CI, where we don't have the full commit history available diff --git a/frontend/.editorconfig b/frontend/.editorconfig deleted file mode 100644 index 70fefa646..000000000 --- a/frontend/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -[*] -charset=utf-8 -end_of_line = lf - -[*.{ts,tsx,js,cjs,mjs,css,json,graphql}] -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/frontend/.gitignore b/frontend/.gitignore index 5b51a6b97..bef0bf155 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + /node_modules /dist /coverage diff --git a/misc/build-docs.sh b/misc/build-docs.sh index 785b3f76f..caeab8d85 100644 --- a/misc/build-docs.sh +++ b/misc/build-docs.sh @@ -1,5 +1,10 @@ #!/bin/sh +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. +# # This script is used by the Cloudflare Pages to build the documentation. # It detects if it's running in the Cloudflare Pages build environment and will install the required dependencies. # It can also be used locally to build the documentation, given that the required dependencies are installed. diff --git a/misc/sqlx_update.sh b/misc/sqlx_update.sh index 6dee03da4..3ca357dff 100755 --- a/misc/sqlx_update.sh +++ b/misc/sqlx_update.sh @@ -1,4 +1,9 @@ #!/bin/sh +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. +# set -eu if [ "${DATABASE_URL+defined}" != defined ]; then @@ -21,11 +26,11 @@ for crate in $CRATES_WITH_SQLX; do if [ $crate = syn2mas ]; then # We need to apply the syn2mas_temporary_tables.sql one-off 'migration' # for checking the syn2mas queries - + # not evident from the help text, but psql accepts connection URLs as the dbname psql --dbname="$DATABASE_URL" --single-transaction --file="${crates_dir}/syn2mas/src/mas_writer/syn2mas_temporary_tables.sql" fi - + (cd "$crates_dir/$crate" && cargo sqlx prepare) || echo "(failed to prepare for $crate)" if [ $crate = syn2mas ]; then diff --git a/misc/update.sh b/misc/update.sh index 4cbea8c31..1bab7d10d 100644 --- a/misc/update.sh +++ b/misc/update.sh @@ -1,5 +1,9 @@ #!/bin/sh - +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. +# set -eu export SQLX_OFFLINE=1 diff --git a/policies/.gitignore b/policies/.gitignore index 8a26235c9..33599e57b 100644 --- a/policies/.gitignore +++ b/policies/.gitignore @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + /policy.wasm /bundle.tar.gz /coverage.json diff --git a/policies/.regal/config.yaml b/policies/.regal/config.yaml index 2088bdbf0..0620e6872 100644 --- a/policies/.regal/config.yaml +++ b/policies/.regal/config.yaml @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + rules: style: external-reference: diff --git a/policies/Makefile b/policies/Makefile index 18cb2dbfc..0e4d8ebdd 100644 --- a/policies/Makefile +++ b/policies/Makefile @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. +# # Set to 1 to run OPA through Docker DOCKER := 0 PODMAN := 0 diff --git a/policies/authorization_grant/authorization_grant.rego b/policies/authorization_grant/authorization_grant.rego index 72fa7ee8b..e8602da76 100644 --- a/policies/authorization_grant/authorization_grant.rego +++ b/policies/authorization_grant/authorization_grant.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # METADATA # schemas: # - input: schema["authorization_grant_input"] diff --git a/policies/authorization_grant/authorization_grant_test.rego b/policies/authorization_grant/authorization_grant_test.rego index 3594bfac2..2a13a2392 100644 --- a/policies/authorization_grant/authorization_grant_test.rego +++ b/policies/authorization_grant/authorization_grant_test.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package authorization_grant_test import data.authorization_grant diff --git a/policies/client_registration/client_registration.rego b/policies/client_registration/client_registration.rego index 2a990b7aa..a257bd599 100644 --- a/policies/client_registration/client_registration.rego +++ b/policies/client_registration/client_registration.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # METADATA # schemas: # - input: schema["client_registration_input"] diff --git a/policies/client_registration/client_registration_test.rego b/policies/client_registration/client_registration_test.rego index 034f5243b..60df994c6 100644 --- a/policies/client_registration/client_registration_test.rego +++ b/policies/client_registration/client_registration_test.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package client_registration_test import rego.v1 diff --git a/policies/common/common.rego b/policies/common/common.rego index 8386555c6..17e9aa82d 100644 --- a/policies/common/common.rego +++ b/policies/common/common.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package common import rego.v1 diff --git a/policies/common/common_test.rego b/policies/common/common_test.rego index 52950a591..18770fdc7 100644 --- a/policies/common/common_test.rego +++ b/policies/common/common_test.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package common_test import data.common diff --git a/policies/email/email.rego b/policies/email/email.rego index d9c5eb778..4f2d09f92 100644 --- a/policies/email/email.rego +++ b/policies/email/email.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # METADATA # schemas: # - input: schema["email_input"] diff --git a/policies/email/email_test.rego b/policies/email/email_test.rego index 9d3750b56..8e75e24a5 100644 --- a/policies/email/email_test.rego +++ b/policies/email/email_test.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package email_test import data.email diff --git a/policies/register/register.rego b/policies/register/register.rego index 6a36f9611..34428741a 100644 --- a/policies/register/register.rego +++ b/policies/register/register.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + # METADATA # schemas: # - input: schema["register_input"] diff --git a/policies/register/register_test.rego b/policies/register/register_test.rego index 040cdcc5d..6cb324b77 100644 --- a/policies/register/register_test.rego +++ b/policies/register/register_test.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package register_test import data.register diff --git a/policies/util/coveralls.rego b/policies/util/coveralls.rego index c25208552..1d8f60585 100644 --- a/policies/util/coveralls.rego +++ b/policies/util/coveralls.rego @@ -1,3 +1,8 @@ +# Copyright 2025 New Vector Ltd. +# +# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +# Please see LICENSE files in the repository root for full details. + package util import rego.v1 From 2468aa01c5371660ab21e7618183a6a85e9c41fa Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 11:13:59 +0200 Subject: [PATCH 28/31] Fix a few more license reference issues --- Cargo.toml | 2 +- crates/i18n/src/sprintf/grammar.pest | 4 ++-- crates/iana-codegen/src/main.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 07bc5d1ac..93870e0d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ resolver = "2" # Updated in the CI with a `sed` command package.version = "0.17.0-rc.0" -package.license = "AGPL-3.0-only" +package.license = "AGPL-3.0-only OR LicenseRef-Element-Commercial" package.authors = ["Element Backend Team"] package.edition = "2024" package.homepage = "https://element-hq.github.io/matrix-authentication-service/" diff --git a/crates/i18n/src/sprintf/grammar.pest b/crates/i18n/src/sprintf/grammar.pest index aa81de02f..6d33ad7f3 100644 --- a/crates/i18n/src/sprintf/grammar.pest +++ b/crates/i18n/src/sprintf/grammar.pest @@ -1,7 +1,7 @@ -// Copyright 2024 New Vector Ltd. +// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. message = _{ (text | percent | placeholder)* ~ EOI } diff --git a/crates/iana-codegen/src/main.rs b/crates/iana-codegen/src/main.rs index 9fc06ef34..0477f0a13 100644 --- a/crates/iana-codegen/src/main.rs +++ b/crates/iana-codegen/src/main.rs @@ -75,10 +75,10 @@ impl Display for File { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { writeln!( f, - r"// Copyright 2024 New Vector Ltd. + r"// Copyright 2024, 2025 New Vector Ltd. // Copyright 2023, 2024 The Matrix.org Foundation C.I.C. // -// SPDX-License-Identifier: AGPL-3.0-only +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. #![allow(clippy::doc_markdown)] From fc4245883ef3e5d61ff65f4a2ccc9058ae599756 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Jun 2025 14:13:22 +0200 Subject: [PATCH 29/31] Bump most frontend dependencies --- .../.storybook/public/mockServiceWorker.js | 143 +- frontend/knip.config.ts | 9 +- frontend/package-lock.json | 1736 +++++++++-------- frontend/package.json | 40 +- .../CompatSessionDetail.test.tsx.snap | 9 +- .../OAuth2SessionDetail.test.tsx.snap | 6 +- .../account/__snapshots__/index.test.tsx.snap | 12 +- 7 files changed, 1059 insertions(+), 896 deletions(-) diff --git a/frontend/.storybook/public/mockServiceWorker.js b/frontend/.storybook/public/mockServiceWorker.js index 84491eb36..de7bc0f29 100644 --- a/frontend/.storybook/public/mockServiceWorker.js +++ b/frontend/.storybook/public/mockServiceWorker.js @@ -5,24 +5,23 @@ * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. - * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.8.7' -const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' +const PACKAGE_VERSION = '2.10.2' +const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() -self.addEventListener('install', function () { +addEventListener('install', function () { self.skipWaiting() }) -self.addEventListener('activate', function (event) { +addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()) }) -self.addEventListener('message', async function (event) { - const clientId = event.source.id +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') if (!clientId || !self.clients) { return @@ -94,17 +93,18 @@ self.addEventListener('message', async function (event) { } }) -self.addEventListener('fetch', function (event) { - const { request } = event - +addEventListener('fetch', function (event) { // Bypass navigation requests. - if (request.mode === 'navigate') { + if (event.request.mode === 'navigate') { return } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { return } @@ -115,48 +115,62 @@ self.addEventListener('fetch', function (event) { return } - // Generate unique request ID. const requestId = crypto.randomUUID() event.respondWith(handleRequest(event, requestId)) }) +/** + * @param {FetchEvent} event + * @param {string} requestId + */ async function handleRequest(event, requestId) { const client = await resolveMainClient(event) + const requestCloneForEvents = event.request.clone() const response = await getResponse(event, client, requestId) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { - ;(async function () { - const responseClone = response.clone() + const serializedRequest = await serializeRequest(requestCloneForEvents) - sendToClient( - client, - { - type: 'RESPONSE', - payload: { - requestId, - isMockedResponse: IS_MOCKED_RESPONSE in response, + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, - body: responseClone.body, headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, }, }, - [responseClone.body], - ) - })() + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) } return response } -// Resolve the main client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) @@ -184,12 +198,16 @@ async function resolveMainClient(event) { }) } +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @returns {Promise} + */ async function getResponse(event, client, requestId) { - const { request } = event - // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). - const requestClone = request.clone() + const requestClone = event.request.clone() function passthrough() { // Cast the request headers to a new Headers instance @@ -230,29 +248,17 @@ async function getResponse(event, client, requestId) { } // Notify the client that a request has been intercepted. - const requestBuffer = await request.arrayBuffer() + const serializedRequest = await serializeRequest(event.request) const clientMessage = await sendToClient( client, { type: 'REQUEST', payload: { id: requestId, - url: request.url, - mode: request.mode, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: requestBuffer, - keepalive: request.keepalive, + ...serializedRequest, }, }, - [requestBuffer], + [serializedRequest.body], ) switch (clientMessage.type) { @@ -268,6 +274,12 @@ async function getResponse(event, client, requestId) { return passthrough() } +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -280,14 +292,18 @@ function sendToClient(client, message, transferrables = []) { resolve(event.data) } - client.postMessage( - message, - [channel.port2].concat(transferrables.filter(Boolean)), - ) + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) }) } -async function respondWithMock(response) { +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { // Setting response status code to 0 is a no-op. // However, when responding with a "Response.error()", the produced Response // instance will have status code set to 0. Since it's not possible to create @@ -305,3 +321,24 @@ async function respondWithMock(response) { return mockedResponse } + +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } +} diff --git a/frontend/knip.config.ts b/frontend/knip.config.ts index a6a4c76cf..36a69e275 100644 --- a/frontend/knip.config.ts +++ b/frontend/knip.config.ts @@ -6,17 +6,10 @@ import type { KnipConfig } from "knip"; export default { - entry: [ - "src/main.tsx", - "src/swagger.ts", - "src/routes/*", - "i18next-parser.config.ts", - ], + entry: ["src/main.tsx", "src/swagger.ts", "src/routes/*"], ignore: ["src/gql/*", "src/routeTree.gen.ts", ".storybook/locales.ts"], ignoreDependencies: [ // This is used by the tailwind PostCSS plugin, but not detected by knip "postcss-nesting", - // We're using @storybook/addon-essentials to simplify upgrades, but knip doesn't detect them - "@storybook/addon-*", ], } satisfies KnipConfig; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8203e1b9a..47a9466b6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,12 +10,12 @@ "dependencies": { "@fontsource/inconsolata": "^5.2.6", "@fontsource/inter": "^5.2.6", - "@radix-ui/react-collapsible": "^1.1.8", - "@radix-ui/react-dialog": "^1.1.11", - "@tanstack/react-query": "^5.80.6", - "@tanstack/react-router": "^1.121.0", - "@vector-im/compound-design-tokens": "4.0.2", - "@vector-im/compound-web": "^7.12.0", + "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-dialog": "^1.1.14", + "@tanstack/react-query": "^5.80.7", + "@tanstack/react-router": "^1.121.2", + "@vector-im/compound-design-tokens": "4.0.4", + "@vector-im/compound-web": "^8.0.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "classnames": "^2.5.1", @@ -24,7 +24,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "react-i18next": "^15.5.2", - "swagger-ui-dist": "^5.22.0", + "swagger-ui-dist": "^5.24.1", "valibot": "^1.1.0", "vaul": "^1.1.2" }, @@ -35,18 +35,18 @@ "@browser-logos/safari": "^2.1.0", "@codecov/vite-plugin": "^1.9.1", "@graphql-codegen/cli": "^5.0.7", - "@graphql-codegen/client-preset": "^4.8.0", + "@graphql-codegen/client-preset": "^4.8.2", "@graphql-codegen/typescript-msw": "^3.0.1", "@storybook/addon-docs": "^9.0.8", "@storybook/react-vite": "^9.0.8", - "@tanstack/react-query-devtools": "^5.80.6", - "@tanstack/react-router-devtools": "^1.121.0", - "@tanstack/router-plugin": "^1.121.0", + "@tanstack/react-query-devtools": "^5.80.7", + "@tanstack/react-router-devtools": "^1.121.5", + "@tanstack/router-plugin": "^1.121.4", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^24.0.0", - "@types/react": "19.1.7", + "@types/node": "^24.0.1", + "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "@types/swagger-ui-dist": "^3.30.5", "@vitejs/plugin-react": "^4.5.2", @@ -54,24 +54,24 @@ "autoprefixer": "^10.4.21", "browserslist-to-esbuild": "^2.1.1", "graphql": "^16.11.0", - "happy-dom": "^17.6.3", + "happy-dom": "^18.0.1", "i18next-parser": "^9.3.0", - "knip": "^5.59.1", - "msw": "^2.8.7", + "knip": "^5.61.0", + "msw": "^2.10.2", "msw-storybook-addon": "^2.0.5", - "postcss": "^8.5.4", + "postcss": "^8.5.5", "postcss-import": "^16.1.0", - "postcss-nesting": "^13.0.1", + "postcss-nesting": "^13.0.2", "rimraf": "^6.0.1", "storybook": "^9.0.1", - "storybook-react-i18next": "^4.0.4", + "storybook-react-i18next": "4.0.7", "tailwindcss": "^3.4.17", "typescript": "^5.8.3", "vite": "6.3.5", "vite-plugin-compression": "^0.5.1", "vite-plugin-graphql-codegen": "^3.6.1", "vite-plugin-manifest-sri": "^0.2.0", - "vitest": "^3.1.2" + "vitest": "^3.2.3" } }, "node_modules/@actions/core": { @@ -130,9 +130,9 @@ "license": "MIT" }, "node_modules/@adobe/css-tools": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", - "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", + "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", "dev": true, "license": "MIT" }, @@ -204,9 +204,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, "license": "MIT", "engines": { @@ -272,13 +272,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -573,13 +573,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -666,9 +666,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "dev": true, "license": "MIT", "dependencies": { @@ -720,9 +720,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "dev": true, "license": "MIT", "dependencies": { @@ -1043,9 +1043,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.3.tgz", - "integrity": "sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1358,9 +1358,9 @@ } }, "node_modules/@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "dev": true, "funding": [ { @@ -1482,9 +1482,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -1499,9 +1499,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -1516,9 +1516,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -1533,9 +1533,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -1550,9 +1550,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -1567,9 +1567,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -1584,9 +1584,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -1601,9 +1601,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -1618,9 +1618,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -1635,9 +1635,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -1652,9 +1652,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -1669,9 +1669,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -1686,9 +1686,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -1703,9 +1703,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -1720,9 +1720,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -1737,9 +1737,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -1754,9 +1754,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -1771,9 +1771,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -1788,9 +1788,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -1805,9 +1805,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -1822,9 +1822,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -1839,9 +1839,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -1856,9 +1856,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -1873,9 +1873,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -1890,9 +1890,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -1914,31 +1914,31 @@ "license": "MIT" }, "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", + "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", + "@floating-ui/core": "^1.7.1", "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/react": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.8.tgz", - "integrity": "sha512-EQJ4Th328y2wyHR3KzOUOoTW2UKjFk53fmyahfwExnFQ8vnsMYqKc+fFPOkeYtj5tcp1DUMiNJ7BFhed7e9ONw==", + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.12.tgz", + "integrity": "sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/react-dom": "^2.1.3", "@floating-ui/utils": "^0.2.9", "tabbable": "^6.0.0" }, @@ -1948,9 +1948,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz", + "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0" @@ -2405,9 +2405,9 @@ } }, "node_modules/@graphql-codegen/typescript-msw/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2664,9 +2664,9 @@ } }, "node_modules/@graphql-tools/batch-execute": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.15.tgz", - "integrity": "sha512-qlWUl6yi87FU5WvyJ0uD81R4Y30oQIuW3mJCjOrEvifyT+f/rEqSZFOhYrofYoZAoTcwqOhy6WgH+b9+AtRYjA==", + "version": "9.0.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.17.tgz", + "integrity": "sha512-i7BqBkUP2+ex8zrQrCQTEt6nYHQmIey9qg7CMRRa1hXCY2X8ZCVjxsvbsi7gOLwyI/R3NHxSRDxmzZevE2cPLg==", "dev": true, "license": "MIT", "dependencies": { @@ -2703,13 +2703,13 @@ } }, "node_modules/@graphql-tools/delegate": { - "version": "10.2.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.17.tgz", - "integrity": "sha512-z+LpZrTQCEXA4fbdJcSsvhaMqT4xi/O8B0mP30ENGyTbSfa20QamOQx9jgCiw2ii/ucwxfGMhygwlpZG36EU4w==", + "version": "10.2.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.19.tgz", + "integrity": "sha512-aaCGAALTQmKctHwumbtz0c5XehGjYLSfoDx1IB2vdPt76Q0MKz2AiEDlENgzTVr4JHH7fd9YNrd+IO3D8tFlIg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/batch-execute": "^9.0.15", + "@graphql-tools/batch-execute": "^9.0.17", "@graphql-tools/executor": "^1.4.7", "@graphql-tools/schema": "^10.0.11", "@graphql-tools/utils": "^10.8.1", @@ -2891,13 +2891,13 @@ } }, "node_modules/@graphql-tools/graphql-file-loader": { - "version": "8.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.19.tgz", - "integrity": "sha512-kyEZL4rRJ5LelfCXL3GLgbMiu5Zd7memZaL8ZxPXGI7DA8On1e5IVBH3zZJwf7LzhjSVnPaHM7O/bRzGvTbXzQ==", + "version": "8.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.20.tgz", + "integrity": "sha512-inds4My+JJxmg5mxKWYtMIJNRxa7MtX+XIYqqD/nu6G4LzQ5KGaBJg6wEl103KxXli7qNOWeVAUmEjZeYhwNEg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/import": "7.0.18", + "@graphql-tools/import": "7.0.19", "@graphql-tools/utils": "^10.8.6", "globby": "^11.0.3", "tslib": "^2.4.0", @@ -2933,9 +2933,9 @@ } }, "node_modules/@graphql-tools/import": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.18.tgz", - "integrity": "sha512-1tw1/1QLB0n5bPWfIrhCRnrHIlbMvbwuifDc98g4FPhJ7OXD+iUQe+IpmD5KHVwYWXWhZOuJuq45DfV/WLNq3A==", + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.19.tgz", + "integrity": "sha512-Xtku8G4bxnrr6I3hVf8RrBFGYIbQ1OYVjl7jgcy092aBkNZvy1T6EDmXmYXn5F+oLd9Bks3K3WaMm8gma/nM/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3136,13 +3136,13 @@ } }, "node_modules/@graphql-tools/wrap": { - "version": "10.0.35", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.35.tgz", - "integrity": "sha512-qBga3wo7+GqY+ClGexiyRz9xgy1RWozZryTuGX8usGWPa4wKi/tJS4rKWQQesgB3Fh//SZUCRA5u2nwZaZQw1Q==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.1.0.tgz", + "integrity": "sha512-M7QolM/cJwM2PNAJS1vphT2/PDVSKtmg5m+fxHrFfKpp2RRosJSvYPzUD/PVPqF2rXTtnCwkgh1s5KIsOPCz+w==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/delegate": "^10.2.17", + "@graphql-tools/delegate": "^10.2.19", "@graphql-tools/schema": "^10.0.11", "@graphql-tools/utils": "^10.8.1", "@whatwg-node/promise-helpers": "^1.3.0", @@ -3179,14 +3179,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", - "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.12.tgz", + "integrity": "sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", - "@inquirer/type": "^3.0.6" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" }, "engines": { "node": ">=18" @@ -3201,14 +3201,14 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", - "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", + "version": "10.1.13", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", + "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", @@ -3249,9 +3249,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", "dev": true, "license": "MIT", "engines": { @@ -3259,9 +3259,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", - "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", "dev": true, "license": "MIT", "engines": { @@ -3482,9 +3482,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.38.7", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.38.7.tgz", - "integrity": "sha512-Jkb27iSn7JPdkqlTqKfhncFfnEZsIJVYxsFbUSWEkxdIPdsyngrhoDBk0/BGD2FQcRH99vlRrkHpNTyKqI+0/w==", + "version": "0.39.2", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.2.tgz", + "integrity": "sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==", "dev": true, "license": "MIT", "dependencies": { @@ -3500,9 +3500,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz", - "integrity": "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", + "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", "dev": true, "license": "MIT", "optional": true, @@ -3748,9 +3748,9 @@ "license": "MIT" }, "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-9.0.2.tgz", - "integrity": "sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.2.0.tgz", + "integrity": "sha512-ruKLkS+Dm/YIJaUhzEB7zPI+jh3EXxu0QnNV8I7t9jf0lpD2VnltuyRbhrbJEkksklZj//xCMyFFsILGjiU2Mg==", "cpu": [ "arm64" ], @@ -3762,9 +3762,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-9.0.2.tgz", - "integrity": "sha512-7kV0EOFEZ3sk5Hjy4+bfA6XOQpCwbDiDkkHN4BHHyrBHsXxUR05EcEJPPL1WjItefg+9+8hrBmoK0xRoDs41+A==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.2.0.tgz", + "integrity": "sha512-0zhgNUm5bYezdSFOg3FYhtVP83bAq7FTV/3suGQDl/43MixfQG7+bl+hlrP4mz6WlD2SUb2u9BomnJWl1uey9w==", "cpu": [ "x64" ], @@ -3776,9 +3776,9 @@ ] }, "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-9.0.2.tgz", - "integrity": "sha512-6OvkEtRXrt8sJ4aVfxHRikjain9nV1clIsWtJ1J3J8NG1ZhjyJFgT00SCvqxbK+pzeWJq6XzHyTCN78ML+lY2w==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.2.0.tgz", + "integrity": "sha512-SHOxfCcZV1axeIGfyeD1BkdLvfQgjmPy18tO0OUXGElcdScxD6MqU5rj/AVtiuBT+51GtFfOKlwl1+BdVwhD1A==", "cpu": [ "x64" ], @@ -3790,9 +3790,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-9.0.2.tgz", - "integrity": "sha512-aYpNL6o5IRAUIdoweW21TyLt54Hy/ZS9tvzNzF6ya1ckOQ8DLaGVPjGpmzxdNja9j/bbV6aIzBH7lNcBtiOTkQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.2.0.tgz", + "integrity": "sha512-mgEkYrJ+N90sgEDqEZ07zH+4I1D28WjqAhdzfW3aS2x2vynVpoY9jWfHuH8S62vZt3uATJrTKTRa8CjPWEsrdw==", "cpu": [ "arm" ], @@ -3804,9 +3804,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-9.0.2.tgz", - "integrity": "sha512-RGFW4vCfKMFEIzb9VCY0oWyyY9tR1/o+wDdNePhiUXZU4SVniRPQaZ1SJ0sUFI1k25pXZmzQmIP6cBmazi/Dew==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.2.0.tgz", + "integrity": "sha512-BhEzNLjn4HjP8+Q18D3/jeIDBxW7OgoJYIjw2CaaysnYneoTlij8hPTKxHfyqq4IGM3fFs9TLR/k338M3zkQ7g==", "cpu": [ "arm64" ], @@ -3818,9 +3818,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-9.0.2.tgz", - "integrity": "sha512-lxx/PibBfzqYvut2Y8N2D0Ritg9H8pKO+7NUSJb9YjR/bfk2KRmP8iaUz3zB0JhPtf/W3REs65oKpWxgflGToA==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.2.0.tgz", + "integrity": "sha512-yxbMYUgRmN2V8x8XoxmD/Qq6aG7YIW3ToMDILfmcfeeRRVieEJ3DOWBT0JSE+YgrOy79OyFDH/1lO8VnqLmDQQ==", "cpu": [ "arm64" ], @@ -3832,9 +3832,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-9.0.2.tgz", - "integrity": "sha512-yD28ptS/OuNhwkpXRPNf+/FvrO7lwURLsEbRVcL1kIE0GxNJNMtKgIE4xQvtKDzkhk6ZRpLho5VSrkkF+3ARTQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.2.0.tgz", + "integrity": "sha512-QG1UfgC2N2qhW1tOnDCgB/26vn1RCshR5sYPhMeaxO1gMQ3kEKbZ3QyBXxrG1IX5qsXYj5hPDJLDYNYUjRcOpg==", "cpu": [ "riscv64" ], @@ -3846,9 +3846,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-9.0.2.tgz", - "integrity": "sha512-WBwEJdspoga2w+aly6JVZeHnxuPVuztw3fPfWrei2P6rNM5hcKxBGWKKT6zO1fPMCB4sdDkFohGKkMHVV1eryQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.2.0.tgz", + "integrity": "sha512-uqTDsQdi6mrkSV1gvwbuT8jf/WFl6qVDVjNlx7IPSaAByrNiJfPrhTmH8b+Do58Dylz7QIRZgxQ8CHIZSyBUdg==", "cpu": [ "s390x" ], @@ -3860,9 +3860,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-9.0.2.tgz", - "integrity": "sha512-a2z3/cbOOTUq0UTBG8f3EO/usFcdwwXnCejfXv42HmV/G8GjrT4fp5+5mVDoMByH3Ce3iVPxj1LmS6OvItKMYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.2.0.tgz", + "integrity": "sha512-GZdHXhJ7p6GaQg9MjRqLebwBf8BLvGIagccI6z5yMj4fV3LU4QuDfwSEERG+R6oQ/Su9672MBqWwncvKcKT68w==", "cpu": [ "x64" ], @@ -3874,9 +3874,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-9.0.2.tgz", - "integrity": "sha512-bHZF+WShYQWpuswB9fyxcgMIWVk4sZQT0wnwpnZgQuvGTZLkYJ1JTCXJMtaX5mIFHf69ngvawnwPIUA4Feil0g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.2.0.tgz", + "integrity": "sha512-YBAC3GOicYznReG2twE7oFPSeK9Z1f507z1EYWKg6HpGYRYRlJyszViu7PrhMT85r/MumDTs429zm+CNqpFWOA==", "cpu": [ "x64" ], @@ -3888,9 +3888,9 @@ ] }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-9.0.2.tgz", - "integrity": "sha512-I5cSgCCh5nFozGSHz+PjIOfrqW99eUszlxKLgoNNzQ1xQ2ou9ZJGzcZ94BHsM9SpyYHLtgHljmOZxCT9bgxYNA==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.2.0.tgz", + "integrity": "sha512-+qlIg45CPVPy+Jn3vqU1zkxA/AAv6e/2Ax/ImX8usZa8Tr2JmQn/93bmSOOOnr9fXRV9d0n4JyqYzSWxWPYDEw==", "cpu": [ "wasm32" ], @@ -3898,16 +3898,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.9" + "@napi-rs/wasm-runtime": "^0.2.11" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-9.0.2.tgz", - "integrity": "sha512-5IhoOpPr38YWDWRCA5kP30xlUxbIJyLAEsAK7EMyUgqygBHEYLkElaKGgS0X5jRXUQ6l5yNxuW73caogb2FYaw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.2.0.tgz", + "integrity": "sha512-AI4KIpS8Zf6vwfOPk0uQPSC0pQ1m5HU4hCbtrgL21JgJSlnJaeEu3/aoOBB45AXKiExBU9R+CDR7aSnW7uhc5A==", "cpu": [ "arm64" ], @@ -3919,9 +3919,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-9.0.2.tgz", - "integrity": "sha512-Qc40GDkaad9rZksSQr2l/V9UubigIHsW69g94Gswc2sKYB3XfJXfIfyV8WTJ67u6ZMXsZ7BH1msSC6Aen75mCg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.2.0.tgz", + "integrity": "sha512-r19cQc7HaEJ76HFsMsbiKMTIV2YqFGSof8H5hB7e5Jkb/23Y8Isv1YrSzkDaGhcw02I/COsrPo+eEmjy35eFuA==", "cpu": [ "x64" ], @@ -3950,12 +3950,12 @@ "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.4.tgz", - "integrity": "sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3973,9 +3973,9 @@ } }, "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.8.tgz", - "integrity": "sha512-hxEsLvK9WxIAPyxdDRULL4hcaSjMZCfP7fHB0Z1uUnDoDBat1Zh46hwYfa69DeZAbJrPckjf0AGAtEZyvDyJbw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", + "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", @@ -3983,7 +3983,7 @@ "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, @@ -4003,15 +4003,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.4.tgz", - "integrity": "sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.0", - "@radix-ui/react-slot": "1.2.0" + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -4059,15 +4059,15 @@ } }, "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.12.tgz", - "integrity": "sha512-5UFKuTMX8F2/KjHvyqu9IYT8bEtDSCJwwIx1PghBo4jh9S6jJVsceq9xIjqsOVcxsynGwV5eaqPE3n/Cu+DrSA==", + "version": "2.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.15.tgz", + "integrity": "sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.12", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-menu": "2.1.15", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, @@ -4087,22 +4087,22 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.11.tgz", - "integrity": "sha512-yI7S1ipkP5/+99qhSI6nthfo/tR6bL6Zgxi/+1UO6qPa6UeM6nlafWcQ65vB4rU2XjgjMfMhI3k9Y5MztA62VQ==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", + "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.7", + "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.6", + "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.0", - "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" @@ -4138,14 +4138,14 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.7.tgz", - "integrity": "sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", + "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, @@ -4165,17 +4165,17 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.12.tgz", - "integrity": "sha512-VJoMs+BWWE7YhzEQyVwvF9n22Eiyr83HotCVrMQzla/OwRovXCgah7AcaEr4hMNj4gJxSdtIbcHGvmJXOoJVHA==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", + "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.12", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-menu": "2.1.15", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { @@ -4209,13 +4209,13 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.4.tgz", - "integrity": "sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { @@ -4234,17 +4234,17 @@ } }, "node_modules/@radix-ui/react-form": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.4.tgz", - "integrity": "sha512-97Q7Hb0///sMF2X8XvyVx3Aub7WG/ybIofoDVUo8utG/z/6TBzWGjgai7ZjECXYLbKip88t9/ibyQJvYe5k6SA==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.7.tgz", + "integrity": "sha512-IXLKFnaYvFg/KkeV5QfOX7tRnwHXp127koOFUjLWMTrRv5Rny3DQcAtIFFeA/Cli4HHM8DuJCXAUsgnFVJndlw==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-label": "2.1.4", - "@radix-ui/react-primitive": "2.1.0" + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4280,12 +4280,12 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.4.tgz", - "integrity": "sha512-wy3dqizZnZVV4ja0FNnUhIWNwWdoldXrneEyUcVtLYDAt8ovGS4ridtMAOGgXBBIfggL4BOveVWsjXDORdGEQg==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4303,26 +4303,26 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.12.tgz", - "integrity": "sha512-+qYq6LfbiGo97Zz9fioX83HCiIYYFNs8zAsVCMQrIakoNYylIzWuoD/anAD3UzvvR6cnswmfRFJFq/zYYq/k7Q==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", + "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.4", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.7", + "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.4", - "@radix-ui/react-portal": "1.1.6", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.0", - "@radix-ui/react-roving-focus": "1.1.7", - "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.10", + "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" @@ -4343,16 +4343,16 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.4.tgz", - "integrity": "sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", + "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.4", + "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", @@ -4375,12 +4375,12 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.6.tgz", - "integrity": "sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { @@ -4423,12 +4423,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.0.tgz", - "integrity": "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.0" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -4446,13 +4446,13 @@ } }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.4.tgz", - "integrity": "sha512-8rl9w7lJdcVPor47Dhws9mUHRHLE+8JEgyJRdNWCpGPa6HIlr3eh+Yn9gyx1CnCLbw5naHsI2gaO9dBWO50vzw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", "license": "MIT", "dependencies": { "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4470,18 +4470,18 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.7.tgz", - "integrity": "sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", + "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.4", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.0", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, @@ -4501,12 +4501,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.4.tgz", - "integrity": "sha512-2fTm6PSiUm8YPq9W0E4reYuv01EE3aFSzt8edBiXqPHshF8N9+Kymt/k0/R+F3dkY5lQyB/zPtrP82phskLi7w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4524,9 +4524,9 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", - "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -4706,9 +4706,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", - "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz", + "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==", "cpu": [ "arm" ], @@ -4720,9 +4720,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", - "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz", + "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==", "cpu": [ "arm64" ], @@ -4734,9 +4734,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", - "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz", + "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==", "cpu": [ "arm64" ], @@ -4748,9 +4748,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", - "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz", + "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==", "cpu": [ "x64" ], @@ -4762,9 +4762,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", - "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz", + "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==", "cpu": [ "arm64" ], @@ -4776,9 +4776,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", - "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz", + "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==", "cpu": [ "x64" ], @@ -4790,9 +4790,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", - "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz", + "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==", "cpu": [ "arm" ], @@ -4804,9 +4804,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", - "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz", + "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==", "cpu": [ "arm" ], @@ -4818,9 +4818,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", - "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz", + "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==", "cpu": [ "arm64" ], @@ -4832,9 +4832,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", - "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz", + "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==", "cpu": [ "arm64" ], @@ -4846,9 +4846,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", - "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz", + "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==", "cpu": [ "loong64" ], @@ -4860,9 +4860,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", - "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz", + "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==", "cpu": [ "ppc64" ], @@ -4874,9 +4874,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", - "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz", + "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==", "cpu": [ "riscv64" ], @@ -4888,9 +4888,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", - "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz", + "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==", "cpu": [ "riscv64" ], @@ -4902,9 +4902,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", - "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz", + "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==", "cpu": [ "s390x" ], @@ -4916,9 +4916,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", - "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz", + "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==", "cpu": [ "x64" ], @@ -4930,9 +4930,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", - "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz", + "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==", "cpu": [ "x64" ], @@ -4944,9 +4944,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", - "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz", + "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==", "cpu": [ "arm64" ], @@ -4958,9 +4958,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", - "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz", + "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==", "cpu": [ "ia32" ], @@ -4972,9 +4972,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", - "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz", + "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==", "cpu": [ "x64" ], @@ -5162,9 +5162,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.80.6", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.6.tgz", - "integrity": "sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==", + "version": "5.80.7", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.7.tgz", + "integrity": "sha512-s09l5zeUKC8q7DCCCIkVSns8zZrK4ZDT6ryEjxNBFi68G4z2EBobBS7rdOY3r6W1WbUDpc1fe5oY+YO/+2UVUg==", "license": "MIT", "funding": { "type": "github", @@ -5183,12 +5183,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.80.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.6.tgz", - "integrity": "sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw==", + "version": "5.80.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.7.tgz", + "integrity": "sha512-u2F0VK6+anItoEvB3+rfvTO9GEh2vb00Je05OwlUe/A0lkJBgW1HckiY3f9YZa+jx6IOe4dHPh10dyp9aY3iRQ==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.80.6" + "@tanstack/query-core": "5.80.7" }, "funding": { "type": "github", @@ -5199,9 +5199,9 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.80.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.80.6.tgz", - "integrity": "sha512-y7Es0OJ4RYQxrPYsuuQP0jxjgJ40a03UbEPmJ6vwf/ERVMRoRIMkpjtvPxf1D+n9nwPfWmGdD0jW8Wxd+TxeEw==", + "version": "5.80.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.80.7.tgz", + "integrity": "sha512-7Dz/19fVo0i+jgLVBabV5vfGOlLyN5L1w8w1/ogFhe6ItNNsNA+ZgNTbtiKpbR3CcX2WDRRTInz1uMSmHzTsoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5212,19 +5212,19 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.80.6", + "@tanstack/react-query": "^5.80.7", "react": "^18 || ^19" } }, "node_modules/@tanstack/react-router": { - "version": "1.121.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.121.0.tgz", - "integrity": "sha512-l+hwNPzAPuCb/V4K6E1ZwKplnk8/nYUTQrXdtfXro5xOT1zNedJOm+juZsNKyoHokvhH+uT+I1s+mrkaykctcA==", + "version": "1.121.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.121.2.tgz", + "integrity": "sha512-+VqITx7ZqQjB/H0ujlgs+uzaIElff1X66uh9Tgi9Bx3DTrPSzdNAKs3Osk8UQ7rL1hbHiW3ZT1vQPJU08cfKrQ==", "license": "MIT", "dependencies": { "@tanstack/history": "1.120.17", "@tanstack/react-store": "^0.7.0", - "@tanstack/router-core": "1.121.0", + "@tanstack/router-core": "1.121.2", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" @@ -5242,14 +5242,13 @@ } }, "node_modules/@tanstack/react-router-devtools": { - "version": "1.121.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.121.0.tgz", - "integrity": "sha512-428xI3N40MEdGZ0Y7WLJVBpezLhG/mNZX92OEx3r0E183X1hoooi2/s9+JoF4ifDv1muoRX6oZqOqGhs4BqeRg==", + "version": "1.121.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.121.5.tgz", + "integrity": "sha512-HQ/zQhywPHpsjpGZnmgUkEvxll3cUZItFUVPqOHXuorgEBfzjK8/jTH2WZpLHt6HyxJq3M8yRUvStoDd2VIxCA==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/router-devtools-core": "^1.121.0", - "solid-js": "^1.9.5" + "@tanstack/router-devtools-core": "^1.121.2" }, "engines": { "node": ">=12" @@ -5259,19 +5258,19 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-router": "^1.121.0", + "@tanstack/react-router": "^1.121.2", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "node_modules/@tanstack/react-store": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.0.tgz", - "integrity": "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.1.tgz", + "integrity": "sha512-qUTEKdId6QPWGiWyKAPf/gkN29scEsz6EUSJ0C3HgLMgaqTAyBsQ2sMCfGVcqb+kkhEXAdjleCgH6LAPD6f2sA==", "license": "MIT", "dependencies": { - "@tanstack/store": "0.7.0", - "use-sync-external-store": "^1.4.0" + "@tanstack/store": "0.7.1", + "use-sync-external-store": "^1.5.0" }, "funding": { "type": "github", @@ -5283,9 +5282,9 @@ } }, "node_modules/@tanstack/router-core": { - "version": "1.121.0", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.121.0.tgz", - "integrity": "sha512-EMiLgRMHbi1JHOgJOrxUSc3Ws+Jge3bGa7r03tdIgvH07dJcsY03L5ZLtuqYKvuS6YJvYeciEXA31IUIEN9dVA==", + "version": "1.121.2", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.121.2.tgz", + "integrity": "sha512-jwkhTTDUuhwWq6CeOwvJFcqXagmFu+2FSCx1WHj+mt516hDe7+qe5JWQ7KqMaAbV92Jue/qNnrRxMEONz8aKBg==", "license": "MIT", "dependencies": { "@tanstack/history": "1.120.17", @@ -5301,9 +5300,9 @@ } }, "node_modules/@tanstack/router-devtools-core": { - "version": "1.121.0", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.121.0.tgz", - "integrity": "sha512-66+bkdII8j3DJWyOgnJpmuddkt+0aVSFI5UP1G6i7qUrqZAciWXBD+UlZJ5pt6S/7PVBow7xsd0YzMEZlz+lIw==", + "version": "1.121.2", + "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.121.2.tgz", + "integrity": "sha512-LRuz0MyEw7swouwtbYT3MfaRVXOtUNAE8Vxuy9ETH6dnvXX+wm8kHqcHZX3AlDrL6fHi86aDKEXFJg+MyWZzcg==", "dev": true, "license": "MIT", "dependencies": { @@ -5318,7 +5317,7 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/router-core": "^1.121.0", + "@tanstack/router-core": "^1.121.2", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" @@ -5330,13 +5329,13 @@ } }, "node_modules/@tanstack/router-generator": { - "version": "1.121.0", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.121.0.tgz", - "integrity": "sha512-3JDHlL5mrdVI6RwRf92YId0fgYr6Vdh0yo/pYMUV6USkB0fRtayz176AODvTaR5IeB2BYkaiPKTK38ySyGueRw==", + "version": "1.121.2", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.121.2.tgz", + "integrity": "sha512-3KIQwY6INW2y2SmBWs+xoGyt6GM8Q96QDJW9sbtLdiTbddvVGyphVAs3Vai2HoTNsUdkw0Fnd2QfgPUwY4PSQQ==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/router-core": "^1.121.0", + "@tanstack/router-core": "^1.121.2", "@tanstack/router-utils": "^1.121.0", "@tanstack/virtual-file-routes": "^1.120.17", "prettier": "^3.5.0", @@ -5353,20 +5352,10 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@tanstack/router-generator/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, "node_modules/@tanstack/router-plugin": { - "version": "1.121.0", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.121.0.tgz", - "integrity": "sha512-A05CE2JuebgU+D7H4VHhOkWDmW1NxFbKVq82hHewiBWdq2nwODSZQV4AO+Ub7bIcILHYX/ivKuspK11s/d7k0A==", + "version": "1.121.4", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.121.4.tgz", + "integrity": "sha512-HWqpfX1rqs+A1Q2ucN64X3JAb34MdVknfEbY5W0L5+LyPHlCw9HJwPXY+i8gXD+YFTizTysCY/Go26OxpebMZA==", "dev": true, "license": "MIT", "dependencies": { @@ -5376,8 +5365,8 @@ "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", - "@tanstack/router-core": "^1.121.0", - "@tanstack/router-generator": "^1.121.0", + "@tanstack/router-core": "^1.121.2", + "@tanstack/router-generator": "^1.121.2", "@tanstack/router-utils": "^1.121.0", "@tanstack/virtual-file-routes": "^1.120.17", "babel-dead-code-elimination": "^1.0.10", @@ -5394,7 +5383,7 @@ }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", - "@tanstack/react-router": "^1.121.0", + "@tanstack/react-router": "^1.121.2", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" @@ -5418,9 +5407,9 @@ } }, "node_modules/@tanstack/router-plugin/node_modules/unplugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.2.tgz", - "integrity": "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.5.tgz", + "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", "dev": true, "license": "MIT", "dependencies": { @@ -5455,9 +5444,9 @@ } }, "node_modules/@tanstack/store": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.0.tgz", - "integrity": "sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.1.tgz", + "integrity": "sha512-PjUQKXEXhLYj2X5/6c1Xn/0/qKY0IVFxTJweopRfF26xfjVyb14yALydJrHupDh3/d+1WKmfEgZPBVCmDkzzwg==", "license": "MIT", "funding": { "type": "github", @@ -5679,9 +5668,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -5707,9 +5696,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.0.tgz", - "integrity": "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==", + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", + "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", "dev": true, "license": "MIT", "dependencies": { @@ -5717,9 +5706,9 @@ } }, "node_modules/@types/react": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.7.tgz", - "integrity": "sha512-BnsPLV43ddr05N71gaGzyZ5hzkCmGwhMvYc8zmvI8Ci1bRkkDSzDDVfAXfN2tk748OwI7ediiPX6PfT9p0QGVg==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5744,9 +5733,9 @@ "license": "MIT" }, "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", "dev": true, "license": "MIT" }, @@ -5771,6 +5760,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -5782,9 +5778,9 @@ } }, "node_modules/@vector-im/compound-design-tokens": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@vector-im/compound-design-tokens/-/compound-design-tokens-4.0.2.tgz", - "integrity": "sha512-y13bhPyJ5OzbGRl21F6+Y2adrjyK+mu67yKTx+o8MfmIpJzMSn4KkHZtcujMquWSh0e5ZAufsnk4VYvxbSpr1A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vector-im/compound-design-tokens/-/compound-design-tokens-4.0.4.tgz", + "integrity": "sha512-nn62mF6Js/h75zpHcmDccrT3qtCwxcDm6gWqBZpOoSD0lBcMCinBnpAZnFVpDw2geBBpQ4xtBvnQCJ7KQE7UtQ==", "license": "SEE LICENSE IN README.md", "peerDependencies": { "@types/react": "*", @@ -5800,9 +5796,9 @@ } }, "node_modules/@vector-im/compound-web": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@vector-im/compound-web/-/compound-web-7.12.0.tgz", - "integrity": "sha512-eGsJhouuBJKnh53yOfcakithgFUzaviDR9dWnIs3ULMK97D+XkXe82M/ULg+dFwbTxHKcnIfy3V7H1pcEjFVcQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@vector-im/compound-web/-/compound-web-8.0.0.tgz", + "integrity": "sha512-VAwCGl0KMjN+qEKflnQOB1LidSsxSDiczEWka1IGKj52EzrNOfY0wlfCs73v+H84zUanYKlgOwnQgWU5at9Q/w==", "license": "SEE LICENSE IN README.md", "dependencies": { "@floating-ui/react": "^0.27.0", @@ -5884,15 +5880,14 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.3.tgz", - "integrity": "sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", + "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.3", - "@vitest/utils": "3.2.3", + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -5927,6 +5922,19 @@ } } }, + "node_modules/@vitest/mocker/node_modules/@vitest/spy": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.3.tgz", + "integrity": "sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/mocker/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -5937,10 +5945,20 @@ "@types/estree": "^1.0.0" } }, + "node_modules/@vitest/mocker/node_modules/tinyspy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@vitest/pretty-format": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz", - "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", + "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", "dev": true, "license": "MIT", "dependencies": { @@ -5965,6 +5983,34 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz", + "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@vitest/utils": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.3.tgz", + "integrity": "sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.3", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/snapshot": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.3.tgz", @@ -5980,37 +6026,40 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { + "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.3.tgz", - "integrity": "sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz", + "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy/node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.3.tgz", - "integrity": "sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==", + "node_modules/@vitest/spy": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", + "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.3", + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", + "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.9", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, @@ -6033,13 +6082,13 @@ } }, "node_modules/@whatwg-node/fetch": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.6.tgz", - "integrity": "sha512-6uzhO2aQ757p3bSHcemA8C4pqEXuyBqyGAM7cYpO0c6/igRMV9As9XL0W12h5EPYMclgr7FgjmbVQBoWEdJ/yA==", + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.8.tgz", + "integrity": "sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==", "dev": true, "license": "MIT", "dependencies": { - "@whatwg-node/node-fetch": "^0.7.18", + "@whatwg-node/node-fetch": "^0.7.21", "urlpattern-polyfill": "^10.0.0" }, "engines": { @@ -6047,15 +6096,15 @@ } }, "node_modules/@whatwg-node/node-fetch": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.18.tgz", - "integrity": "sha512-IxKdVWfZYasGiyxBcsROxq6FmDQu3MNNiOYJ/yqLKhe+Qq27IIWsK7ItbjS2M9L5aM5JxjWkIS7JDh7wnsn+CQ==", + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.21.tgz", + "integrity": "sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==", "dev": true, "license": "MIT", "dependencies": { "@fastify/busboy": "^3.1.1", "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.3.1", + "@whatwg-node/promise-helpers": "^1.3.2", "tslib": "^2.6.3" }, "engines": { @@ -6063,9 +6112,9 @@ } }, "node_modules/@whatwg-node/promise-helpers": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.1.tgz", - "integrity": "sha512-D+OwTEunoQhVHVToD80dPhfz9xgPLqJyEA3F5jCRM14A2u8tBBQVdZekqfqx6ZAfZ+POT4Hb0dn601UKMsvADw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", "dev": true, "license": "MIT", "dependencies": { @@ -6091,9 +6140,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -6228,9 +6277,9 @@ "license": "Python-2.0" }, "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -6534,9 +6583,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6643,9 +6692,9 @@ } }, "node_modules/broccoli-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -6706,9 +6755,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -6726,10 +6775,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -6844,9 +6893,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001716", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", - "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", + "version": "1.0.30001722", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001722.tgz", + "integrity": "sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==", "dev": true, "funding": [ { @@ -6968,22 +7017,22 @@ } }, "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", + "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", "dev": true, "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", + "domutils": "^3.2.2", "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", + "undici": "^7.10.0", "whatwg-mimetype": "^4.0.0" }, "engines": { @@ -7012,13 +7061,13 @@ } }, "node_modules/cheerio/node_modules/undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz", + "integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/cheerio/node_modules/whatwg-mimetype": { @@ -7168,13 +7217,6 @@ "node": ">=0.8" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", - "dev": true, - "license": "MIT" - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -7714,9 +7756,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.145", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.145.tgz", - "integrity": "sha512-pZ5EcTWRq/055MvSBgoFEyKf2i4apwfoqJbK/ak2jnFq8oHjZ+vzc3AhRcz37Xn+ZJfL58R666FLJx0YOK9yTw==", + "version": "1.5.166", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz", + "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==", "dev": true, "license": "ISC" }, @@ -7728,9 +7770,9 @@ "license": "MIT" }, "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "dev": true, "license": "MIT", "dependencies": { @@ -7786,9 +7828,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7799,31 +7841,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/esbuild-register": { @@ -8005,19 +8047,19 @@ "license": "MIT" }, "node_modules/fd-package-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", - "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", + "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", "dev": true, "license": "MIT", "dependencies": { - "walk-up-path": "^3.0.1" + "walk-up-path": "^4.0.0" } }, "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8117,13 +8159,13 @@ } }, "node_modules/formatly": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.2.3.tgz", - "integrity": "sha512-WH01vbXEjh9L3bqn5V620xUAWs32CmK4IzWRRY6ep5zpa/mrisL4d9+pRVuETORVDTQw8OycSO1WC68PL51RaA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.2.4.tgz", + "integrity": "sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==", "dev": true, "license": "MIT", "dependencies": { - "fd-package-json": "^1.2.0" + "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" @@ -8316,9 +8358,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8363,9 +8405,9 @@ } }, "node_modules/glob-stream": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", - "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.3.tgz", + "integrity": "sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==", "dev": true, "license": "MIT", "dependencies": { @@ -8526,9 +8568,9 @@ } }, "node_modules/graphql-ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.4.tgz", - "integrity": "sha512-8b4OZtNOvv8+NZva8HXamrc0y1jluYC0+13gdh7198FKjVzXyTvVc95DCwGzaKEfn3YuWZxUqjJlHe3qKM/F2g==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.5.tgz", + "integrity": "sha512-HzYw057ch0hx2gZjkbgk1pur4kAtgljlWRP+Gccudqm3BRrTpExjWCQ9OHdIsq47Y6lHL++1lTvuQHhgRRcevw==", "dev": true, "license": "MIT", "engines": { @@ -8536,6 +8578,7 @@ }, "peerDependencies": { "@fastify/websocket": "^10 || ^11", + "crossws": "~0.3", "graphql": "^15.10.1 || ^16", "uWebSockets.js": "^20", "ws": "^8" @@ -8544,6 +8587,9 @@ "@fastify/websocket": { "optional": true }, + "crossws": { + "optional": true + }, "uWebSockets.js": { "optional": true }, @@ -8563,19 +8609,37 @@ } }, "node_modules/happy-dom": { - "version": "17.6.3", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-17.6.3.tgz", - "integrity": "sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-18.0.1.tgz", + "integrity": "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==", "dev": true, "license": "MIT", "dependencies": { - "webidl-conversions": "^7.0.0", + "@types/node": "^20.0.0", + "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" }, "engines": { "node": ">=20.0.0" } }, + "node_modules/happy-dom/node_modules/@types/node": { + "version": "20.19.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz", + "integrity": "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/happy-dom/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8679,9 +8743,9 @@ } }, "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -8694,8 +8758,21 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-proxy-agent": { @@ -8758,9 +8835,9 @@ } }, "node_modules/i18next-browser-languagedetector": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.5.tgz", - "integrity": "sha512-OstebRKqKiQw8xEvQF5aRyUujsCatanj7Q9eo5iiH2gJpoXGZ7483ol3sVBwfqbobTQPNH1J+NAyJ1aCQoEC+w==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", + "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", "dev": true, "license": "MIT", "peer": true, @@ -9451,9 +9528,9 @@ } }, "node_modules/knip": { - "version": "5.59.1", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.59.1.tgz", - "integrity": "sha512-pOMBw6sLQhi/RfnpI6TwBY6NrAtKXDO5wkmMm+pCsSK5eWbVfDnDtPXbLDGNCoZPXiuAojb27y4XOpp4JPNxlA==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.61.0.tgz", + "integrity": "sha512-g4zwSPUoSCWXWTHshNgtsiuM90jnLpZyBZ6J7BQaydfoOjclgh4NfrD7BL+TjChgDbeYg5bEQcERKK/vdJlpmA==", "dev": true, "funding": [ { @@ -9473,15 +9550,15 @@ "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", - "formatly": "^0.2.3", + "formatly": "^0.2.4", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "minimist": "^1.2.8", - "oxc-resolver": "^9.0.2", - "picocolors": "^1.1.0", + "oxc-resolver": "^11.1.0", + "picocolors": "^1.1.1", "picomatch": "^4.0.1", - "smol-toml": "^1.3.1", - "strip-json-comments": "5.0.1", + "smol-toml": "^1.3.4", + "strip-json-comments": "5.0.2", "zod": "^3.22.4", "zod-validation-error": "^3.0.3" }, @@ -9791,9 +9868,9 @@ } }, "node_modules/matcher-collection/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -9838,9 +9915,9 @@ } }, "node_modules/meros": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.0.tgz", - "integrity": "sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.1.tgz", + "integrity": "sha512-eV7dRObfTrckdmAz4/n7pT1njIsIJXRIZkgCiX43xEsPNy4gjXQzOYYxmGcolAMtF7HyfqRuDBh3Lgs4hmhVEw==", "dev": true, "license": "MIT", "engines": { @@ -9956,9 +10033,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.8.7.tgz", - "integrity": "sha512-0TGfV4oQiKpa3pDsQBDf0xvFP+sRrqEOnh2n1JWpHVKHJHLv6ZmY1HCZpCi7uDiJTeIHJMBpmBiRmBJN+ETPSQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.2.tgz", + "integrity": "sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9967,7 +10044,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.38.7", + "@mswjs/interceptors": "^0.39.1", "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", @@ -10014,9 +10091,9 @@ } }, "node_modules/msw/node_modules/type-fest": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", - "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -10290,28 +10367,28 @@ "license": "MIT" }, "node_modules/oxc-resolver": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-9.0.2.tgz", - "integrity": "sha512-w838ygc1p7rF+7+h5vR9A+Y9Fc4imy6C3xPthCMkdFUgFvUWkmABeNB8RBDQ6+afk44Q60/UMMQ+gfDUW99fBA==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.2.0.tgz", + "integrity": "sha512-3iJYyIdDZMDoj0ZSVBrI1gUvPBMkDC4gxonBG+7uqUyK5EslG0mCwnf6qhxK8oEU7jLHjbRBNyzflPSd3uvH7Q==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-resolver/binding-darwin-arm64": "9.0.2", - "@oxc-resolver/binding-darwin-x64": "9.0.2", - "@oxc-resolver/binding-freebsd-x64": "9.0.2", - "@oxc-resolver/binding-linux-arm-gnueabihf": "9.0.2", - "@oxc-resolver/binding-linux-arm64-gnu": "9.0.2", - "@oxc-resolver/binding-linux-arm64-musl": "9.0.2", - "@oxc-resolver/binding-linux-riscv64-gnu": "9.0.2", - "@oxc-resolver/binding-linux-s390x-gnu": "9.0.2", - "@oxc-resolver/binding-linux-x64-gnu": "9.0.2", - "@oxc-resolver/binding-linux-x64-musl": "9.0.2", - "@oxc-resolver/binding-wasm32-wasi": "9.0.2", - "@oxc-resolver/binding-win32-arm64-msvc": "9.0.2", - "@oxc-resolver/binding-win32-x64-msvc": "9.0.2" + "@oxc-resolver/binding-darwin-arm64": "11.2.0", + "@oxc-resolver/binding-darwin-x64": "11.2.0", + "@oxc-resolver/binding-freebsd-x64": "11.2.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "11.2.0", + "@oxc-resolver/binding-linux-arm64-gnu": "11.2.0", + "@oxc-resolver/binding-linux-arm64-musl": "11.2.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "11.2.0", + "@oxc-resolver/binding-linux-s390x-gnu": "11.2.0", + "@oxc-resolver/binding-linux-x64-gnu": "11.2.0", + "@oxc-resolver/binding-linux-x64-musl": "11.2.0", + "@oxc-resolver/binding-wasm32-wasi": "11.2.0", + "@oxc-resolver/binding-win32-arm64-msvc": "11.2.0", + "@oxc-resolver/binding-win32-x64-msvc": "11.2.0" } }, "node_modules/p-limit": { @@ -10478,9 +10555,9 @@ } }, "node_modules/parse5/node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -10678,9 +10755,9 @@ } }, "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz", + "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", "dev": true, "funding": [ { @@ -10821,9 +10898,9 @@ } }, "node_modules/postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "dev": true, "funding": [ { @@ -10837,7 +10914,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, @@ -11006,9 +11083,9 @@ } }, "node_modules/quick-temp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -11097,9 +11174,9 @@ } }, "node_modules/react-docgen-typescript": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", + "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -11163,9 +11240,9 @@ } }, "node_modules/react-remove-scroll": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", - "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.7", @@ -11299,6 +11376,16 @@ "node": ">= 4" } }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -11509,6 +11596,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-3.0.1.tgz", + "integrity": "sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-4.0.1.tgz", + "integrity": "sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^3.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/rimraf/node_modules/glob": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", @@ -11534,9 +11644,9 @@ } }, "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -11560,13 +11670,13 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.2.tgz", + "integrity": "sha512-+9TJCIYXgZ2Dm5LxVCFsa8jOm+evMwXHFI0JM1XROmkfkpz8/iLLDh+TwSmyIBrs6C6Xu9294/fq8cBA+P6AqA==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^4.0.1" }, "engines": { "node": "20 || >=22" @@ -11593,9 +11703,9 @@ } }, "node_modules/rollup": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", - "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz", + "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==", "dev": true, "license": "MIT", "dependencies": { @@ -11609,29 +11719,36 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.1", - "@rollup/rollup-android-arm64": "4.40.1", - "@rollup/rollup-darwin-arm64": "4.40.1", - "@rollup/rollup-darwin-x64": "4.40.1", - "@rollup/rollup-freebsd-arm64": "4.40.1", - "@rollup/rollup-freebsd-x64": "4.40.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", - "@rollup/rollup-linux-arm-musleabihf": "4.40.1", - "@rollup/rollup-linux-arm64-gnu": "4.40.1", - "@rollup/rollup-linux-arm64-musl": "4.40.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-musl": "4.40.1", - "@rollup/rollup-linux-s390x-gnu": "4.40.1", - "@rollup/rollup-linux-x64-gnu": "4.40.1", - "@rollup/rollup-linux-x64-musl": "4.40.1", - "@rollup/rollup-win32-arm64-msvc": "4.40.1", - "@rollup/rollup-win32-ia32-msvc": "4.40.1", - "@rollup/rollup-win32-x64-msvc": "4.40.1", + "@rollup/rollup-android-arm-eabi": "4.43.0", + "@rollup/rollup-android-arm64": "4.43.0", + "@rollup/rollup-darwin-arm64": "4.43.0", + "@rollup/rollup-darwin-x64": "4.43.0", + "@rollup/rollup-freebsd-arm64": "4.43.0", + "@rollup/rollup-freebsd-x64": "4.43.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", + "@rollup/rollup-linux-arm-musleabihf": "4.43.0", + "@rollup/rollup-linux-arm64-gnu": "4.43.0", + "@rollup/rollup-linux-arm64-musl": "4.43.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-musl": "4.43.0", + "@rollup/rollup-linux-s390x-gnu": "4.43.0", + "@rollup/rollup-linux-x64-gnu": "4.43.0", + "@rollup/rollup-linux-x64-musl": "4.43.0", + "@rollup/rollup-win32-arm64-msvc": "4.43.0", + "@rollup/rollup-win32-ia32-msvc": "4.43.0", + "@rollup/rollup-win32-x64-msvc": "4.43.0", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -11728,9 +11845,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -11758,6 +11875,7 @@ "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -11768,6 +11886,7 @@ "integrity": "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -11813,9 +11932,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -11907,6 +12026,7 @@ "integrity": "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -11930,13 +12050,13 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/source-map-js": { @@ -11974,9 +12094,9 @@ "license": "MIT" }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", "engines": { @@ -12039,9 +12159,9 @@ } }, "node_modules/storybook-react-i18next": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/storybook-react-i18next/-/storybook-react-i18next-4.0.4.tgz", - "integrity": "sha512-eDHqX2hSuJJyDmBWulDgE/z6aL2XiiWZsJZeIm20w4JpgHwqQBy/Q4qqTpuiCCfUu+eQt4O/zvKRIX4yI4SD4A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/storybook-react-i18next/-/storybook-react-i18next-4.0.7.tgz", + "integrity": "sha512-rYmV1UObKoWe8vqo8JCLFfHLGn7dIf5HE+NCBTmRpFcfRrLbSRCCkM0dPCT2T8m11RM562ceVT6Pa6B2Zw1UIw==", "dev": true, "license": "MIT", "dependencies": { @@ -12051,67 +12171,11 @@ "i18next": "^22.0.0 || ^23.0.0 || ^24.0.0 || ^25.0.0", "i18next-browser-languagedetector": "^7.0.0 || ^8.0.0", "i18next-http-backend": "^2.0.0 || ^3.0.0", + "react": ">=16.8.0", "react-i18next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "storybook": "^9.0.0" } }, - "node_modules/storybook/node_modules/@vitest/expect": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", - "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/storybook/node_modules/@vitest/pretty-format": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", - "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/storybook/node_modules/@vitest/spy": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", - "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/storybook/node_modules/@vitest/utils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", - "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.9", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/stream-composer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", @@ -12123,9 +12187,9 @@ } }, "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", "dev": true, "license": "MIT", "dependencies": { @@ -12245,9 +12309,9 @@ } }, "node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.2.tgz", + "integrity": "sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==", "dev": true, "license": "MIT", "engines": { @@ -12337,9 +12401,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.22.0.tgz", - "integrity": "sha512-8YlCSxiyb8uPFa7qoB1lRHYr1PBbT1NuV9RvQdFFPFPudRBTPf9coU5jl02KhzvrtmTEw4jXRgb0kg8pJvVuWQ==", + "version": "5.24.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.24.1.tgz", + "integrity": "sha512-ITeWc7CCAfK53u8jnV39UNqStQZjSt+bVYtJHsOEL3vVj/WV9/8HmsF8Ej4oD8r+Xk1HpWyeW/t59r1QNeAcUQ==", "license": "Apache-2.0", "dependencies": { "@scarf/scarf": "=1.4.0" @@ -12815,9 +12879,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.19.4", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", - "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.2.tgz", + "integrity": "sha512-He0ZWr41gLa4vD30Au3yuwpe0HXaCZbclvl8RBieUiJ9aFnPMWUPIyvw3RU8+1Crjfcrauvitae2a4tUzRAGsw==", "dev": true, "license": "MIT", "dependencies": { @@ -13072,9 +13136,9 @@ } }, "node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", "dev": true, "license": "MIT" }, @@ -13175,14 +13239,13 @@ } }, "node_modules/vinyl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", - "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", "dev": true, "license": "MIT", "dependencies": { "clone": "^2.1.2", - "clone-stats": "^1.0.0", "remove-trailing-separator": "^1.1.0", "replace-ext": "^2.0.0", "teex": "^1.0.1" @@ -13243,14 +13306,14 @@ } }, "node_modules/vinyl-fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", - "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.2.tgz", + "integrity": "sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA==", "dev": true, "license": "MIT", "dependencies": { "fs-mkdirp-stream": "^2.0.1", - "glob-stream": "^8.0.0", + "glob-stream": "^8.0.3", "graceful-fs": "^4.2.11", "iconv-lite": "^0.6.3", "is-valid-glob": "^1.0.0", @@ -13261,7 +13324,7 @@ "streamx": "^2.14.0", "to-through": "^3.0.0", "value-or-function": "^4.0.0", - "vinyl": "^3.0.0", + "vinyl": "^3.0.1", "vinyl-sourcemap": "^2.0.0" }, "engines": { @@ -13506,6 +13569,74 @@ } } }, + "node_modules/vitest/node_modules/@vitest/expect": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.3.tgz", + "integrity": "sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.3", + "@vitest/utils": "3.2.3", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/pretty-format": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz", + "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/spy": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.3.tgz", + "integrity": "sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/@vitest/utils": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.3.tgz", + "integrity": "sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.3", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest/node_modules/tinyspy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -13532,9 +13663,9 @@ } }, "node_modules/walk-sync/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -13556,11 +13687,14 @@ } }, "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/wcwidth": { "version": "1.0.1", @@ -13583,14 +13717,11 @@ } }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } + "license": "BSD-2-Clause" }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", @@ -13633,13 +13764,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -13722,9 +13846,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "license": "MIT", "engines": { @@ -13771,16 +13895,16 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yaml-ast-parser": { @@ -13846,9 +13970,9 @@ } }, "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "version": "3.25.63", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.63.tgz", + "integrity": "sha512-3ttCkqhtpncYXfP0f6dsyabbYV/nEUW+Xlu89jiXbTBifUfjaSqXOG6JnQPLtqt87n7KAmnMqcjay6c0Wq0Vbw==", "dev": true, "license": "MIT", "funding": { @@ -13856,16 +13980,16 @@ } }, "node_modules/zod-validation-error": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.4.0.tgz", - "integrity": "sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.5.0.tgz", + "integrity": "sha512-IWK6O51sRkq0YsnYD2oLDuK2BNsIjYUlR0+1YSd4JyBzm6/892IWroUnLc7oW4FU+b0f6948BHi6H8MDcqpOGw==", "dev": true, "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "zod": "^3.18.0" + "zod": "^3.25.0" } } } diff --git a/frontend/package.json b/frontend/package.json index 0db963fb2..e23e24218 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,12 +20,12 @@ "dependencies": { "@fontsource/inconsolata": "^5.2.6", "@fontsource/inter": "^5.2.6", - "@radix-ui/react-collapsible": "^1.1.8", - "@radix-ui/react-dialog": "^1.1.11", - "@tanstack/react-query": "^5.80.6", - "@tanstack/react-router": "^1.121.0", - "@vector-im/compound-design-tokens": "4.0.2", - "@vector-im/compound-web": "^7.12.0", + "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-dialog": "^1.1.14", + "@tanstack/react-query": "^5.80.7", + "@tanstack/react-router": "^1.121.2", + "@vector-im/compound-design-tokens": "4.0.4", + "@vector-im/compound-web": "^8.0.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "classnames": "^2.5.1", @@ -34,7 +34,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "react-i18next": "^15.5.2", - "swagger-ui-dist": "^5.22.0", + "swagger-ui-dist": "^5.24.1", "valibot": "^1.1.0", "vaul": "^1.1.2" }, @@ -45,18 +45,18 @@ "@browser-logos/safari": "^2.1.0", "@codecov/vite-plugin": "^1.9.1", "@graphql-codegen/cli": "^5.0.7", - "@graphql-codegen/client-preset": "^4.8.0", + "@graphql-codegen/client-preset": "^4.8.2", "@graphql-codegen/typescript-msw": "^3.0.1", "@storybook/addon-docs": "^9.0.8", "@storybook/react-vite": "^9.0.8", - "@tanstack/react-query-devtools": "^5.80.6", - "@tanstack/react-router-devtools": "^1.121.0", - "@tanstack/router-plugin": "^1.121.0", + "@tanstack/react-query-devtools": "^5.80.7", + "@tanstack/react-router-devtools": "^1.121.5", + "@tanstack/router-plugin": "^1.121.4", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^24.0.0", - "@types/react": "19.1.7", + "@types/node": "^24.0.1", + "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "@types/swagger-ui-dist": "^3.30.5", "@vitejs/plugin-react": "^4.5.2", @@ -64,24 +64,24 @@ "autoprefixer": "^10.4.21", "browserslist-to-esbuild": "^2.1.1", "graphql": "^16.11.0", - "happy-dom": "^17.6.3", + "happy-dom": "^18.0.1", "i18next-parser": "^9.3.0", - "knip": "^5.59.1", - "msw": "^2.8.7", + "knip": "^5.61.0", + "msw": "^2.10.2", "msw-storybook-addon": "^2.0.5", - "postcss": "^8.5.4", + "postcss": "^8.5.5", "postcss-import": "^16.1.0", - "postcss-nesting": "^13.0.1", + "postcss-nesting": "^13.0.2", "rimraf": "^6.0.1", "storybook": "^9.0.1", - "storybook-react-i18next": "^4.0.4", + "storybook-react-i18next": "4.0.7", "tailwindcss": "^3.4.17", "typescript": "^5.8.3", "vite": "6.3.5", "vite-plugin-compression": "^0.5.1", "vite-plugin-graphql-codegen": "^3.6.1", "vite-plugin-manifest-sri": "^0.2.0", - "vitest": "^3.1.2" + "vitest": "^3.2.3" }, "msw": { "workerDirectory": [ diff --git a/frontend/src/components/SessionDetail/__snapshots__/CompatSessionDetail.test.tsx.snap b/frontend/src/components/SessionDetail/__snapshots__/CompatSessionDetail.test.tsx.snap index 8563e1abf..d07848769 100644 --- a/frontend/src/components/SessionDetail/__snapshots__/CompatSessionDetail.test.tsx.snap +++ b/frontend/src/components/SessionDetail/__snapshots__/CompatSessionDetail.test.tsx.snap @@ -33,7 +33,8 @@ exports[` > renders a compatability session details 1`] = ` aria-expanded="false" aria-haspopup="dialog" aria-labelledby="«r3»" - class="_icon-button_m2erp_8" + class="_icon-button_1pz9o_8" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: var(--cpd-space-6x);" @@ -329,7 +330,8 @@ exports[` > renders a compatability session without an ssoL aria-expanded="false" aria-haspopup="dialog" aria-labelledby="«rf»" - class="_icon-button_m2erp_8" + class="_icon-button_1pz9o_8" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: var(--cpd-space-6x);" @@ -611,7 +613,8 @@ exports[` > renders a finished compatability session detail aria-expanded="false" aria-haspopup="dialog" aria-labelledby="«rr»" - class="_icon-button_m2erp_8" + class="_icon-button_1pz9o_8" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: var(--cpd-space-6x);" diff --git a/frontend/src/components/SessionDetail/__snapshots__/OAuth2SessionDetail.test.tsx.snap b/frontend/src/components/SessionDetail/__snapshots__/OAuth2SessionDetail.test.tsx.snap index c64271293..5cfc1424e 100644 --- a/frontend/src/components/SessionDetail/__snapshots__/OAuth2SessionDetail.test.tsx.snap +++ b/frontend/src/components/SessionDetail/__snapshots__/OAuth2SessionDetail.test.tsx.snap @@ -33,7 +33,8 @@ exports[` > renders a finished session details 1`] = ` aria-expanded="false" aria-haspopup="dialog" aria-labelledby="«rf»" - class="_icon-button_m2erp_8" + class="_icon-button_1pz9o_8" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: var(--cpd-space-6x);" @@ -343,7 +344,8 @@ exports[` > renders session details 1`] = ` aria-expanded="false" aria-haspopup="dialog" aria-labelledby="«r3»" - class="_icon-button_m2erp_8" + class="_icon-button_1pz9o_8" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: var(--cpd-space-6x);" diff --git a/frontend/tests/routes/account/__snapshots__/index.test.tsx.snap b/frontend/tests/routes/account/__snapshots__/index.test.tsx.snap index 781350fcb..2fd8ac416 100644 --- a/frontend/tests/routes/account/__snapshots__/index.test.tsx.snap +++ b/frontend/tests/routes/account/__snapshots__/index.test.tsx.snap @@ -340,7 +340,8 @@ exports[`Account home page > renders the page 1`] = ` aria-expanded="false" aria-haspopup="dialog" aria-labelledby="«r3»" - class="_icon-button_m2erp_8 _editButton_0d9d49" + class="_icon-button_1pz9o_8 _editButton_0d9d49" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: var(--cpd-space-6x);" @@ -423,7 +424,8 @@ exports[`Account home page > renders the page 1`] = ` aria-controls="radix-«ra»" aria-expanded="true" aria-labelledby="«rb»" - class="_icon-button_m2erp_8 _triggerIcon_a44bb3" + class="_icon-button_1pz9o_8 _triggerIcon_a44bb3" + data-kind="primary" data-state="open" role="button" style="--cpd-icon-button-size: 32px;" @@ -543,7 +545,8 @@ exports[`Account home page > renders the page 1`] = ` aria-controls="radix-«rr»" aria-expanded="true" aria-labelledby="«rs»" - class="_icon-button_m2erp_8 _triggerIcon_a44bb3" + class="_icon-button_1pz9o_8 _triggerIcon_a44bb3" + data-kind="primary" data-state="open" role="button" style="--cpd-icon-button-size: 32px;" @@ -638,7 +641,8 @@ exports[`Account home page > renders the page 1`] = ` aria-controls="radix-«r15»" aria-expanded="false" aria-labelledby="«r16»" - class="_icon-button_m2erp_8 _triggerIcon_a44bb3" + class="_icon-button_1pz9o_8 _triggerIcon_a44bb3" + data-kind="primary" data-state="closed" role="button" style="--cpd-icon-button-size: 32px;" From 18f08fdce0420ee45d3288680bc45c2f7bbd5019 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Jun 2025 10:03:41 +0000 Subject: [PATCH 30/31] build(deps): bump react-i18next in /frontend in the i18next group Bumps the i18next group in /frontend with 1 update: [react-i18next](https://github.com/i18next/react-i18next). Updates `react-i18next` from 15.5.2 to 15.5.3 - [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/react-i18next/compare/v15.5.2...v15.5.3) --- updated-dependencies: - dependency-name: react-i18next dependency-version: 15.5.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: i18next ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 10 +++++----- frontend/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 47a9466b6..bc6d3932e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,7 +23,7 @@ "i18next": "^25.2.1", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-i18next": "^15.5.2", + "react-i18next": "^15.5.3", "swagger-ui-dist": "^5.24.1", "valibot": "^1.1.0", "vaul": "^1.1.2" @@ -11196,12 +11196,12 @@ } }, "node_modules/react-i18next": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.2.tgz", - "integrity": "sha512-ePODyXgmZQAOYTbZXQn5rRsSBu3Gszo69jxW6aKmlSgxKAI1fOhDwSu6bT4EKHciWPKQ7v7lPrjeiadR6Gi+1A==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.3.tgz", + "integrity": "sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.0", + "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { diff --git a/frontend/package.json b/frontend/package.json index e23e24218..3ae9fe909 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -33,7 +33,7 @@ "i18next": "^25.2.1", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-i18next": "^15.5.2", + "react-i18next": "^15.5.3", "swagger-ui-dist": "^5.24.1", "valibot": "^1.1.0", "vaul": "^1.1.2" From d8e75db7a872cb63d986a3b2119add561a09b309 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Jun 2025 10:04:10 +0000 Subject: [PATCH 31/31] build(deps-dev): bump the tanstack-router group Bumps the tanstack-router group in /frontend with 2 updates: [@tanstack/react-router-devtools](https://github.com/TanStack/router/tree/HEAD/packages/react-router-devtools) and [@tanstack/router-plugin](https://github.com/TanStack/router/tree/HEAD/packages/router-plugin). Updates `@tanstack/react-router-devtools` from 1.121.5 to 1.121.8 - [Release notes](https://github.com/TanStack/router/releases) - [Commits](https://github.com/TanStack/router/commits/v1.121.8/packages/react-router-devtools) Updates `@tanstack/router-plugin` from 1.121.4 to 1.121.7 - [Release notes](https://github.com/TanStack/router/releases) - [Commits](https://github.com/TanStack/router/commits/v1.121.7/packages/router-plugin) --- updated-dependencies: - dependency-name: "@tanstack/react-router-devtools" dependency-version: 1.121.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: tanstack-router - dependency-name: "@tanstack/router-plugin" dependency-version: 1.121.7 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: tanstack-router ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 38 ++++++++++++++++++-------------------- frontend/package.json | 4 ++-- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 47a9466b6..ce148b5e7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -40,8 +40,8 @@ "@storybook/addon-docs": "^9.0.8", "@storybook/react-vite": "^9.0.8", "@tanstack/react-query-devtools": "^5.80.7", - "@tanstack/react-router-devtools": "^1.121.5", - "@tanstack/router-plugin": "^1.121.4", + "@tanstack/react-router-devtools": "^1.121.8", + "@tanstack/router-plugin": "^1.121.7", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", @@ -5242,13 +5242,13 @@ } }, "node_modules/@tanstack/react-router-devtools": { - "version": "1.121.5", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.121.5.tgz", - "integrity": "sha512-HQ/zQhywPHpsjpGZnmgUkEvxll3cUZItFUVPqOHXuorgEBfzjK8/jTH2WZpLHt6HyxJq3M8yRUvStoDd2VIxCA==", + "version": "1.121.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.121.8.tgz", + "integrity": "sha512-QwFG4kWTNV0jSjJDvMs5LfK7X+GPQz9NZhSDStZMkC6xu+s+n+Wk/Szv/FDZ/wqjcJ3/k0rh4C5DEfZvMtSdOg==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/router-devtools-core": "^1.121.2" + "@tanstack/router-devtools-core": "^1.121.8" }, "engines": { "node": ">=12" @@ -5300,14 +5300,15 @@ } }, "node_modules/@tanstack/router-devtools-core": { - "version": "1.121.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.121.2.tgz", - "integrity": "sha512-LRuz0MyEw7swouwtbYT3MfaRVXOtUNAE8Vxuy9ETH6dnvXX+wm8kHqcHZX3AlDrL6fHi86aDKEXFJg+MyWZzcg==", + "version": "1.121.8", + "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.121.8.tgz", + "integrity": "sha512-5SSNbGCeiq8ub8Hq+kdE1Ah7tp0/h5DrxnTq4TnAPA7TSxCB3ueUUvjYrPMfVgcEQHxgHbwYFuwegfmuD/t0Eg==", "dev": true, "license": "MIT", "dependencies": { "clsx": "^2.1.1", - "goober": "^2.1.16" + "goober": "^2.1.16", + "solid-js": "^1.9.5" }, "engines": { "node": ">=12" @@ -5329,9 +5330,9 @@ } }, "node_modules/@tanstack/router-generator": { - "version": "1.121.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.121.2.tgz", - "integrity": "sha512-3KIQwY6INW2y2SmBWs+xoGyt6GM8Q96QDJW9sbtLdiTbddvVGyphVAs3Vai2HoTNsUdkw0Fnd2QfgPUwY4PSQQ==", + "version": "1.121.7", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.121.7.tgz", + "integrity": "sha512-j8k3P9YIeN+9rLxYvPGs/DcRnyh5LSh+plRWO6KgQcPikmcLBGUCK5LKJQolpxMj+t68RQIXE3CFDgqyVtN/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -5353,9 +5354,9 @@ } }, "node_modules/@tanstack/router-plugin": { - "version": "1.121.4", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.121.4.tgz", - "integrity": "sha512-HWqpfX1rqs+A1Q2ucN64X3JAb34MdVknfEbY5W0L5+LyPHlCw9HJwPXY+i8gXD+YFTizTysCY/Go26OxpebMZA==", + "version": "1.121.7", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.121.7.tgz", + "integrity": "sha512-p33tkGIYUbvcFwUeJrK5brqz8BtxwSZxBIDYPawhK3XvcFe5IyrRVRGKxxtIeyx9Hp1bmMfgpK/BSqnox6OQ3w==", "dev": true, "license": "MIT", "dependencies": { @@ -5366,7 +5367,7 @@ "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.121.2", - "@tanstack/router-generator": "^1.121.2", + "@tanstack/router-generator": "^1.121.7", "@tanstack/router-utils": "^1.121.0", "@tanstack/virtual-file-routes": "^1.120.17", "babel-dead-code-elimination": "^1.0.10", @@ -11875,7 +11876,6 @@ "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -11886,7 +11886,6 @@ "integrity": "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -12026,7 +12025,6 @@ "integrity": "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", diff --git a/frontend/package.json b/frontend/package.json index e23e24218..b0be03fa5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -50,8 +50,8 @@ "@storybook/addon-docs": "^9.0.8", "@storybook/react-vite": "^9.0.8", "@tanstack/react-query-devtools": "^5.80.7", - "@tanstack/react-router-devtools": "^1.121.5", - "@tanstack/router-plugin": "^1.121.4", + "@tanstack/react-router-devtools": "^1.121.8", + "@tanstack/router-plugin": "^1.121.7", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1",
  • 4ssHC`h?XOxs_NEKJ7l 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