Loading...
diff --git a/.sqlx/query-de72338f80b4f7b5bc7c9fc44100b6eb9e75f442b5b37a5a1cd761cd3b6950d9.json b/.sqlx/query-0fe621daeeb56e4be363ce96df73278467cba319b1fbe312d9220253610c4fcd.json
similarity index 71%
rename from .sqlx/query-de72338f80b4f7b5bc7c9fc44100b6eb9e75f442b5b37a5a1cd761cd3b6950d9.json
rename to .sqlx/query-0fe621daeeb56e4be363ce96df73278467cba319b1fbe312d9220253610c4fcd.json
index 64edd35..f511c6b 100644
--- a/.sqlx/query-de72338f80b4f7b5bc7c9fc44100b6eb9e75f442b5b37a5a1cd761cd3b6950d9.json
+++ b/.sqlx/query-0fe621daeeb56e4be363ce96df73278467cba319b1fbe312d9220253610c4fcd.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "SELECT\n handle, email, email_verified, is_admin,\n preferred_comms_channel as \"preferred_channel: crate::comms::CommsChannel\",\n discord_verified, telegram_verified, signal_verified\n FROM users WHERE did = $1",
+ "query": "SELECT\n handle, email, email_verified, is_admin, deactivated_at, preferred_locale,\n preferred_comms_channel as \"preferred_channel: crate::comms::CommsChannel\",\n discord_verified, telegram_verified, signal_verified\n FROM users WHERE did = $1",
"describe": {
"columns": [
{
@@ -25,6 +25,16 @@
},
{
"ordinal": 4,
+ "name": "deactivated_at",
+ "type_info": "Timestamptz"
+ },
+ {
+ "ordinal": 5,
+ "name": "preferred_locale",
+ "type_info": "Varchar"
+ },
+ {
+ "ordinal": 6,
"name": "preferred_channel: crate::comms::CommsChannel",
"type_info": {
"Custom": {
@@ -41,17 +51,17 @@
}
},
{
- "ordinal": 5,
+ "ordinal": 7,
"name": "discord_verified",
"type_info": "Bool"
},
{
- "ordinal": 6,
+ "ordinal": 8,
"name": "telegram_verified",
"type_info": "Bool"
},
{
- "ordinal": 7,
+ "ordinal": 9,
"name": "signal_verified",
"type_info": "Bool"
}
@@ -66,11 +76,13 @@
true,
false,
false,
+ true,
+ true,
false,
false,
false,
false
]
},
- "hash": "de72338f80b4f7b5bc7c9fc44100b6eb9e75f442b5b37a5a1cd761cd3b6950d9"
+ "hash": "0fe621daeeb56e4be363ce96df73278467cba319b1fbe312d9220253610c4fcd"
}
diff --git a/.sqlx/query-50fef1f4f739c42622f2d23c8057861fea2e0e757c40b4d43bafa1beb156c2f1.json b/.sqlx/query-50fef1f4f739c42622f2d23c8057861fea2e0e757c40b4d43bafa1beb156c2f1.json
new file mode 100644
index 0000000..0924497
--- /dev/null
+++ b/.sqlx/query-50fef1f4f739c42622f2d23c8057861fea2e0e757c40b4d43bafa1beb156c2f1.json
@@ -0,0 +1,23 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET preferred_locale = $1 WHERE did = $2 RETURNING did",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "did",
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Varchar",
+ "Text"
+ ]
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "50fef1f4f739c42622f2d23c8057861fea2e0e757c40b4d43bafa1beb156c2f1"
+}
diff --git a/.sqlx/query-17da8b6f6b46eae067bd8842a369a406699888f689122d2bae8bef13b532bcd2.json b/.sqlx/query-7fea217210a7a97f02d981692ba1cdda4f8037c7feba39610e3dd4d4d2f7ee8c.json
similarity index 80%
rename from .sqlx/query-17da8b6f6b46eae067bd8842a369a406699888f689122d2bae8bef13b532bcd2.json
rename to .sqlx/query-7fea217210a7a97f02d981692ba1cdda4f8037c7feba39610e3dd4d4d2f7ee8c.json
index 25d150d..28de5f1 100644
--- a/.sqlx/query-17da8b6f6b46eae067bd8842a369a406699888f689122d2bae8bef13b532bcd2.json
+++ b/.sqlx/query-7fea217210a7a97f02d981692ba1cdda4f8037c7feba39610e3dd4d4d2f7ee8c.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "SELECT\n handle, email, email_verified, is_admin, deactivated_at,\n preferred_comms_channel as \"preferred_channel: crate::comms::CommsChannel\",\n discord_verified, telegram_verified, signal_verified\n FROM users WHERE did = $1",
+ "query": "SELECT\n handle, email, email_verified, is_admin, preferred_locale,\n preferred_comms_channel as \"preferred_channel: crate::comms::CommsChannel\",\n discord_verified, telegram_verified, signal_verified\n FROM users WHERE did = $1",
"describe": {
"columns": [
{
@@ -25,8 +25,8 @@
},
{
"ordinal": 4,
- "name": "deactivated_at",
- "type_info": "Timestamptz"
+ "name": "preferred_locale",
+ "type_info": "Varchar"
},
{
"ordinal": 5,
@@ -78,5 +78,5 @@
false
]
},
- "hash": "17da8b6f6b46eae067bd8842a369a406699888f689122d2bae8bef13b532bcd2"
+ "hash": "7fea217210a7a97f02d981692ba1cdda4f8037c7feba39610e3dd4d4d2f7ee8c"
}
diff --git a/.sqlx/query-8c69c5f98e3ee59b50346094ff39eed73bb602f0b5ab48c11e53c82839a66721.json b/.sqlx/query-b554241c510dae200a0de3050da30d1236b5f8c876de016eb358bdcfc383671d.json
similarity index 74%
rename from .sqlx/query-8c69c5f98e3ee59b50346094ff39eed73bb602f0b5ab48c11e53c82839a66721.json
rename to .sqlx/query-b554241c510dae200a0de3050da30d1236b5f8c876de016eb358bdcfc383671d.json
index 4dfc823..19219c2 100644
--- a/.sqlx/query-8c69c5f98e3ee59b50346094ff39eed73bb602f0b5ab48c11e53c82839a66721.json
+++ b/.sqlx/query-b554241c510dae200a0de3050da30d1236b5f8c876de016eb358bdcfc383671d.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n email,\n handle,\n preferred_comms_channel as \"channel: CommsChannel\"\n FROM users\n WHERE id = $1\n ",
+ "query": "\n SELECT\n email,\n handle,\n preferred_comms_channel as \"channel: CommsChannel\",\n preferred_locale\n FROM users\n WHERE id = $1\n ",
"describe": {
"columns": [
{
@@ -29,6 +29,11 @@
}
}
}
+ },
+ {
+ "ordinal": 3,
+ "name": "preferred_locale",
+ "type_info": "Varchar"
}
],
"parameters": {
@@ -39,8 +44,9 @@
"nullable": [
true,
false,
- false
+ false,
+ true
]
},
- "hash": "8c69c5f98e3ee59b50346094ff39eed73bb602f0b5ab48c11e53c82839a66721"
+ "hash": "b554241c510dae200a0de3050da30d1236b5f8c876de016eb358bdcfc383671d"
}
diff --git a/README.md b/README.md
index 347cd98..413aa0b 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ Another excellent PDS is [Cocoon](https://github.com/haileyok/cocoon), written i
This software isn't an afterthought by a company with limited resources.
-It is a superset of the reference PDS, including: multi-channel communication (email, discord, telegram, signal) for verification and alerts. Built-in web UI for account management, OAuth consent, repo browsing, and admin. Granular OAuth scopes with UI support such that users choose exactly what apps can access.
+It is a superset of the reference PDS, including: passkeys and 2FA (WebAuthn/FIDO2, TOTP, backup codes, trusted devices), did:web support (PDS-hosted subdomains or bring-your-own), multi-channel communication (email, discord, telegram, signal) for verification and alerts, granular OAuth scopes with a consent UI showing human-readable descriptions, and a built-in web UI for account management, OAuth consent, repo browsing, and admin.
The PDS itself is a single small binary with no node/npm runtime. It does require postgres, valkey, and s3-compatible storage, which makes setup heavier than the reference PDS's sqlite. The tradeoff is that these are battle-tested pieces of infra that we already know how to scale, back up, and monitor.
diff --git a/frontend/deno.lock b/frontend/deno.lock
index 0736697..4bf6511 100644
--- a/frontend/deno.lock
+++ b/frontend/deno.lock
@@ -6,6 +6,7 @@
"npm:@testing-library/svelte@^5.2.6": "5.2.9_svelte@5.45.10__acorn@8.15.0_vite@6.4.1__picomatch@4.0.3_vitest@2.1.9__jsdom@25.0.1__vite@5.4.21_jsdom@25.0.1",
"npm:@testing-library/user-event@^14.5.2": "14.6.1_@testing-library+dom@10.4.1",
"npm:jsdom@^25.0.1": "25.0.1",
+ "npm:svelte-i18n@^4.0.1": "4.0.1_svelte@5.45.10__acorn@8.15.0",
"npm:svelte@5": "5.45.10_acorn@8.15.0",
"npm:vite@*": "6.4.1_picomatch@4.0.3",
"npm:vite@6": "6.4.1_picomatch@4.0.3",
@@ -68,6 +69,11 @@
"@csstools/css-tokenizer@3.0.4": {
"integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="
},
+ "@esbuild/aix-ppc64@0.19.12": {
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+ "os": ["aix"],
+ "cpu": ["ppc64"]
+ },
"@esbuild/aix-ppc64@0.21.5": {
"integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
"os": ["aix"],
@@ -78,6 +84,11 @@
"os": ["aix"],
"cpu": ["ppc64"]
},
+ "@esbuild/android-arm64@0.19.12": {
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+ "os": ["android"],
+ "cpu": ["arm64"]
+ },
"@esbuild/android-arm64@0.21.5": {
"integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
"os": ["android"],
@@ -88,6 +99,11 @@
"os": ["android"],
"cpu": ["arm64"]
},
+ "@esbuild/android-arm@0.19.12": {
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+ "os": ["android"],
+ "cpu": ["arm"]
+ },
"@esbuild/android-arm@0.21.5": {
"integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
"os": ["android"],
@@ -98,6 +114,11 @@
"os": ["android"],
"cpu": ["arm"]
},
+ "@esbuild/android-x64@0.19.12": {
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+ "os": ["android"],
+ "cpu": ["x64"]
+ },
"@esbuild/android-x64@0.21.5": {
"integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
"os": ["android"],
@@ -108,6 +129,11 @@
"os": ["android"],
"cpu": ["x64"]
},
+ "@esbuild/darwin-arm64@0.19.12": {
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+ "os": ["darwin"],
+ "cpu": ["arm64"]
+ },
"@esbuild/darwin-arm64@0.21.5": {
"integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
"os": ["darwin"],
@@ -118,6 +144,11 @@
"os": ["darwin"],
"cpu": ["arm64"]
},
+ "@esbuild/darwin-x64@0.19.12": {
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+ "os": ["darwin"],
+ "cpu": ["x64"]
+ },
"@esbuild/darwin-x64@0.21.5": {
"integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
"os": ["darwin"],
@@ -128,6 +159,11 @@
"os": ["darwin"],
"cpu": ["x64"]
},
+ "@esbuild/freebsd-arm64@0.19.12": {
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+ "os": ["freebsd"],
+ "cpu": ["arm64"]
+ },
"@esbuild/freebsd-arm64@0.21.5": {
"integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
"os": ["freebsd"],
@@ -138,6 +174,11 @@
"os": ["freebsd"],
"cpu": ["arm64"]
},
+ "@esbuild/freebsd-x64@0.19.12": {
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+ "os": ["freebsd"],
+ "cpu": ["x64"]
+ },
"@esbuild/freebsd-x64@0.21.5": {
"integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
"os": ["freebsd"],
@@ -148,6 +189,11 @@
"os": ["freebsd"],
"cpu": ["x64"]
},
+ "@esbuild/linux-arm64@0.19.12": {
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
"@esbuild/linux-arm64@0.21.5": {
"integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
"os": ["linux"],
@@ -158,6 +204,11 @@
"os": ["linux"],
"cpu": ["arm64"]
},
+ "@esbuild/linux-arm@0.19.12": {
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+ "os": ["linux"],
+ "cpu": ["arm"]
+ },
"@esbuild/linux-arm@0.21.5": {
"integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
"os": ["linux"],
@@ -168,6 +219,11 @@
"os": ["linux"],
"cpu": ["arm"]
},
+ "@esbuild/linux-ia32@0.19.12": {
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+ "os": ["linux"],
+ "cpu": ["ia32"]
+ },
"@esbuild/linux-ia32@0.21.5": {
"integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
"os": ["linux"],
@@ -178,6 +234,11 @@
"os": ["linux"],
"cpu": ["ia32"]
},
+ "@esbuild/linux-loong64@0.19.12": {
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+ "os": ["linux"],
+ "cpu": ["loong64"]
+ },
"@esbuild/linux-loong64@0.21.5": {
"integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
"os": ["linux"],
@@ -188,6 +249,11 @@
"os": ["linux"],
"cpu": ["loong64"]
},
+ "@esbuild/linux-mips64el@0.19.12": {
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+ "os": ["linux"],
+ "cpu": ["mips64el"]
+ },
"@esbuild/linux-mips64el@0.21.5": {
"integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
"os": ["linux"],
@@ -198,6 +264,11 @@
"os": ["linux"],
"cpu": ["mips64el"]
},
+ "@esbuild/linux-ppc64@0.19.12": {
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+ "os": ["linux"],
+ "cpu": ["ppc64"]
+ },
"@esbuild/linux-ppc64@0.21.5": {
"integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
"os": ["linux"],
@@ -208,6 +279,11 @@
"os": ["linux"],
"cpu": ["ppc64"]
},
+ "@esbuild/linux-riscv64@0.19.12": {
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+ "os": ["linux"],
+ "cpu": ["riscv64"]
+ },
"@esbuild/linux-riscv64@0.21.5": {
"integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
"os": ["linux"],
@@ -218,6 +294,11 @@
"os": ["linux"],
"cpu": ["riscv64"]
},
+ "@esbuild/linux-s390x@0.19.12": {
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+ "os": ["linux"],
+ "cpu": ["s390x"]
+ },
"@esbuild/linux-s390x@0.21.5": {
"integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
"os": ["linux"],
@@ -228,6 +309,11 @@
"os": ["linux"],
"cpu": ["s390x"]
},
+ "@esbuild/linux-x64@0.19.12": {
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
"@esbuild/linux-x64@0.21.5": {
"integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
"os": ["linux"],
@@ -243,6 +329,11 @@
"os": ["netbsd"],
"cpu": ["arm64"]
},
+ "@esbuild/netbsd-x64@0.19.12": {
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+ "os": ["netbsd"],
+ "cpu": ["x64"]
+ },
"@esbuild/netbsd-x64@0.21.5": {
"integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
"os": ["netbsd"],
@@ -258,6 +349,11 @@
"os": ["openbsd"],
"cpu": ["arm64"]
},
+ "@esbuild/openbsd-x64@0.19.12": {
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+ "os": ["openbsd"],
+ "cpu": ["x64"]
+ },
"@esbuild/openbsd-x64@0.21.5": {
"integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
"os": ["openbsd"],
@@ -273,6 +369,11 @@
"os": ["openharmony"],
"cpu": ["arm64"]
},
+ "@esbuild/sunos-x64@0.19.12": {
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+ "os": ["sunos"],
+ "cpu": ["x64"]
+ },
"@esbuild/sunos-x64@0.21.5": {
"integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
"os": ["sunos"],
@@ -283,6 +384,11 @@
"os": ["sunos"],
"cpu": ["x64"]
},
+ "@esbuild/win32-arm64@0.19.12": {
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+ "os": ["win32"],
+ "cpu": ["arm64"]
+ },
"@esbuild/win32-arm64@0.21.5": {
"integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
"os": ["win32"],
@@ -293,6 +399,11 @@
"os": ["win32"],
"cpu": ["arm64"]
},
+ "@esbuild/win32-ia32@0.19.12": {
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+ "os": ["win32"],
+ "cpu": ["ia32"]
+ },
"@esbuild/win32-ia32@0.21.5": {
"integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
"os": ["win32"],
@@ -303,6 +414,11 @@
"os": ["win32"],
"cpu": ["ia32"]
},
+ "@esbuild/win32-x64@0.19.12": {
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+ "os": ["win32"],
+ "cpu": ["x64"]
+ },
"@esbuild/win32-x64@0.21.5": {
"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
"os": ["win32"],
@@ -313,6 +429,42 @@
"os": ["win32"],
"cpu": ["x64"]
},
+ "@formatjs/ecma402-abstract@2.3.6": {
+ "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==",
+ "dependencies": [
+ "@formatjs/fast-memoize",
+ "@formatjs/intl-localematcher",
+ "decimal.js",
+ "tslib"
+ ]
+ },
+ "@formatjs/fast-memoize@2.2.7": {
+ "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==",
+ "dependencies": [
+ "tslib"
+ ]
+ },
+ "@formatjs/icu-messageformat-parser@2.11.4": {
+ "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==",
+ "dependencies": [
+ "@formatjs/ecma402-abstract",
+ "@formatjs/icu-skeleton-parser",
+ "tslib"
+ ]
+ },
+ "@formatjs/icu-skeleton-parser@1.8.16": {
+ "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==",
+ "dependencies": [
+ "@formatjs/ecma402-abstract",
+ "tslib"
+ ]
+ },
+ "@formatjs/intl-localematcher@0.6.2": {
+ "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==",
+ "dependencies": [
+ "tslib"
+ ]
+ },
"@jridgewell/gen-mapping@0.3.13": {
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dependencies": [
@@ -540,7 +692,7 @@
"integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==",
"dependencies": [
"@vitest/spy",
- "estree-walker",
+ "estree-walker@3.0.3",
"magic-string",
"vite@5.4.21"
],
@@ -637,6 +789,16 @@
"check-error@2.1.1": {
"integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="
},
+ "cli-color@2.0.4": {
+ "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
+ "dependencies": [
+ "d",
+ "es5-ext",
+ "es6-iterator",
+ "memoizee",
+ "timers-ext"
+ ]
+ },
"clsx@2.1.1": {
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="
},
@@ -656,6 +818,13 @@
"rrweb-cssom@0.8.0"
]
},
+ "d@1.0.2": {
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "dependencies": [
+ "es5-ext",
+ "type"
+ ]
+ },
"data-urls@5.0.0": {
"integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
"dependencies": [
@@ -728,6 +897,70 @@
"hasown"
]
},
+ "es5-ext@0.10.64": {
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "dependencies": [
+ "es6-iterator",
+ "es6-symbol",
+ "esniff",
+ "next-tick"
+ ],
+ "scripts": true
+ },
+ "es6-iterator@2.0.3": {
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "dependencies": [
+ "d",
+ "es5-ext",
+ "es6-symbol"
+ ]
+ },
+ "es6-symbol@3.1.4": {
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "dependencies": [
+ "d",
+ "ext"
+ ]
+ },
+ "es6-weak-map@2.0.3": {
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+ "dependencies": [
+ "d",
+ "es5-ext",
+ "es6-iterator",
+ "es6-symbol"
+ ]
+ },
+ "esbuild@0.19.12": {
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+ "optionalDependencies": [
+ "@esbuild/aix-ppc64@0.19.12",
+ "@esbuild/android-arm@0.19.12",
+ "@esbuild/android-arm64@0.19.12",
+ "@esbuild/android-x64@0.19.12",
+ "@esbuild/darwin-arm64@0.19.12",
+ "@esbuild/darwin-x64@0.19.12",
+ "@esbuild/freebsd-arm64@0.19.12",
+ "@esbuild/freebsd-x64@0.19.12",
+ "@esbuild/linux-arm@0.19.12",
+ "@esbuild/linux-arm64@0.19.12",
+ "@esbuild/linux-ia32@0.19.12",
+ "@esbuild/linux-loong64@0.19.12",
+ "@esbuild/linux-mips64el@0.19.12",
+ "@esbuild/linux-ppc64@0.19.12",
+ "@esbuild/linux-riscv64@0.19.12",
+ "@esbuild/linux-s390x@0.19.12",
+ "@esbuild/linux-x64@0.19.12",
+ "@esbuild/netbsd-x64@0.19.12",
+ "@esbuild/openbsd-x64@0.19.12",
+ "@esbuild/sunos-x64@0.19.12",
+ "@esbuild/win32-arm64@0.19.12",
+ "@esbuild/win32-ia32@0.19.12",
+ "@esbuild/win32-x64@0.19.12"
+ ],
+ "scripts": true,
+ "bin": true
+ },
"esbuild@0.21.5": {
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"optionalDependencies": [
@@ -794,21 +1027,46 @@
"esm-env@1.2.2": {
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="
},
+ "esniff@2.0.1": {
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "dependencies": [
+ "d",
+ "es5-ext",
+ "event-emitter",
+ "type"
+ ]
+ },
"esrap@2.2.1": {
"integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==",
"dependencies": [
"@jridgewell/sourcemap-codec"
]
},
+ "estree-walker@2.0.2": {
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
"estree-walker@3.0.3": {
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dependencies": [
"@types/estree"
]
},
+ "event-emitter@0.3.5": {
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "dependencies": [
+ "d",
+ "es5-ext"
+ ]
+ },
"expect-type@1.3.0": {
"integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="
},
+ "ext@1.7.0": {
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "dependencies": [
+ "type"
+ ]
+ },
"fdir@6.5.0_picomatch@4.0.3": {
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dependencies": [
@@ -858,6 +1116,12 @@
"es-object-atoms"
]
},
+ "globalyzer@0.1.0": {
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="
+ },
+ "globrex@0.1.2": {
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="
+ },
"gopd@1.2.0": {
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
},
@@ -905,9 +1169,21 @@
"indent-string@4.0.0": {
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
},
+ "intl-messageformat@10.7.18": {
+ "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==",
+ "dependencies": [
+ "@formatjs/ecma402-abstract",
+ "@formatjs/fast-memoize",
+ "@formatjs/icu-messageformat-parser",
+ "tslib"
+ ]
+ },
"is-potential-custom-element-name@1.0.1": {
"integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
},
+ "is-promise@2.2.2": {
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+ },
"is-reference@3.0.3": {
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
"dependencies": [
@@ -955,6 +1231,12 @@
"lru-cache@10.4.3": {
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
},
+ "lru-queue@0.1.0": {
+ "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
+ "dependencies": [
+ "es5-ext"
+ ]
+ },
"lz-string@1.5.0": {
"integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
"bin": true
@@ -968,6 +1250,19 @@
"math-intrinsics@1.1.0": {
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
},
+ "memoizee@0.4.17": {
+ "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==",
+ "dependencies": [
+ "d",
+ "es5-ext",
+ "es6-weak-map",
+ "event-emitter",
+ "is-promise",
+ "lru-queue",
+ "next-tick",
+ "timers-ext"
+ ]
+ },
"mime-db@1.52.0": {
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
@@ -980,6 +1275,9 @@
"min-indent@1.0.1": {
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
},
+ "mri@1.2.0": {
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="
+ },
"ms@2.1.3": {
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
@@ -987,6 +1285,9 @@
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"bin": true
},
+ "next-tick@1.1.0": {
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
"nwsapi@2.2.23": {
"integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="
},
@@ -1075,6 +1376,12 @@
"rrweb-cssom@0.8.0": {
"integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="
},
+ "sade@1.8.1": {
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dependencies": [
+ "mri"
+ ]
+ },
"safer-buffer@2.1.2": {
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
@@ -1102,6 +1409,20 @@
"min-indent"
]
},
+ "svelte-i18n@4.0.1_svelte@5.45.10__acorn@8.15.0": {
+ "integrity": "sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==",
+ "dependencies": [
+ "cli-color",
+ "deepmerge",
+ "esbuild@0.19.12",
+ "estree-walker@2.0.2",
+ "intl-messageformat",
+ "sade",
+ "svelte",
+ "tiny-glob"
+ ],
+ "bin": true
+ },
"svelte@5.45.10_acorn@8.15.0": {
"integrity": "sha512-GiWXq6akkEN3zVDMQ1BVlRolmks5JkEdzD/67mvXOz6drRfuddT5JwsGZjMGSnsTRv/PjAXX8fqBcOr2g2qc/Q==",
"dependencies": [
@@ -1125,6 +1446,20 @@
"symbol-tree@3.2.4": {
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
+ "timers-ext@0.1.8": {
+ "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==",
+ "dependencies": [
+ "es5-ext",
+ "next-tick"
+ ]
+ },
+ "tiny-glob@0.2.9": {
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dependencies": [
+ "globalyzer",
+ "globrex"
+ ]
+ },
"tinybench@2.9.0": {
"integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="
},
@@ -1169,6 +1504,12 @@
"punycode"
]
},
+ "tslib@2.8.1": {
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+ },
+ "type@2.7.3": {
+ "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
+ },
"vite-node@2.1.9": {
"integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==",
"dependencies": [
@@ -1300,6 +1641,7 @@
"npm:@testing-library/svelte@^5.2.6",
"npm:@testing-library/user-event@^14.5.2",
"npm:jsdom@^25.0.1",
+ "npm:svelte-i18n@^4.0.1",
"npm:svelte@5",
"npm:vite@6",
"npm:vitest@^2.1.8"
diff --git a/frontend/package.json b/frontend/package.json
index ad2361b..4fe7c98 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -11,6 +11,9 @@
"test:run": "vitest run",
"test:coverage": "vitest run --coverage"
},
+ "dependencies": {
+ "svelte-i18n": "^4.0.1"
+ },
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"@testing-library/jest-dom": "^6.6.3",
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index 0586495..1bf3b54 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -1,6 +1,8 @@
Loading...
{description}
+ {/if} + {@render children()} +