[web] General refactoring (#6164)
This commit is contained in:
@@ -39,7 +39,7 @@
|
||||
"next-electron-server": "^1.0.0",
|
||||
"node-stream-zip": "^1.15.0",
|
||||
"onnxruntime-node": "^1.20.1",
|
||||
"zod": "^3.25.50"
|
||||
"zod": "^3.25.51"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.28.0",
|
||||
@@ -49,7 +49,7 @@
|
||||
"ajv": "^8.17.1",
|
||||
"concurrently": "^9.1.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^36.3.2",
|
||||
"electron": "^36.4.0",
|
||||
"electron-builder": "^26.0.14",
|
||||
"eslint": "^9",
|
||||
"prettier": "3.5.3",
|
||||
@@ -57,7 +57,7 @@
|
||||
"prettier-plugin-packagejson": "^2.5.15",
|
||||
"shx": "^0.4.0",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.33.0"
|
||||
"typescript-eslint": "^8.33.1"
|
||||
},
|
||||
"packageManager": "yarn@1.22.22",
|
||||
"productName": "ente"
|
||||
|
||||
@@ -392,78 +392,78 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.0.tgz#51ed03649575ba51bcee7efdbfd85283249b5447"
|
||||
integrity sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==
|
||||
"@typescript-eslint/eslint-plugin@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz#532641b416ed2afd5be893cddb2a58e9cd1f7a3e"
|
||||
integrity sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.10.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.0"
|
||||
"@typescript-eslint/type-utils" "8.33.0"
|
||||
"@typescript-eslint/utils" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/type-utils" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^7.0.0"
|
||||
natural-compare "^1.4.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/parser@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.0.tgz#8e523c2b447ad7cd6ac91b719d8b37449481784d"
|
||||
integrity sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==
|
||||
"@typescript-eslint/parser@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.1.tgz#ef9a5ee6aa37a6b4f46cc36d08a14f828238afe2"
|
||||
integrity sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/typescript-estree" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/project-service@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.0.tgz#71f37ef9010de47bf20963914743c5cbef851e08"
|
||||
integrity sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==
|
||||
"@typescript-eslint/project-service@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.1.tgz#c85e7d9a44d6a11fe64e73ac1ed47de55dc2bf9f"
|
||||
integrity sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==
|
||||
dependencies:
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.0"
|
||||
"@typescript-eslint/types" "^8.33.0"
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.1"
|
||||
"@typescript-eslint/types" "^8.33.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.0.tgz#459cf0c49d410800b1a023b973c62d699b09bf4c"
|
||||
integrity sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==
|
||||
"@typescript-eslint/scope-manager@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz#d1e0efb296da5097d054bc9972e69878a2afea73"
|
||||
integrity sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
|
||||
"@typescript-eslint/tsconfig-utils@8.33.0", "@typescript-eslint/tsconfig-utils@^8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.0.tgz#316adab038bbdc43e448781d5a816c2973eab73e"
|
||||
integrity sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==
|
||||
"@typescript-eslint/tsconfig-utils@8.33.1", "@typescript-eslint/tsconfig-utils@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz#7836afcc097a4657a5ed56670851a450d8b70ab8"
|
||||
integrity sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==
|
||||
|
||||
"@typescript-eslint/type-utils@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.0.tgz#f06124b2d6db8a51b24990cb123c9543af93fef5"
|
||||
integrity sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==
|
||||
"@typescript-eslint/type-utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz#d73ee1a29d8a0abe60d4abbff4f1d040f0de15fa"
|
||||
integrity sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "8.33.0"
|
||||
"@typescript-eslint/utils" "8.33.0"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/types@8.33.0", "@typescript-eslint/types@^8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.0.tgz#02a7dbba611a8abf1ad2a9e00f72f7b94b5ab0ee"
|
||||
integrity sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==
|
||||
"@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f"
|
||||
integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==
|
||||
|
||||
"@typescript-eslint/typescript-estree@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.0.tgz#abcc1d3db75a8e9fd2e274ee8c4099fa2399abfd"
|
||||
integrity sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==
|
||||
"@typescript-eslint/typescript-estree@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d"
|
||||
integrity sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==
|
||||
dependencies:
|
||||
"@typescript-eslint/project-service" "8.33.0"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/project-service" "8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
debug "^4.3.4"
|
||||
fast-glob "^3.3.2"
|
||||
is-glob "^4.0.3"
|
||||
@@ -471,22 +471,22 @@
|
||||
semver "^7.6.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/utils@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.0.tgz#574ad5edee371077b9e28ca6fb804f2440f447c1"
|
||||
integrity sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==
|
||||
"@typescript-eslint/utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.1.tgz#ea22f40d3553da090f928cf17907e963643d4b96"
|
||||
integrity sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.7.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/typescript-estree" "8.33.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
|
||||
"@typescript-eslint/visitor-keys@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.0.tgz#fbae16fd3594531f8cad95d421125d634e9974fe"
|
||||
integrity sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==
|
||||
"@typescript-eslint/visitor-keys@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc"
|
||||
integrity sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
eslint-visitor-keys "^4.2.0"
|
||||
|
||||
"@xmldom/xmldom@^0.8.8":
|
||||
@@ -1250,10 +1250,10 @@ electron-updater@^6.6.3:
|
||||
semver "^7.6.3"
|
||||
tiny-typed-emitter "^2.1.0"
|
||||
|
||||
electron@^36.3.2:
|
||||
version "36.3.2"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-36.3.2.tgz#4a60f95e8d3858d01570c03b58dc2fb2f17ee8b6"
|
||||
integrity sha512-v0/j7n22CL3OYv9BIhq6JJz2+e1HmY9H4bjTk8/WzVT9JwVX/T/21YNdR7xuQ6XDSEo9gP5JnqmjOamE+CUY8Q==
|
||||
electron@^36.4.0:
|
||||
version "36.4.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-36.4.0.tgz#9463bf5fa7565ae7be3a274f7f6a46359bcfe74d"
|
||||
integrity sha512-LLOOZEuW5oqvnjC7HBQhIqjIIJAZCIFjQxltQGLfEC7XFsBoZgQ3u3iFj+Kzw68Xj97u1n57Jdt7P98qLvUibQ==
|
||||
dependencies:
|
||||
"@electron/get" "^2.0.0"
|
||||
"@types/node" "^22.7.7"
|
||||
@@ -3251,14 +3251,14 @@ typedarray@^0.0.6:
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
|
||||
|
||||
typescript-eslint@^8.33.0:
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.0.tgz#89f733a90edc6abe0994b6130b964e781a1ba82f"
|
||||
integrity sha512-5YmNhF24ylCsvdNW2oJwMzTbaeO4bg90KeGtMjUw0AGtHksgEPLRTUil+coHwCfiu4QjVJFnjp94DmU6zV7DhQ==
|
||||
typescript-eslint@^8.33.1:
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff"
|
||||
integrity sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin" "8.33.0"
|
||||
"@typescript-eslint/parser" "8.33.0"
|
||||
"@typescript-eslint/utils" "8.33.0"
|
||||
"@typescript-eslint/eslint-plugin" "8.33.1"
|
||||
"@typescript-eslint/parser" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
|
||||
typescript@^5.4.3, typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
@@ -3421,7 +3421,7 @@ yocto-queue@^0.1.0:
|
||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
zod@^3.25.50:
|
||||
version "3.25.50"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.50.tgz#9de9ca02ae702fd37ed87b28f8f17099f2402aa9"
|
||||
integrity sha512-VstOnRxf4tlSq0raIwbn0n+LA34SxVoZ8r3pkwSUM0jqNiA/HCMQEVjTuS5FZmHsge+9MDGTiAuHyml5T0um6A==
|
||||
zod@^3.25.51:
|
||||
version "3.25.51"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.51.tgz#aa2cf648e54f6f060f139cf77b694819f63c9f3a"
|
||||
integrity sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"devDependencies": {
|
||||
"@types/react": "^19.1.6",
|
||||
"@types/react-dom": "^19.1.5",
|
||||
"@vitejs/plugin-react": "^4.5.0",
|
||||
"@vitejs/plugin-react": "^4.5.1",
|
||||
"ente-build-config": "*",
|
||||
"vite": "^6.3.5"
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { VerifyMasterPasswordForm } from "ente-accounts/components/VerifyMasterPasswordForm";
|
||||
import { checkSessionValidity } from "ente-accounts/services/session";
|
||||
import {
|
||||
TitledMiniDialog,
|
||||
@@ -6,9 +7,6 @@ import {
|
||||
import type { ModalVisibilityProps } from "ente-base/components/utils/modal";
|
||||
import { useBaseContext } from "ente-base/context";
|
||||
import log from "ente-base/log";
|
||||
import VerifyMasterPasswordForm, {
|
||||
type VerifyMasterPasswordFormProps,
|
||||
} from "ente-shared/components/VerifyMasterPasswordForm";
|
||||
import { getData } from "ente-shared/storage/localStorage";
|
||||
import type { KeyAttributes, User } from "ente-shared/user/types";
|
||||
import { t } from "i18next";
|
||||
@@ -90,12 +88,6 @@ export const AuthenticateUser: React.FC<AuthenticateUserProps> = ({
|
||||
if (open) void validateSession();
|
||||
}, [open]);
|
||||
|
||||
const useMasterPassword: VerifyMasterPasswordFormProps["callback"] =
|
||||
async () => {
|
||||
onClose();
|
||||
onAuthenticate();
|
||||
};
|
||||
|
||||
return (
|
||||
<TitledMiniDialog
|
||||
open={open}
|
||||
@@ -104,11 +96,13 @@ export const AuthenticateUser: React.FC<AuthenticateUserProps> = ({
|
||||
title={t("password")}
|
||||
>
|
||||
<VerifyMasterPasswordForm
|
||||
buttonText={t("authenticate")}
|
||||
callback={useMasterPassword}
|
||||
user={user}
|
||||
keyAttributes={keyAttributes}
|
||||
submitButtonProps={{ sx: { mb: 0 } }}
|
||||
submitButtonTitle={t("authenticate")}
|
||||
onVerify={() => {
|
||||
onClose();
|
||||
onAuthenticate();
|
||||
}}
|
||||
/>
|
||||
</TitledMiniDialog>
|
||||
);
|
||||
|
||||
@@ -19,22 +19,40 @@ import {
|
||||
AccountsPageFooter,
|
||||
} from "./layouts/centered-paper";
|
||||
|
||||
export const PasswordHeader: React.FC<React.PropsWithChildren> = ({
|
||||
children,
|
||||
}) => {
|
||||
return (
|
||||
<Header_>
|
||||
<Typography variant="h3">{t("password")}</Typography>
|
||||
<Typography sx={{ color: "text.faint" }}>{children}</Typography>
|
||||
</Header_>
|
||||
);
|
||||
};
|
||||
interface HeaderCaptionProps {
|
||||
/**
|
||||
* If specified, then a caption to display below the title (which is
|
||||
* expected to be passed as the `children`).
|
||||
*
|
||||
* The components which use the {@link HeaderCaptionProps} that they'll have
|
||||
* the same height irrespective of whether or not the caption is provided.
|
||||
* This allows us to use this component to get a similar look across various
|
||||
* pages in the login flow (some of which have a caption, some which not).
|
||||
*/
|
||||
caption?: string;
|
||||
}
|
||||
|
||||
const PasskeyHeader: React.FC<React.PropsWithChildren> = ({ children }) => {
|
||||
export const PasswordHeader: React.FC<HeaderCaptionProps> = (props) => (
|
||||
<AccountsPageTitleWithCaption {...props}>
|
||||
{t("password")}
|
||||
</AccountsPageTitleWithCaption>
|
||||
);
|
||||
|
||||
const PasskeyHeader: React.FC<HeaderCaptionProps> = (props) => (
|
||||
<AccountsPageTitleWithCaption {...props}>
|
||||
{t("passkey")}
|
||||
</AccountsPageTitleWithCaption>
|
||||
);
|
||||
|
||||
export const AccountsPageTitleWithCaption: React.FC<
|
||||
React.PropsWithChildren<HeaderCaptionProps>
|
||||
> = ({ caption, children }) => {
|
||||
return (
|
||||
<Header_>
|
||||
<Typography variant="h3">{t("passkey")}</Typography>
|
||||
<Typography sx={{ color: "text.faint" }}>{children}</Typography>
|
||||
<Typography variant="h3">{children}</Typography>
|
||||
<Typography sx={{ color: "text.faint" }}>
|
||||
{caption ?? ""}
|
||||
</Typography>
|
||||
</Header_>
|
||||
);
|
||||
};
|
||||
@@ -123,7 +141,7 @@ export const VerifyingPasskey: React.FC<VerifyingPasskeyProps> = ({
|
||||
|
||||
return (
|
||||
<AccountsPageContents>
|
||||
<PasskeyHeader>{email ?? ""}</PasskeyHeader>
|
||||
<PasskeyHeader caption={email} />
|
||||
|
||||
<VerifyingPasskeyMiddle>
|
||||
<VerifyingPasskeyStatus>
|
||||
|
||||
@@ -12,6 +12,7 @@ import { t } from "i18next";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { useCallback } from "react";
|
||||
import { z } from "zod/v4";
|
||||
import { AccountsPageTitleWithCaption } from "./LoginComponents";
|
||||
|
||||
interface LoginContentsProps {
|
||||
/** Called when the user clicks the signup option instead. */
|
||||
@@ -85,13 +86,11 @@ export const LoginContents: React.FC<LoginContentsProps> = ({
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* AccountsPageTitle, inlined to tweak mb */}
|
||||
<Typography variant="h3" sx={{ flex: 1, mb: 4 }}>
|
||||
<AccountsPageTitleWithCaption>
|
||||
{t("login")}
|
||||
</Typography>
|
||||
</AccountsPageTitleWithCaption>
|
||||
<form onSubmit={formik.handleSubmit}>
|
||||
<TextField
|
||||
id="email"
|
||||
name="email"
|
||||
value={formik.values.email}
|
||||
onChange={formik.handleChange}
|
||||
|
||||
226
web/packages/accounts/components/VerifyMasterPasswordForm.tsx
Normal file
226
web/packages/accounts/components/VerifyMasterPasswordForm.tsx
Normal file
@@ -0,0 +1,226 @@
|
||||
import { Input, TextField } from "@mui/material";
|
||||
import type { SRPAttributes } from "ente-accounts/services/srp-remote";
|
||||
import { LoadingButton } from "ente-base/components/mui/LoadingButton";
|
||||
import { ShowHidePasswordInputAdornment } from "ente-base/components/mui/PasswordInputAdornment";
|
||||
import { sharedCryptoWorker } from "ente-base/crypto";
|
||||
import log from "ente-base/log";
|
||||
import { CustomError } from "ente-shared/error";
|
||||
import type { KeyAttributes, User } from "ente-shared/user/types";
|
||||
import { useFormik } from "formik";
|
||||
import { t } from "i18next";
|
||||
import { useCallback, useState } from "react";
|
||||
|
||||
export interface VerifyMasterPasswordFormProps {
|
||||
/**
|
||||
* The user whose password we're trying to verify.
|
||||
*/
|
||||
user: User | undefined;
|
||||
/**
|
||||
* The user's key attributes.
|
||||
*/
|
||||
keyAttributes: KeyAttributes | undefined;
|
||||
/**
|
||||
* A callback invoked when the form wants to get {@link KeyAttributes}.
|
||||
*
|
||||
* It is only provided during the login flow, where we do not have
|
||||
* {@link keyAttributes} already available for the user. In case the form is
|
||||
* used for reauthenticating the user after they've already logged in, then
|
||||
* this function will not be provided.
|
||||
*
|
||||
* This function can throw an `CustomError.TWO_FACTOR_ENABLED` to signal to
|
||||
* the form that some other form of second factor is enabled and the user
|
||||
* has been redirected to a two factor verification page.
|
||||
*
|
||||
* This function can throw an `CustomError.INCORRECT_PASSWORD_OR_NO_ACCOUNT`
|
||||
* to signal that either that the password is incorrect, or no account with
|
||||
* the provided email exists.
|
||||
*/
|
||||
getKeyAttributes?: (kek: string) => Promise<KeyAttributes | undefined>;
|
||||
/**
|
||||
* The user's SRP attributes.
|
||||
*/
|
||||
srpAttributes?: SRPAttributes;
|
||||
/**
|
||||
* The title of the submit button no the form.
|
||||
*/
|
||||
submitButtonTitle: string;
|
||||
/**
|
||||
* The callback invoked with the verified password, and all the other
|
||||
* auxillary information that was ascertained when verifying it.
|
||||
*
|
||||
* @param key The user's master key obtained after decrypting it by using
|
||||
* the kek derived from their passphrase.
|
||||
*
|
||||
* @param kek The key used for encrypting the user's master key.
|
||||
*
|
||||
* @param keyAttributes The user's key attributes (either those that we
|
||||
* started with, or those that we fetched on the way using
|
||||
* {@link getKeyAttributes}).
|
||||
*
|
||||
* @param passphrase The plaintext passphrase. This can be used during login
|
||||
* to derive another encrypted key using interactive mem/ops limits for
|
||||
* faster reauthentication after the initial login.
|
||||
*/
|
||||
onVerify: (
|
||||
key: string,
|
||||
kek: string,
|
||||
keyAttributes: KeyAttributes,
|
||||
passphrase: string,
|
||||
) => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* A form with a text field that can be used to ask the user to verify their
|
||||
* password.
|
||||
*/
|
||||
export const VerifyMasterPasswordForm: React.FC<
|
||||
VerifyMasterPasswordFormProps
|
||||
> = ({
|
||||
user,
|
||||
keyAttributes,
|
||||
srpAttributes,
|
||||
getKeyAttributes,
|
||||
onVerify,
|
||||
submitButtonTitle,
|
||||
}) => {
|
||||
const [showPassword, setShowPassword] = useState(false);
|
||||
|
||||
const handleToggleShowHidePassword = useCallback(
|
||||
() => setShowPassword((show) => !show),
|
||||
[],
|
||||
);
|
||||
|
||||
const formik = useFormik({
|
||||
initialValues: { password: "" },
|
||||
onSubmit: async ({ password }, { setFieldError }) => {
|
||||
const setPasswordFieldError = (message: string) =>
|
||||
setFieldError("password", message);
|
||||
|
||||
if (!password) {
|
||||
setPasswordFieldError(t("required"));
|
||||
return;
|
||||
}
|
||||
|
||||
await verifyPassphrase(password, setPasswordFieldError);
|
||||
},
|
||||
});
|
||||
|
||||
const verifyPassphrase = async (
|
||||
passphrase: string,
|
||||
setFieldError: (message: string) => void,
|
||||
) => {
|
||||
try {
|
||||
const cryptoWorker = await sharedCryptoWorker();
|
||||
let kek: string;
|
||||
if (srpAttributes) {
|
||||
try {
|
||||
kek = await cryptoWorker.deriveKey(
|
||||
passphrase,
|
||||
srpAttributes.kekSalt,
|
||||
srpAttributes.opsLimit,
|
||||
srpAttributes.memLimit,
|
||||
);
|
||||
} catch (e) {
|
||||
log.error("Failed to derive kek", e);
|
||||
setFieldError(t("weak_device_hint"));
|
||||
return;
|
||||
}
|
||||
} else if (keyAttributes) {
|
||||
try {
|
||||
kek = await cryptoWorker.deriveKey(
|
||||
passphrase,
|
||||
keyAttributes.kekSalt,
|
||||
keyAttributes.opsLimit,
|
||||
keyAttributes.memLimit,
|
||||
);
|
||||
} catch (e) {
|
||||
log.error("Failed to derive kek", e);
|
||||
setFieldError(t("weak_device_hint"));
|
||||
return;
|
||||
}
|
||||
} else throw new Error("Both SRP and key attributes are missing");
|
||||
|
||||
if (!keyAttributes && typeof getKeyAttributes == "function") {
|
||||
keyAttributes = await getKeyAttributes(kek);
|
||||
}
|
||||
if (!keyAttributes) {
|
||||
throw Error("couldn't get key attributes");
|
||||
}
|
||||
|
||||
try {
|
||||
const key = await cryptoWorker.decryptB64(
|
||||
keyAttributes.encryptedKey,
|
||||
keyAttributes.keyDecryptionNonce,
|
||||
kek,
|
||||
);
|
||||
onVerify(key, kek, keyAttributes, passphrase);
|
||||
} catch (e) {
|
||||
log.error("user entered a wrong password", e);
|
||||
throw Error(CustomError.INCORRECT_PASSWORD);
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
if (e.message === CustomError.TWO_FACTOR_ENABLED) {
|
||||
// two factor enabled, user has been redirected to two factor page
|
||||
return;
|
||||
}
|
||||
log.error("failed to verify passphrase", e);
|
||||
switch (e.message) {
|
||||
case CustomError.INCORRECT_PASSWORD:
|
||||
setFieldError(t("incorrect_password"));
|
||||
break;
|
||||
case CustomError.INCORRECT_PASSWORD_OR_NO_ACCOUNT:
|
||||
setFieldError(t("incorrect_password_or_no_account"));
|
||||
break;
|
||||
default:
|
||||
setFieldError(t("generic_error"));
|
||||
}
|
||||
} else {
|
||||
log.error("failed to verify passphrase", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<form onSubmit={formik.handleSubmit}>
|
||||
<Input
|
||||
sx={{ display: "none" }}
|
||||
name="email"
|
||||
autoComplete="username"
|
||||
type="email"
|
||||
value={user?.email}
|
||||
/>
|
||||
<TextField
|
||||
name="password"
|
||||
value={formik.values.password}
|
||||
onChange={formik.handleChange}
|
||||
type={showPassword ? "text" : "password"}
|
||||
autoComplete="current-password"
|
||||
label={t("password")}
|
||||
fullWidth
|
||||
margin="normal"
|
||||
disabled={formik.isSubmitting}
|
||||
error={!!formik.errors.password}
|
||||
helperText={formik.errors.password ?? " "}
|
||||
slotProps={{
|
||||
input: {
|
||||
endAdornment: (
|
||||
<ShowHidePasswordInputAdornment
|
||||
showPassword={showPassword}
|
||||
onToggle={handleToggleShowHidePassword}
|
||||
/>
|
||||
),
|
||||
},
|
||||
}}
|
||||
/>
|
||||
<LoadingButton
|
||||
fullWidth
|
||||
type="submit"
|
||||
loading={formik.isSubmitting}
|
||||
color={"accent"}
|
||||
>
|
||||
{submitButtonTitle}
|
||||
</LoadingButton>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
@@ -7,6 +7,10 @@ import {
|
||||
import { SecondFactorChoice } from "ente-accounts/components/SecondFactorChoice";
|
||||
import { sessionExpiredDialogAttributes } from "ente-accounts/components/utils/dialog";
|
||||
import { useSecondFactorChoiceIfNeeded } from "ente-accounts/components/utils/second-factor-choice";
|
||||
import {
|
||||
VerifyMasterPasswordForm,
|
||||
type VerifyMasterPasswordFormProps,
|
||||
} from "ente-accounts/components/VerifyMasterPasswordForm";
|
||||
import {
|
||||
openPasskeyVerificationURL,
|
||||
passkeyVerificationRedirectURL,
|
||||
@@ -31,9 +35,6 @@ import { sharedCryptoWorker } from "ente-base/crypto";
|
||||
import type { B64EncryptionResult } from "ente-base/crypto/libsodium";
|
||||
import { clearLocalStorage } from "ente-base/local-storage";
|
||||
import log from "ente-base/log";
|
||||
import VerifyMasterPasswordForm, {
|
||||
type VerifyMasterPasswordFormProps,
|
||||
} from "ente-shared/components/VerifyMasterPasswordForm";
|
||||
import {
|
||||
decryptAndStoreToken,
|
||||
generateAndSaveIntermediateKeyAttributes,
|
||||
@@ -149,8 +150,7 @@ const Page: React.FC = () => {
|
||||
keyAttributes.keyDecryptionNonce,
|
||||
kek,
|
||||
);
|
||||
// eslint-disable-next-line react-hooks/rules-of-hooks
|
||||
useMasterPassword(key, kek, keyAttributes);
|
||||
void postVerification(key, kek, keyAttributes);
|
||||
return;
|
||||
}
|
||||
if (keyAttributes) {
|
||||
@@ -257,46 +257,46 @@ const Page: React.FC = () => {
|
||||
}
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
const useMasterPassword: VerifyMasterPasswordFormProps["callback"] = async (
|
||||
key,
|
||||
kek,
|
||||
keyAttributes,
|
||||
passphrase,
|
||||
const handleVerifyMasterPassword: VerifyMasterPasswordFormProps["onVerify"] =
|
||||
(key, kek, keyAttributes, passphrase) => {
|
||||
void (async () => {
|
||||
if (isFirstLogin()) {
|
||||
await generateAndSaveIntermediateKeyAttributes(
|
||||
passphrase,
|
||||
keyAttributes,
|
||||
key,
|
||||
);
|
||||
}
|
||||
await postVerification(key, kek, keyAttributes);
|
||||
})();
|
||||
};
|
||||
|
||||
const postVerification = async (
|
||||
key: string,
|
||||
kek: string,
|
||||
keyAttributes: KeyAttributes,
|
||||
) => {
|
||||
await saveKeyInSessionStore("encryptionKey", key);
|
||||
await decryptAndStoreToken(keyAttributes, key);
|
||||
try {
|
||||
if (isFirstLogin() && passphrase) {
|
||||
await generateAndSaveIntermediateKeyAttributes(
|
||||
passphrase,
|
||||
keyAttributes,
|
||||
key,
|
||||
);
|
||||
}
|
||||
await saveKeyInSessionStore("encryptionKey", key);
|
||||
await decryptAndStoreToken(keyAttributes, key);
|
||||
try {
|
||||
let srpAttributes: SRPAttributes | null =
|
||||
getData("srpAttributes");
|
||||
if (!srpAttributes && user) {
|
||||
srpAttributes = await getSRPAttributes(user.email);
|
||||
if (srpAttributes) {
|
||||
setData("srpAttributes", srpAttributes);
|
||||
}
|
||||
let srpAttributes: SRPAttributes | null = getData("srpAttributes");
|
||||
if (!srpAttributes && user) {
|
||||
srpAttributes = await getSRPAttributes(user.email);
|
||||
if (srpAttributes) {
|
||||
setData("srpAttributes", srpAttributes);
|
||||
}
|
||||
log.debug(() => `userSRPSetupPending ${!srpAttributes}`);
|
||||
if (!srpAttributes) {
|
||||
const loginSubKey = await generateLoginSubKey(kek);
|
||||
const srpSetupAttributes =
|
||||
await generateSRPSetupAttributes(loginSubKey);
|
||||
await configureSRP(srpSetupAttributes);
|
||||
}
|
||||
} catch (e) {
|
||||
log.error("migrate to srp failed", e);
|
||||
}
|
||||
void router.push(unstashRedirect() ?? appHomeRoute);
|
||||
log.debug(() => `userSRPSetupPending ${!srpAttributes}`);
|
||||
if (!srpAttributes) {
|
||||
const loginSubKey = await generateLoginSubKey(kek);
|
||||
const srpSetupAttributes =
|
||||
await generateSRPSetupAttributes(loginSubKey);
|
||||
await configureSRP(srpSetupAttributes);
|
||||
}
|
||||
} catch (e) {
|
||||
log.error("useMasterPassword failed", e);
|
||||
log.error("migrate to srp failed", e);
|
||||
}
|
||||
void router.push(unstashRedirect() ?? appHomeRoute);
|
||||
};
|
||||
|
||||
if (!keyAttributes && !srpAttributes) {
|
||||
@@ -333,17 +333,15 @@ const Page: React.FC = () => {
|
||||
// possibility using types.
|
||||
return (
|
||||
<AccountsPageContents>
|
||||
<PasswordHeader>{user?.email ?? ""}</PasswordHeader>
|
||||
|
||||
<PasswordHeader caption={user?.email} />
|
||||
<VerifyMasterPasswordForm
|
||||
buttonText={t("sign_in")}
|
||||
callback={useMasterPassword}
|
||||
user={user}
|
||||
keyAttributes={keyAttributes}
|
||||
getKeyAttributes={getKeyAttributes}
|
||||
srpAttributes={srpAttributes}
|
||||
submitButtonTitle={t("sign_in")}
|
||||
onVerify={handleVerifyMasterPassword}
|
||||
/>
|
||||
|
||||
<AccountsPageFooterWithHost>
|
||||
<LinkButton onClick={() => router.push("/recover")}>
|
||||
{t("forgot_password")}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"react-dom": "^19.1.0",
|
||||
"react-i18next": "^15.5.2",
|
||||
"yup": "^1.6.1",
|
||||
"zod": "^3.25.50"
|
||||
"zod": "^3.25.51"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/libsodium-wrappers-sumo": "^0.7.8",
|
||||
|
||||
@@ -13,6 +13,6 @@
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"prettier-plugin-packagejson": "^2.5.15",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.33.0"
|
||||
"typescript-eslint": "^8.33.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"hls-video-element": "^1.5.2",
|
||||
"leaflet": "^1.9.4",
|
||||
"leaflet-defaulticon-compatibility": "^0.1.2",
|
||||
"media-chrome": "^4.10.0",
|
||||
"media-chrome": "^4.11.0",
|
||||
"photoswipe": "^5.4.4",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
import { Input, type ButtonProps } from "@mui/material";
|
||||
import type { SRPAttributes } from "ente-accounts/services/srp-remote";
|
||||
import { sharedCryptoWorker } from "ente-base/crypto";
|
||||
import log from "ente-base/log";
|
||||
import { t } from "i18next";
|
||||
import SingleInputForm, {
|
||||
type SingleInputFormProps,
|
||||
} from "../components/SingleInputForm";
|
||||
import { CustomError } from "../error";
|
||||
import type { KeyAttributes, User } from "../user/types";
|
||||
|
||||
export interface VerifyMasterPasswordFormProps {
|
||||
user: User | undefined;
|
||||
callback: (
|
||||
key: string,
|
||||
kek: string,
|
||||
keyAttributes: KeyAttributes,
|
||||
passphrase?: string,
|
||||
) => void;
|
||||
buttonText: string;
|
||||
keyAttributes: KeyAttributes | undefined;
|
||||
/**
|
||||
* A callback invoked when the form wants to get {@link KeyAttributes}.
|
||||
*
|
||||
* It is only provided during the login flow, where we do not have
|
||||
* {@link keyAttributes} already available for the user. In case the form is
|
||||
* used for reauthenticating the user after they've already logged in, then
|
||||
* this function will not be provided.
|
||||
*
|
||||
* This function can throw an `CustomError.TWO_FACTOR_ENABLED` to signal to
|
||||
* the form that some other form of second factor is enabled and the user
|
||||
* has been redirected to a two factor verification page.
|
||||
*
|
||||
* This function can throw an `CustomError.INCORRECT_PASSWORD_OR_NO_ACCOUNT`
|
||||
* to signal that either that the password is incorrect, or no account with
|
||||
* the provided email exists.
|
||||
*/
|
||||
getKeyAttributes?: (kek: string) => Promise<KeyAttributes | undefined>;
|
||||
srpAttributes?: SRPAttributes;
|
||||
submitButtonProps?: ButtonProps;
|
||||
}
|
||||
|
||||
export default function VerifyMasterPasswordForm({
|
||||
user,
|
||||
keyAttributes,
|
||||
srpAttributes,
|
||||
callback,
|
||||
buttonText,
|
||||
submitButtonProps,
|
||||
getKeyAttributes,
|
||||
}: VerifyMasterPasswordFormProps) {
|
||||
const verifyPassphrase: SingleInputFormProps["callback"] = async (
|
||||
passphrase,
|
||||
setFieldError,
|
||||
) => {
|
||||
try {
|
||||
const cryptoWorker = await sharedCryptoWorker();
|
||||
let kek: string;
|
||||
try {
|
||||
if (srpAttributes) {
|
||||
kek = await cryptoWorker.deriveKey(
|
||||
passphrase,
|
||||
srpAttributes.kekSalt,
|
||||
srpAttributes.opsLimit,
|
||||
srpAttributes.memLimit,
|
||||
);
|
||||
} else if (keyAttributes) {
|
||||
kek = await cryptoWorker.deriveKey(
|
||||
passphrase,
|
||||
keyAttributes.kekSalt,
|
||||
keyAttributes.opsLimit,
|
||||
keyAttributes.memLimit,
|
||||
);
|
||||
} else
|
||||
throw new Error("Both SRP and key attributes are missing");
|
||||
} catch (e) {
|
||||
log.error("failed to derive key", e);
|
||||
throw Error(CustomError.WEAK_DEVICE);
|
||||
}
|
||||
if (!keyAttributes && typeof getKeyAttributes == "function") {
|
||||
keyAttributes = await getKeyAttributes(kek);
|
||||
}
|
||||
if (!keyAttributes) {
|
||||
throw Error("couldn't get key attributes");
|
||||
}
|
||||
try {
|
||||
const key = await cryptoWorker.decryptB64(
|
||||
keyAttributes.encryptedKey,
|
||||
keyAttributes.keyDecryptionNonce,
|
||||
kek,
|
||||
);
|
||||
callback(key, kek, keyAttributes, passphrase);
|
||||
} catch (e) {
|
||||
log.error("user entered a wrong password", e);
|
||||
throw Error(CustomError.INCORRECT_PASSWORD);
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
if (e.message === CustomError.TWO_FACTOR_ENABLED) {
|
||||
// two factor enabled, user has been redirected to two factor page
|
||||
return;
|
||||
}
|
||||
log.error("failed to verify passphrase", e);
|
||||
switch (e.message) {
|
||||
case CustomError.WEAK_DEVICE:
|
||||
setFieldError(t("weak_device_hint"));
|
||||
break;
|
||||
case CustomError.INCORRECT_PASSWORD:
|
||||
setFieldError(t("incorrect_password"));
|
||||
break;
|
||||
case CustomError.INCORRECT_PASSWORD_OR_NO_ACCOUNT:
|
||||
setFieldError(t("incorrect_password_or_no_account"));
|
||||
break;
|
||||
default:
|
||||
setFieldError(t("generic_error"));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<SingleInputForm
|
||||
callback={verifyPassphrase}
|
||||
placeholder={t("password")}
|
||||
buttonText={buttonText}
|
||||
submitButtonProps={submitButtonProps}
|
||||
hiddenPreInput={
|
||||
<Input
|
||||
sx={{ display: "none" }}
|
||||
id="email"
|
||||
name="email"
|
||||
autoComplete="username"
|
||||
type="email"
|
||||
value={user?.email}
|
||||
/>
|
||||
}
|
||||
autoComplete={"current-password"}
|
||||
fieldType="password"
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -40,7 +40,6 @@ export const CustomError = {
|
||||
BAD_REQUEST: "bad request",
|
||||
SUBSCRIPTION_NEEDED: "subscription not present",
|
||||
NOT_FOUND: "not found ",
|
||||
WEAK_DEVICE: "password decryption failed on the device",
|
||||
INCORRECT_PASSWORD: "incorrect password",
|
||||
INCORRECT_PASSWORD_OR_NO_ACCOUNT: "incorrect password or no such account",
|
||||
UPLOAD_CANCELLED: "upload cancelled",
|
||||
|
||||
326
web/yarn.lock
326
web/yarn.lock
@@ -151,7 +151,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.25.9"
|
||||
|
||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.25.0", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.27.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
|
||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.25.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
|
||||
version "7.27.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762"
|
||||
integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==
|
||||
@@ -750,127 +750,110 @@
|
||||
"@jridgewell/resolve-uri" "^3.1.0"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||
|
||||
"@mui/core-downloads-tracker@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.11.tgz#0752eea024d8ff0f120b0f26aee4342c79112847"
|
||||
integrity sha512-CzAQs9CTzlwbsF9ZYB4o4lLwBv1/qNE264NjuYao+ctAXsmlPtYa8RtER4UsUXSMxNN9Qi+aQdYcKl2sUpnmAw==
|
||||
"@mui/core-downloads-tracker@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.1.1.tgz#43532ccf57be19055eb20e7802508520293cf286"
|
||||
integrity sha512-yBckQs4aQ8mqukLnPC6ivIRv6guhaXi8snVl00VtyojBbm+l6VbVhyTSZ68Abcx7Ah8B+GZhrB7BOli+e+9LkQ==
|
||||
|
||||
"@mui/icons-material@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.4.11.tgz#add406d3d1c82e7aaf49002a8d456fa992e7f3db"
|
||||
integrity sha512-+jjJGIrB1awNbMv4ZVPPdN/p7O1UKFZ+xqRvNIQ8B1KnlID5hPMPBLM6UUbRF4bu3UDCbu79rn9Nye5LGNzmeA==
|
||||
"@mui/icons-material@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.1.1.tgz#0e0e9640579da5e4096f0449438337c448bc5a5c"
|
||||
integrity sha512-X37+Yc8QpEnl0sYmz+WcLFy2dWgNRzbswDzLPXG7QU1XDVlP5TPp1HXjdmCupOWLL/I9m1fyhcyZl8/HPpp/Cg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
|
||||
"@mui/material@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.4.11.tgz#ac5c42c25fc807545eef4de0e88a47b52de8ed75"
|
||||
integrity sha512-k2D3FLJS+/qD0qnd6ZlAjGFvaaxe1Dl10NyvpeDzIebMuYdn8VqYe6XBgGueEAtnzSJM4V03VD9kb5Fi24dnTA==
|
||||
"@mui/material@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.1.1.tgz#5f75b25936925be14cb34abe0489cda82a6f8413"
|
||||
integrity sha512-mTpdmdZCaHCGOH3SrYM41+XKvNL0iQfM9KlYgpSjgadXx/fEKhhvOktxm8++Xw6FFeOHoOiV+lzOI8X1rsv71A==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/core-downloads-tracker" "^6.4.11"
|
||||
"@mui/system" "^6.4.11"
|
||||
"@mui/types" "~7.2.24"
|
||||
"@mui/utils" "^6.4.9"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/core-downloads-tracker" "^7.1.1"
|
||||
"@mui/system" "^7.1.1"
|
||||
"@mui/types" "^7.4.3"
|
||||
"@mui/utils" "^7.1.1"
|
||||
"@popperjs/core" "^2.11.8"
|
||||
"@types/react-transition-group" "^4.4.12"
|
||||
clsx "^2.1.1"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
react-is "^19.0.0"
|
||||
react-is "^19.1.0"
|
||||
react-transition-group "^4.4.5"
|
||||
|
||||
"@mui/private-theming@^6.4.9":
|
||||
version "6.4.9"
|
||||
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.4.9.tgz#0c1d65a638a1740aad0eb715d79e76471abe8175"
|
||||
integrity sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==
|
||||
"@mui/private-theming@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.1.1.tgz#c2ecc57a9b97fbfdd850430de500c42a0f2571fe"
|
||||
integrity sha512-M8NbLUx+armk2ZuaxBkkMk11ultnWmrPlN0Xe3jUEaBChg/mcxa5HWIWS1EE4DF36WRACaAHVAvyekWlDQf0PQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/utils" "^6.4.9"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/utils" "^7.1.1"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/styled-engine@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.4.11.tgz#a48f48165382943018f70519de1d31e036abb054"
|
||||
integrity sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==
|
||||
"@mui/styled-engine@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.1.1.tgz#2524e0f4e22782b42ea4c32f36f9e19a50ccf55a"
|
||||
integrity sha512-R2wpzmSN127j26HrCPYVQ53vvMcT5DaKLoWkrfwUYq3cYytL6TQrCH8JBH3z79B6g4nMZZVoaXrxO757AlShaw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@emotion/cache" "^11.13.5"
|
||||
"@emotion/serialize" "^1.3.3"
|
||||
"@emotion/sheet" "^1.4.0"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/system@^6.4.11":
|
||||
version "6.4.11"
|
||||
resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.4.11.tgz#f209e0792d008be2f75af41fada2ee9e06adeef2"
|
||||
integrity sha512-gibtsrZEwnDaT5+I/KloOj/yHluX5G8heknuxBpQOdEQ3Gc0avjSImn5hSeKp8D4thiwZiApuggIjZw1dQguUA==
|
||||
"@mui/system@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.1.1.tgz#eff52e597b0bfed8ecf2e973f4575ef737430727"
|
||||
integrity sha512-Kj1uhiqnj4Zo7PDjAOghtXJtNABunWvhcRU0O7RQJ7WOxeynoH6wXPcilphV8QTFtkKaip8EiNJRiCD+B3eROA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/private-theming" "^6.4.9"
|
||||
"@mui/styled-engine" "^6.4.11"
|
||||
"@mui/types" "~7.2.24"
|
||||
"@mui/utils" "^6.4.9"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/private-theming" "^7.1.1"
|
||||
"@mui/styled-engine" "^7.1.1"
|
||||
"@mui/types" "^7.4.3"
|
||||
"@mui/utils" "^7.1.1"
|
||||
clsx "^2.1.1"
|
||||
csstype "^3.1.3"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
"@mui/types@^7.4.1":
|
||||
version "7.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.1.tgz#5611268faa0b46ab0c622c02b54f3f30f9809c2d"
|
||||
integrity sha512-gUL8IIAI52CRXP/MixT1tJKt3SI6tVv4U/9soFsTtAsHzaJQptZ42ffdHZV3niX1ei0aUgMvOxBBN0KYqdG39g==
|
||||
"@mui/types@^7.4.3":
|
||||
version "7.4.3"
|
||||
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.3.tgz#b205ee3404db0478cd93227fc21967e2cb8630fe"
|
||||
integrity sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.0"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
|
||||
"@mui/types@~7.2.24":
|
||||
version "7.2.24"
|
||||
resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.24.tgz#5eff63129d9c29d80bbf2d2e561bd0690314dec2"
|
||||
integrity sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==
|
||||
|
||||
"@mui/utils@^5.16.6 || ^6.0.0 || ^7.0.0":
|
||||
version "7.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.0.2.tgz#b6842a9f979a619b65011a84a1964b85b205a9a4"
|
||||
integrity sha512-72gcuQjPzhj/MLmPHLCgZjy2VjOH4KniR/4qRtXTTXIEwbkgcN+Y5W/rC90rWtMmZbjt9svZev/z+QHUI4j74w==
|
||||
"@mui/utils@^7.0.2", "@mui/utils@^7.1.1":
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.1.1.tgz#de315ec45ac9e16c637dcc2b32cd7912edb4e234"
|
||||
integrity sha512-BkOt2q7MBYl7pweY2JWwfrlahhp+uGLR8S+EhiyRaofeRYUWL2YKbSGQvN4hgSN1i8poN0PaUiii1kEMrchvzg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.27.0"
|
||||
"@mui/types" "^7.4.1"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/types" "^7.4.3"
|
||||
"@types/prop-types" "^15.7.14"
|
||||
clsx "^2.1.1"
|
||||
prop-types "^15.8.1"
|
||||
react-is "^19.1.0"
|
||||
|
||||
"@mui/utils@^6.4.9":
|
||||
version "6.4.9"
|
||||
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.4.9.tgz#b0df01daa254c7c32a1a30b30a5179e19ef071a7"
|
||||
integrity sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==
|
||||
"@mui/x-date-pickers@^8.5.0":
|
||||
version "8.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-8.5.0.tgz#5a79e7e6c4d10b394a4005cb1eb29c8819961f9a"
|
||||
integrity sha512-pnivJhAopuu6C4uWbEEg7b8kDdPc7Ad0ANrlDzx4qZGUj9vFcc6n+hT7/kOFnn9uceszQmb07e3Ud+g/d8Z4vg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.26.0"
|
||||
"@mui/types" "~7.2.24"
|
||||
"@types/prop-types" "^15.7.14"
|
||||
clsx "^2.1.1"
|
||||
prop-types "^15.8.1"
|
||||
react-is "^19.0.0"
|
||||
|
||||
"@mui/x-date-pickers@^7.29.3":
|
||||
version "7.29.3"
|
||||
resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-7.29.3.tgz#7e8939d5fbc1626c5d6fd02d0b8107ad010d0c3a"
|
||||
integrity sha512-/A0/8fpLnEFeJKr5YQsI8jqlWPJlOtgfCGcqXHVDOLxgV3lW49+Kh5TZAc1yi6HKT3AG6k4DkNwTuu/RjJeMFA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.25.7"
|
||||
"@mui/utils" "^5.16.6 || ^6.0.0 || ^7.0.0"
|
||||
"@mui/x-internals" "7.29.0"
|
||||
"@types/react-transition-group" "^4.4.11"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/utils" "^7.0.2"
|
||||
"@mui/x-internals" "8.5.0"
|
||||
"@types/react-transition-group" "^4.4.12"
|
||||
clsx "^2.1.1"
|
||||
prop-types "^15.8.1"
|
||||
react-transition-group "^4.4.5"
|
||||
|
||||
"@mui/x-internals@7.29.0":
|
||||
version "7.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@mui/x-internals/-/x-internals-7.29.0.tgz#1f353b697ed1bf5594ac549556ade2e6841f4bf5"
|
||||
integrity sha512-+Gk6VTZIFD70XreWvdXBwKd8GZ2FlSCuecQFzm6znwqXg1ZsndavrhG9tkxpxo2fM1Zf7Tk8+HcOO0hCbhTQFA==
|
||||
"@mui/x-internals@8.5.0":
|
||||
version "8.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@mui/x-internals/-/x-internals-8.5.0.tgz#f1fbeb02804459ebc46d57b61a89adbb99d9d105"
|
||||
integrity sha512-Ef4KJij1pBGk6/xILyVZHf76tcuRpJIX30k4Ghklsd5QJujZ9ENCGAjvd7aWRAFAs5p3ffn0H8UDESoIcroj1Q==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.25.7"
|
||||
"@mui/utils" "^5.16.6 || ^6.0.0 || ^7.0.0"
|
||||
"@babel/runtime" "^7.27.1"
|
||||
"@mui/utils" "^7.0.2"
|
||||
|
||||
"@next/env@15.3.3":
|
||||
version "15.3.3"
|
||||
@@ -1192,7 +1175,7 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.1.tgz#a8d097b28247d1129cf56e74d1622c98978c04ed"
|
||||
integrity sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==
|
||||
|
||||
"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.11", "@types/react-transition-group@^4.4.12":
|
||||
"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.12":
|
||||
version "4.4.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044"
|
||||
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
|
||||
@@ -1216,78 +1199,78 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.5.tgz#8ce8623ed7a36e3a76d1c0b539708dfb2e859bc0"
|
||||
integrity sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA==
|
||||
|
||||
"@typescript-eslint/eslint-plugin@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.0.tgz#51ed03649575ba51bcee7efdbfd85283249b5447"
|
||||
integrity sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==
|
||||
"@typescript-eslint/eslint-plugin@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz#532641b416ed2afd5be893cddb2a58e9cd1f7a3e"
|
||||
integrity sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==
|
||||
dependencies:
|
||||
"@eslint-community/regexpp" "^4.10.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.0"
|
||||
"@typescript-eslint/type-utils" "8.33.0"
|
||||
"@typescript-eslint/utils" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/type-utils" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^7.0.0"
|
||||
natural-compare "^1.4.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/parser@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.0.tgz#8e523c2b447ad7cd6ac91b719d8b37449481784d"
|
||||
integrity sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==
|
||||
"@typescript-eslint/parser@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.1.tgz#ef9a5ee6aa37a6b4f46cc36d08a14f828238afe2"
|
||||
integrity sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/typescript-estree" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/project-service@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.0.tgz#71f37ef9010de47bf20963914743c5cbef851e08"
|
||||
integrity sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==
|
||||
"@typescript-eslint/project-service@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.1.tgz#c85e7d9a44d6a11fe64e73ac1ed47de55dc2bf9f"
|
||||
integrity sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==
|
||||
dependencies:
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.0"
|
||||
"@typescript-eslint/types" "^8.33.0"
|
||||
"@typescript-eslint/tsconfig-utils" "^8.33.1"
|
||||
"@typescript-eslint/types" "^8.33.1"
|
||||
debug "^4.3.4"
|
||||
|
||||
"@typescript-eslint/scope-manager@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.0.tgz#459cf0c49d410800b1a023b973c62d699b09bf4c"
|
||||
integrity sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==
|
||||
"@typescript-eslint/scope-manager@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz#d1e0efb296da5097d054bc9972e69878a2afea73"
|
||||
integrity sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
|
||||
"@typescript-eslint/tsconfig-utils@8.33.0", "@typescript-eslint/tsconfig-utils@^8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.0.tgz#316adab038bbdc43e448781d5a816c2973eab73e"
|
||||
integrity sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==
|
||||
"@typescript-eslint/tsconfig-utils@8.33.1", "@typescript-eslint/tsconfig-utils@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz#7836afcc097a4657a5ed56670851a450d8b70ab8"
|
||||
integrity sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==
|
||||
|
||||
"@typescript-eslint/type-utils@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.0.tgz#f06124b2d6db8a51b24990cb123c9543af93fef5"
|
||||
integrity sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==
|
||||
"@typescript-eslint/type-utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz#d73ee1a29d8a0abe60d4abbff4f1d040f0de15fa"
|
||||
integrity sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==
|
||||
dependencies:
|
||||
"@typescript-eslint/typescript-estree" "8.33.0"
|
||||
"@typescript-eslint/utils" "8.33.0"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
debug "^4.3.4"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/types@8.33.0", "@typescript-eslint/types@^8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.0.tgz#02a7dbba611a8abf1ad2a9e00f72f7b94b5ab0ee"
|
||||
integrity sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==
|
||||
"@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f"
|
||||
integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==
|
||||
|
||||
"@typescript-eslint/typescript-estree@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.0.tgz#abcc1d3db75a8e9fd2e274ee8c4099fa2399abfd"
|
||||
integrity sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==
|
||||
"@typescript-eslint/typescript-estree@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d"
|
||||
integrity sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==
|
||||
dependencies:
|
||||
"@typescript-eslint/project-service" "8.33.0"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/visitor-keys" "8.33.0"
|
||||
"@typescript-eslint/project-service" "8.33.1"
|
||||
"@typescript-eslint/tsconfig-utils" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/visitor-keys" "8.33.1"
|
||||
debug "^4.3.4"
|
||||
fast-glob "^3.3.2"
|
||||
is-glob "^4.0.3"
|
||||
@@ -1295,22 +1278,22 @@
|
||||
semver "^7.6.0"
|
||||
ts-api-utils "^2.1.0"
|
||||
|
||||
"@typescript-eslint/utils@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.0.tgz#574ad5edee371077b9e28ca6fb804f2440f447c1"
|
||||
integrity sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==
|
||||
"@typescript-eslint/utils@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.1.tgz#ea22f40d3553da090f928cf17907e963643d4b96"
|
||||
integrity sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.7.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/typescript-estree" "8.33.0"
|
||||
"@typescript-eslint/scope-manager" "8.33.1"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
"@typescript-eslint/typescript-estree" "8.33.1"
|
||||
|
||||
"@typescript-eslint/visitor-keys@8.33.0":
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.0.tgz#fbae16fd3594531f8cad95d421125d634e9974fe"
|
||||
integrity sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==
|
||||
"@typescript-eslint/visitor-keys@8.33.1":
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc"
|
||||
integrity sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "8.33.0"
|
||||
"@typescript-eslint/types" "8.33.1"
|
||||
eslint-visitor-keys "^4.2.0"
|
||||
|
||||
"@vercel/edge@^1.2.1":
|
||||
@@ -1318,10 +1301,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@vercel/edge/-/edge-1.2.1.tgz#d74298f01912ea2940546f4b7639dc8619f4c89e"
|
||||
integrity sha512-1++yncEyIAi68D3UEOlytYb1IUcIulMWdoSzX2h9LuSeeyR7JtaIgR8DcTQ6+DmYOQn+5MCh6LY+UmK6QBByNA==
|
||||
|
||||
"@vitejs/plugin-react@^4.5.0":
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.5.0.tgz#ef2bad6be3031af2b2105b7ab2754f710e890a32"
|
||||
integrity sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==
|
||||
"@vitejs/plugin-react@^4.5.1":
|
||||
version "4.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz#19432712467ad3b81f24c85d695a6febf8d4cc11"
|
||||
integrity sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==
|
||||
dependencies:
|
||||
"@babel/core" "^7.26.10"
|
||||
"@babel/plugin-transform-react-jsx-self" "^7.25.9"
|
||||
@@ -1582,10 +1565,10 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001688:
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8"
|
||||
integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==
|
||||
|
||||
ce-la-react@^0.1.3:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/ce-la-react/-/ce-la-react-0.1.3.tgz#ccb34ec24091bd8be3da40ddcedb4a99ae1db72f"
|
||||
integrity sha512-zZwEEJv9XukeEGbswQXObaDJjYAufOIilSnDg4BWCpKNEYN84H9fpaB+wl+rYKWOIH4wBBPbLnOxKvDIwsL/JQ==
|
||||
ce-la-react@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/ce-la-react/-/ce-la-react-0.3.0.tgz#8935d42dfd44963fd3c107c267c93aab3330891a"
|
||||
integrity sha512-84SEDLNHaAjykzlkqgKRq95hA3qnxrsTrwh4hTgBq6tfpINqajxz4bkz9q4orhUfpqDPQRgdCzYTF3bHcvTIlQ==
|
||||
|
||||
chalk@^4.0.0, chalk@^4.1.2:
|
||||
version "4.1.2"
|
||||
@@ -2973,13 +2956,13 @@ math-intrinsics@^1.1.0:
|
||||
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
|
||||
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
|
||||
|
||||
media-chrome@^4.10.0:
|
||||
version "4.10.0"
|
||||
resolved "https://registry.yarnpkg.com/media-chrome/-/media-chrome-4.10.0.tgz#9d79222e40ab09db1b013d13889de0150ad22d4b"
|
||||
integrity sha512-XA37xpQaI3IqTpBj8C46RD3DHkEl/KMKrIfNZYQBSm7JTRfsRQKluDGD8nCQ5ZkZdovmI4zSkY9mSjVEN9qsJw==
|
||||
media-chrome@^4.11.0:
|
||||
version "4.11.0"
|
||||
resolved "https://registry.yarnpkg.com/media-chrome/-/media-chrome-4.11.0.tgz#3ccce6d5104b55215d121c93ad4a6197d88d52f3"
|
||||
integrity sha512-DfV64DbQTZRkTkbwwXARLy6NX/Xp9fM3iS3dnuWIcmWiIzkTiw/Q6UMMuAXCrN3if6Cb+wLz9vKq23OGwS7MEA==
|
||||
dependencies:
|
||||
"@vercel/edge" "^1.2.1"
|
||||
ce-la-react "^0.1.3"
|
||||
ce-la-react "^0.3.0"
|
||||
|
||||
media-tracks@^0.3.3:
|
||||
version "0.3.3"
|
||||
@@ -3416,11 +3399,6 @@ react-is@^16.13.1, react-is@^16.7.0:
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
||||
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
||||
|
||||
react-is@^19.0.0:
|
||||
version "19.0.0"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0.tgz#d6669fd389ff022a9684f708cf6fa4962d1fea7a"
|
||||
integrity sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==
|
||||
|
||||
react-is@^19.1.0:
|
||||
version "19.1.0"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.0.tgz#805bce321546b7e14c084989c77022351bbdd11b"
|
||||
@@ -4110,14 +4088,14 @@ typed-array-length@^1.0.7:
|
||||
possible-typed-array-names "^1.0.0"
|
||||
reflect.getprototypeof "^1.0.6"
|
||||
|
||||
typescript-eslint@^8.33.0:
|
||||
version "8.33.0"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.0.tgz#89f733a90edc6abe0994b6130b964e781a1ba82f"
|
||||
integrity sha512-5YmNhF24ylCsvdNW2oJwMzTbaeO4bg90KeGtMjUw0AGtHksgEPLRTUil+coHwCfiu4QjVJFnjp94DmU6zV7DhQ==
|
||||
typescript-eslint@^8.33.1:
|
||||
version "8.33.1"
|
||||
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff"
|
||||
integrity sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin" "8.33.0"
|
||||
"@typescript-eslint/parser" "8.33.0"
|
||||
"@typescript-eslint/utils" "8.33.0"
|
||||
"@typescript-eslint/eslint-plugin" "8.33.1"
|
||||
"@typescript-eslint/parser" "8.33.1"
|
||||
"@typescript-eslint/utils" "8.33.1"
|
||||
|
||||
typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
@@ -4314,10 +4292,10 @@ yup@^1.6.1:
|
||||
toposort "^2.0.2"
|
||||
type-fest "^2.19.0"
|
||||
|
||||
zod@^3.25.48:
|
||||
version "3.25.48"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.48.tgz#6c2b536fbb519905e8f4a4ac58743de4d5331bb2"
|
||||
integrity sha512-0X1mz8FtgEIvaxGjdIImYpZEaZMrund9pGXm3M6vM7Reba0e2eI71KPjSCGXBfwKDPwPoywf6waUKc3/tFvX2Q==
|
||||
zod@^3.25.51:
|
||||
version "3.25.51"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.51.tgz#aa2cf648e54f6f060f139cf77b694819f63c9f3a"
|
||||
integrity sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==
|
||||
|
||||
zxcvbn@^4.4.2:
|
||||
version "4.4.2"
|
||||
|
||||
Reference in New Issue
Block a user