From b68e7c6b9a32f7f5288aeca84991304f578739c8 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 09:03:58 +0100 Subject: [PATCH 01/12] feat(auth): implement welcome page with auth --- index.html | 1 + package.json | 14 +- src/App.css | 42 - src/App.tsx | 1 - src/assets/images/welcome/welcome-image.webp | Bin 0 -> 344690 bytes src/assets/logos/small-logo.svg | 15 + src/features/welcome/index.tsx | 62 + src/hooks/useAuth.ts | 120 ++ src/i18n/locales/en.json | 16 +- src/index.css | 217 ++- src/routes/index.tsx | 13 +- src/{ => routes}/layouts/RootLayout.tsx | 0 src/routes/paths.ts | 1 + src/services/auth/auth.service.ts | 116 ++ src/services/auth/oauth.service.ts | 310 ++++ src/services/config/config.errors.ts | 7 + src/services/config/config.service.ts | 33 + src/services/crypto/crypto.service.ts | 163 ++ src/services/crypto/errors/keys.errors.ts | 39 + src/services/crypto/keys.service.ts | 245 +++ src/services/crypto/pgp.service.ts | 35 + src/services/local-storage.service.ts | 74 + src/services/payments.service.ts | 23 + src/services/sdk.service.ts | 77 + src/types/index.ts | 56 + tsconfig.app.json | 2 +- vite.config.ts | 18 +- yarn.lock | 1451 +++++++++++++++++- 28 files changed, 3031 insertions(+), 120 deletions(-) delete mode 100644 src/App.css create mode 100644 src/assets/images/welcome/welcome-image.webp create mode 100644 src/assets/logos/small-logo.svg create mode 100644 src/features/welcome/index.tsx create mode 100644 src/hooks/useAuth.ts rename src/{ => routes}/layouts/RootLayout.tsx (100%) create mode 100644 src/services/auth/auth.service.ts create mode 100644 src/services/auth/oauth.service.ts create mode 100644 src/services/config/config.errors.ts create mode 100644 src/services/config/config.service.ts create mode 100644 src/services/crypto/crypto.service.ts create mode 100644 src/services/crypto/errors/keys.errors.ts create mode 100644 src/services/crypto/keys.service.ts create mode 100644 src/services/crypto/pgp.service.ts create mode 100644 src/services/local-storage.service.ts create mode 100644 src/services/payments.service.ts create mode 100644 src/services/sdk.service.ts create mode 100644 src/types/index.ts diff --git a/index.html b/index.html index 327a4de..7aaf0fd 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,7 @@ + mail-web diff --git a/package.json b/package.json index 2f7eec4..c15d310 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,13 @@ "preview": "vite preview" }, "dependencies": { + "@dashlane/pqc-kem-kyber512-browser": "^1.0.0", + "@internxt/css-config": "^1.1.0", + "@internxt/lib": "^1.4.1", + "@internxt/sdk": "^1.15.1", "@internxt/ui": "^0.1.6", "@phosphor-icons/react": "^2.1.10", + "@tailwindcss/vite": "^4.2.1", "@tiptap/extension-color": "^3.20.0", "@tiptap/extension-font-family": "^3.20.0", "@tiptap/extension-image": "^3.20.0", @@ -23,14 +28,16 @@ "@tiptap/starter-kit": "^3.20.0", "dayjs": "^1.11.19", "i18next": "^25.8.13", + "openpgp": "^6.3.0", "react": "^19.2.0", "react-dom": "^19.2.0", "react-i18next": "^16.5.4", - "react-router-dom": "^7.13.1" + "react-router-dom": "^7.13.1", + "tailwindcss": "^4.2.1" }, "devDependencies": { "@eslint/js": "^9.39.1", - "@types/node": "^24.10.1", + "@types/node": "^25.3.3", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", @@ -40,6 +47,7 @@ "globals": "^16.5.0", "typescript": "~5.9.3", "typescript-eslint": "^8.48.0", - "vite": "^7.3.1" + "vite": "^7.3.1", + "vite-plugin-node-polyfills": "^0.25.0" } } diff --git a/src/App.css b/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.tsx b/src/App.tsx index d6fc2f2..0bf4e87 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,5 @@ import { RouterProvider, createBrowserRouter } from 'react-router-dom' import { routes } from './routes' -import './App.css' const router = createBrowserRouter(routes) diff --git a/src/assets/images/welcome/welcome-image.webp b/src/assets/images/welcome/welcome-image.webp new file mode 100644 index 0000000000000000000000000000000000000000..745fb255b6b0836c7ff33109025235047966c5bb GIT binary patch literal 344690 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℘z$qLVl03y`|slcta9wM_dvkH!eP+HDt%4Q8F-6mAlVor6P4ooH68Tlc|z%kpVy5yDW z1gigJk_3uHq0*rIuezrgKHiGlJthU51T zdu~m&zYgrp#2y&AzR#kb<-iC_Aa*;L6#>)QxfOmHNJ@GkVpBMXW5TFZwft1T z(k2OY1%vI(R`Dru#!r2Od+x=+!?AM1DSyP{A9?)6M?C-Xd0h(r%Cjv?qYV6G4nW?Q z=ZDLqW9?!fJse^jJtBCWZ#8)>J|+8|B`e}Sw)*`Qw9ijh!MxtFP3nMAt7Z>iREZVppo+Gxh7=CTUCd|7|4HLi$nFIBJ z1}7JY)Q#jRo>I__P#OO7n;j{jfKh94=ke&WIe>#^{?r!G#Y+JdB>I<%ef#SV*yo70 zZzej7vKD%{hARYkDtx$W@ic1p0pIrqIW+@W0A%}e&JMNS`Y))fXyY{ShzR6%n3}DL z_3DZT;*k?nQH7H3Q~~tjdgOu9bZVjNE33n@YsH3C^(R&~sqf5WKN^C!pqdDEP=mk+ ztbd4@ZO8I=WHYO#o%_(^;#*&?O~nC}sa%R3?gnl$$3VX~L=z(6s2veCgsgLxrW zGPCWh#F~2K&9e|Q0o^DR(l<;?{+W`i=x%^1(QhK~sb1>)y5WzhM#$H@yrg>g`wMlT zf@Yjfj3@*>8rm=>dr~-a(fT<1Vs7Pq=lK7JT>G`RduZ%gq0zeo_<9nZ-=Y(Gj0|Cl zD0%bW2H6b8>cRFuwWvg4-3I0bMb?Dax~9;P2~R7h3=-4TH#1_XC> zC43$qZCH{?9~sB1j}<<@u7)T{Dx=kF@!O6;)0^BK^dW9adf3*@?$WLLDD6x(o=Vb- zEFx#7%+}Bo?XCJ{scU%}fo${l^*|4Yz87_v10y{(vAq&Pw(L1thBzVkvN0n<-*zh0 zQT-lDDBf!gdMc(Km65PLFNUkSMfesZ{0{Vzp*TUT>V`RSw2XU=S6u&`UkvT^Ax~fz z0RZbPqaH1Ev8V0KW!RZ}kqt;Ge!hLD3A=7TUA4uEMr){ou&FA8+ z@dbjB8oFUjPk1kW6li`leN#c+sf*0~a=vpC^?w@iPV$6qh{^sq#z==LM;N%$HjJMz zR_HEPN*kgg4md01@9P$*QzdHTf5A*-=U$D`u$@lkp+KWO7Vl|}w>5r^?7%;lN$s>D zlrm4Cot~%;4wm7Q^7wgLq~WPO$>3W9O9=~Ar|X6RU~nQ#e7|%YQI`?E$?JDC`^8zP3j+e-OI=!o0=+W%m-&!ga^zcjrx?+atZBE-dGa z-MbWMZQMbRrcTW6`_PaA1^xAfRBGb;*wST6gR!)iNumYVgbNVw&artp4N%jp@=qF8 z7|u7?Nbt_`;F*TE5>?zqk<+#n6forv{*~*DIkrQ$c%Us_v4U2mVS$sA01 zfyMl$oe!4~_8=3Bp0IkHMD7sJwf4?^_ZsxS%?@!hHuEwbQX>!8@D>bt_gc+V4(Luz z&MRn90$BrKo`|DkrGMZ2+GZD#w$lCZPUk^x|AyIRw`=u{hclbFO=58Uv7{T%)2bXhS4_XbRUgq$Xd-4V z>IxZ3RIkqn9{zRGVF%{B`5QZ%`>+V4VY>A=kF#L`F{jrKB6ZnCt?%gf*b#mwq8JL+ z$53lsTnCD*;+El;Bk-xauFZXSaEM&8E0xTsrGd@dZAg!!)^$keY??8JxvME`(mTY{ zJBr5e>^83Y2gbq6GA_%TqjeUdj@M3ABkfbgPc?%QGQOZT4~=%x68g{3)?1WkNW*DO zwBWUewvb-cn%C3Mo=EJko)gKDy3EE1QOia*>bxmr+F{q#5M^w)nYT5DUksX2LiN^6 zN{@l6n?jGL5;zg`G!8nZax;vL3!*Oqo0v2I;5!9&xy&=7K%^UwI|dxR;D2n(@#R&i zvK&JgFHmnH8a~3(i_??(Y_~6#g50vah{OQ8F5)xm9`QV+=~d4|(M2`#{Ael*`*P#9 z?QJ`$Vlg6E3wv?keNEk|Od?R)04_}2U~|w=4fOl8(ed` zcR?8I_ZR!|Uz5~Fx(h|KgNbEWZ)w?}3dXrD$rZb05o*f4;7T=J^9&#&jbqGhWxI1X zl|R6y)y1g=dbOl+HQin=m7FeJhER>}30dxM0!Pz$)Y`YiOHJX>KwEWXxt)?gRCc4V zPfO_G*#iHwqa_dSle!KOl~6R}z!50Sze{aaEuxp5U;#NYfv=%%CthUa2@ zC)PPKa(ctt3B0UBeYDW;SaI9DCT9b}LAYZkbOtmNPj>yP0cm(nSm!3Wkw3M@q)DdY ze(RA@w@f}o?4`Nov}@N5a}C>>`I@a?Wo^Z;ZqW9{51d4ZmX(zq5m>%xr09CI#r2p$be8* zw9zN+)>{Br|7Qb)Nd~>rw@+HQMANQ%-6&$(@*XWIK`KKqS&U*?B6nVWf;4=E9c?05?XJo~L?st0r@Cg&Bj zD1j`2uunu$vC_Zq{%tc0$lGat_$PCp)-n6utHNogz|U^NpuI0MfJvwQJ>amXBS=Nm zYaM;olAYdav|bJjn=r_JxOa)lDIiWKn4d71QlXfFwKon<%l%!1J-+$OO&e%R6t=jqiB9jm5a;Hr=4r?e3>7j*>; zr7BnFgb#l@=`e%yUHpxm&HdN}QZU_moJZNPfSA+khY>pLqSp8Hd+Z3m6VVI>Yh$Q2 zuC4>cR&h&k%aQn0-PdNmySPLySry9WR8qj^?lz=H(d#;-bT&;G!raxAwrL&WX`RJm zcy=3CeFNiQ<(U^{&C$AxQAca1Dv|c7;-{Lyi5Xu|8wbX_X$gI2=xZ&?Go)d(rrK~? z!`nzNYRzlu=g%Z|SI-IL$lYdR1SsXB8}(ikvTZQy>WDJ7Tg=;d%Rz2gUPNL5T^Df~^^bU-Qgo{4q3EKT`F=DN1^u~k+jh2{ z)UgH-RJRylQP*;w7f==pZe+vfR$eASydi*e9j* zaO{DJ8=;vZcdR(=-V-x{;UL^GlR5($38%Y$)c~}-CoFT5T*#l=<5DEkaX)p) zsN1F=BKA_;^4c})hPj6A%>2z(ud=q{*SBbUVu#KmL`zD_j`8)J)Ncx#M?27^@!%cC zZMUM<2bw0$=4d<3D{IPPA^%b$P-7R1{Wn~^Mx%5zO>bNbX!gn4^2^`VKbKXgrjDeS z?howGY#D2QC{Y;ometJl)}WRcc3Spc2V$Tzt~+H}W{DqO*za-Ax~x8y)5D_Uri z_UkQxEPu0s!X$%U>076*Tq0@LJ#LgSZFwRVa{->ahwc~FmeChm=j-xE6CPl3e<`O! z<-|RR1mfqc9;XpIgfs1Zv!8v&y)W}aoJ`HU%!ibS!}dG{gC2d>vsDAS6O(g_+7v*R zK-eduDA?&=_y0DTh2(9tzkCz9&+8cd?^WS6)8J>fVNhO|nZP8|{+{qyQ<0=1>NSqO z>q$=UHCitR22Ge`KU_P+9MaI&(B=O8> zf9t_wi?WcqH4gvbwpnf3{bOOw=I#?%oIh-72J`glhYr=#FYr}I^i$dhnTxuDhEkO) z^TG$eophK%`L6y(&gTB?0x1}7y-p+S*g#Ba^}~prc2R44`aSjpUy1030=2Q!8rN3= z;;T5NxMj%vDsJnuUtQcH7c7e9b1Erdb9Wn3Bk1*=QaT$ZjA3qS%3Cy!@ifljvAjDC ztGtaF@h9w(T)1A3RyOob@fCUTP@~o&0&|rCX`UUb(0dK;A*DO zqv^zs1bqzyj;WlC<0C@oi@>Jl4FC8J!CkI%4Cs(42IJ1bhc9>^+cNxlRcdU95XKAC z8_0%_u(YD|hFHd<_v;8*X;e4%E}HCLdlC*^pBG zpeRrR<-mG?DEht6W3F&%kg7!NR)@pnaE8BD)Q#?3MOSe*{}8$O{1OYQuy!=<2KvT zYXi*_X7e;1=9RVOF%bW$5hyW>#r~VFUL#Su8YZ`{1~hwQ?RjPI>YvN1)Kf=NOZNx% zXSNKr)}FO5SwEb>CH$$l1fkv+Uqs*{%3lwALnPi>^w8Kr zo;}uH@`)%UeYQCAvQ_Kpelkew8!UiM>0}$+qU}0k$CWN%&$&*OVq5Yc6cw#BN&9t{ zz!pE*z~K@>uXL@`)~*pW>z=nt7`D8T3ps$#UBmYa>q}^ht@HKyBZ-eNIKPzBq4MG$ z!~$`1)(=yNox&ORzS+;d<6f8fq0S~|-eyC}L}B|L0>O_y>shLS-3iIL#cc{8OCW3$ z(G+ZSulxU-Ov3Uu+F!m2+~@U-e)p>InrZMe+pwrFOU&RBY5z}nEGfv+5p^2JUv;FX zcbcsigM%i_G9RuT;&O^e6N%<0%qA45W+1Ii!;`ZAS92W#cIg?8NTTCuT#|U^G(Yv= zu|?TPT^fgf@Y^i5?S8Sa=5u!mtWF=cG=q8ibwh`0>6iE_qxvcB1Wd)J4kFfbmtF zQrt4+eib)$*{`nd5et?@a=DchusOSpsS)&g&Z!*@lSVMNHDxWDM|hfNaai6RhSlFd z_}DpSMcH$7Zlcst+Ud%qeX4k==CEQ$SJVc<@vhoJUs?JZ%W{nA7;P!GoEEV5(hJ(N zTKakO$sLvR!g(?`S(w2JIcUcHSA{H_Ogj3a46T;)Hs-L);gd=zUb@MNQSdcWXi@ay zM*=>EfyY$NMsbm$bVcA(a|VC>2Vkz(Ifisd6oYZ+V8fTZ5AB(LJgT)eLx^Jq>J8*W zN7!0XdUAhFmgVx$Tb5Um7=RZ=+(vz4-Y1luD!J%-D5kz&jRiq}Zd`WVt*3P?MkGrC zZ*Dvfsk^l)gi0Gg1<9L?4tfd!E*2}Y~FVT1%xta**Bw{B+gr}z}wxV0d! zRLyQ{_0vxUpB$`QT6D?QENNcwLYn^yRVX}mfJ3vR5pGqOkuj?{Ju>3tkKAYw-7 zXPS8bZWaU8yS1{-{UfziO^*%;0!PHw4(U@ zl(#&#je6m(VY_obGgYhXt+=)A+8)@U^N5iW(z2txeP=Zr!lu#A^eKFJ2XUKi=(U07 ziL-f{4)aRd@|cK!)QFTA#p3@>*Dn#M-3=34*8>_ovUa?(_w`TZ)oLlDsU`b^`!m}H zTI)|*m#pU2tn-!)#O-B+L~GZ+AN9TbpOXGm+yYSV3$LPZ5oIrjy`hqCEqZ8dAkQA_ zFL^|i5t6?ooD~G2_aYFlXGSO0g~Z5DE&`nk4FZYrnsv`xr3_nMNQIohXRhJgfqY0&v`4`Km0 zx$6h1#7^N1`(JG5-*K-?{LtqUGjB5?Pw&8A^_8*MM&1nzVC#y@-2cuh3;8SU6q7p3NK2{iwwycQJXX$ZQFW3Rf>Q@hPp zi^0K@W*HCH4)HlfBniax6Xp{NR5K7(rs2uif2+BUfje}J$0Sj4w5~}!a~dD|@K~bk zq%Ms^zxZvITXw%#*mF6%gw`hy+ZsW<{W_t;wRFq;6;b^Z_JSs2?x3NRrAqwpf$!&C zCJ=sWzmc=KzqPR;wN2{THgMTeSsI^dLe+VY;^{;)xdbF&M9sg zaz6^2y6o52cL;^cBDq}3idY=o#?*-VJ!e#ohRLHCTbi<#%_F=`Gq|j84#R5ipnPl` zvm)%dx;Ig3DD8CRQa;r@RP$IdBP;3yVEETqV6L;vF{VgPL*8rJrq-4FUEqPzqc+sZr0PfmLn1+fVa0E z2h`o#l)@zqpaSI0#s@tG0P+55(Y|D^819)46{j7cLV=l3F}24#r*sjHzj1%R75P0x zd!V#iI5?J7hW4GB0IX}0+>u+hQ5LML-UOpn-!Q@gDAqj2)?2qTc~krfZCqNASF2h_ z6J6Ef=~=?%*kuUb;FX@{@FaaVjZLe3M6})=1O>NNTbbD;1xIQ-1oXa+9gs02bTiF7 zf42((>fPGeX8w`ds;0-btC%Fg!5zZ}NC;m8L{e<&JV|nG^e5YDAiDC+@iw8+60uUdmgZ zTSmQb*D&3=pP8!F_Ey|l_U#XBQ2E42iD_9;-afOMjp0*h=Xw;rJOjARw)9%S^F-Oa z%?Ej9pz{D=hwYfTb<-DR)^kM?jl zM38IUD|Gd%giSi3LWmN`8wB)48yzeD z|K`&$yp6V(?}B$Z{bL`!>bxeJd<^#NDhtx{I0Tx1)7}dTax{cpMzPo3X(`?2t3}}8 z$+HZH>xX!pqLKvSd5QB0g(?|{D^qaf?7!9A$3UIBMq`pFxY}1Fo;i&V{dg=;o7=o{tBr6ihDs5F?Uc<%2K6%ctH2_u9FBq zHQ&hD+~3`RMI#N@sl$`+P<&j*jWkoCwZsTf1eIB!_M?+-Mj4jPsOJ;vo_z90 zWqk0SOpVrNFhY)6F~3#eOD59}zNmvMWxUO~tTOmy(uxY(4$!OMXNGg0-fJKW?(v0>}F}93n_H z?v=WF)xsv7bJpoY7T1y?XD}J-xPIY%X>Ad8zJ9+XaWUox7xJ2PK3qfCfKD!Y!Rm1n zxI;eI+d22#YtsKTImFD{%*c62j6Y+*STX0_Yc)_ip*c4=t)WB-WDSCPB8`rf|9|so zm|jNPOZUM$oc^(o-t}G+O+E&Db`=Hbd7J`GKk4rUg*h5RE~8lM?zEKd^HrkoaAetr zL-oVFPEkn$aXiHNgu;~!#1*Nya&}+p?qi@%-6Ju{6kKg9l207QhyJ`4D7z^Oqfqbu z8)cT=uhupk&Tio~iNp5BkZ(UusBrCFGXDise?>i@iI}^nC}k;9zdRs&`PWH=ADZvv zZ0>LFz#@@`>(t^t&4dKTpIkVJ*JT#BzoXw^MfjeGU@Kc4L9KOg9xAhnTZUYZ!lv%K zHTB)XA#%vBS2CiO2RCuGB0i5<)gz&@XvP-itfjL^?-NY!D;vYG+Pml<8wV`NyDn~x z)LM!=T{%>bwNDj1)(l9>`heIzHQPu_>pw$TZc&{h4W%~Ig4Q0|L3>tfUr#=HBeK4D zPbNm|GZ-O9EV2~i!SOx{Ap;|KCdO+x`{D6=o6E)F&-em#L$EmL&I2V%PxPvSucDTN z?DGA+n^tT6fB+3i>Ha{c56Vjh0D=4#dUg7bXV&hpv0vG+- zNtfQ$mG5@4n{3v|jP!L@j0C!1mGg8e*6&e3Kb+GBM=7%FT-m-AnkMccR$=wDyzkU2 z#GmX>h}UK>5QN+mmk}q>pncJt16Mgk$=pMpfd6Fim$S5;_`6k9D>)^|baS3CQ!c!T zO*@ruCuu7sH~_uW`76v%L9>>)7g0cgb*`6)a7kE_UFJyo1LU4)_i?kzVy)h!jffPMP@fTr`Go$*z?D23#xu9K_HW zO^Dz#?bzAsr1Ox2vm9Lu-IjCJXd`oZTeG<)Y zc0m11|U3fv9UYMqIH3D9bw1Z$XAOOaWu;YbwZn-oc$zw{foYougz_N_!ddr3n}1S z>8SM8VJtQycDm;;=A1J8DHvuo2IRrU!h)Mzi=i+INCNMyf5kS@VYQw17dNOI%jaRB zo7bEQ4JZK05o~7gA}+n=J)y&uuQbVaXPFy7^Y0p9A8|dl$%$*XX`>==pqvM3A~>ik z=b|2IRe*V4bQz;*9adG!3*@42XP-CJ<`sA5$4r}ps5PnOOlif!wm{FRA>C+dt;B@UwR4k_r#=&G4~ZNNDjzD7l#G+_dSju zinIXo*B=0^m$;NZ(7M#mm1o}`hN?-mJ{zU(IMR^eVzrb60Dxhc17GxpXw}vgzK_0~ zv)F;1#ao|5ZL__v()!L2jOWJZtCK(*3AjC(os(>9R3Qj!Qo&&W;s9VGW>Cy*ic3_$ z8+LYIT_ho*lL5)ZeKjrgV~Knz!13PR{*^gcl?ESyL;Pc2>UKr1EPuEC*Zzm;kFqiN4pWX^{wnNtyx&r=Os$tF zgn&mnz(T=5E+zh8M=M7{1*mHB!jC$W6)hRju@8MMkioIQ;s(u`nBl{?A}x2ZZ|U@EcqW-s4mUhy}yz5B>0+sU8!A=Wf+ z^*eJr)DAIv8J^i?ETx|M{B^8#9i52;FO0Qrz@5MR5Os64^SY01W&|EY>LRsMFNSbj z8ET$X!eVIT_%IQ-K-U6JqfxtoSf9Ere|E}g}Q9D7X@kDF(La3X9NGu#TGRM zc$T{uduv9A8@H~Ih(~$Dr3sSpHTkc2Rov}%I2n>hIqBS)nm$0sGK0_#jnrGKcp8`K zTtQ$8yBx3Tbakj?P2<~vik)z1gZZ)r=-|IsH>nJ}<@>8tYI1)w$2=4z6K`gG%BI3b z+C&7fLWh(=Kl%^;e8jcXNNUHLZscM%eUIB!lST}V{eE!1`dA{?Z|_kB#9)0IZ?|pO zc*c)#fPi4MZYunCd)bv?nR7WFNJ+f2^L8k!x6V16kHm+b;wOk+@(`u*@cS_!0%dh;f7;=a~#zW!TqkHTPZ z(es@1m-#Gav6r2+-Xa5?RF)nX0z9aOru}(WmqdgLFK>O9g8HQu^fti1edj!rB<>1c z0niY&BYe{TQ>1rc73B>YOE$Qs)^n%Wd6R>b{!)34T2i|yWZUhZKf_>Q8Rwxg1mf&p zZ#z9K8r4mnU#AqvGdFSc>-np>@j1w zc`R*IK>Dw*XoF>896E0K1z1Ev#g`(AQHWlF+ZS6nMuYSKr|IIBF~~MdH6;ugh)@N2 zeAz$6x?{<($lh{FCg&&lFR~JYPZkElHtq@}1-%#bq%d42QdEUN{>LVR7(4PVc1A(N zqE6?^379v)um=^%tFli6@eMW-3Oeoln@rvO4be&KcAq{Q%fRM<1vbZEz2Ncptr*nL zB4JB2k-QR<3Uwvs;ksFlxaYOU?$7oq&I*(E%L|@$K(Z6J{K9xuW^um38TPu!5;I%{ zLa@R>vN*v&PYK?h8%YdCqDC*n*h{|II>fZnZmR6Z`fmIh@}Q6>w>c+~QqA!|Btyl3 z^0|q+?T`{RDLLMIKzJH8{&49{U!u_CNZtslqP)a%W#~d)$v}_Ht+gJ`8 z?fmof^iU3?-DA=CiD#HSzWYsOh6A z%stOS;2+@%!ybVFzElH(z+2yH24D(;#7Tt3bIh2)g_OOj_&6pp0o;t&l6N^t+uzZt zzX48DF&vONw+m{l!13HTF!RUYS8>sW@r@$gl=Vsql8|U4tR@m~^xpi#6xVR^pf)D( zy^iTi`kG&B$lOr{b(|%!2V`oA0X-Hmq)Sy7^V$%{h+bz_hE+zCOMGe9P7-E>Nniok zN5;`uui-!vWiqF#lcHB*LHQNSyYSvgL)NOaety5ouS7bU-@)O_O&{-*$LHlFUTeEs zRj?>k00)_q4Aev`snkh05pUi;#Gg`MiFylTv5t4^TIs2+_Lr@*Kd-9@DajoPF;l2Z z=Tm)>5&gT}S077=YgdJ7l|E`_m-0j*3r$7rwRviw)m1HTery#sfHI)2((wDZthyxx zI|uruU&-6wZ2FvS)VK7Wz>Deupa!_NTpq=i@1ACg&;7sYjijJ>+KakYNJ7=%fTsOq z_3C?W+J+FxoKHg4-LCxS&mLlPdCY zMK+hrKciQXfgGf20qS(?%#m;O0qDkI&G;!$&le>ZwHYPQeBJ>CEmz@UvVlD+Gv(c| zPw=!}zDYsoK@;ih?fni}ElIT5p7hYVqdz@NF0ZigB}McQR4cNlxH<(K4$`E$@yQXC zkj98KuAbN|omi}Q1{AxL2oo5eUlptr_YmovCtNEswvvNX3elChIKMc$4V^Em-{qU7+Ly^)hbxX&h4LQ+`Nm~o) z*O+$yq=f-_AR~8E;b9-Ac!f9u7xXow<17=zE8FqSH&6R9c}+O~as%pS`;iV9!b1Q2 zi`Uls`jDz25L9yu0gRGz`M-^hP6%|V&&x24@jGlb5UFW3a?rd|_o#x!2QHJpdJ~7p zMF|^Lj327JJz6CIWDbSzRUV;^)U{$f53Hp-*}L*!c27SgRDI|Yr7*rI?0z>}EZfC; zC{Kd=j)h?l!Y@4B*Up23jlO7J9b^`#pY%V)kZljNQC$Bz6c8GZa^P#s9fIIQGBZ68 z{g_9-CI%{ph-&79m<(z(*p5C5b_dpPn8)$$d>v?y67L}?ohalNNV!Ja(9LXJKJhl$ z$UXVvU$Rs=n!ZIP2?qu+Yx8`Vz)H+y!dLor$mX|>cPp`9BML>{%m8z@e$-2Sgdn0? zblhHkZE3Z<1E<58l>gQ=v%d$5?o@EzfcRY!JPef>+>sl^BZx|8<>JB7?pqUf?tfXE zM*(^A4ZfXuC~e}dndQB00=NE}4K)PxUMa>?VdZotmdsQ@RS*(>%FGXEUWZ`XIqh-#v;B&5f~5Vj!sne(EQIa365{`Yb#|$;C8v|_i z)&qw7e?0v?6a%RDSoD4(S>_LKzvV?vi+(#CG^>yV%>)@%KTqd46jhoE*Sck}#Vf~fZtnAL8BX9(}T4(-`WVV)=oka+;mmjqpx zVJIQ<4|CAC2lzs;$DlxOl>p$d7WdkLm;#`&5@9i1^CmDMWiM*J4hf7vcOy0Aoz7Br z_w;ISz*CgWM*~S^az{c; zRO%A>)Zb);e{T0x$I{{&)!|xYPnwyf{E-Mk(@}dZURtO%RZCmnn*~jv45%x#ygu$L zE{Q=7!TzaN@^<&zKBpUXE&V63BKm-60j@3A2eDIC>fGRJQ0^QY(dl` z3RDh499*x4)_RNh=+)$4M=2VBdYwA+BwPIedNG)DehO4G#mPnOMoDxZH-JG)Rrpw}pifGS z`FCs+{4E!+l2CdOMEZL>e?yi_Qf)S8y)-VU&(Bi}tL!`pQGEmz3hb%w4uMAlw5cw< zazte$F`^ACr?v|xRx2IBg)Zd+1jaBSlfn-Ga|}N>VSfiWZJAV=0Cn^57ep}ZV*Gei z;ki!moGLpd2pRWUnu9i=vDV!!r9A)FwW^d?i~DJyq<{iK3AwXV82;J29SV!sJAx;2={S9dN%LMTX_WW~A)Bem}Q%*nJfclxfL9T}%cSq# zgyHfLLPpi22kNg6R*66v1EG7>N2p`9Em)5O>nTq5Zv2=Xlh4UjA9@6-OfQN%AC1<_ zHt}AH6X3q1p;$xki_bST^Pu44Z<-f}Sp})*{SWbE8$<0BS3k~$1O}trxEk{ZV7L(s zjL$?rW)bg+fr_Ex8o8k+0~(DsBaecef%Ti_G5mX92U;VX7hGg}u= zyiK-p4}N&p?3E5?uaQYYLBWg~{NE-p60;dFmHwS_Ij!TJ%IsIj!jX5g037Y#wG!W9 z2q>1FHy59qT5WFt>G0-dKlP0)@4@1`l^i#qJ{Lrf10_Z`Bu4QF;u4wpc(8PPmc-q= zpVns4z+QZVZ>L^L8+faxd2d@lt^cNjO+h^uigA?Kd0h#mvlS2(LmRY^Y#BfiIaqn9S*H>vjf@Jq1ZN#dt83(|6-irsXuJ6x#v_1Av=G}CxupL8|)FE zYpj7IHNaFW3?vI9j1&a$o$2AUki=>vV*EXXyX}*#OHC%~uFQX?@4>Gs2?Bd_l6e&@ z-xLBwJXj7w=JH@#k+qQ#f-;FdJUkZW$3k9@Q1UP8aBm^`<@-h5=~TRu7C1V*yu5TN z?vVo8IeNp~UTN)Ipsgl1_{!xqUD{6B!@xDtv%Ha)4yD3g#0b*4B|P@#-Bn8}_3>sq zkgy%aRGqZL&{yy_w-JyqW3YwO8j_?T;qI&F_{eP745h3u+6D&h_|G*2qn~VX!wqXj zz}r2wfZ@L1&p%H^0O~!~Js*gcd4t>U`B77%-;T!(D&zq(K?YTi)A`N?6=-qW$;B*n zgk#xL>D*-r>IQS?YC5g73^U3TxkdDkqg->;y8^z3d48vY-_xH|8xPizh~_59Iqg6l zAVIoq%BoANCaOyFRqC#437gsa%tI0#{QnqWsy)RfHCv$B!aMInyLM8TXNm%(9zZlD z!53xNN(g+z-1II1{t&D&=nxy_KsYP~z4oAH0H`cPm`qnZ$&3hDOWLo4f@2UJ$jx~t zbCjLE{TiF_6y-A!$pf2kwyMkz9m9hUJbndt9T;C2(k-?(pL#eI&9vrmM{`ow9 zeo{r|yS24j0){)L4=4h<{+y0o^N(YUoyQO4= zEnWx;Z`My?B67c1elo}&IZ^-qh3{n;w46Jz7V?1|7LSe|?k-;vLC#Qd2SFy=TdvAHXX z1lH*?uO}2!X?(-_HF+2j%0{3br%t@d7XLsVjAk6)f|U&Ma#4Fxl3fSQ;1E*Peikbz z6VjtTUE2iz3q|YXlpcf;KAz6s(B+cUn@ySTO$(|s^VGuX`ws$CUqJ;zyDEEwpi#i> zDod{%kr_!0XoE`W?SjeGipOwaOSwRSF^mXg@Poh{!w=2aU%}2BW>qFY9en%+(F{8n zzaAAhZd1G`3XaJ_27T7K5FpyWnrVwSBqUej=%WMh%)Z7o36HPe30A~89U|vcym}zh zofy=Wu)dvnhj02wP#2N{H+4Q15&CzCQ-C3VLs~vE!8}5}zZ}za|FajA(~tKcKBjNE z5aEm@FaOBBeQ&?13ZfAOM=-D$$tN$H_}Jv&hf19Mvk2c4w!>ixmXlX43&k&bh%8WY z={xtKIDCXqk+o>S`m4j$qEH4v=w9_v>KN@yRwKar%2U0Yza|G{^YT?k-hnDp3*wH) z<8`vlyjP-x_%EpFRuKFm^UckC=r}mr=7r(bL27ybL;P6=(ECLd&-0-{0jT#b2E4)8 zE(Aj(Gtm#(gnQy(VyJkAu4qYs#-mM$-<~!5B}193DQ8m-YV&yTh`Dkf9aspP)|kToMkp1S3+rQ#Y6>B0VnQ6?^~26 z|JE~dc~jmz{eREmWZ@&nL#te@!1i_Mb`7JR*B`q-*rzxuPunamdDQ~QPT%th;Z>Q& z`vhm&>mW$Ya1{!}2?EID1pz!KdU$OlF&c>&zYk$9`(*19(@DCkvmfcZ@N3F~K%U&> zo<&PH#Q>2H76XvEyqFfGZDd4XjG|AE4+Xig(3hjsJd66A8_0fne$jV&RWBrkjt;Lc zFC7Ydq(HWgUaAvGmr%b-Kg#fBUajj&$wVB+w$S&o&7 z7vq(Q-OHX;nSrJ+zD@AMVSaog=#+5|5;3Z0toE^=b2r<`r5FeP6=3l&5cVSLu84tn z^shWn{(iw!(4N4c@A9xv0Cqm*82*${2&70Tvy4W7sERLDdwc1_V2(_>5?jY)c7CFz zUmzUP!;btXTQrqTK%@41L$i1RI-{a!Bg|2*O3UPwk^=d$_309Qi(Ze=N;*R${%cu- zFI**b7ZyHsL=M6zEB2|wI0==+z)$KU2{g)jv*tp$1Rgn>7%G?wH1}mX>=Ky>B>rFq zcvvEaeIb7&k|%O2Wg~PVz>d^tZ-+cc;4~}e-#>mSd*Cmu{J_F!nEiU?@bZ!qJZi6P zRQn5*|KOTRGbzB=mMIYLiS)UDBKk=9lAO`Rj&SVOSe2HxZRoa6{q$Djmk~P?|CKGE z%aM5z7kjyN(e|MwsL@3!RerC?)EkEnreQ&ATt2Q0Qc-T{d9PRA_%jjMB{g(&(0G;% ze}#9E;zwrZ({$m`rntM{1xQy8>W_J_ZSRGu)$5T-#rN`C%9(!|2$=Pp zv|4f9Wr;3C>Yy_AL1#~w+pqO)@ggt-ulfKK_(y)GS>i7w_`k#%vC{yClj<;zAbkn{ z5y9VyHyg9^zE~cmgZ*Du$tvKrw|g!^XYduWJYcpXr)>v5QjutmSSV{-$%6ovPU))g zzsMVU^gl7WqQH&`Ivc#x10are2GJ7tvqO^qsv!{V8a30`j#JxqD~G_FR&Qm!rg@ zib9z93!Ps2jV^`_Tj+{6^7zt5fEe8PcVP5GkFIEUPNC~567gVqd;rcuup@M%A+lJ> zw-AFxjq(9`F15notaT@uhSTE^C~uwQ{a;LU4Kad7m#>2=4X|S39m{mM;moI^EF{)+ zWx58NKZ(d7NB%L}av{OKIS0sl;Cgc_anbd1@O5^h%-eide~+0DzsKMzvTlUgjUb?Y zAL#V7ZZ8DOg9Q|(s6iPeCQp7?IoJsn%J`@U*@my{*91$7mnQ}9rFIITkg+>uzt3dx z{`FnkXwv&u-aVTq1H^Np^(cFWaw#r{-|;pk->xVyw_=K9V3q6#$g{_o&?cW|k5QM?Y}F_xVWOM~<0 z@TM95>uHSdxcrIbJ908HHu^x_^n(!q6+;q)-uWs~<_^bJ?O*R`3N$ZzfSK)21)3N5 zzzB;)2aorb(v>^dJXlkuU-gBVFI=h)g&|L%eP{7IMr9*MVLSL(0*bt}C@`@OYnjcC zZ&Mp=kkc{N50|5Yw#ZJi)aPc%-4Ao-C8T-xG7Oopl(|eT1_c0Reu>Wnu9ahmzUSzz zT;a=0TU^vPos&bpqy*G9($Z zbKN-i01#jC=q4CBW7#^wU7T{_l3aRF*Nt%Gf!@R~I-NC~)>teLZM;UZv0`;^3UPUo z8PKo$uT{}T<2Un5OM0q(L&07$;08NpH<>KUD*AyLAh(boO7R!yKg+>}>Bs^a3_?7n zaSj09q2#R(trEy@4|<*Z2{rSkr(@ObIvaZ-b z^F#?plh9O>cEJRjtKMgn>|d8;JytrrLb#ffvOo@IDmc4vF?MD@cvkU)U^^ zsLvq^bCiv5?`Kb6gz%LopWa+fF~ao{N|Gc{^(w$Xp}72C7+j?x2M*w8>MlPT^HQ&v zCo86iL2j(9!mZo3#>(Y6b9}|=sAg)?L4gY^{Krl;|LTx%dxtR8^cg_=%Vr@yAv&<( zKr#V)Z>u&6I!f9i+aUr@g_ty~pFxmuJz4ENVa zoP7Jeo7U2up9S%0hyObH8zm1I@plS`DLeeIo!~x_sX^f&YHnPO=^ddEp+Sdsk(Giq z&y@|HvsS4g4pfQT z9gDSb(|@(j>wInAZwK{bQB#mCSx~s0!6P~`(G+W{q>LCd>9mn7%ddR4yO&r!NwU=- z$_Xjsge-59GUpHO4fz=a6FWPChXXXic=+X#y`%&Rs5N75Fx=7GPaR z#y~`#0?vy3)@AJWIfvyK`7Y6;Cg8#u=$F#;cuQFQ9^=(Q2ps^gn{M+L=r6SN8|%p(W{S*|?Vw&N+$od;g`HHynyc>Vc%(l*u8TAkExFLZ}pEYasR%eHSgKZy%_~1p)|muFWGgPADk& z1Yak#>{yJO{S>Nyvh^6;0US*`ppZAVCC|lNRTFM37A}Enc zO6&Lo)KzxuL$)iFs(LinD8*>r|z=&XSXk zhb?@92Z44_2wQ=V)GyN@l(x%PQ0 z4;LMTA#1cH--#HCqKyec8Vh(L-J%fdibL$s=`(`;OHcbL)WrNIRE$bkfzxXamd)D9 z9t1i4h3d$U4W;TgF_NZrZu>#xjAc$kDXL4x12FwQ#ZBJG7=uQVL%? zWnkcB4BO2{;^p9cFm@$MO(gH|f<*FgeLRDr0P-Do0S9Oi7W4`kuLV@C<3MD9r;fVD z`vnp(RT3Jc+K=}9B2~$mC~ZWKNqK(&q*-JphjFtW0CRmQU4n$Xae<;G(QNrO0V>x4 z)<~4$J|whx{dC(N5V!Lx!#Be*nH^=fJ8c;qoGr)=n4KM3Sd2{9v&>PFO}*w4l>9&l z_e8KoHHT`m_vxQ!`GXXuEN1vfD#)P8ka^Dmf3G;}gGu4yyv7n*Pp7zQ)I{4e%&T&0 z8|ywU<7{ttnqnV3=AhX6DOUCl@7vkUD<=OQb@J(kr|5R&Ws^NPVE48EgoYs#*~QD{ zw>?!#N6OIG$UxwQVLAFUou!JPrQH;mg00;#n|gTu)^PEFa{$XvwU62Qe2x}`IOZ%Y zZS5tDh@G(WgITqUtx8oD5wVF`aYpE?c$S&Y@IVVIL8;%w>c-r^B~w}j&u*J}*(g%@ z<^t1#{cHLiZ$CKw$jQm=zkF7Ho(fpSG^ zjtWHqncj+6-rueCUnyE`&RMtJ%B^n~QsLXFOY^PO(_GLx!q|FNHo2ni%sQ{E31si* zkL?@ZF~l5Vrd&j4BdM7`lavGUN_>s|tJ_blwLdVs?Myy>a^~A zRSor2l^-i$zLB+^jGBU}3ZYZ63Hyi)C-4F%G=8_<=g9|WTz!`pCKCwUFIwISE2|b7 zEO5aJ7X!l(5(%toAXh6OcU+w5vTu*I0A2oe$!*zZ+1;(A{6su3&q=O+n>}=PtK=j$ zrEoWll=r|Ra3QO^;E}A&IpE$f@*rDFxHyd(+`KdA_;qW$4iEzEgFuA&-&q_{QJTx; ze42&jm1CM^jk19rY;eScBeoa4nK5t5VcBu*J>&$>6qnX8eB%=5%U!a!Pa1ggurnLl zBDdm;o{<;mIQM_*FJ7vM>Q^is9W+G?QShP+gb`f?e78+s;G{*VNvN%%&47BTxekqb zkB^r?*iTb0!lznRB7Z8-WuX%7Lmrah!-wVNOZ_hztPc&$yBeF7GK2}#+wO3K6oO}J z%5R1SV~c1J#a8qMr@7h*Oa}9OF&^(bsq`93IP=K+jxuX$(e7z-pYB$Gz&_^6JgHxL zKe=b1rvR2Sg>s{jVA{{U8iR|8#TmdW>6I2U@yH!*KSHzEd3F_sfPOUz0q2a$DdQMU zRKbvNZ3#rYm!4jL{o?%fa5wLg6mxUR7+CK!ZnABdx0tj1vMs%&AM?8_=?I-Gq3hu5 zhS^{=8181GYz1ex-ey()=`?+&DEjsawNR3ZI1vuDA45m5NL;U#_4dxMluHaRP+V!&nxLASg;8ym78$y+jLLo z!AEmV`4b!Xc08P5e}e_JY4SoHPm2a7BKT)xopy;I)8Ak3(40J-sUbrE4~vgKWVn9X zjKs(mZ*)t}kU2d@*xnmwL;x-VT1>FCISyo>r|QT7 z9Le1vYqGUcMXLjCY&`v1kemv=o4+ZTy9zLqV#xabreH8^4`iAI&)+(kc7|ylvVibI#vC1oZ8*oixInBTWvP$; zE29Vf(p}|E`UGP6FfIAJZPqV5L+0F!Wmh^CPh6&6fl)dIGJfIB3E~J#BNH@#&ct;D`A>U_ zaXe~Bg5ACUbCp8sDr@JxUuBJvFX$6E8hZ}y=ZUpqe+VR}yhP%`L5Kgy%xyrqd}g2W z!5J0CDu%3W`o5TVZ|F#3l3>8QT;M@7T^{&B=wKvF?c0egmC5@#qKol-ZrCiHn8ARLcIDWaAg zzh_6-%SFM^@j09dPp_Wx8)0P|e7`ms>W!rS2)X-CDJ1_eGz`7*l6L@CTWOUf_DkX7 zX|6UX=hi~}H829QY)%!B4Zt+{Jc);?qp35a&2q2c*M(`rph_zV?%COE&uydZr2tXD zRK_g}J3`A7KrIu^xQj&in|t&f-?~!3=uHvbO*VNAcu8<*;VxC&fA6&A4@jh`Nq!r} z0Lk--!ES3Kz|^xX>ubWiH?Vins2LpfO}5R<{3SqYozruyCv!%XsB95xPAu<1yNOQZ z;M_0ML2bG?!)TPzfa54$g|^_HP$XFRosWPjO8>RopxzI z8|1yOMO6RgZGY(1dvo>;YVsOGO(7Z>RZhriCY;l5Au!>Ib3=zfWUvZnais3_>@4J# zXYY2TapXpmfo?M!5iNiw)*2`z}xt#dur(#kwZXV(6GoZvp!{9D+Rlk!h3hh zz?FlZ^)mhg6bYWRhe7Qu>Z zOs8c1bo=n~Gr|E)9w6Uyi|$N_^344}LQVNuMf&>^uR9Y9aHLwWP*+<8_&|*fJk@S-^_sh=8iGhiO zR5TuLM^v_keNoVr*uoRIl0*>`0u8gYAS09&SnET*OV7oKQ)fGe2#KSo0a9@!&+e#U zzc;4;0#-1yJQvX9NoIS4u3_K8<3r5>)|C0KI`uKD*ta<%Ec4t@IX3Z^f3mB-P$$No zLfDRbBx8??i7F*-$uoI5h^}v+(Jbq3x=HPEQc{fB+TIeNDBF)o3ESwBlFzv?t#}H3 zj!|8eZ{cZmd9a%;R2dboACSm?v){B#Z{qA*^GaHK{t}a}<`RA%lhH7Rk9&X7(Ql~D zn~lh6!x=IuF_#rv8%)9FaZ#K{xL$B(Skkf$!Ii~5CcZv14j))EMK#Z*22~&DuySRl zo8DAy&)$sW1e3Pt@i4yBPn?UI*ndDO;UT)iW=TpFldC|Je5dIkqj3wCH8U43oiXww zMG7XK;tk7CAD{fzv}WO5k4(XCKl>zG-q3`x%Ko(`8SBHsCABq2ppLYTrt^#?nOgCG zqkV?367bVX$(u+zzsJBH1+Rz$Je*`6MRD<~oenFc6lg>cgZ&HA$N&(D9I5L~Wty`E z-?%T=2mSuGjY@tDI(^Ey1h=;lac$flRqpcS#V^S2-2{VmqvKS_U83Fk^4ba2TG6DM zjQK_%tS+aasH^iOVUj9VBSVTNu;|zxlKwuI8{)$L;@l2k*Mp5{;VR|QI=^x+dmW^N zZh(l;`l#bL`*87X^8J9$tfvf?idvjg-+(Agf|fk>DlxZgXJ5`b&+Q!jL=tmt3{qb? zfA7dI!+T|A|8{O5s)+$J;@MW!NsSKQQUzOQmPP|Ng&?d1#Tkx?537KG%HDXP3^uJo zRI!q&gq5?(Iv?}0eywy(!PiIqrSZ4nE#(DXW8JqGz_<5h6!);#Kvl*} zgTwm~^A?9lWH0Ihi~a^>ATv9f#4ApDed5N-1=&Kws4+KGkWi$s1kPH5rRcUD2!Xw| zr#3Ed*@VrTvI|xu{p$kcFX%)IN@URTU&EdzE_8W#7aPVn96RI7I0Fx4{*Kjb6^?kU z$T1J+nM!9)BGU@)hsPiEvkAk_*^?XLnWzOC!{o z@uM9KmQku#tlXJ>ZDZw=Iu0SWI62Pkq4>py-mI@UDsFo^DrkKxQx`laND=p^`xY`D zV_&8sOq)zhoBm8yJY+p~Per0Pr7#;7CFhh`{&&7(uN@9FmCF=yQ;1puY7Dhhe85~e zWlT80keq#IJZiST3h%FV%*^VvpT+7m6&i89Sg}on>G2F=zpyOjSm*;lX}8f1=Ye4Y z#nk75bYLTgVcQh$+>$G>M*w_SF@9(Pv4FX{UfY8a$ZY&R`+7Q%mv$EUkdFjN?vZs- z_*u2*W+-rTK)4g(>olcK`-dd{TUf2T19Bx8y7-!(}Q zLXxUkOhBWpx`-H^PA08J`4QS*T2pwnAsiT`hdXU zx-Tg$XR_E4ZKl1<(R9_{aYf9qR9t-1)#hJ#9~ULK6Ecqxc}5D3tZt}DlCzGp zZ-0&??%j|TeUvesQF6Eusn`1k1Nyfke5zKLA-_G2A)gsAADOa;$L5-8IKSzvb+PHC zB}uZ>x9uR52O(eJMo{jo(XCYj6sV|1O|2*N1BC>gou~o=nl~8f@A4A8Jl2OBhA-%I zkd&Rvh)VX3o9Al4eEpg-oe}#&w(TybjRP7zynZ$3gxBse9x!FPxq`#j;Gkb}$06L- zAzc#<>=&Y&GyDGCV?RgwJotp z{(F%wCY?ZK*h$ZU+W@-vyYV1Ej|Q8O_DG}3~6r5UrtTl#t(&(MCr+DTLnQ2ts+r-z^i`dy+gUiS3?bLwi@ zd>%9}YtyRO7T#C?`HrZ>@d`E$s<2LB=G&L>p|THv zYM|C2fX5}MDbJ7Lfin7|H(?rVDPVk9Oo_=q+>W3zRqFfDemb2z`i3G=P*($C{h@rg z$J&4D9`HxkAH|02r7P#Xuqvc0KDOf4K`SK_L~MPqt-(0ija|xBYAXMPlanz!^&lW? zGm>@YR=~FMWwTQcU|vC1$jQwEys{`%P?N~=ov{akI(xiezFS-x6Uv^qwMJgGRLAFk5a5Ih>^?AeA(h!@A?v0--^A!P0<@3Qs`^YMDUdpKL|sH1;1t3o|;lZ=2?| zUt3mv*W0SAA~gqVjz(8116q-{wRyYq70`l%svrgI2Dz6ZM)`-JmvjS>6D}0&|)wrlcK#Nx+t*}ukNXEG_ zTc+h6oq7HKkQ#LtFYXR=U;RkJbd4qc`9F>kU>twb6!Up4D{y3+7t*(GI$ERcT4ycu zEF`|)%?@U0;)d($17{|m@1UMvTiIW8C_r4Vd@nng?#gwPZO!?E-U*(GDWy*`?+Dqx zu*V9DlBfeyjds_b9KEsZ^({L}Vk9V}E2>ewsMllScNN3_S zc7njnbz>()Zh`inSdbvqrA_euGiZtle9iI;Ba~e^E;ka($lT&=b)rV-OL^Kok}^kZh`FstOn?jOOk@ym5MWMJBY&2~1Ia@$2bm z_|T)KAd+LFem<9b+cVt`ks~4LDDXo54JrR zaF?Q>DGz$RX~&pZ&NfH(9DQ;2U)$op%F7g_GYBQ$<$kZRNpg*x&+aBc{wPg0M$ zh6DBh)L|EdRU-_wH)j3LKsP(a4)do+7VdetNEp;J1@$b)BIwbXP2AQnNsfb*9G+M6 zj?-fJz2uK3R(GxNKOg!E#2^z1DyPKkSYvgu6VkT6_awp4s3d*|nwtgOu8jM6z$@H? zZ9kInOWgJMK&(AwZ$X!pnMd=#6FRz?D0fNQ*Ajg64goHjkb7o-q#wQ=M@Q0B)11;^ zyp{ECMzW+;q7nmfYwNP%uvBoD1kI(-XOV&$qT=+Wkc^<)hR6C&JNS%gTFRyKAdToC z9zOXy$J{q`5zpzlwO{f7gs-GVave+w#`%uOVr9uo-?}N~WyrA8yK`2j77+eQyvo4v z!AoS3*?FifdO{whU>amXAmd84j(~6JP&)zyUy*+du_O|=~@xPBu(yqtOSyd2G7PX*z9i+i}t&lHNS{U^^PeuCn1S|`D}O(8|rz50DD z`E4P&U>yDkR@^Xc25+E#KOw(|7W49Gy@L8Yg=VL-$Kv!BbSeC-z31U#7TpW5zO%`pMc6Ny4;#hU%I ztF5`CVBy1fx0=!cA+c4-!!JDzoKtBuA?2;sjh>Mj{>ktT>@_R@!Vo{*z#A~gh=)nA zr#tE*s18zk+@*DJn{)D%QH4wm8#5 z2mDcDCQ^hV!y%Ag043>nB zJB^}EvlZ+j=M}kCJx9qqgVGa4T+}hB)u?L%#xOsheAI>vy|bmz>gEaMqSm^-@CF+h z>4=rpH725h&4@UUr4|v%j3fP=8~^hF`ANwJwsNy0i}6&scFyV^q0}eKRpaD3>aGQs zn1$On4$*QN-sd4PDSg1G#|JgVn)0M^pR@|J7QHl0agK%V1avwx;c2MT8C$9u6>~Rq ze)x6N^DW)Lo&|ky%}kPi$zdiFds2$gRr%`l*-&NxQKL31-BZojsgR+~8<;#goC{RC zka!M>A_U=QvMK^H3tw>!L*Bv(9S?jEU)(Wzk0iz6(RXQ6I{N9*1k~oEXM))kWiXx8 zpatPbH!>QLl?g0Gm_-D&QxxIElFtj(Bd9s2w{mRuQ2gO7D#kEKY1H5TFwO8+NAI%9 z;4CuUI#^+-LBKki-!OzQEe~?N%ng{jUFmj+*OyHsl0%@$W2Ob@jkVBAgO>0D#|L)~ zJ{FI9Nc1yJ`z($^ji#sPCh)q_dbtF&7n%SSX+=3L%@0w-B;is?B4o~atCql&*O{z9 zN0ujt_K()B7;vUe;;?XP<_jcPI?nGQe?21(`LqZ~}zL zF%!>%GmF+1B}}s%4iOK8k(UO5HD$B6c07_?7v>f(r@BIFsE|W$&BaX=C@_uXP}TbJ zq|hU<0`lNYA!s;IvN*>Kb!Q5|ql);2OKI}RsmpY;kx#3a@~5QS?Ia(ngS9V-PcW*h zUY);QT~EVk_qjOLzai8a&kGT}C~^`6#v6yLAW$@8UJXF#+dC0~!Ok#7Zo>T;ElS$k z3<6S_rnZ!jG?CG7+6XvSt9gqb_@O1KZjRkFc+!Z4uQZ;!PMIUO4cR-2R^4L-W0D}x z@$OZ)2X%koggfyB#E;=KO07vC^u93DB!qJ!g&`ha*{25vr_b9o7$tLiW=X-R-nzeR zM?&EE=Pq|sZacOtnaZAkFAaKDIF z=7^-E9!n&oLsZEL$kB$yK{hxZOLNMbtS>-PzCx~SYx=&Pj$3#)kihilFsqaF8wFy$ zqV%Bn=ba(9>7`hKZ!b4d#E1HoUuT46ksK>|I4XJcJx*?)?$9L(p2CRKxJQVDO>+5v zXWwXqe;&!A54_4lDg-hBpDEa5D4Q_A>!nS|xG@;k-&}_AQQu`?vfoUna~}x`y__%H z#7A;{1hko36t~Lr_$9MmYJqk{H3X+_w}s!blt#3w4{&JA;@!ao*e@L2Hw2wSTVAZ{ zMD=4Zc%8oA@63)r2)oOH`y+8pKgxSA-f-69z1qXu3iYxdQK9@HjQJE$bQxmYoOprq z@mwE?V&nLTq=w(_(#K6*U;^qW$%l=XGY<8wvr-WhCRa_PQY|?^?!~gG^g`;xUKar) z@M)DJ>o^GdcSO8h6^)!;BdGE98>oH}SGFMz8`7ZPNE=R2`W}=+3y#CWFVk7`EhXNAqM<71)PUFl&C)JYd6_$#yRzG@4hnx=nKulpwUgnWUA*_) zH_BfMkp#_T-Lr9`wY>n7PCNbp zi#9ha?4lYXd%ZB)Z*2scd39!gO;`*B4J;eCK%jldb(&ke1xl}Tc}?_Y&8ZQWFGA0W z=RfGQ(u*FP8^uGD8HlZ5bY?F`zRMuMHU>~e(4-YSt&RftwmywKJ6+gd@1jx1f5^yM z&GOUhR1C30J^EQj4_x05h26Zj<=vsBZ7|jrp@UQBhOXwoJMWf&5S_U+cM3*@sB)FX z=*`a0L+yAC?8cbHY&9F|HJ9zi9T>In@W~EA>RYg2kp^Y-u=rRkP@D(s6Q0vqNEB6o z#`%Gh)CTy{6AMl&oJ#>7Hs^>}c~_wL70%fn{oYiAbRWkMb1+J%>gl!1CC;~yUVv{Gt{$ueirQ0 z^$_fl7VVxoWng5cfs*Z$+C&S3Mna4*U18H2RG|;-3AzvQ#sbAc$yb(~xL?m=OvjI( z%fX)5)3;%bj^-vi%H45wpmyMlCKF!9p%^=N=dfX>64=eVI>`a9+jrCYc+|kR&ei>0 zX+~h>CiM?*N+u?VL(UwR_x#)B3HG{)YbnpTB zju}7z4hp&zI@)1Q*C-3dpa#H;ddSsh2CJ_)1P$rJ>-t?O`q|4WpT&DXk#or1BAsiy z%`cl`A-KQzw=2IbWRX8z*ei!n34Yek0tiZkhD&0D<8lMi4M>Lwz@*pQa^j0x+8OFEU;kru+{ECHp3$S} zA6ixlC!sl=p8eC~%O}7D4?KB<^2j5$HzCG5_X7nzDo;776!V~m-X`|cFg8UGE8?L1OGys1$9QsU&_Ki zCpR}1HXcgJWV8!O#Rl$8QBQIUU+_u_Ra_V>+{%)iNKSCAAMGKd05e{L{Twnho`Duv z)rlgnyO!h8gy9E7(cJ1%P>VN({SBs`V+WrfEgwWn_Ph4f*SvDy_K2v`YfJUmG(h3S zzUE4U1ZM_uJMod6BQ`d=jHEr^^yMI?scTNFvZwVXt>0N$DSm5vN0737KRz{lqgz@b z|H7>LDeN^~ZC#y$%S!A+b$GO4)2uY_QE7$c+CvWqJRcW zW0KR_jfH-CTdgZ^JBABf#3PFks}sC2^VBE)gqSi;#VgNPFOj}m@pP663W;R2$=%8 z`%U%#PY+NlOu%H#xRm1!v>{!%@>na2Xg9hfC5?WZWbbRPOA{+Z4K=W1LB0ZHz$~s1zL> z`Dgm9t?b_~3`RFIVnsjOsX43D6IiL@=+4q=;-wRYm!i7BGxK8?3d}f|ES1A$R*EUr zFqg7%)!GzcT{mr%Z7BNrYP>Z?8QoJ|;WssYdjo#^T*va9N($(7;dS0fe^H{TU}eJN z|A_lYKqhgNc7w7!DiH9nCKVa6*ALhDjr z@0-sr-?>5+%k9yuw;%e`;doY7>f}I+YaeX(bMRs=^Y+?D;K z69S%DreC7clXq)t?VC0UDZV&8$>XW?!;aBrpfoOFcRns;b1z#T@>hs5;g8-&=y<$C zrK$*B8VOz2D|N|;&BQ%5ss5DWY`*PipSB5e>(e1t>(>kzq|Gv=PEqE^3&{PF%G6`w4?yMJ7JJ+W#tBq2 z-wU$gjavopzUFi9>lNH^m^?-QUo92mG{wBT^V;ce?HqXu$?{LF?GpCgGZ#8%B^8M6hw(g zt7ox*jJN6|V|BZjwVM>i=pwn-HNR+r`FhilB>)_YRXoOFK_93N8UL-`KRkFe(*moN;{bS9@5lGL%fM!y%go9u=RCR1KTnB zk+}P`8}3V%OSX=O^ia?~8%h^Z43F}|s;W+bMwZ1|;4_gpord?W3=h{3hu4N^?iuOc zZ{*gYY%Gz;2Gb`8y?f_q8*y3Ff;*+*(0IoF5VDjM#=bSd7wtAAg`O-SacwW1o+!ye zOIY{7mG-hjJ-3yzRplv}pS*P#hb>q->3RYLUdv+i>t%f^o5I<}V)MC8cmMi# z_s*xdp!W+HKe2Y71(kl2Q{V~Jlq?`?Q#NdKTmJaQhU-4=z3DOb~m;2#u|7sY_9?O>*ph zk0l-4kQaZHGoMj$x)W!&A6 zu{Lz>AXWsUT;WAi?XA(T)c_W%s>M#NCl3IJ2A`d%0RdSw8yoEN5x+b(MHoda8E}%8 zpUa9#4NO`TXu^K|nlYb|_(65@yuPXSusUAk^bxT=OI%-Zmm% z6A#Y|?7HTj^F9D&TOLSP*QtD_JhHn_Bt@OkUD<+%6Jz6f;*s7L4^DIAkL!bf=_Nk` zG}Hm_rw9Okdu+C2 zK0)_OgU<)99Aij2(PTvR4^Lk#0kiPXdrGcY51&3?-hV)(`;+S7*JWJr zfhuymgx#r|8UqZ2zy-sH9JYnx7sRXM0tYa`hG64Us{44+U^96VAZryzS zYf;&*UAZlCs1ERnq|EsWJ`Se1U*77d4X7mzeD(BX@9eLcMa#36S!M1wnE0W(4~S-{ z-YAIAEu^I&fa!@k@~1C(8hj~md{kVSIUvHGuqi|O``BSNiz4ohGD%2J6LI~iVzl2T zVCEk1PtPC94YzAIu166yC^rHerJaK|DrU&IrVu;Baq=7c)T^`%fhlKa6AqfcKx}Qu zHaR&b>f|h1sDeHxCFZV$i|OqRR({F#bbdtVzi*#1d zwaKPxaQP(+_hkO(&BdL9A@YNI>n`&GPQ#R5LXtGHLBs&;#T2v-U&0GBx^^F%77agJ z*8SJJYU`r42Ww8oSE_^BQTGi8rY8Z2W2Iw*ujL2Y)8=r2xAOm5xt}{UzAAY05E7>B zBh&9_xtpXN)YLw%);tM|u?UduujI9e;L!`jOHKz{Ew%@sXpukfX7gg^4P)i4cbsbY ze_+aUSERx_!}P?Ofr-K<>F0ZoS2>9$R3`20yz;v&vsf$y>Vm*Uf}c}Jj(3MsHHua;&LF))Rf}Pr2J7o=LbmBjN7zqaO{w8)>s%q5eTsCSXQZjY3o+>b_s$+ zp7}itEG0If5Qqg8Jfvrxb6`|oA%kp?M#X0Z)pu6-wIFNo(1?K-Z${eSVpEY#3gWlS zsyw?22Lhlp|HUmm9Ou3UkVWX5$^#1j93#RyMbVbpzqq`F7qxV zeLl?o&DO$;&@%wZNxR%byS%k_xaCxYyk7fWbu`8V{0SbZM6c0E8xc zS#ucQ{+2Njvtr}+ya67TRZr-|S*Cf{tZ*V@45rBcMn>=17@7Ww0TF%GZ{&WySPlwB z2boM0;bF>(;7{z0Y?C#NjAA4Xj~Y%f(>GHC3KK#1a3t9}eYheQUgiR!thxI2ax!}A zRaX?vwbi&>$h+^K?t;vfl=736#IlQY38tmQP!0$DU1F6EicxH&@a~}S-t91_Gtb@T%voS4%ad1wp;2z5B%4Dl{jTzVO-Pk*;(Ar!C0)8ty<`uQ(m28e zgqP*a&Sj0yA*k`myqr%b5|zvT_4USh_YJS31fVAj%jm77>+A({CC0rWq&Z7F<^CJE z2dDwJB%&5=q_Z{ae+IVQJ$6_$JGOAo%T3Ctkt3vUH4({x!D8yZhDCZDtnB!_UU-}t zE8wkgGO@aEP4NBHUnmZhLRd8;ZqJsWhm)MX^?e`(j!rH4JKWMH=ze7~#0ydF5n}h1 zLQw8uZ~$uKC3g?Ds=_i}^qbt-!%VeL*0qu7tA7Z1(TvhR^C#o@<2WvcwubhU7W1vV zZ##xHy$X#4m`6vC9hbF|r#yHrV=gBN*37wPyV zz$N~^xtnA`-@W689{{0-2HEXzdI;`!bT%7ne#XvC86RV&z5bnx292P|Ptr{$rZ0XH ztL)B0UFj3bI3@ECGa@;6noTr9d#Cyl5X73obEs_@^FgnYuuyfrWTBMFnGef-zg|rb zLyz`HmKfXLNn+k4rOd}UXf#Xv8NjdIjUsw4Z~OhvUYpY|kmHx=s`3#)D6)c{`PA!Mao^uzb*#9;32o>w_Y1n&zCJs z>HLxdkEF-e{Y}WZYZwR`p>0JK7_|ySTb8(@y$6FD61^HTzc<2pXbvJ|%K~Kr8jAyj z(^+5S*f48p8$CYqb*s7ZbxH_zOdM0vF;Iewbqg(; zLjRhhAU1ZpnogC16El;EF}9;)$rKU6LA;Z-EuV;`y^ znwWUjZPjHAjVNd93HTY=3k%@yea^kJ#gL*}?1M`E5j*%QONRltqI4f9upPbmeJ=lP zC%s@A{R&aqGHZiqrujUhc!Ux6_H4U>{yc}_pm)IL@)2?_6twZJZlgC|4781xvZtD& z{%a8M0}2ModD^>}b18rOTxjo338-SgqfXkde-s3CG(9x4-M^Y|3aBp{joOAid+^Lw ze@Ds6kNIvrr3*@Gr2nFb@$l(>hup-*O3RuohWxU}wYGrX)N^n;wX&;}0Qh4?oS0pI|0BNBXZu9Y6- ztJGYy7*&>2u%H-PDgY&W!t9nR)_YyrFF-jH^J6Y`wnUZ}$Qsry93JEhKy|Uts$(~k zvR$hK{37=ir9&fM*(aOI3spkQDY(tJdji&|sEA_RmK>v}y~z6J3H74RrmN%*2L<_v zjm<4SvXb4Hq>!}^3E7-8b`W~^&H``6~>!e6U2cY#x`}fUW4jLsMO*|om`n-D z0y1SN;?HDlBvdYe(gvo2r85RT#9smlr?>;sRL4iZl}(wrmqSx9+mGG}7B|$PEHcAZ z#3Q|!I3zY^@Kh02QM4X0#1kuiZ#2)~mi)e&iP>X`r?==>qhRIH0EgpDqsY#_Rnwt) z6#RAYqAYjSa)O=N zUYy#0+IC_gn7c?iH_b2I%UlO4qUj^RH$7@Q%-&sm8-L!RG3hFSCZQB%*VH2j5u+wd zy^7B)+uD_}%yT(KJrPG<8Ufc-%-=fjN%LG;+P$6Yi)f%j4|%kfw^55=k|K`rz;ee62&VvbPsjlw2AehpYCa zgpU8Zl5Z;PCYGf#IFbouz|Qjj-mI|NJ(*Lob%7-O4}15tC5RSe3p8!pwr$(CZ9B8l zwry70wr$(Ct*-Zb`v-cQuh_9i%oXdjR;>z$p^r|dgYrCkO9~|ANwvcnMMX1#L`09I zk{g(-4Tp_bK zRS{Y#hzayU$q`G{j0w>oeL~KI$++?EGF*W6ArqVPZaRziL|EkIeCZ}3hUX)&&C;r* zU6Ic}h5cFwyeqmPBxAQD;-0NEx>a+COKXFB;G_#D>yYE>_~AB)NR^z(6V zcJfKoQvosng=hL%(P#ONyPn|H5z$_xm-B=M9RO*}w~(sK80+T58(e_z`a~QT&sQuh z;(nhoak|D=&vR!loT%WG?u`5&j(vZhS5h z*r;u1Mo#aq7X=^B?~-r^fCp~XeWq|L5;|<73Mzn#qmb66$pqwyN74RC27J~jKb+%q z|3L!9BvnNo+RRP93&zp?+ItR^lmm`B->$HzzD$_$9<>!D41!m+OfLQjL%*I3HPkF z%GqRztSy-smEqGaVBObbY$viu7$CczqGc=wMIu!)X}+1M4a6wg0`LElD}}R7RG;BD zaL^}TuWlQ7pCw$pqpXnb6V(1&_~Tdd)Bu2eHj;vhmF*?^SNB-ZaWsAN#l}-VVPabX zrh2AG&xAzn+2|S5Q1}{yRA$hQV)b9Tw(9P>6OsAG716!t21gaN29#bN5^?mHZB8`e z(FWvpwNm0tKN;>kz)vS}|5MeBwJi8k_$5K9Sar%7YNJJsUNAm&X27^*1~d2yZIQjQ zb1~A(yVrH!j)Mf@w^F1Q65$bjfHUl<7pK&6L%bo~M?iShWFQnDgkGp>YiWj#?VJC( zZ9u4qL>CoRjr`1XObec=>);6S^Lb^|dA-ui`#%PQscuGi06kPJ z4NWL*($f3V8g0EOgTn*W%$re=yT^PIz(iC2=ZQjRme8~JasFH+IY%QuMT^mK8tNx& zqdwNq4=P4;Bbipt2t$%GF4nIU-`fK{&G3wlnV)t8;j4va%Jc73wnVNmvCFJ2fKd(> zYJ%_HY9wV%J4%WS{8d#X!FcBmfAm!XwRv>ZkBuYZ5fC8Af!Z-8qLsGiyS?+01iih2 z8u?|je7R?mXYb2e`7^izi$%vmT^S1N0s577jjGKSwVHwdMABQpeFaTGKY z>y};e`#Zhbn>8wYr{^5+Z0QsagCJw15U)s!rYa@uvb#)sNs(uf2HtE9%dzDjZ*?|R zv$^ss?kq_h2=@Y@6dg-L)*-%9IY;cPMDINA-Fg*{abxV&p;=uk!y9N$!0Ah8?HujB zT2X*fV7Md6-0vTYOD*^c{HW&bP$=I=5XNqBf;1srwuao0Iw+_ah#vQJG2e3yg}-nU zL~JKCwl*_*Er)4i4!DMo(R(iVfo&_Vz9IktX)tY)yuTJnuXmmJeaR|% z!e7pz5q<}L27E)Vabitk_U4E!uCeb8hp{ezY$%DKy+gQkD4yY+C^6^x7N3?SS#IJf zV)UqCckD=j#lNQu1ld0IP-%G*NswiKu^H&g_)uy9x*~CQv`F1De`Ujtq;n^UACN6b zp$UqR6}$mmu~%4_va1SaPcd)P{FaB#doT)ibq;@8xU!`_x-?|KsHm-e88%r|^BjR} z(^n-QNh)av$WMjpROx79Wh(no7GuVF-FVs@z0wE6u-`kS_K!7a#7M8lq{Xmt$}0We z?c+__zTWxu#Q%zhfXO0-qLs27g%H{#AH=yV170N;U&4++uy2Z>Dtdl3CGnI5Xf-5R zdeiXA!UfL)Lxt#DDX=l=iG{4O9tW0c--x&zM%wEqqq(1EY(X_g=>@5QSV4wJZ0&{n zoV}NY9~+so+!jT36Vj)M1%@C+<&>GY#&}7iiX}>g5F`^}33P7=ICp;zgz#J}E9Jd( zH%Wz}j&%wBHAR(V#+f>Y>QjZdrk!D3U+I(Jokcou5L+=kd?T}yl1YbO#1VPi!u1C7vxphW z-;T%_6kb&7icu`GZyJ>jvOszk-{xPd4r6VbCvCwW)d=hveVorl0TfW43b~=?DoQH*`;Tn zW=@>``Xc{w_a!Vd-*NNhrrLG@I9L=AMG_j1cFql89PW16NQ7$a%nW$jDLQoDUB`bF zD;<~7sOF5jEVP%ly_h10dsuUz2*busa&Dn7+~Y;pbr*bK!>}5f=C?)K6>YV}E0aVp z{M*Ur+ImX=!r7s6Ywxt`ALO5pGmS?L-Y}32SW|@pO3WcjJ`j!53(FU5x0(ofF$mp* zO|=WALE^Xkvt+4xo{^SocRO(!l{EJ+|1i|Ok*7cs2(hi`UlUPMeS%`_XA|fYaG*#` zlfOE*7CiQ#E&W@)1A7B(Yh%=p{8`RgDyqab;?q3js00yg{&z<+h!9RjF`<9XB}c{; z*}=rR$vAy4(lmd~h8vGjF4&7{nKEj~NNz&2@0)@A@UIg_K5T50TU}-@$*ra0AC~KE z(8^kPYTkCZlwEV+vl~SmX)3sml6% z6xdSkuDoUT9SpLAvI|>;VHCt8GYOEx<0A6-MZCrtEwj!H9pvsL{5}MP(5@aJTKHf< zus2!g7dbHL*v(mZY<8j{5cv)45k&5v(fdo!Ud!Hg(dOCJR`}q@7xg8$!nCicgKYsz z3XRgVfoNK1v9+yyP_aqd;NJKX264y^*b6@6lY16H+HON^6%+x{!ab%DQezJt5tNB9 zF;)3%pb#(B2un9wDdf$H3Z<|&F>8G0OGTt|P(4O6ntq=sY%dY4#4NJ3Qc>j>ud8Q9 zsT%LXoCUJ~AR^L!vIEJ}+ENoz9H>&U=U)#X?%H+WgaGY9iYj0_b{?V6rds?=`awbB z|K!EA8ad*RaD$r2;%APz#c985A3eXzxU5dN?d0#b(}6rUSv?inIM=LCrLgV`elIi9 zgJY;t&PVQLC;FCNp?uH=x|WX)8npiF#Y(wn%0z_qVmG#Rj$}rZD;}2pGMA}*`4V&$ zzfFy(aqlV#27P}gJwn`ic323Jsf{{rlJihwPGIz!y^|PChL+GL&x4FqeyLz} zyFu6K=>p99Wlzj4MrD_k)|y5* zbrBdWKN?bOyV6{}jB;UQ`CIeKlyw6v3e-C{(rk#TVd10NoHZ-isYu*NDnBa<9M^a) ztym+`*K$9)C`kE1-OtU-mDsunz!$IxIbOHSI=||fZ zP=h1f4EBNFEu9F`iB7_*Auw!;ipvS}9TFq#SrzeGqyTA|K@4XBS;iS@@u0!{ttqOQ&h(rg^(YfE1R`YN%J zK`V;KALo~(|1M8AfV@U_mq4t8%eq+sQk=L-U!FWOT4|^7rFAEfZX>j%ZfNG!dmnc) zK@SR4Cquhrl?hvdMaE4;?vGKwG)8T<>yI;Q$1&B=beZr}camsG86Tc3%xRO{mk)_T zW(zxnN^;>v%Ine%3R99^w@^D7v1szd>Qw8YqmMTDw8)tvG$+oY#GRjDIoix`qzl^1 zHmVIeNxkPJgD--)@gLkrQLtYbrrP9SzfKSQr&3zOaTWhN!L$g))3W3X^T2yuBwEqk zUZZ&9=(Jv%ea3Hl68?lZ0+h8$Lq;l{u#h@!&KS0!()f`D>~n;g4Hy0J`t{EA+3?)P zS60c`>S5d|qD#UM;gKJ7T9E1G_UflKKzm3ht`mynZHj#bjSyzO1Xu<#PJgu$JQ_>f zeF-D7)gRr~e%x}-b}=2ySdrwptCpJE%2)O5?_^%M+9bg*)FCI2Y6MpCdQ=hUsn#Y9 zW+t$Fq_=X0106LDcA%aOK$7%P*vJH}U(XVcR&G*uLc0NY4=_Xu85qXu5fW<;u7w=zueZLKac4c(mBY_l58fA|i@HyJIV zhyBptE2482^S8A1)g|Vt_zZrPu`4-!&)}QB+&0lA9w?jDe4& zi*e3Av2cb5-;`UkEqA||x#1((saFRvQYSRzA#>i`35aH?ij%$G>JTL3$C&(N8z?FZ zn4A`%DxTIblO|EY#*h0TE-Pr22$=xYtcpZs3?V>@%JF8L_U|4(>$`cjD%%%`b!Q8M zq>tKU5VTk;LIkn`7ik(1n$BRi6+1!^uOuQ4v;#9)RVQ!rg?}nhLV*EwBAp=bg*)rf z&u;0m!`kJU6_!m47PQIYj*}$%JU~X0nIMTqcjssZ+2(wzO79>J$Y5@@bjN28F*bM= ztG2vz8fUF9O8x@lt%8l3ZxhfQqOs?4Fr-(ikzQ-N9a`g}&>(J+oeGSSJ)FUDv0YYxMN1q}StdZ}DmQpjEU9rjQDdLt3+8 zM1|oijV+@+?)(d*iKqx;nvq+MY6BD|8BEjKLlQY+pcYF8E#IEJU z4(HIcBx~`RHX^(`T7s{ww{T0&NZ5DVTj%*jbRK(X-yt7~INta1=6h~q3?C2rhMM7{{X;t`IyT%WEetxMUT9z7em(0Dp z2Sqioh`8xbYwUF2J;cl^5eoilX@W0>@^3?EEB4m=}Dn`CQvK%l~XOK`p zxvJ!;*x{t-58v{V*g2zOPz*+x9rMG%CzD$x@IOg{f7KC8x{zZwKih6%4VCSaC)vNo zhDCnOQ`hi_;se}w=P}1W@Y+4-|DwVqLvz89?mHfVNa_MF5{;oM+1Paw--ErH_tp;K zu^SZ2$xhSldFW{pMCVw+zBKxOO4%;fiR!L+|9w|%6V`q~>m*k)$4@mG`w$Bj z8BCz218;(_!ILa{^(r1%2F@)6AiTh9hMnieI6bkK9awJ= z645cWdF$&y7LLoXX7mBQ*%j76!jl()aP&_T$DS-~Q`&9jj`59!VxDFjY|skYIO-nu z*yL?<;gf&GcgVzvj>=pUIIFR`@QIB;&0QFmf(4n`q^aB$Be2M0_)rxL_$sg^-rV@e z96A`}1g8|$@q;Lc2YIO=?SxNpYk|#hh_F1iNq6gb@m~0V%40>HI4$eLT+OZ`d6O6#p$fv|Y;< zzmM(LL>513z%5$&QG4h0RmNp~$Z0L(u#*npwZ-bD$ilg7aVC}ZQ1Ek=k?tQsm2xp^ zBPYo#{{-cWGRU!Vyj!FFR~={SE%P^6STAO6Q|BOhNV%L**$;D(>bn;~SMl?>&^qUq z(h$(sSJD%tjq<$q9OOKbKEEgQ)@zy6+lpY?>Q9!#O~TiHtMOC9BRj64q@-E7?GxpO zDLHH3bs+mTp7Hrze3qj^uuKiq;lqr_3JU_`r|iwxa1ykHzWEMhgz__m>#I$gPB< z=64%nPLV46w6rd2@O-rkn0uZET(e?v6FVX8&)^?zIZ-Mj5zP$3C4u9!{rN736%htt zWiE>{Z3m>JSsjKF`-G^mL$EnxqMjC+mA9^geHQW-S59y_CYhy~oPe&@+=;XPAo=0o zq8gPZ8fBET!U|tn*G8q*6`v0hdO z(Ro2Ck2*da8|>(-d>qa!-^AttaZO|N^&nc^f#;#SKi+MX?~NA1kDfm@>;P5S!i}MC zd7qOBAnj=+u4@8=rmDD{(O)3Z!d}!6FGTT>Rv5%`4x)s-2pE+x86G+)f2Zh+AH$uN z+R%0AT{iV4U7C|iXm|;uIf(Gxv-{?0MH-PLdGyj~nLDf9t>YmFW4`=UaeKAkqnwi?_LJ^t~XIbFEpR*Ee>^;ZD}RKcI25J7GQ`ulk-=GOlzK zcZTQ~GgP?m4Ve^VcD1wiVFS<}(1~r2BxRT4P(dS-^8sMuV9OC{My9Ei6Ps>aq1BshYjB&=61vwP4!S5J zcR6E6TU}mYp@vWAUmCfX(eD7h=ErRrUO@gD^js|TP`9+@R;u{HL zbofEJKE-nXg_#*Vh?#i48zF5-MIJEs#T|oaoG2&7>!ATbGGT(rTeOL!I+Mw63asd6 z12cIT7Hsfz0OGocQVEywSIsP&SH=(mq__}o%x?4M>AA9(XQ#Sx314+S%U^h>Lk2;M zu_{m?+iRMn8KUI^c2}`02>yda>YiqW<*>nqj&L-L?=D3i7Gi<6Fpbxk6NT&7_#K)H>EU68p`lPbXkz)7ouwxSG)28l(>hiRgsdr1fbK1IM+0Eqa&M_#9&p?%5qr z1p2d%WB+$#UD{pdropYL9G+Gitluiic;YtZu!LQ6?!A)~0%YtcTV0_^7I{ z+8&H+&cdt|(lqv>K1k#Ne4rv4d>PnMA8vGL1|1A?jB|q8gkc!Oqr4E1Bm6Dn@kzWY z2`!^16dmLiB>flOU(p-OH_j_A z=H3?B)z*0LD~I(dsLZuzp-pTKON)%swT@`g`@XrQbY8JR+y6G`9fxtij@S#o9a8$5 zK|1zLZ5b2+(IPB*9@6559TAj?uRcZjW3K?O*$B(0(kb}Gii@P6yFT-D8_Pwcd|o}; zGE4qfD0HVDtk^7~x!h3Yn{Q+5%Bhkc!kqp*@x6y&*VP&BKDV9{J$O~?Z5clP> zU`&AyAXybK4ZBCs``s+=s`V~E;rIM)(~TVQ%eYQWWd6M>%;LE>rAJ;rc~sWB)b;`n zJ8@55TdY=!Y?SLddt6x$1%F!^>CQ1kDF>qla-96aw_m<+ja)0+n+^J3yW+Y&GGzh6 zYLOe;Dn}6`%7u)|?ug4oul*3ZitoEc=INga4FUbUL_I+|C@<>|K`x_z=(M17r&&@T zE1X#?_hgH^*pI_@?VH4VdQ?M6NwY%R2g)r&a@v90Am&v({llAtY)gd@nL4oTt1*`~ z1_Z`;@lOMz$-n~o`fH$(%C{7*&nD?Aye3}nwf+v0;d;;i#-l&0t~>?OePiD7D(~qDh#Fekj$dU=A2m6`)qW58&%==*o#{BP8v?_+s<@mnKOix}PUHY@ zcrlPxD8ynmqJ+E%7}X$|9y%yxBlJ1X0Zua==qmI!+vtfe9gD7v6p zeOaT-c5HUUwNdUS+fcM$_RcspGiX`k7~t%K3_j%Z8j{!1_5+A@(cey0fMh4G;im`B zvSHc_dTXC^qU$niYnXol@)^XfcGSIm)$x=LU1!3kAdyiMk<%6$l={f`QTJ2#pETEOFpZSP3?_Z>56vw)1NJPSWVvjo|xWZtV5DEDH8dgH-Pl;-9Snzfw*s zI4KhFAebI0cwP~5e?90?=ZThdKVK-pIL7}x%pl{hJP5yIJOIi@w;&^xjCp8-Hl{CH zaCySm680oOU6+c!Md4<(N54f}@;j@fUu-FE4bU}UsPNeDJI%>#YiI7t`lH>Y5!V<+ z$S%a9f`%(IpCc>+8K;9!CdLwQmWhI;Tryohm!cAJ;eDu0{&aMm3 zUA(j4_v?t0N6rJQ{6SO^=$iZ^8pKRs1xO#61V=h-8stEIosT3L?XXskTKk%*9_8pT zsr9NZ$p)OnRY>T52v5P`-a5b}{ApV$`cR6<-!L%{fB-vB2agC|*5w9Xt!6~3T=O(Y z2_5AwGD*Fd&}j1_H${Ol3~HFyI5%-GSGcH{pkKWba= z68y`s<8qdZx~UySma-em$;QAZ(jhn#S6?ut!ym%!Ig;}`$XxeU0V3Vr@5Zh6>OoU8;YF5FbGJ@bQ z#g%Y%N{0_m--*3AJ<*v%#JcrC!O|lg+z(o$Ri*;jM$0tG2rcKoy^LLEh&L3TOWH7=o|ZRKK3X1krh@=3zxLP;zyGu8r)yTQkWo-#^)Po zirE%?W5N$0mdIe{xnwK*hcTvT8EblUe3R#;r$Wns@!G-0&1V5U+OCajqBo=O?r~iZ&62NjK%88k#-r zqv82*^pE+bec>|Nm{4#T%06xAAfm$Hg~vtUj&_H^Z~`jAh-St`5mXk+M(Cr-nO4?{ z%h;N&o=H$R(D*jAa#tj|u~;p~+?0)9_9zg4LO_c35DNt7A#XoFzJ4d?cUDVvlCRdcbP`Nsc04X7f;)O14;;V zpKrwMyn@TLzz;)(ae>DC0X=j)0g;qBUM89VRkD%G27Uy4w?7|Wf`@KUB1c;bH{dbn zOIw6UD^Rf;6AdN2Cta7-tw2U$9R7WL*ozRlsnUdmsi!)? zv|@{ubY2stfJU8*X3EM^o_AvX+P{u?=}I4mhgGR6o$%7xl`hPsU?r(cWrvJRjNH z?ydF-iRgsbqV=p13&*zoQS>Ig`Zm@e!m~Gl2=HqW$3CxbQQBVQuF9#V5}s7+uhS}A zd+0p$IG0^<;j{-k1)y2riuBM#$`6}}U8Bc${xgLK$~+AJsnqD6SfBBaF~GbAVzS7oa5 z(?%g)tr41MwN=2I85==iZ)4W}Dwcyt<)V6sWw!V`SI}A|SdLj}Yo(#eFW=J2jZ-l@ zfIAK3cqJmzdbI_~)7(@QToj>FwiDC}A@0+0=7a+6Pl_sFI&vGY&!<`RN&7`X;`iap zwjD9#hjE3Pz~XC7xWQ|GY@f7x%($pex#<-YdenxzGGDn6Q9sjZ&ZM#$0{*Hp)P-ZH zQYuCr=p^}(SEqc|0=ZI(4;#26D$S-oG+`madbSO(ioLn%Na-($XhtHg2%KIlF7_y_ zi7)^w^WVsjRzOOg=Rqj7cZ{xB23s&D>PwSp`=}W@WT8Li%JD9TB-1kIYuJ;XS2fWX zEMFQ@T*uNv!;Er~RHX;2+Ke@0EDF>|SJHf_s-aQS+JaR}Svg4jSQ=kT3LKYYUCmfi zQIF~%x+qAcQNa5n{cST7fP)#W=hQkRuBnVZ=}gO8^g8n3t&@?xS!}`l?0FZ54p8Gm z+#L21zg_JJ(iu+Ty1_7Ps)~#0vwadn?1go4Mw9@l1%WK5AWF#dfRT0MX(9bmHUl5> z9AUK50j>kDvdvFv(wb6Ag9{jgfrPJ~Q?N)&(u^cY!{<(m+#RcK?Eu*vyCX4_C}x)l zz?Hni&|Njs^H@ky?&Jv%G7H!AjT6&4rt69EPuUx!ruwaD z9sr!blE4Ri+(2^M*}Vg>&dzI=1xRsX>wS1~tr(@fqBeHDBs#6IHU|G?(eZM0G zW0~~68iPllyW)Suc>I-(X@iH#o$%25ZBAG=;BtkrCG3lZIxXjYiAK$CjQNPXX1A8f zxLQ%%8KSB}QQ@)QbefRa)lOO$4M4j{$1c+gm0gNL1dULpK15jh(oX=jl0E8+-9re& zv-IEHc0t^VPmVDi%s7#hg&Q_Hduq4!oL>~4xO!y4@6-{;51Is)@rG0p=$Urr4W`Dh z{G|_y2O}Ic4Yr^@EkF{DaoDItt-nuF4z_fdR=SrLWc`n3%EEQu1}ETfukWJce>Sb= zy~~H>uNvy|MSxwTgN6hz=y3xsRnsF>F1r~fgbudnnI@i&Y&Lm~majge$Zdv;=~2Hl z_$rv(<$@e-eRPS1>fVFCW$dbsKlAw(?>B993HhhkbGXPu+*S_8OWY4*WuxH}=;ED= zt}L9<;rHcs983M~rmpxXwrcfZjI=2YdC1)NxBR1cDiReh5BdbjgbBvK*~SWMg2yK% zs45o?%;afQ{z-iR;+nE%iQq9%&59UQ#$W=Z*y2B&lVO9CHzQAvPBo_zG46bku=I)h z41yLb6{tXV&@v5ELW}wAu3{G$;`K!25q3}(%j)z!0q`GHN*FMpPLyNh!*Dl4`bAwG zPI$*W)55B$VUjkP{He0UfP2VT3S%Tu_(Z_`M!%OzD{UhC#JroAq^V5HNR~b3^0O%siU+KL5$^S>%y!3U|OkASO)v6=o zHU;LNj^VoCWppozM6l_mJRRl*1i23b>MDzCE_>y_+mWx4>nlpc;n~tdeTaeJveT>c zvG$1@d;k8?M6@h1NyVm%$qFXdGWLxb;A_fOxqei4&4;XGv3*$kHLa^0$!uTEB;s={ zL}WOTsy4hizBW&?xb2H1XcaiGaDcD|QxA*J|v&!`Cp9;PJAc| z$sS4raUJi`c_*q%&~YL@^cgY|A6xkC_)TMi+NmGgX-h?wn0kDcyKL1YYVRl>i`zxi zha)hv$v-PIyq?&b9;|l=3Fw5{qO~m$bB8r}OZt$1_%&7_!m`$Z2>u<4{tpWM2ZjEF zLjOUb|De!+Q0PA>^dA)Z4+{MUh5my=|3RVupwNF%=szg*9~Alz3jGI#{)0mQL81R+ zQ0O<;Z0>+Lvw+FX9+Q*`4Lor#&p_ojhvm_5qbmRf4&79kqsvuQuN- zH6mf+M~SAwF`Xe;^I@-h#StbZzAhhHfhAHSCsxRmayXvHk=TeffJdj zOWR=_(*iDnf?NYVAJ_D~F6p|IekRbh!S%>OzSF}&6F@h>b@;hwg3-}GB==8*7cbC6 znL@hpyy5{G)Y3eOtxIYM@fb1w?oJ3UEX0IAg#%pB zt*i9fjTrp^&f!5m^6eaDZy$++*(blXWp%}Z$W}rf&3EY2s$Z22Ka#S4fj^40%sQ~j zZz8ha8+ib_9JAerbHyQV$YF~6IYaVuB6+Zax;aV6X?$8EHZur|qjQYYwwe}zKjAFI zONqmqgw8X9mYxXVpUhtRtxm0X24$7#X?$7L>g+81t1mMdRHc?wzEZYzKx}W%Q8Cy7 zh~CZQ-NIb~10-hYVgY;TI5vW%ZbKB1G3>onnjUj7^rvK`MNeb~mGQz39&uw*n@p)f zou|RNC}@U-9Wm1*EpV0ZWK8>+Dk;a*f$Fa0gdS%I9Z@7(My5hF@~&58^uG}wV$|on zaGvW4`E#Aoo#V8q_DT~;)PguIO`TWE)tHFnLTry2+nQWRkzZ^HEJdgT7xZl8PnZqt z2a1SKxxazeVSDl?@$=hyfnX)$FT$M_w;bqwx<{2@H4BikoVgkRX5g4g8Vwr@-%x zV1XFZF2}~CY~rdz_^R0a5F50cRV|%rql$K$hZt7cz5R!?%?sz>zc(c!*a|)GBA_?(bm#`j0^niKaWF2b!QM2|Ds(5gNZ5WjaHj*Cv3;M#>`Ww_T%M z@DBtoy_ufDd)wN)je1<{z=k)%O$g@Ld-|^B51Zmr7yb>p0G=51AwkoZbM|V+#hd=8hR~tJ-=5`ULXX%L`nnPjlURvo8 zX0Z}B;q=-0O17i7g#pvy%{>p~JI>Cd_E-fNs;i54L0R?h(4=kjb2vbDSo9hVTm&!Y zQPfST%&uZaF<`Z?TDf<3bW7>%7lo~2%`hl31!Xo&@W z(Zd@3cW-iv^OWk~^=+w^z%@t3?}B`Os+~UXwxceB*MaUdV;~kRkqTJiJ%p9I!E~zT_2AIP&hjrh6{Pv8<-ykYGMa0dC>@7eE{)T;k!36XeO3C~}6) z9g&x#nrCO7a&KwcSU||3tL2AIB%6mw5<;^Yr-!sV@LZ{el&Z&d!oG zJ&4u@;7s)t+Q{PR>t85kyo4Ct_U3src1~qvD>BAHtvntc?}geRf&0;tE}r7Qdz7Ln zm^M_K<4S+&4!^fV0omen*=d4qPgwin9aTh<+@KEdm7b8k+JVedFWfmxZbIyyGl0gn z?;AitTw%nckq}2m-&gnV3!PiH^~uMSMs(UW>rp^5O_2d+j4f^^6$^fT)gO&Vwb-W~ zAgEi+&mJlPcPMgXE0VM9B~|ta$U-18d4s~e?Tov*t%ETkp|wP$vK<@6nj{Q zCjHZUT4dpRTrAV7amO9rnU~Fvcy9bRsQX}M8g#a-z`O?%J;OXX3Z=HeFJ-*@f5vnP zRwyg54M<<9A~Yq)zrF(jIZ@?6or=_DO9*F0ASfj-kh|to@EvQ zeEfIVX-Byf`tU&NRt)nNQ`BcdApqSZZlLF`$V4g%8#ipPgs%o8rf{wCidN#CB22dt z)A`8lN4vV?V%s0C7yu6j1x!q$j9Z>;YnPED0)C_h0rdo9f&}L$@ef2cg&hjCAUiZC zfSxk&sKPZ(=TSmxKMQd8dUzcCmx#Fi5HO40MMO@3%?Z&WQ+DckK)g zRYbjpoO%V>Rj#O?`vT8YK}NsJ`fVE+-b!LE*ldlM{Z?yi|Oo4>w^bTNHI`nmVOJKz1Tsp;1cY?fXl0x2OLN;@}kDc(dCPN>^)c|N22OMCV2q7Rnh{mF{?c14ORsD z^FvMd*q2>iNy8D&0+dYLq|fh<6T62^AV0Ps{60{KA9$#4xh}c z>MJZ~4qMa%Fk?kJD@I^8T}htdmK;S=JOA4G=FO4F) zi{J{R=U9=N6680pP5^Sw4EU`cEWpJG-2t4wFCvmIN97pmE^W!B%M zTG>72cjn#pXO4|SAqI-VE7ue%OjiK#?@%6`w6R`!rT}~$_Q-MDsT2lqUnT&-8gQ)7jE!aii+AF+3s+kbVtshYU3rZ1vo{T&O&DJq3gHTwEFv1KHX3N9t{ha z=mZ7bwi7X2{6ly_sX-)yXB;sL3Xqpb9_~u_1;x6>j zSOlzKar*;c7*9jL)Lt9Qq=;h+(Xwgf$?Df$QDamwl=Du5Y|KnOi#fa+dIe4@m-uzY zwsq1@*o!;4hpya=D!5-I#stxu$aY`u;@E8x5w6ecDIBZtT8&usGqQ`E5Z^WgU8wx@ z-)0Qj7BPI3`f0G~DlwIrQ|Xo30WI~$i*7#|0aEntsdSxcvLV=21wsN0abyrH6Y_te zKa{Gie5OVe{NbNm?EO>MxHW_N3Zb1O@y^#T1*9)kPECx$O_m0_9;})rE|tV{AMqTo zR;*`bwtYCLaT^v&V1+gJ=DxPwBrocr#2w`JL{wy3k<~_gEAvMxY6)U8YrS&s&J5d0-3ae=tBACBYuv^sW z9T1NRmvkKG7ikxX9`O+7+&7K!d0J`J+WunHaKS?ecPJg;(J3D=vd%N>*Ws1uc`gd! zEPJU%${T>vsAO5a^B={kE<|e!aIRJcZEX3xopeeWFELiPlU335tz#M4vhs_jOs8YBAq6DMWEo)2 zn4(Tvv9Ql?{pmPdi(Te1f|~Voy~tzQBc3<>ylM@24r7giA;;lJ&xInc3H7PGH`Ido zjaSVrY3Kun?EM)~vA0!ZIv}Hubr!Do`M-Ki?xcf9v#NRVj~&1kwE)aq@|>%5z~Tk{nNH8NKFay9$z2;xnTPI z&U{WgV9(vz*X?r)oMxhW3MB$aE z3KTBO09e+N_Q!3kmzgC1Uw}QfT5-;W0X&cfHADU6RQ0(q2te0~+vtVsGLR}FXDwUn z;Tz$|8CjnpdR64ez~8B1Ks~|O zV8O*{{34KTVFyAi$j;3vpchO$DhN%}M3m5aZ-U(e-|h#16~eE-1PtS7=pR~%6kHd>r3nddU{H9##zP0MU{d06A#-3`GCYvIFv zVz)$`)k29o*zE+X*fuM>gZP}sSt@!3U^@R{^~QrKpy;cy%6kScT5ltma|!Ziz~xml zP+Bz6k6|qB%qj9?TJN((M;YN1!0|j8e89XRurqtd0f&-}IID7Ub@^bP`Hj-amZ*4> zNg4z1mb3t@&#WzeK@@?!eXHu61#c*+U#Xh#$=)#8E3 z%TdX*y+*maIC&&6aNknk1;BTBT~dFA>oqa`DGvtqIllG{7Kt9BOF3*=m+1}S5yXXG z679qE^qhsm<>=AGr%>uJ+{crB+Gk{)`?ojSC%l_^Aei&y=^CjQ07~PW6^+i`iZv~e z))wGY?F8D`^6_)=-(^~fk(#ZIvqtRf@`z?+jCor5Ts%HY_5OU1!-X9@C1nSc!ine> zRNJF+Wpu}%8zTQK33=>P!PiHuJqeBqBFRorNBD9tNMD@*=1EuX?1fjMRY7rg3hzv31h5lOov8GNZm7x}+HBTG<0H?!wP=I9J>uZcQWP`voWo zeJZ4^j8N>FTo+~$R&5f zTR07(;+V%M1CKn|enUOP4b0yofZ<88Jr#~luAfGE-|=gci4|W7l6e64sVx9DGgb7S z!YF|~{}q>c;7(N4mK;PH0ZI|tFQ32&@sQ~*Jm(;uZNyPImd^qwrxjR)YtQmu@|OzP=`F;ouXIZ0ZSbwqQ%YaMzZilt)Lw0+`(*ZK7V>( zr7`Ik)!Un07GrajF*c%O8YQXo!^h1k_%sh3dRxQFN^Sy_Sy7h4t-O^gV(vfP#84Ay z3FC6eKK^4|2?rHKNjG4wA@wgoFUyc7d2Xk3nqKHu?^%#6jo%v}P)AV2c)=kYe1DyO z9~vh+ebw@Og)C*um75VjNv2US4CXeD?6n#n@AZE+Jawad&me-kW?_0Ol(&%c;C_C! zU_9ZCVuumO7AfaSjO!_1GJoJ!hC^%JXK^eqh{AJ+I29Y?TuitLi|b_2>*q$9dePjM z50gDsenZaa4WhgN%JMNdtg<7=R zXTUO6sk_Sm=X|#RXd4_TMuikTPcnr=uAl(ZVo!%9v9DCkAP3kD<8s_{r3?Y!OATfj z{W(>9=wN^sWRBpy4#H$gsw+LF-o!r4IGn-OvFbf(2Pl?Z(HVo{cKmzG*!b(8F2evG zEHnm2NVYp~M%w*RIG7*gtS}Yi7}zu&9I^f+O|&-(6`-4?oS-jBk>aR@mR%7@TK~Ec z-V5W$2n|9bxA6gnJg~pZU$!*K#PYNv)MlyW*8AV0v5KP#bltE{49zbzXb)Exs2r6# zNNkwgY?9rE^>`@7ge}RWe4k*Y0WYOgm63`alS_i^!Ya+9rAeN6 z#QMl9QZF?#Zt>x)cf-RFH4SKdJM3=SC!)M59l^VL5mC0)P23Uprah%a>I7xY?A7pi zGK8Z7xvGEE9*<_=gF(^`0KjzhS%FJUk$yDBp6+&y{L5znv|Ljd7&pZAta&aQ7;WAGk9`z-l2F7Z>lh{QNC%@vd?>q_0nzF-)gFq=l zJ4N&O0Uk0PCC8lP6V14aCo^hvBae^sufyX+=Wn{cPmraIxpK2&C(lHu}as?W%I-2t>$fEk@+xwzB} z`Gq9&4)SqCmAVhsnE8YKkh(#vQ&cpaa`lpSu;%_ZtO;_6%fb%8OYT(?vXD>t`vd@; z24Fvn5NH=hA$Ncahc~L09lb&B6{>~Ii@TAv!_cc%n{4<7O4T=cU;OWu-|Yiqg$U51 zhpFaJsCCo;8f;1M687opfpiB&~s zwAl(?<>jan!xY% zBN-H4=&P6Gx=8KPL_@E>+`-1EiuH))eu8eP*jMX;1<><5$-*XYc`) + + + + + + + + + + + + + + diff --git a/src/features/welcome/index.tsx b/src/features/welcome/index.tsx new file mode 100644 index 0000000..6956ae5 --- /dev/null +++ b/src/features/welcome/index.tsx @@ -0,0 +1,62 @@ +import { Button } from '@internxt/ui' +import smallLogo from '../../assets/logos/small-logo.svg' +import MailAppImage from '../../assets/images/welcome/welcome-image.webp' +import { useTranslationContext } from '@/i18n' +import { useAuth } from '@/hooks/useAuth' +import { useNavigation } from '@/hooks/useNavigation' + +const WelcomePage = () => { + const { translate } = useTranslationContext() + const { goTo } = useNavigation() + + const onClose = () => {} + + const onLogin = (token: string) => { + console.log('onLogin', token) + goTo('/inbox') + } + + const { handleWebLogin, handleWebSignup } = useAuth({ + onClose, + onLogin, + translate, + }) + + return ( +
diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index 2d7c1f1..199ace4 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -1,17 +1,15 @@ import { useCallback, useState } from 'react' -import { OauthService } from '@/services/auth/oauth.service' import { LocalStorageService } from '@/services/local-storage' import { PaymentsService } from '@/services/sdk/payments.service' import type { LoginCredentials } from '@/types' +import { OauthService } from '@/services/oauth/oauth.service' interface UseWebAuthProps { - onClose: () => void onLogin?: (token: string) => void translate: (key: string) => string } -export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { - const [isLoggingIn, setIsLoggingIn] = useState(false) +export function useAuth({ onLogin, translate }: UseWebAuthProps) { const [webAuthError, setWebAuthError] = useState('') const saveUserSession = useCallback( @@ -39,7 +37,6 @@ export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { * Handles web-based login using popup window */ const handleWebLogin = async () => { - setIsLoggingIn(true) setWebAuthError('') try { @@ -50,23 +47,8 @@ export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { } await saveUserSession(credentials) - onClose() } catch (err: unknown) { - if (err instanceof Error) { - if (err.message.includes('popup blocker')) { - setWebAuthError(translate('meet.auth.modal.error.popupBlocked')) - } else if (err.message.includes('cancelled')) { - setWebAuthError(translate('meet.auth.modal.error.authCancelled')) - } else if (err.message.includes('timeout')) { - setWebAuthError(translate('meet.auth.modal.error.authTimeout')) - } else { - setWebAuthError(err.message) - } - } else { - setWebAuthError(translate('meet.auth.modal.error.genericError')) - } - } finally { - setIsLoggingIn(false) + errorHandler(err) } } @@ -74,7 +56,6 @@ export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { * Handles web-based signup using popup window */ const handleWebSignup = async () => { - setIsLoggingIn(true) setWebAuthError('') try { @@ -85,8 +66,13 @@ export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { } await saveUserSession(credentials) - onClose() } catch (err: unknown) { + errorHandler(err) + } + } + + const errorHandler = useCallback( + (err: unknown) => { if (err instanceof Error) { if (err.message.includes('popup blocker')) { setWebAuthError(translate('meet.auth.modal.error.popupBlocked')) @@ -100,18 +86,15 @@ export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { } else { setWebAuthError(translate('meet.auth.modal.error.genericError')) } - } finally { - setIsLoggingIn(false) - } - } + }, + [setWebAuthError], + ) const resetState = useCallback(() => { setWebAuthError('') - setIsLoggingIn(false) }, []) return { - isLoggingIn, webAuthError, handleWebLogin, handleWebSignup, diff --git a/src/services/auth/auth.service.ts b/src/services/auth/auth.service.ts deleted file mode 100644 index 64cf358..0000000 --- a/src/services/auth/auth.service.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { SdkManager } from '../sdk' - -export class AuthService { - public static readonly instance: AuthService = new AuthService() - - /** - * Checks from user's security details if it has enabled two factor auth - * @param email The user's email - * @throws {Error} If auth.securityDetails endpoint fails - * @returns True if user has enabled two factor auth - * @async - **/ - public is2FANeeded = async (email: string): Promise => { - const authClient = SdkManager.instance.getNewAuth() - const securityDetails = await authClient - .securityDetails(email) - .catch((error) => { - throw new Error(error.message ?? 'Login error') - }) - return securityDetails.tfaEnabled - } - - /** - * Obtains the current logged in user - * - * @returns The current user - */ - public getUser = async () => { - const usersClient = SdkManager.instance.getUsers() - - const { user } = await usersClient.refreshUser() - - return user - } - - /** - * Refreshes user tokens and data - * @returns The refreshed user data and tokens - */ - public refreshUserAndTokens = async () => { - const usersClient = SdkManager.instance.getUsers() - const refreshResponse = await usersClient.refreshUser() - return refreshResponse - } - - /** - * Refreshes user avatar independently - */ - public refreshAvatarUser = async (): Promise<{ avatar: string | null }> => { - const usersClient = SdkManager.instance.getUsers() - return usersClient.refreshAvatarUser() - } -} diff --git a/src/services/oauth/errors/oauth.errors.ts b/src/services/oauth/errors/oauth.errors.ts new file mode 100644 index 0000000..8f25a83 --- /dev/null +++ b/src/services/oauth/errors/oauth.errors.ts @@ -0,0 +1,33 @@ +export class MissingAuthParamsToken extends Error { + constructor() { + super('Missing auth params token') + + Object.setPrototypeOf(this, MissingAuthParamsToken.prototype) + } +} + +export class AuthCancelledByUserError extends Error { + constructor() { + super('Authentication cancelled by user') + + Object.setPrototypeOf(this, AuthCancelledByUserError.prototype) + } +} + +export class AuthTimeoutError extends Error { + constructor() { + super('Authentication timed out') + + Object.setPrototypeOf(this, AuthTimeoutError.prototype) + } +} + +export class OpenAuthPopupError extends Error { + constructor() { + super( + 'Failed to open authentication popup. Please check your popup blocker settings.', + ) + + Object.setPrototypeOf(this, OpenAuthPopupError.prototype) + } +} diff --git a/src/services/auth/oauth.service.ts b/src/services/oauth/oauth.service.ts similarity index 88% rename from src/services/auth/oauth.service.ts rename to src/services/oauth/oauth.service.ts index 6a066b1..c7ad349 100644 --- a/src/services/auth/oauth.service.ts +++ b/src/services/oauth/oauth.service.ts @@ -1,14 +1,21 @@ import { WEB_AUTH_CONFIG, WEB_AUTH_MESSAGE_TYPES, - WEB_AUTH_STORAGE_KEYS, WEB_AUTH_VALID_ORIGINS, type LoginCredentials, type WebAuthMessage, type WebAuthParams, } from '@/types' -import { AuthService } from './auth.service' +import { UserService } from '../user/user.service' import { ConfigService } from '../config' +import { LocalStorageService } from '../local-storage' +import { + AuthCancelledByUserError, + AuthTimeoutError, + MissingAuthParamsToken, + OpenAuthPopupError, +} from './errors/oauth.errors' +import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' export class OauthService { public static readonly instance: OauthService = new OauthService() @@ -102,12 +109,10 @@ export class OauthService { const { payload } = data if (!payload || !this.validateAuthParams(payload)) { - reject(new Error('Missing authentication parameters')) + reject(new MissingAuthParamsToken()) return } - console.log('handleAuthSuccess', payload) - resolve(payload) } @@ -134,10 +139,10 @@ export class OauthService { ): NodeJS.Timeout { return setInterval(() => { if (popup.closed) { - clearInterval(this.popupCheckInterval!) + if (this.popupCheckInterval) clearInterval(this.popupCheckInterval) clearTimeout(timeout) this.cleanup() - reject(new Error('Authentication cancelled by user')) + reject(new AuthCancelledByUserError()) } }, WEB_AUTH_CONFIG.popupCheckIntervalMs) } @@ -151,7 +156,7 @@ export class OauthService { return new Promise((resolve, reject) => { const timeout = setTimeout(() => { this.cleanup() - reject(new Error('Authentication timeout')) + reject(new AuthTimeoutError()) }, WEB_AUTH_CONFIG.authTimeoutMs) this.messageListener = (event: MessageEvent) => { @@ -212,14 +217,14 @@ export class OauthService { * Store tokens in localStorage */ private storeTokens(newToken: string): void { - localStorage.setItem(WEB_AUTH_STORAGE_KEYS.NEW_TOKEN, newToken) + LocalStorageService.instance.setToken(newToken) } /** * Fetch user data with provided tokens */ private async fetchUserData() { - const { user } = await AuthService.instance.refreshUserAndTokens() + const { user } = await UserService.instance.refreshUserAndTokens() return user } @@ -228,17 +233,15 @@ export class OauthService { * Build login credentials response */ private buildLoginCredentials( - user: any, + user: UserSettings, mnemonic: string, newToken: string, ): LoginCredentials { - console.log('buildLoginCredentials', user, mnemonic, newToken) return { user: { ...user, mnemonic, } as unknown as LoginCredentials['user'], - token: '', // Token is not used in web auth flow, remove when remove all old token references newToken, mnemonic, } @@ -259,11 +262,13 @@ export class OauthService { const user = await this.fetchUserData() - console.log('user', user) - - return this.buildLoginCredentials(user, mnemonic, newToken) + return this.buildLoginCredentials( + user as unknown as LoginCredentials['user'], + mnemonic, + newToken, + ) } catch (error) { - console.log('processWebAuthParams error', error) + console.error('Error while processing web auth params', error) throw new Error( `Web authentication processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, ) @@ -278,13 +283,11 @@ export class OauthService { this.authPopup = this.openAuthPopup(url) if (!this.authPopup) { - throw new Error( - 'Failed to open authentication popup. Please check your popup blocker settings.', - ) + throw new OpenAuthPopupError() } const authParams = await this.waitForAuthResponse(this.authPopup) - console.log('authParams', authParams) + return await this.processWebAuthParams(authParams) } catch (error) { this.cleanup() diff --git a/src/services/user/user.service.ts b/src/services/user/user.service.ts new file mode 100644 index 0000000..cca8e32 --- /dev/null +++ b/src/services/user/user.service.ts @@ -0,0 +1,28 @@ +import { SdkManager } from '../sdk' + +export class UserService { + public static readonly instance: UserService = new UserService() + + /** + * Obtains the current logged in user + * + * @returns The current user + */ + public getUser = async () => { + const usersClient = SdkManager.instance.getUsers() + + const { user } = await usersClient.refreshUser() + + return user + } + + /** + * Refreshes user tokens and data + * @returns The refreshed user data and tokens + */ + public refreshUserAndTokens = async () => { + const usersClient = SdkManager.instance.getUsers() + const refreshResponse = await usersClient.refreshUser() + return refreshResponse + } +} diff --git a/src/types/index.ts b/src/types/index.ts index 6800c1a..0a2c4b5 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -2,7 +2,6 @@ import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' export interface LoginCredentials { user: UserSettings - token: string newToken: string mnemonic: string } @@ -13,7 +12,9 @@ export interface WebAuthParams { } export interface WebAuthMessage { - type: 'INTERNXT_AUTH_SUCCESS' | 'INTERNXT_AUTH_ERROR' + type: + | typeof WEB_AUTH_MESSAGE_TYPES.SUCCESS + | typeof WEB_AUTH_MESSAGE_TYPES.ERROR payload?: WebAuthParams error?: string } diff --git a/yarn.lock b/yarn.lock index d03db54..ef33d7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -237,11 +237,6 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz#798a33950d11226a0ebb6acafa60f5594424967f" integrity sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== -"@dashlane/pqc-kem-kyber512-browser@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@dashlane/pqc-kem-kyber512-browser/-/pqc-kem-kyber512-browser-1.0.0.tgz#10a1b07e396616e574b9acad78d53076f271ac1d" - integrity sha512-lGWwF/5qkcnlZNZ5n2KkqjzC4q6EUre85ZotxOUQii9pCcZpeJBjK+naZoKAQz1pQZjGIZNHxIfzX5UxWsaouA== - "@emnapi/core@^1.7.1", "@emnapi/core@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" @@ -524,13 +519,6 @@ dependencies: tailwindcss "^4.1.17" -"@internxt/lib@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@internxt/lib/-/lib-1.4.1.tgz#dd4974cb49ab6bba118cf218434e69e95cc4a481" - integrity sha512-sWNp57IKCk0HjzTdPSuxOgZWvrSDWGYrzNOq90LIZTzr1HwkxObicUaZqSzmw4uDKrJhsdFdzwdywk3g8gwDDA== - dependencies: - uuid "^11.1.0" - "@internxt/sdk@^1.15.1": version "1.15.1" resolved "https://registry.yarnpkg.com/@internxt/sdk/-/sdk-1.15.1.tgz#69ad13a3c8cacbd929f025f24adc6fd2d1faf8ef" @@ -3661,11 +3649,6 @@ obug@^2.1.1: resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== -openpgp@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-6.3.0.tgz#e5f72f3f10dd8bb43660225e421c4fda80bafd6e" - integrity sha512-pLzCU8IgyKXPSO11eeharQkQ4GzOKNWhXq79pQarIRZEMt1/ssyr+MIuWBv1mNoenJLg04gvPx+fi4gcKZ4bag== - optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -4638,11 +4621,6 @@ util@^0.12.4, util@^0.12.5: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - uuid@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" From 7cbc67ba1d4246fe21b2fcd643d3075cc1e1d511 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 17:01:28 +0100 Subject: [PATCH 07/12] refactor: cleaning up oauth service --- src/hooks/useAuth.ts | 2 +- src/services/oauth/oauth.service.ts | 37 +++++++++-------------------- src/types/{ => oauth}/index.ts | 4 ---- 3 files changed, 12 insertions(+), 31 deletions(-) rename src/types/{ => oauth}/index.ts (93%) diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index 199ace4..be1a5b4 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { LocalStorageService } from '@/services/local-storage' import { PaymentsService } from '@/services/sdk/payments.service' -import type { LoginCredentials } from '@/types' +import type { LoginCredentials } from '@/types/oauth' import { OauthService } from '@/services/oauth/oauth.service' interface UseWebAuthProps { diff --git a/src/services/oauth/oauth.service.ts b/src/services/oauth/oauth.service.ts index c7ad349..ef96bb2 100644 --- a/src/services/oauth/oauth.service.ts +++ b/src/services/oauth/oauth.service.ts @@ -5,10 +5,9 @@ import { type LoginCredentials, type WebAuthMessage, type WebAuthParams, -} from '@/types' +} from '@/types/oauth' import { UserService } from '../user/user.service' import { ConfigService } from '../config' -import { LocalStorageService } from '../local-storage' import { AuthCancelledByUserError, AuthTimeoutError, @@ -16,14 +15,15 @@ import { OpenAuthPopupError, } from './errors/oauth.errors' import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' +import { LocalStorageService } from '../local-storage' + +const WEB_CLIENT_URL = ConfigService.instance.isProduction() + ? 'https://drive.internxt.com' + : 'http://localhost:3000' export class OauthService { public static readonly instance: OauthService = new OauthService() - private readonly WEB_CLIENT_URL = ConfigService.instance.isProduction() - ? 'https://drive.internxt.com' - : 'http://localhost:3000' - private authPopup: Window | null = null private messageListener: ((event: MessageEvent) => void) | null = null private popupCheckInterval: NodeJS.Timeout | null = null @@ -33,8 +33,8 @@ export class OauthService { */ public get urls() { return { - login: `${this.WEB_CLIENT_URL}${WEB_AUTH_CONFIG.loginPath}?${WEB_AUTH_CONFIG.authOriginParam}`, - signup: `${this.WEB_CLIENT_URL}${WEB_AUTH_CONFIG.signupPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + login: `${WEB_CLIENT_URL}${WEB_AUTH_CONFIG.loginPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + signup: `${WEB_CLIENT_URL}${WEB_AUTH_CONFIG.signupPath}?${WEB_AUTH_CONFIG.authOriginParam}`, } } @@ -213,22 +213,6 @@ export class OauthService { return Buffer.from(param, 'base64').toString('utf-8') } - /** - * Store tokens in localStorage - */ - private storeTokens(newToken: string): void { - LocalStorageService.instance.setToken(newToken) - } - - /** - * Fetch user data with provided tokens - */ - private async fetchUserData() { - const { user } = await UserService.instance.refreshUserAndTokens() - - return user - } - /** * Build login credentials response */ @@ -258,9 +242,10 @@ export class OauthService { try { const mnemonic = this.decodeBase64Param(params.mnemonic) const newToken = this.decodeBase64Param(params.newToken) - this.storeTokens(newToken) - const user = await this.fetchUserData() + LocalStorageService.instance.setToken(newToken) + + const user = await UserService.instance.getUser() return this.buildLoginCredentials( user as unknown as LoginCredentials['user'], diff --git a/src/types/index.ts b/src/types/oauth/index.ts similarity index 93% rename from src/types/index.ts rename to src/types/oauth/index.ts index 0a2c4b5..1057db9 100644 --- a/src/types/index.ts +++ b/src/types/oauth/index.ts @@ -35,10 +35,6 @@ export const WEB_AUTH_MESSAGE_TYPES = { ERROR: 'INTERNXT_AUTH_ERROR', } as const -export const WEB_AUTH_STORAGE_KEYS = { - NEW_TOKEN: 'xNewToken', -} as const - export const WEB_AUTH_CONFIG: WebAuthConfig = { popupWidth: 500, popupHeight: 700, From 72859821680438fc54a06c54535fc37f0021b598 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 17:21:19 +0100 Subject: [PATCH 08/12] ci: add sonarcloud action --- .github/workflows/sonarcloud.yml | 38 ++++++++++++++ package.json | 1 + sonar-project.properties | 9 ++++ vitest.config.ts | 7 +++ yarn.lock | 85 ++++++++++++++++++++++++++++++-- 5 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/sonarcloud.yml create mode 100644 sonar-project.properties diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml new file mode 100644 index 0000000..683e19c --- /dev/null +++ b/.github/workflows/sonarcloud.yml @@ -0,0 +1,38 @@ +name: SonarCloud analysis + +on: + push: + branches: ["master"] + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + +permissions: + pull-requests: read # allows SonarCloud to decorate PRs with analysis results + +jobs: + Analysis: + runs-on: ubuntu-latest + strategy: + matrix: + node_version: [24.x] + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + + - name: Install + run: yarn install + - name: Unit test run + run: yarn test:coverage + + # Analyze with SonarCloud + - name: Analyze with SonarCloud + uses: SonarSource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # Generate a token on Sonarcloud.io, add it to the secrets of this repo with the name SONAR_TOKEN (Settings > Secrets > Actions > add new repository secret) diff --git a/package.json b/package.json index cba8e94..dc9a70b 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", + "@vitest/coverage-istanbul": "^4.0.18", "eslint": "^9.39.1", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..1e9e52b --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,9 @@ +sonar.organization=internxt +sonar.projectKey=internxt_mail-web +sonar.projectName=mail-web +sonar.sources=src +sonar.tests=src +sonar.test.inclusions=src/**/*.test.ts,src/**/*.test.tsx +sonar.javascript.lcov.reportPaths=coverage/lcov.info +sonar.exclusions=**/*.json,**/assets/**,**/*.css +sonar.cpd.exclusions=**/*.json,**/assets/**,**/*.css \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts index 4e44efe..e9babcb 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,6 +5,13 @@ export default defineConfig({ test: { globals: true, environment: 'jsdom', + coverage: { + provider: 'istanbul', + reporter: ['text', 'lcov'], + reportsDirectory: './coverage', + include: ['src/**/*.{js,ts,jsx,tsx}'], + exclude: ['src/**/*.test.{js,ts,jsx,tsx}'], + }, }, resolve: { alias: { diff --git a/yarn.lock b/yarn.lock index ef33d7d..b656b3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,7 +48,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== -"@babel/core@^7.24.4", "@babel/core@^7.29.0": +"@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== @@ -141,7 +141,7 @@ "@babel/template" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== @@ -537,7 +537,12 @@ "@radix-ui/react-switch" "^1.2.6" "@radix-ui/themes" "^3.2.1" -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": +"@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.13", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== @@ -563,7 +568,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": +"@jridgewell/trace-mapping@0.3.31", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": version "0.3.31" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== @@ -1996,6 +2001,22 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.18.0" +"@vitest/coverage-istanbul@^4.0.18": + version "4.0.18" + resolved "https://registry.yarnpkg.com/@vitest/coverage-istanbul/-/coverage-istanbul-4.0.18.tgz#9521482686849c76c2feee2335bb9b914ecc4f06" + integrity sha512-0OhjP30owEDihYTZGWuq20rNtV1RjjJs1Mv4MaZIKcFBmiLUXX7HJLX4fU7wE+Mrc3lQxI2HKq6WrSXi5FGuCQ== + dependencies: + "@istanbuljs/schema" "^0.1.3" + "@jridgewell/gen-mapping" "^0.3.13" + "@jridgewell/trace-mapping" "0.3.31" + istanbul-lib-coverage "^3.2.2" + istanbul-lib-instrument "^6.0.3" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.2.0" + magicast "^0.5.1" + obug "^2.1.1" + tinyrainbow "^3.0.3" + "@vitest/expect@4.0.18": version "4.0.18" resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-4.0.18.tgz#361510d99fbf20eb814222e4afcb8539d79dc94d" @@ -3095,6 +3116,11 @@ html-encoding-sniffer@^6.0.0: dependencies: "@exodus/bytes" "^1.6.0" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + html-parse-stringify@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" @@ -3280,6 +3306,39 @@ isomorphic-timers-promises@^1.0.1: resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + jiti@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" @@ -3481,6 +3540,22 @@ magic-string@^0.30.21, magic-string@^0.30.3: dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" +magicast@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.5.2.tgz#70cea9df729c164485049ea5df85a390281dfb9d" + integrity sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + source-map-js "^1.2.1" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + markdown-it@^14.0.0: version "14.1.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" @@ -4264,7 +4339,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.7.3: +semver@^7.5.3, semver@^7.5.4, semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== From cfc4502db8c0eeaae817e34794ce6d9102526ff0 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 17:24:48 +0100 Subject: [PATCH 09/12] fix: remove tsx files from coverage --- sonar-project.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/sonar-project.properties b/sonar-project.properties index 1e9e52b..c223035 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -4,6 +4,7 @@ sonar.projectName=mail-web sonar.sources=src sonar.tests=src sonar.test.inclusions=src/**/*.test.ts,src/**/*.test.tsx +sonar.coverage.exclusions=src/**/*.tsx sonar.javascript.lcov.reportPaths=coverage/lcov.info sonar.exclusions=**/*.json,**/assets/**,**/*.css sonar.cpd.exclusions=**/*.json,**/assets/**,**/*.css \ No newline at end of file From a699a2816ea8c9c0edbd5a65a83ad2efc5a502ab Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 17:34:07 +0100 Subject: [PATCH 10/12] test(service): add coverage for user service --- sonar-project.properties | 2 +- src/services/user/user.service.test.ts | 48 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/services/user/user.service.test.ts diff --git a/sonar-project.properties b/sonar-project.properties index c223035..63e8098 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -4,7 +4,7 @@ sonar.projectName=mail-web sonar.sources=src sonar.tests=src sonar.test.inclusions=src/**/*.test.ts,src/**/*.test.tsx -sonar.coverage.exclusions=src/**/*.tsx +sonar.coverage.exclusions=src/**/*.tsx,**/*.errors.ts,types/** sonar.javascript.lcov.reportPaths=coverage/lcov.info sonar.exclusions=**/*.json,**/assets/**,**/*.css sonar.cpd.exclusions=**/*.json,**/assets/**,**/*.css \ No newline at end of file diff --git a/src/services/user/user.service.test.ts b/src/services/user/user.service.test.ts new file mode 100644 index 0000000..33cd1ea --- /dev/null +++ b/src/services/user/user.service.test.ts @@ -0,0 +1,48 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { describe, expect, test, vi } from 'vitest' +import { SdkManager } from '../sdk' +import { UserService } from './user.service' + +describe('User Service', () => { + describe('Get the current logged in user', () => { + test('When a user is logged in, then it should be returned', async () => { + const mockedUser = { + user: { name: 'John Doe' }, + oldToken: 'oldToken', + newToken: 'newToken', + } + + const mockedUserClient = { + refreshUser: vi.fn().mockResolvedValue(mockedUser), + } + vi.spyOn(SdkManager.instance, 'getUsers').mockReturnValue( + mockedUserClient as any, + ) + + const result = await UserService.instance.getUser() + + expect(result).toEqual(mockedUser.user) + }) + }) + + describe('Refresh user data and tokens', () => { + test('When refreshing user data, then it should be returned', async () => { + const mockedUser = { + user: { name: 'John Doe' }, + oldToken: 'oldToken', + newToken: 'newToken', + } + + const mockedUserClient = { + refreshUser: vi.fn().mockResolvedValue(mockedUser), + } + vi.spyOn(SdkManager.instance, 'getUsers').mockReturnValue( + mockedUserClient as any, + ) + + const result = await UserService.instance.refreshUserAndTokens() + + expect(result).toEqual(mockedUser) + }) + }) +}) From 2e3c7c2cfd21f18e3506a4eae65f28dd5f6320bd Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 18:07:37 +0100 Subject: [PATCH 11/12] chore: add eslint --- .prettierrc | 5 + eslint.config.js | 19 +- package.json | 2 + src/App.tsx | 10 +- src/components/chips/RecipientChip.tsx | 6 +- .../components/DefaultAttachmentItem.tsx | 10 +- .../components/RecipientInput.tsx | 32 +- .../components/RichTextEditor.tsx | 62 +-- .../components/editorBar/EditorBarButton.tsx | 2 +- .../components/editorBar/EditorBarGroup.tsx | 6 +- .../components/editorBar/index.tsx | 122 ++--- .../components/fontSizeExtension.ts | 18 +- .../mail/composeMessageDialog/index.tsx | 44 +- .../mail/composeMessageDialog/types/index.ts | 2 +- src/features/mail/MailView.tsx | 24 +- src/features/welcome/index.tsx | 30 +- src/hooks/useAuth.ts | 66 +-- src/hooks/useNavigation.ts | 12 +- src/i18n/index.ts | 12 +- src/i18n/provider/TranslationProvider.tsx | 16 +- src/i18n/provider/useTranslationContext.tsx | 10 +- src/i18n/services/i18n.service.ts | 18 +- src/main.tsx | 12 +- src/routes/index.tsx | 12 +- src/routes/layouts/RootLayout.tsx | 8 +- src/routes/paths.ts | 2 +- src/services/config/config.errors.ts | 4 +- src/services/config/config.service.test.ts | 56 +-- src/services/config/index.ts | 18 +- src/services/local-storage/index.ts | 50 +- .../local-storage.service.test.ts | 134 ++--- src/services/oauth/errors/oauth.errors.ts | 26 +- src/services/oauth/oauth.service.test.ts | 465 ++++++++++++++++++ src/services/oauth/oauth.service.ts | 160 +++--- src/services/sdk/index.ts | 62 +-- src/services/sdk/payments.service.test.ts | 68 +-- src/services/sdk/payments.service.ts | 20 +- src/services/sdk/sdk.service.test.ts | 146 +++--- src/services/user/user.service.test.ts | 36 +- src/services/user/user.service.ts | 20 +- src/types/oauth/index.ts | 8 +- vite.config.ts | 12 +- vitest.config.ts | 6 +- yarn.lock | 15 +- 44 files changed, 1186 insertions(+), 682 deletions(-) create mode 100644 .prettierrc create mode 100644 src/services/oauth/oauth.service.test.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..9e4c08a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "all" +} diff --git a/eslint.config.js b/eslint.config.js index 5e6b472..55131e1 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,12 +1,14 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' +import js from '@eslint/js'; +import globals from 'globals'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import tseslint from 'typescript-eslint'; +import { defineConfig, globalIgnores } from 'eslint/config'; +import internxtConfig from '@internxt/eslint-config-internxt'; export default defineConfig([ globalIgnores(['dist']), + ...internxtConfig, { files: ['**/*.{ts,tsx}'], extends: [ @@ -19,5 +21,8 @@ export default defineConfig([ ecmaVersion: 2020, globals: globals.browser, }, + rules: { + 'max-len': 'off', + }, }, -]) +]); diff --git a/package.json b/package.json index dc9a70b..a6df1d4 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dev": "vite", "build": "tsc -b && vite build", "lint": "eslint .", + "lint:fix": "eslint . --fix", "preview": "vite preview", "test": "vitest run", "test:ui": "vitest --ui", @@ -40,6 +41,7 @@ }, "devDependencies": { "@eslint/js": "^9.39.1", + "@internxt/eslint-config-internxt": "^2.0.1", "@types/node": "^25.3.3", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", diff --git a/src/App.tsx b/src/App.tsx index 0bf4e87..fac663d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,10 @@ -import { RouterProvider, createBrowserRouter } from 'react-router-dom' -import { routes } from './routes' +import { RouterProvider, createBrowserRouter } from 'react-router-dom'; +import { routes } from './routes'; -const router = createBrowserRouter(routes) +const router = createBrowserRouter(routes); function App() { - return + return ; } -export default App +export default App; diff --git a/src/components/chips/RecipientChip.tsx b/src/components/chips/RecipientChip.tsx index c666c39..e80de74 100644 --- a/src/components/chips/RecipientChip.tsx +++ b/src/components/chips/RecipientChip.tsx @@ -1,5 +1,5 @@ -import { XIcon } from '@phosphor-icons/react' -import type { Recipient } from '../mail/composeMessageDialog/types' +import { XIcon } from '@phosphor-icons/react'; +import type { Recipient } from '../mail/composeMessageDialog/types'; interface RecipientChipProps { recipient: Recipient @@ -18,4 +18,4 @@ export const RecipientChip = ({ recipient, onRemove }: RecipientChipProps) => ( -) +); diff --git a/src/components/mail/composeMessageDialog/components/DefaultAttachmentItem.tsx b/src/components/mail/composeMessageDialog/components/DefaultAttachmentItem.tsx index c81b5f0..3cd7591 100644 --- a/src/components/mail/composeMessageDialog/components/DefaultAttachmentItem.tsx +++ b/src/components/mail/composeMessageDialog/components/DefaultAttachmentItem.tsx @@ -1,12 +1,12 @@ -import { PaperclipIcon, XIcon } from '@phosphor-icons/react' -import type { Attachment } from '../types' +import { PaperclipIcon, XIcon } from '@phosphor-icons/react'; +import type { Attachment } from '../types'; export const DefaultAttachmentItem = ({ attachment, onRemove, }: { - attachment: Attachment - onRemove: () => void + attachment: Attachment; + onRemove: () => void; }) => (
@@ -23,4 +23,4 @@ export const DefaultAttachmentItem = ({
-) +); diff --git a/src/components/mail/composeMessageDialog/components/RecipientInput.tsx b/src/components/mail/composeMessageDialog/components/RecipientInput.tsx index b1c35ea..e84236a 100644 --- a/src/components/mail/composeMessageDialog/components/RecipientInput.tsx +++ b/src/components/mail/composeMessageDialog/components/RecipientInput.tsx @@ -1,6 +1,6 @@ -import { useState, type KeyboardEvent } from 'react' -import type { Recipient } from '../types' -import { RecipientChip } from '@/components/chips/RecipientChip' +import { useState, type KeyboardEvent } from 'react'; +import type { Recipient } from '../types'; +import { RecipientChip } from '@/components/chips/RecipientChip'; interface RecipientInputProps { label: string @@ -31,32 +31,32 @@ export const RecipientInput = ({ bccButtonText = 'BCC', disabled, }: RecipientInputProps) => { - const [inputValue, setInputValue] = useState('') + const [inputValue, setInputValue] = useState(''); const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ',') { - e.preventDefault() - const email = inputValue.trim().replace(/,$/, '') + e.preventDefault(); + const email = inputValue.trim().replace(/,$/, ''); if (email) { - onAddRecipient(email) - setInputValue('') + onAddRecipient(email); + setInputValue(''); } } else if ( e.key === 'Backspace' && inputValue === '' && recipients.length > 0 ) { - onRemoveRecipient(recipients.at(-1)!.id) + onRemoveRecipient(recipients.at(-1)!.id); } - } + }; const handleBlur = () => { - const email = inputValue.trim() + const email = inputValue.trim(); if (email) { - onAddRecipient(email) - setInputValue('') + onAddRecipient(email); + setInputValue(''); } - } + }; return (
@@ -104,5 +104,5 @@ export const RecipientInput = ({ )}
- ) -} + ); +}; diff --git a/src/components/mail/composeMessageDialog/components/RichTextEditor.tsx b/src/components/mail/composeMessageDialog/components/RichTextEditor.tsx index 3399247..423f47a 100644 --- a/src/components/mail/composeMessageDialog/components/RichTextEditor.tsx +++ b/src/components/mail/composeMessageDialog/components/RichTextEditor.tsx @@ -1,14 +1,14 @@ -import { useEditor, EditorContent, Editor } from '@tiptap/react' -import StarterKit from '@tiptap/starter-kit' -import { Underline } from '@tiptap/extension-underline' -import { TextAlign } from '@tiptap/extension-text-align' -import { Link } from '@tiptap/extension-link' -import { Image } from '@tiptap/extension-image' -import { TextStyle } from '@tiptap/extension-text-style' -import { Color } from '@tiptap/extension-color' -import { FontFamily } from '@tiptap/extension-font-family' -import { useEffect } from 'react' -import { FontSize } from './fontSizeExtension' +import { useEditor, EditorContent, Editor } from '@tiptap/react'; +import StarterKit from '@tiptap/starter-kit'; +import { Underline } from '@tiptap/extension-underline'; +import { TextAlign } from '@tiptap/extension-text-align'; +import { Link } from '@tiptap/extension-link'; +import { Image } from '@tiptap/extension-image'; +import { TextStyle } from '@tiptap/extension-text-style'; +import { Color } from '@tiptap/extension-color'; +import { FontFamily } from '@tiptap/extension-font-family'; +import { useEffect } from 'react'; +import { FontSize } from './fontSizeExtension'; export interface RichTextEditorProps { value?: string @@ -71,63 +71,63 @@ export const RichTextEditor = ({ ], content: value, onUpdate: ({ editor }) => { - onChange?.(editor.getHTML()) + onChange?.(editor.getHTML()); }, editorProps: { attributes: { class: `focus:outline-none h-full ${className}`, }, handlePaste: (view, event) => { - const text = event.clipboardData?.getData('text/plain') - const { from, to } = view.state.selection - const hasSelection = from !== to + const text = event.clipboardData?.getData('text/plain'); + const { from, to } = view.state.selection; + const hasSelection = from !== to; if (text && hasSelection) { - const urlPattern = /^(https?:\/\/|www\.)[^\s]+$/i + const urlPattern = /^(https?:\/\/|www\.)[^\s]+$/i; if (urlPattern.test(text)) { - const url = text.startsWith('www.') ? `https://${text}` : text + const url = text.startsWith('www.') ? `https://${text}` : text; view.dispatch( view.state.tr.addMark( from, to, view.state.schema.marks.link.create({ href: url }), ), - ) - return true + ); + return true; } } - return false + return false; }, }, - }) + }); useEffect(() => { if (editor && onEditorReady) { - onEditorReady(editor) + onEditorReady(editor); } - }, [editor, onEditorReady]) + }, [editor, onEditorReady]); useEffect(() => { if (editor && value !== editor.getHTML()) { - editor.commands.setContent(value) + editor.commands.setContent(value); } - }, [value, editor]) + }, [value, editor]); useEffect(() => { if (editor) { - editor.setEditable(!disabled) + editor.setEditable(!disabled); } - }, [editor, disabled]) + }, [editor, disabled]); if (!editor) { - return null + return null; } return (
- ) -} + ); +}; -export type { Editor } +export type { Editor }; diff --git a/src/components/mail/composeMessageDialog/components/editorBar/EditorBarButton.tsx b/src/components/mail/composeMessageDialog/components/editorBar/EditorBarButton.tsx index ffcd487..72e5caa 100644 --- a/src/components/mail/composeMessageDialog/components/editorBar/EditorBarButton.tsx +++ b/src/components/mail/composeMessageDialog/components/editorBar/EditorBarButton.tsx @@ -19,4 +19,4 @@ export const EditorBarButton = ({ > {children} -) +); diff --git a/src/components/mail/composeMessageDialog/components/editorBar/EditorBarGroup.tsx b/src/components/mail/composeMessageDialog/components/editorBar/EditorBarGroup.tsx index e38b1e4..022968c 100644 --- a/src/components/mail/composeMessageDialog/components/editorBar/EditorBarGroup.tsx +++ b/src/components/mail/composeMessageDialog/components/editorBar/EditorBarGroup.tsx @@ -1,5 +1,5 @@ -import type { EditorBarItem } from '../../types' -import { EditorBarButton } from './EditorBarButton' +import type { EditorBarItem } from '../../types'; +import { EditorBarButton } from './EditorBarButton'; export interface EditorBarGroupProps { items: EditorBarItem[] @@ -19,4 +19,4 @@ export const EditorBarGroup = ({ items, disabled }: EditorBarGroupProps) => ( ))}
-) +); diff --git a/src/components/mail/composeMessageDialog/components/editorBar/index.tsx b/src/components/mail/composeMessageDialog/components/editorBar/index.tsx index 5548829..42b7ad7 100644 --- a/src/components/mail/composeMessageDialog/components/editorBar/index.tsx +++ b/src/components/mail/composeMessageDialog/components/editorBar/index.tsx @@ -13,12 +13,12 @@ import { ImageIcon, CaretDownIcon, PaintBucketIcon, -} from '@phosphor-icons/react' -import { Editor } from '@tiptap/react' -import { useCallback, useState, useRef, useEffect, useReducer } from 'react' -import { EditorBarButton } from './EditorBarButton' -import { EditorBarGroup } from './EditorBarGroup' -import type { EditorBarItem } from '../../types' +} from '@phosphor-icons/react'; +import { Editor } from '@tiptap/react'; +import { useCallback, useState, useRef, useEffect, useReducer } from 'react'; +import { EditorBarButton } from './EditorBarButton'; +import { EditorBarGroup } from './EditorBarGroup'; +import type { EditorBarItem } from '../../types'; export interface ActionBarProps { editor: Editor | null @@ -31,9 +31,9 @@ const FONTS = [ { label: 'Georgia', value: 'Georgia, serif' }, { label: 'Verdana', value: 'Verdana, sans-serif' }, { label: 'Courier New', value: 'Courier New, monospace' }, -] +]; -const FONT_SIZES = ['10', '12', '14', '16', '18', '20', '24', '28', '32'] +const FONT_SIZES = ['10', '12', '14', '16', '18', '20', '24', '28', '32']; const COLORS = [ '#000000', @@ -52,31 +52,31 @@ const COLORS = [ '#0000FF', '#9900FF', '#FF00FF', -] +]; export const EditorBar = ({ editor, disabled }: ActionBarProps) => { - const [showColorPicker, setShowColorPicker] = useState(false) - const [showFontPicker, setShowFontPicker] = useState(false) - const [showSizePicker, setShowSizePicker] = useState(false) - const [currentFont, setCurrentFont] = useState('Arial') - const [currentSize, setCurrentSize] = useState('14') + const [showColorPicker, setShowColorPicker] = useState(false); + const [showFontPicker, setShowFontPicker] = useState(false); + const [showSizePicker, setShowSizePicker] = useState(false); + const [currentFont, setCurrentFont] = useState('Arial'); + const [currentSize, setCurrentSize] = useState('14'); - const colorPickerRef = useRef(null) - const fontPickerRef = useRef(null) - const sizePickerRef = useRef(null) - const [, forceUpdate] = useReducer((x) => x + 1, 0) + const colorPickerRef = useRef(null); + const fontPickerRef = useRef(null); + const sizePickerRef = useRef(null); + const [, forceUpdate] = useReducer((x) => x + 1, 0); useEffect(() => { - if (!editor) return + if (!editor) return; - editor.on('selectionUpdate', forceUpdate) - editor.on('transaction', forceUpdate) + editor.on('selectionUpdate', forceUpdate); + editor.on('transaction', forceUpdate); return () => { - editor.off('selectionUpdate', forceUpdate) - editor.off('transaction', forceUpdate) - } - }, [editor]) + editor.off('selectionUpdate', forceUpdate); + editor.off('transaction', forceUpdate); + }; + }, [editor]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { @@ -84,85 +84,85 @@ export const EditorBar = ({ editor, disabled }: ActionBarProps) => { colorPickerRef.current && !colorPickerRef.current.contains(event.target as Node) ) { - setShowColorPicker(false) + setShowColorPicker(false); } if ( fontPickerRef.current && !fontPickerRef.current.contains(event.target as Node) ) { - setShowFontPicker(false) + setShowFontPicker(false); } if ( sizePickerRef.current && !sizePickerRef.current.contains(event.target as Node) ) { - setShowSizePicker(false) + setShowSizePicker(false); } - } + }; - document.addEventListener('mousedown', handleClickOutside) - return () => document.removeEventListener('mousedown', handleClickOutside) - }, []) + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); // TODO: Update this to use the Modal component instead const setLink = useCallback(() => { - if (!editor) return + if (!editor) return; - const previousUrl = editor.getAttributes('link').href - const url = window.prompt('URL', previousUrl) + const previousUrl = editor.getAttributes('link').href; + const url = window.prompt('URL', previousUrl); - if (url === null) return + if (url === null) return; if (url === '') { - editor.chain().focus().extendMarkRange('link').unsetLink().run() - return + editor.chain().focus().extendMarkRange('link').unsetLink().run(); + return; } - editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run() - }, [editor]) + editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run(); + }, [editor]); // TODO: Update this to use the Modal component instead const addImage = useCallback(() => { - if (!editor) return + if (!editor) return; - const url = window.prompt('Image URL') + const url = window.prompt('Image URL'); if (url) { - editor.chain().focus().setImage({ src: url }).run() + editor.chain().focus().setImage({ src: url }).run(); } - }, [editor]) + }, [editor]); const setColor = useCallback( (color: string) => { - if (!editor) return - editor.chain().focus().setColor(color).run() - setShowColorPicker(false) + if (!editor) return; + editor.chain().focus().setColor(color).run(); + setShowColorPicker(false); }, [editor], - ) + ); const setFont = useCallback( (font: { label: string; value: string }) => { - if (!editor) return - editor.chain().focus().setFontFamily(font.value).run() - setCurrentFont(font.label) - setShowFontPicker(false) + if (!editor) return; + editor.chain().focus().setFontFamily(font.value).run(); + setCurrentFont(font.label); + setShowFontPicker(false); }, [editor], - ) + ); const setFontSize = useCallback( (size: string) => { - if (!editor) return - editor.chain().focus().setFontSize(`${size}px`).run() - setCurrentSize(size) - setShowSizePicker(false) + if (!editor) return; + editor.chain().focus().setFontSize(`${size}px`).run(); + setCurrentSize(size); + setShowSizePicker(false); }, [editor], - ) + ); if (!editor) { - return null + return null; } return ( @@ -376,5 +376,5 @@ export const EditorBar = ({ editor, disabled }: ActionBarProps) => { - ) -} + ); +}; diff --git a/src/components/mail/composeMessageDialog/components/fontSizeExtension.ts b/src/components/mail/composeMessageDialog/components/fontSizeExtension.ts index b98fe64..1af43df 100644 --- a/src/components/mail/composeMessageDialog/components/fontSizeExtension.ts +++ b/src/components/mail/composeMessageDialog/components/fontSizeExtension.ts @@ -1,4 +1,4 @@ -import { Extension } from '@tiptap/core' +import { Extension } from '@tiptap/core'; declare module '@tiptap/core' { interface Commands { @@ -15,7 +15,7 @@ export const FontSize = Extension.create({ addOptions() { return { types: ['textStyle'], - } + }; }, addGlobalAttributes() { @@ -29,16 +29,16 @@ export const FontSize = Extension.create({ element.style.fontSize?.replace(/['"]+/g, ''), renderHTML: (attributes) => { if (!attributes.fontSize) { - return {} + return {}; } return { style: `font-size: ${attributes.fontSize}`, - } + }; }, }, }, }, - ] + ]; }, addCommands() { @@ -46,7 +46,7 @@ export const FontSize = Extension.create({ setFontSize: (fontSize: string) => ({ chain }) => { - return chain().setMark('textStyle', { fontSize }).run() + return chain().setMark('textStyle', { fontSize }).run(); }, unsetFontSize: () => @@ -54,8 +54,8 @@ export const FontSize = Extension.create({ return chain() .setMark('textStyle', { fontSize: null }) .removeEmptyTextStyle() - .run() + .run(); }, - } + }; }, -}) +}); diff --git a/src/components/mail/composeMessageDialog/index.tsx b/src/components/mail/composeMessageDialog/index.tsx index 7c052e3..1f098f9 100644 --- a/src/components/mail/composeMessageDialog/index.tsx +++ b/src/components/mail/composeMessageDialog/index.tsx @@ -1,12 +1,12 @@ -import { PaperclipIcon, XIcon } from '@phosphor-icons/react' -import { useState, useCallback } from 'react' -import { Editor } from '@tiptap/react' -import type { Attachment, Recipient } from './types' -import { RecipientInput } from './components/RecipientInput' -import { Button, Input } from '@internxt/ui' -import { RichTextEditor } from './components/RichTextEditor' -import { EditorBar } from './components/editorBar' -import { DefaultAttachmentItem } from './components/DefaultAttachmentItem' +import { PaperclipIcon, XIcon } from '@phosphor-icons/react'; +import { useState, useCallback } from 'react'; +import { Editor } from '@tiptap/react'; +import type { Attachment, Recipient } from './types'; +import { RecipientInput } from './components/RecipientInput'; +import { Button, Input } from '@internxt/ui'; +import { RichTextEditor } from './components/RichTextEditor'; +import { EditorBar } from './components/editorBar'; +import { DefaultAttachmentItem } from './components/DefaultAttachmentItem'; export interface ComposeMessageDialogProps { isOpen: boolean @@ -65,23 +65,23 @@ export const ComposeMessageDialog = ({ onSubjectChange, text, }: ComposeMessageDialogProps) => { - const [editor, setEditor] = useState(null) - const [showCc, setShowCc] = useState(ccRecipients.length > 0) - const [showBcc, setShowBcc] = useState(bccRecipients.length > 0) + const [editor, setEditor] = useState(null); + const [showCc, setShowCc] = useState(ccRecipients.length > 0); + const [showBcc, setShowBcc] = useState(bccRecipients.length > 0); const handleEditorReady = useCallback((editorInstance: Editor) => { - setEditor(editorInstance) - }, []) + setEditor(editorInstance); + }, []); const handlePrimaryAction = useCallback(() => { if (editor) { - const html = editor.getHTML() - onPrimaryAction(html) + const html = editor.getHTML(); + onPrimaryAction(html); } - }, [editor, onPrimaryAction]) + }, [editor, onPrimaryAction]); if (!isOpen) { - return null + return null; } return ( @@ -173,14 +173,14 @@ export const ComposeMessageDialog = ({ {attachments.length > 0 && (
{attachments.map((attachment) => { - const handleRemove = () => onRemoveAttachment?.(attachment.id) + const handleRemove = () => onRemoveAttachment?.(attachment.id); return ( - ) + ); })}
)} @@ -205,5 +205,5 @@ export const ComposeMessageDialog = ({ - ) -} + ); +}; diff --git a/src/components/mail/composeMessageDialog/types/index.ts b/src/components/mail/composeMessageDialog/types/index.ts index f825460..a42b408 100644 --- a/src/components/mail/composeMessageDialog/types/index.ts +++ b/src/components/mail/composeMessageDialog/types/index.ts @@ -1,4 +1,4 @@ -import type { Icon } from '@phosphor-icons/react' +import type { Icon } from '@phosphor-icons/react'; export interface Attachment { id: string diff --git a/src/features/mail/MailView.tsx b/src/features/mail/MailView.tsx index e5bea0f..4a7e7a8 100644 --- a/src/features/mail/MailView.tsx +++ b/src/features/mail/MailView.tsx @@ -1,22 +1,22 @@ -import { useNavigation } from '@/hooks/useNavigation' -import { useTranslationContext } from '@/i18n' -import { PATHS } from '@/routes/paths' +import { useNavigation } from '@/hooks/useNavigation'; +import { useTranslationContext } from '@/i18n'; +import { PATHS } from '@/routes/paths'; interface MailViewProps { folder: string } const MailView = ({ folder }: MailViewProps) => { - const { goTo } = useNavigation() - const { translate } = useTranslationContext() + const { goTo } = useNavigation(); + const { translate } = useTranslationContext(); const goToInbox = () => { - goTo(PATHS.inbox) - } + goTo(PATHS.inbox); + }; const goToTrash = () => { - goTo(PATHS.trash) - } + goTo(PATHS.trash); + }; return (
@@ -27,7 +27,7 @@ const MailView = ({ folder }: MailViewProps) => {
- ) -} + ); +}; -export default MailView +export default MailView; diff --git a/src/features/welcome/index.tsx b/src/features/welcome/index.tsx index fcab03d..4fa08d4 100644 --- a/src/features/welcome/index.tsx +++ b/src/features/welcome/index.tsx @@ -1,23 +1,23 @@ -import { Button } from '@internxt/ui' -import smallLogo from '../../assets/logos/small-logo.svg' -import MailAppImage from '../../assets/images/welcome/welcome-page.webp' -import { useTranslationContext } from '@/i18n' -import { useAuth } from '@/hooks/useAuth' -import { useNavigation } from '@/hooks/useNavigation' +import { Button } from '@internxt/ui'; +import smallLogo from '../../assets/logos/small-logo.svg'; +import MailAppImage from '../../assets/images/welcome/welcome-page.webp'; +import { useTranslationContext } from '@/i18n'; +import { useAuth } from '@/hooks/useAuth'; +import { useNavigation } from '@/hooks/useNavigation'; const WelcomePage = () => { - const { translate } = useTranslationContext() - const { goTo } = useNavigation() + const { translate } = useTranslationContext(); + const { goTo } = useNavigation(); const handleOnLogin = () => { - console.log('onLogin') - goTo('/inbox') - } + console.log('onLogin'); + goTo('/inbox'); + }; const { handleWebLogin, handleWebSignup } = useAuth({ onLogin: handleOnLogin, translate, - }) + }); return (
@@ -62,7 +62,7 @@ const WelcomePage = () => {
- ) -} + ); +}; -export default WelcomePage +export default WelcomePage; diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index be1a5b4..65be25b 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -1,8 +1,8 @@ -import { useCallback, useState } from 'react' -import { LocalStorageService } from '@/services/local-storage' -import { PaymentsService } from '@/services/sdk/payments.service' -import type { LoginCredentials } from '@/types/oauth' -import { OauthService } from '@/services/oauth/oauth.service' +import { useCallback, useState } from 'react'; +import { LocalStorageService } from '@/services/local-storage'; +import { PaymentsService } from '@/services/sdk/payments.service'; +import type { LoginCredentials } from '@/types/oauth'; +import { OauthService } from '@/services/oauth/oauth.service'; interface UseWebAuthProps { onLogin?: (token: string) => void @@ -10,7 +10,7 @@ interface UseWebAuthProps { } export function useAuth({ onLogin, translate }: UseWebAuthProps) { - const [webAuthError, setWebAuthError] = useState('') + const [webAuthError, setWebAuthError] = useState(''); const saveUserSession = useCallback( async (credentials: LoginCredentials) => { @@ -18,86 +18,86 @@ export function useAuth({ onLogin, translate }: UseWebAuthProps) { credentials.user, credentials.mnemonic, credentials.newToken, - ) + ); try { const subscription = - await PaymentsService.instance.getUserSubscription() - LocalStorageService.instance.setSubscription(subscription) + await PaymentsService.instance.getUserSubscription(); + LocalStorageService.instance.setSubscription(subscription); } catch (err) { - console.error('Error getting user subscription:', err) + console.error('Error getting user subscription:', err); } - onLogin?.(credentials.newToken) + onLogin?.(credentials.newToken); }, [LocalStorageService, onLogin], - ) + ); /** * Handles web-based login using popup window */ const handleWebLogin = async () => { - setWebAuthError('') + setWebAuthError(''); try { - const credentials = await OauthService.instance.loginWithWeb() + const credentials = await OauthService.instance.loginWithWeb(); if (!credentials?.newToken || !credentials?.user) { - throw new Error(translate('meet.auth.modal.error.invalidCredentials')) + throw new Error(translate('meet.auth.modal.error.invalidCredentials')); } - await saveUserSession(credentials) + await saveUserSession(credentials); } catch (err: unknown) { - errorHandler(err) + errorHandler(err); } - } + }; /** * Handles web-based signup using popup window */ const handleWebSignup = async () => { - setWebAuthError('') + setWebAuthError(''); try { - const credentials = await OauthService.instance.signupWithWeb() + const credentials = await OauthService.instance.signupWithWeb(); if (!credentials?.newToken || !credentials?.user) { - throw new Error(translate('meet.auth.modal.error.invalidCredentials')) + throw new Error(translate('meet.auth.modal.error.invalidCredentials')); } - await saveUserSession(credentials) + await saveUserSession(credentials); } catch (err: unknown) { - errorHandler(err) + errorHandler(err); } - } + }; const errorHandler = useCallback( (err: unknown) => { if (err instanceof Error) { if (err.message.includes('popup blocker')) { - setWebAuthError(translate('meet.auth.modal.error.popupBlocked')) + setWebAuthError(translate('meet.auth.modal.error.popupBlocked')); } else if (err.message.includes('cancelled')) { - setWebAuthError(translate('meet.auth.modal.error.authCancelled')) + setWebAuthError(translate('meet.auth.modal.error.authCancelled')); } else if (err.message.includes('timeout')) { - setWebAuthError(translate('meet.auth.modal.error.authTimeout')) + setWebAuthError(translate('meet.auth.modal.error.authTimeout')); } else { - setWebAuthError(err.message) + setWebAuthError(err.message); } } else { - setWebAuthError(translate('meet.auth.modal.error.genericError')) + setWebAuthError(translate('meet.auth.modal.error.genericError')); } }, [setWebAuthError], - ) + ); const resetState = useCallback(() => { - setWebAuthError('') - }, []) + setWebAuthError(''); + }, []); return { webAuthError, handleWebLogin, handleWebSignup, resetState, - } + }; } diff --git a/src/hooks/useNavigation.ts b/src/hooks/useNavigation.ts index e09f8b6..258d483 100644 --- a/src/hooks/useNavigation.ts +++ b/src/hooks/useNavigation.ts @@ -1,15 +1,15 @@ -import type { RoutePath } from '@/routes/paths' -import { useNavigate, useParams, useLocation } from 'react-router-dom' +import type { RoutePath } from '@/routes/paths'; +import { useNavigate, useParams, useLocation } from 'react-router-dom'; export function useNavigation() { - const navigate = useNavigate() - const params = useParams() - const location = useLocation() + const navigate = useNavigate(); + const params = useParams(); + const location = useLocation(); return { goTo: (path: RoutePath) => navigate(path), goBack: () => navigate(-1), currentPath: location.pathname, params, - } + }; } diff --git a/src/i18n/index.ts b/src/i18n/index.ts index e062bfd..0196af1 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -1,8 +1,8 @@ -export { default as i18nService } from './services/i18n.service' +export { default as i18nService } from './services/i18n.service'; -export { TranslationProvider } from './provider/TranslationProvider' -export { useTranslationContext } from './provider/useTranslationContext' -export type { TranslationContextProps } from './provider/TranslationProvider' +export { TranslationProvider } from './provider/TranslationProvider'; +export { useTranslationContext } from './provider/useTranslationContext'; +export type { TranslationContextProps } from './provider/TranslationProvider'; -export { Locale } from './types' -export type { Translate, TranslateArray } from './types' +export { Locale } from './types'; +export type { Translate, TranslateArray } from './types'; diff --git a/src/i18n/provider/TranslationProvider.tsx b/src/i18n/provider/TranslationProvider.tsx index 7fe1429..c4a7c8e 100644 --- a/src/i18n/provider/TranslationProvider.tsx +++ b/src/i18n/provider/TranslationProvider.tsx @@ -1,7 +1,7 @@ -import React, { useMemo } from 'react' -import { useTranslation } from 'react-i18next' -import type { Translate } from '../types' -import { TranslationContext } from './useTranslationContext' +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import type { Translate } from '../types'; +import { TranslationContext } from './useTranslationContext'; export interface TranslationContextProps { translate: Translate @@ -14,12 +14,12 @@ interface TranslationProviderProps { export const TranslationProvider: React.FC = ({ children, }) => { - const { t } = useTranslation() + const { t } = useTranslation(); - const value = useMemo(() => ({ translate: t }), [t]) + const value = useMemo(() => ({ translate: t }), [t]); return ( {children} - ) -} + ); +}; diff --git a/src/i18n/provider/useTranslationContext.tsx b/src/i18n/provider/useTranslationContext.tsx index 6f9c2f2..811ca6e 100644 --- a/src/i18n/provider/useTranslationContext.tsx +++ b/src/i18n/provider/useTranslationContext.tsx @@ -1,10 +1,10 @@ -import { createContext, useContext } from 'react' -import { type TranslationContextProps } from './TranslationProvider' +import { createContext, useContext } from 'react'; +import { type TranslationContextProps } from './TranslationProvider'; export const TranslationContext = createContext({ translate: () => '', -}) +}); export const useTranslationContext = (): TranslationContextProps => { - return useContext(TranslationContext) -} + return useContext(TranslationContext); +}; diff --git a/src/i18n/services/i18n.service.ts b/src/i18n/services/i18n.service.ts index 94c9120..67a479d 100644 --- a/src/i18n/services/i18n.service.ts +++ b/src/i18n/services/i18n.service.ts @@ -1,19 +1,19 @@ -import { initReactI18next } from 'react-i18next' -import i18next from 'i18next' +import { initReactI18next } from 'react-i18next'; +import i18next from 'i18next'; -import dayjs from 'dayjs' -import en from 'dayjs/locale/en' +import dayjs from 'dayjs'; +import en from 'dayjs/locale/en'; -import enJson from '../locales/en.json' +import enJson from '../locales/en.json'; const dayJsLocale: Record = { en, -} +}; const deviceLang: string = - localStorage.getItem('i18nextLng') ?? navigator.language.split('-')[0] + localStorage.getItem('i18nextLng') ?? navigator.language.split('-')[0]; -dayjs.locale(dayJsLocale[deviceLang] || dayJsLocale['en']) +dayjs.locale(dayJsLocale[deviceLang] || dayJsLocale['en']); export default i18next.use(initReactI18next).init({ resources: { @@ -30,4 +30,4 @@ export default i18next.use(initReactI18next).init({ interpolation: { escapeValue: false, }, -}) +}); diff --git a/src/main.tsx b/src/main.tsx index 68f5614..0ee9ad2 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,8 +1,8 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' -import { TranslationProvider } from './i18n/index.ts' +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import './index.css'; +import App from './App.tsx'; +import { TranslationProvider } from './i18n/index.ts'; createRoot(document.getElementById('root')!).render( @@ -10,4 +10,4 @@ createRoot(document.getElementById('root')!).render( , -) +); diff --git a/src/routes/index.tsx b/src/routes/index.tsx index e6ac410..0aca659 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,9 +1,9 @@ -import { type RouteObject, Navigate } from 'react-router-dom' -import { lazy } from 'react' -import RootLayout from '@/routes/layouts/RootLayout' +import { type RouteObject, Navigate } from 'react-router-dom'; +import { lazy } from 'react'; +import RootLayout from '@/routes/layouts/RootLayout'; -const WelcomePage = lazy(() => import('@/features/welcome')) -const MailView = lazy(() => import('@/features/mail/MailView')) +const WelcomePage = lazy(() => import('@/features/welcome')); +const MailView = lazy(() => import('@/features/mail/MailView')); export const routes: RouteObject[] = [ { @@ -27,4 +27,4 @@ export const routes: RouteObject[] = [ }, ], }, -] +]; diff --git a/src/routes/layouts/RootLayout.tsx b/src/routes/layouts/RootLayout.tsx index eeea03b..7bfcdf9 100644 --- a/src/routes/layouts/RootLayout.tsx +++ b/src/routes/layouts/RootLayout.tsx @@ -1,5 +1,5 @@ -import { Outlet } from 'react-router-dom' -import { Suspense } from 'react' +import { Outlet } from 'react-router-dom'; +import { Suspense } from 'react'; /** * App layout (contains the static components like the sidebar) @@ -20,7 +20,7 @@ export default function RootLayout() { - ) + ); } function LoadingFallback() { @@ -28,5 +28,5 @@ function LoadingFallback() {
Loading...
- ) + ); } diff --git a/src/routes/paths.ts b/src/routes/paths.ts index b1686b8..d78d2bb 100644 --- a/src/routes/paths.ts +++ b/src/routes/paths.ts @@ -2,6 +2,6 @@ export const PATHS = { welcome: '/welcome', inbox: '/inbox', trash: '/trash', -} as const +} as const; export type RoutePath = (typeof PATHS)[keyof typeof PATHS] diff --git a/src/services/config/config.errors.ts b/src/services/config/config.errors.ts index 1aee6b2..f7faa43 100644 --- a/src/services/config/config.errors.ts +++ b/src/services/config/config.errors.ts @@ -1,7 +1,7 @@ export class VariableNotFoundError extends Error { constructor(variableName: string) { - super(`Variable not found: ${variableName}`) + super(`Variable not found: ${variableName}`); - Object.setPrototypeOf(this, VariableNotFoundError.prototype) + Object.setPrototypeOf(this, VariableNotFoundError.prototype); } } diff --git a/src/services/config/config.service.test.ts b/src/services/config/config.service.test.ts index 3dba814..aa404d0 100644 --- a/src/services/config/config.service.test.ts +++ b/src/services/config/config.service.test.ts @@ -1,48 +1,48 @@ -import { describe, expect, vi, beforeEach, test, afterEach } from 'vitest' -import { VariableNotFoundError } from './config.errors' +import { describe, expect, vi, beforeEach, test, afterEach } from 'vitest'; +import { VariableNotFoundError } from './config.errors'; -import { ConfigService } from '.' +import { ConfigService } from '.'; describe('Config Service', () => { beforeEach(() => { - vi.stubEnv('VITE_DRIVE_API_URL', 'https://api-drive.internxt.com') - vi.stubEnv('VITE_MAIL_API_URL', 'https://api-mail.internxt.com') - vi.stubEnv('VITE_PAYMENTS_API_URL', 'https://api-payments.internxt.com') - vi.stubEnv('VITE_CRYPTO_SECRET', 'test-secret') - vi.stubEnv('VITE_MAGIC_IV', 'test-iv') - vi.stubEnv('VITE_MAGIC_SALT', 'test-salt') - vi.stubEnv('PROD', false) - }) + vi.stubEnv('VITE_DRIVE_API_URL', 'https://api-drive.internxt.com'); + vi.stubEnv('VITE_MAIL_API_URL', 'https://api-mail.internxt.com'); + vi.stubEnv('VITE_PAYMENTS_API_URL', 'https://api-payments.internxt.com'); + vi.stubEnv('VITE_CRYPTO_SECRET', 'test-secret'); + vi.stubEnv('VITE_MAGIC_IV', 'test-iv'); + vi.stubEnv('VITE_MAGIC_SALT', 'test-salt'); + vi.stubEnv('PROD', false); + }); afterEach(() => { - vi.unstubAllEnvs() - }) + vi.unstubAllEnvs(); + }); - const configService = ConfigService.instance + const configService = ConfigService.instance; describe('Get Variable', () => { test('When getting an existing variable, then it should be returned successfully', () => { - const result = configService.getVariable('DRIVE_API_URL') - expect(result).toBe('https://api-drive.internxt.com') - }) + const result = configService.getVariable('DRIVE_API_URL'); + expect(result).toBe('https://api-drive.internxt.com'); + }); test('When the variable does not exist, then an error indicating so is thrown', () => { - vi.stubEnv('VITE_DRIVE_API_URL', undefined) + vi.stubEnv('VITE_DRIVE_API_URL', undefined); expect(() => configService.getVariable('DRIVE_API_URL')).toThrow( VariableNotFoundError, - ) - }) - }) + ); + }); + }); describe('Checking if the environment is production', () => { test('When the environment is not production, then should indicate so', () => { - expect(configService.isProduction()).toBe(false) - }) + expect(configService.isProduction()).toBe(false); + }); test('When the environment is production, then should indicate so', () => { - vi.stubEnv('PROD', true) + vi.stubEnv('PROD', true); - expect(configService.isProduction()).toBe(true) - }) - }) -}) + expect(configService.isProduction()).toBe(true); + }); + }); +}); diff --git a/src/services/config/index.ts b/src/services/config/index.ts index f00ff3b..3e051bc 100644 --- a/src/services/config/index.ts +++ b/src/services/config/index.ts @@ -1,4 +1,4 @@ -import { VariableNotFoundError } from './config.errors' +import { VariableNotFoundError } from './config.errors'; interface ConfigKeys { DRIVE_API_URL: string @@ -16,18 +16,18 @@ const configKeys: Record = { CRYPTO_SECRET: 'VITE_CRYPTO_SECRET', MAGIC_IV: 'VITE_MAGIC_IV', MAGIC_SALT: 'VITE_MAGIC_SALT', -} +}; export class ConfigService { - public static readonly instance: ConfigService = new ConfigService() + public static readonly instance: ConfigService = new ConfigService(); public getVariable = (key: keyof ConfigKeys): string => { - const value = import.meta.env[configKeys[key]] - if (!value) throw new VariableNotFoundError(key) - return value - } + const value = import.meta.env[configKeys[key]]; + if (!value) throw new VariableNotFoundError(key); + return value; + }; public isProduction = (): boolean => { - return import.meta.env.PROD - } + return import.meta.env.PROD; + }; } diff --git a/src/services/local-storage/index.ts b/src/services/local-storage/index.ts index 0763d36..ae13317 100644 --- a/src/services/local-storage/index.ts +++ b/src/services/local-storage/index.ts @@ -1,74 +1,74 @@ -import type { UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' -import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' +import type { UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types'; +import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; const LocalStorageKeys = { xUser: 'xUser', xNewToken: 'xNewToken', -} +}; export class LocalStorageService { - public static readonly instance = new LocalStorageService() + public static readonly instance = new LocalStorageService(); set(key: string, value: string) { - localStorage.setItem(key, value) + localStorage.setItem(key, value); } get(key: string): string | null { - return localStorage.getItem(key) + return localStorage.getItem(key); } remove(key: string) { - localStorage.removeItem(key) + localStorage.removeItem(key); } clear() { - localStorage.clear() + localStorage.clear(); } setUser(user: UserSettings) { - localStorage.setItem(LocalStorageKeys.xUser, JSON.stringify(user)) + localStorage.setItem(LocalStorageKeys.xUser, JSON.stringify(user)); } getUser(): UserSettings | null { - const user = localStorage.getItem(LocalStorageKeys.xUser) - return user ? JSON.parse(user) : null + const user = localStorage.getItem(LocalStorageKeys.xUser); + return user ? JSON.parse(user) : null; } setToken(token: string) { - localStorage.setItem(LocalStorageKeys.xNewToken, token) + localStorage.setItem(LocalStorageKeys.xNewToken, token); } getToken(): string | null { - return localStorage.getItem(LocalStorageKeys.xNewToken) + return localStorage.getItem(LocalStorageKeys.xNewToken); } setMnemonic(mnemonic: string) { - localStorage.setItem('xMnemonic', mnemonic) + localStorage.setItem('xMnemonic', mnemonic); } getMnemonic(): string | null { - return localStorage.getItem('xMnemonic') + return localStorage.getItem('xMnemonic'); } setSubscription(subscription: UserSubscription) { - localStorage.setItem('xSubscription', JSON.stringify(subscription)) + localStorage.setItem('xSubscription', JSON.stringify(subscription)); } getSubscription(): UserSubscription | null { - const subscription = localStorage.getItem('xSubscription') - return subscription ? JSON.parse(subscription) : null + const subscription = localStorage.getItem('xSubscription'); + return subscription ? JSON.parse(subscription) : null; } saveCredentials(user: UserSettings, mnemonic: string, token: string) { - this.setUser(user) - this.setMnemonic(mnemonic) - this.setToken(token) + this.setUser(user); + this.setMnemonic(mnemonic); + this.setToken(token); } clearCredentials() { - localStorage.removeItem('xUser') - localStorage.removeItem('xNewToken') - localStorage.removeItem('xSubscription') - localStorage.removeItem('xMnemonic') + localStorage.removeItem('xUser'); + localStorage.removeItem('xNewToken'); + localStorage.removeItem('xSubscription'); + localStorage.removeItem('xMnemonic'); } } diff --git a/src/services/local-storage/local-storage.service.test.ts b/src/services/local-storage/local-storage.service.test.ts index 0f7f3fa..7f5a3ef 100644 --- a/src/services/local-storage/local-storage.service.test.ts +++ b/src/services/local-storage/local-storage.service.test.ts @@ -1,101 +1,101 @@ -import { afterEach, beforeEach, describe, expect, test } from 'vitest' -import { LocalStorageService } from '.' -import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' -import type { UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' +import { afterEach, beforeEach, describe, expect, test } from 'vitest'; +import { LocalStorageService } from '.'; +import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; +import type { UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types'; -const localStorageService = LocalStorageService.instance +const localStorageService = LocalStorageService.instance; describe('Local Storage Service', () => { beforeEach(() => { - localStorage.clear() - }) + localStorage.clear(); + }); afterEach(() => { - localStorage.clear() - }) + localStorage.clear(); + }); describe('User persistence', () => { test('When storing user data, then it should persist across service calls', () => { - const user = { name: 'John Doe' } - localStorageService.setUser(user as UserSettings) - const savedUser = localStorageService.getUser() - expect(savedUser).toStrictEqual(user) - }) + const user = { name: 'John Doe' }; + localStorageService.setUser(user as UserSettings); + const savedUser = localStorageService.getUser(); + expect(savedUser).toStrictEqual(user); + }); test('When no user is stored, then should return null', () => { - expect(localStorageService.getUser()).toBeNull() - }) - }) + expect(localStorageService.getUser()).toBeNull(); + }); + }); describe('Token management', () => { test('When storing a token, then it should be retrievable', () => { - const token = 'token' - localStorageService.setToken(token) - const savedToken = localStorageService.getToken() - expect(savedToken).toBe(token) - }) + const token = 'token'; + localStorageService.setToken(token); + const savedToken = localStorageService.getToken(); + expect(savedToken).toBe(token); + }); test('When no token is stored, then should return null', () => { - expect(localStorageService.getToken()).toBeNull() - }) - }) + expect(localStorageService.getToken()).toBeNull(); + }); + }); describe('Mnemonic storage', () => { test('When storing a mnemonic phrase, then it should be retrievable', () => { - const mnemonic = 'mnemonic' - localStorageService.setMnemonic(mnemonic) - const savedMnemonic = localStorageService.getMnemonic() - expect(savedMnemonic).toBe(mnemonic) - }) + const mnemonic = 'mnemonic'; + localStorageService.setMnemonic(mnemonic); + const savedMnemonic = localStorageService.getMnemonic(); + expect(savedMnemonic).toBe(mnemonic); + }); test('When no mnemonic is stored, then should return null', () => { - expect(localStorageService.getMnemonic()).toBeNull() - }) - }) + expect(localStorageService.getMnemonic()).toBeNull(); + }); + }); describe('Subscription data', () => { test('When storing subscription info, then it should persist the data', () => { - const subscription = { plan: 'plan', status: 'status' } + const subscription = { plan: 'plan', status: 'status' }; localStorageService.setSubscription( subscription as unknown as UserSubscription, - ) - const savedSubscription = localStorageService.getSubscription() - expect(savedSubscription).toStrictEqual(subscription) - }) + ); + const savedSubscription = localStorageService.getSubscription(); + expect(savedSubscription).toStrictEqual(subscription); + }); test('When no subscription is stored, then should return null', () => { - expect(localStorageService.getSubscription()).toBeNull() - }) - }) + expect(localStorageService.getSubscription()).toBeNull(); + }); + }); describe('Batch credential operations', () => { test('When saving all credentials at once, then all should be stored correctly', () => { - const user = { name: 'John Doe' } - const mnemonic = 'mnemonic' - const token = 'token' - localStorageService.saveCredentials(user as UserSettings, mnemonic, token) - const savedUser = localStorageService.getUser() - const savedMnemonic = localStorageService.getMnemonic() - const savedToken = localStorageService.getToken() - expect(savedUser).toStrictEqual(user) - expect(savedMnemonic).toBe(mnemonic) - expect(savedToken).toBe(token) - }) - }) + const user = { name: 'John Doe' }; + const mnemonic = 'mnemonic'; + const token = 'token'; + localStorageService.saveCredentials(user as UserSettings, mnemonic, token); + const savedUser = localStorageService.getUser(); + const savedMnemonic = localStorageService.getMnemonic(); + const savedToken = localStorageService.getToken(); + expect(savedUser).toStrictEqual(user); + expect(savedMnemonic).toBe(mnemonic); + expect(savedToken).toBe(token); + }); + }); describe('Credential cleanup', () => { test('When clearing credentials, then all sensitive data should be removed', () => { - const user = { name: 'John Doe' } - const mnemonic = 'mnemonic' - const token = 'token' - localStorageService.saveCredentials(user as UserSettings, mnemonic, token) - localStorageService.clearCredentials() - const savedUser = localStorageService.getUser() - const savedMnemonic = localStorageService.getMnemonic() - const savedToken = localStorageService.getToken() - expect(savedUser).toBeNull() - expect(savedMnemonic).toBeNull() - expect(savedToken).toBeNull() - }) - }) -}) + const user = { name: 'John Doe' }; + const mnemonic = 'mnemonic'; + const token = 'token'; + localStorageService.saveCredentials(user as UserSettings, mnemonic, token); + localStorageService.clearCredentials(); + const savedUser = localStorageService.getUser(); + const savedMnemonic = localStorageService.getMnemonic(); + const savedToken = localStorageService.getToken(); + expect(savedUser).toBeNull(); + expect(savedMnemonic).toBeNull(); + expect(savedToken).toBeNull(); + }); + }); +}); diff --git a/src/services/oauth/errors/oauth.errors.ts b/src/services/oauth/errors/oauth.errors.ts index 8f25a83..3747b9a 100644 --- a/src/services/oauth/errors/oauth.errors.ts +++ b/src/services/oauth/errors/oauth.errors.ts @@ -1,24 +1,24 @@ export class MissingAuthParamsToken extends Error { constructor() { - super('Missing auth params token') + super('Missing auth params token'); - Object.setPrototypeOf(this, MissingAuthParamsToken.prototype) + Object.setPrototypeOf(this, MissingAuthParamsToken.prototype); } } export class AuthCancelledByUserError extends Error { constructor() { - super('Authentication cancelled by user') + super('Authentication cancelled by user'); - Object.setPrototypeOf(this, AuthCancelledByUserError.prototype) + Object.setPrototypeOf(this, AuthCancelledByUserError.prototype); } } export class AuthTimeoutError extends Error { constructor() { - super('Authentication timed out') + super('Authentication timed out'); - Object.setPrototypeOf(this, AuthTimeoutError.prototype) + Object.setPrototypeOf(this, AuthTimeoutError.prototype); } } @@ -26,8 +26,18 @@ export class OpenAuthPopupError extends Error { constructor() { super( 'Failed to open authentication popup. Please check your popup blocker settings.', - ) + ); - Object.setPrototypeOf(this, OpenAuthPopupError.prototype) + Object.setPrototypeOf(this, OpenAuthPopupError.prototype); + } +} + +export class WebAuthProcessingError extends Error { + constructor(cause?: Error) { + super( + `Web authentication processing failed: ${cause instanceof Error ? cause.message : 'Unknown error'}`, + ); + + Object.setPrototypeOf(this, WebAuthProcessingError.prototype); } } diff --git a/src/services/oauth/oauth.service.test.ts b/src/services/oauth/oauth.service.test.ts new file mode 100644 index 0000000..56527af --- /dev/null +++ b/src/services/oauth/oauth.service.test.ts @@ -0,0 +1,465 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { OauthService } from './oauth.service'; +import { UserService } from '../user/user.service'; +import { ConfigService } from '../config'; +import { LocalStorageService } from '../local-storage'; +import { + WEB_AUTH_CONFIG, + WEB_AUTH_MESSAGE_TYPES, + type WebAuthMessage, + type WebAuthParams, +} from '@/types/oauth'; +import { + AuthCancelledByUserError, + MissingAuthParamsToken, + WebAuthProcessingError, +} from './errors/oauth.errors'; + +describe('OAuth Service', () => { + let service: OauthService; + + beforeEach(() => { + vi.clearAllMocks(); + + vi.spyOn(UserService.instance, 'getUser').mockResolvedValue({ + userId: '123', + email: 'test@example.com', + name: 'Test', + lastname: 'User', + } as any); + + vi.spyOn(LocalStorageService.instance, 'setToken').mockImplementation( + () => {}, + ); + vi.spyOn(ConfigService.instance, 'isProduction').mockReturnValue(true); + + service = OauthService.instance; + }); + + describe('Authentication URLs', () => { + it('when in production environment, then authentication URLs point to production domain', () => { + const urls = service.urls; + + expect(urls.login).toBe( + `https://drive.internxt.com${WEB_AUTH_CONFIG.loginPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + ); + expect(urls.signup).toBe( + `https://drive.internxt.com${WEB_AUTH_CONFIG.signupPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + ); + }); + + it('when in development environment, then authentication URLs point to localhost', () => { + vi.spyOn(ConfigService.instance, 'isProduction').mockReturnValue(false); + + const urls = service.urls; + + expect(urls.login).toContain('localhost:3000'); + expect(urls.login).toContain(WEB_AUTH_CONFIG.loginPath); + expect(urls.login).toContain(WEB_AUTH_CONFIG.authOriginParam); + }); + }); + + describe('Processing authentication credentials', () => { + it('when credentials are received, then the mnemonic is decoded from base64', async () => { + const mnemonic = 'test mnemonic phrase'; + const encodedMnemonic = Buffer.from(mnemonic).toString('base64'); + const encodedNewToken = Buffer.from('test-new-token').toString('base64'); + + const params: WebAuthParams = { + mnemonic: encodedMnemonic, + newToken: encodedNewToken, + }; + + const result = await (service as any).processWebAuthParams(params); + + expect(result.mnemonic).toBe(mnemonic); + expect(result.user.mnemonic).toBe(mnemonic); + }); + + it('when credentials are processed, then the token is stored in local storage', async () => { + const newToken = 'test-new-token-value'; + const encodedNewToken = Buffer.from(newToken).toString('base64'); + const encodedMnemonic = Buffer.from('test mnemonic').toString('base64'); + + const setTokenSpy = vi.spyOn(LocalStorageService.instance, 'setToken'); + + const params: WebAuthParams = { + mnemonic: encodedMnemonic, + newToken: encodedNewToken, + }; + + await (service as any).processWebAuthParams(params); + + expect(setTokenSpy).toHaveBeenCalledWith(newToken); + }); + + it('when credentials are stored, then user data is fetched from the API', async () => { + const encodedNewToken = Buffer.from('test-new-token').toString('base64'); + const encodedMnemonic = Buffer.from('test mnemonic').toString('base64'); + + const getUserSpy = vi.spyOn(UserService.instance, 'getUser'); + + const params: WebAuthParams = { + mnemonic: encodedMnemonic, + newToken: encodedNewToken, + }; + + await (service as any).processWebAuthParams(params); + + expect(getUserSpy).toHaveBeenCalledTimes(1); + }); + + it('when credentials are fully processed, then complete authentication data is returned', async () => { + const mnemonic = 'test mnemonic phrase'; + const newToken = 'test-new-token-value'; + const encodedMnemonic = Buffer.from(mnemonic).toString('base64'); + const encodedNewToken = Buffer.from(newToken).toString('base64'); + + const params: WebAuthParams = { + mnemonic: encodedMnemonic, + newToken: encodedNewToken, + }; + + const result = await (service as any).processWebAuthParams(params); + + expect(result).toHaveProperty('user'); + expect(result).toHaveProperty('newToken', newToken); + expect(result).toHaveProperty('mnemonic', mnemonic); + expect(result.user).toHaveProperty('mnemonic', mnemonic); + }); + + it('when user data cannot be retrieved, then an error indicating so is thrown', async () => { + vi.spyOn(UserService.instance, 'getUser').mockRejectedValue( + new Error('API Error'), + ); + + const params: WebAuthParams = { + mnemonic: Buffer.from('test').toString('base64'), + newToken: Buffer.from('new-token').toString('base64'), + }; + + await expect( + (service as any).processWebAuthParams(params), + ).rejects.toThrow(WebAuthProcessingError); + }); + }); + + describe('Validating authentication parameters', () => { + it('when all required parameters are provided, then validation passes', () => { + const params: WebAuthParams = { + mnemonic: 'test-mnemonic', + newToken: 'test-token', + }; + + const isValid = (service as any).validateAuthParams(params); + + expect(isValid).toBe(true); + }); + + it('when the mnemonic is missing, then validation fails', () => { + const params = { + newToken: 'test-token', + }; + + const isValid = (service as any).validateAuthParams(params); + + expect(isValid).toBe(false); + }); + + it('when the token is missing, then validation fails', () => { + const params = { + mnemonic: 'test-mnemonic', + }; + + const isValid = (service as any).validateAuthParams(params); + + expect(isValid).toBe(false); + }); + + it('when no parameters are provided, then validation fails', () => { + const params = {}; + + const isValid = (service as any).validateAuthParams(params); + + expect(isValid).toBe(false); + }); + }); + + describe('Origin security validation', () => { + it('when the origin is from internxt.com domain, then it is accepted', () => { + const isValid = (service as any).isValidOrigin( + 'https://drive.internxt.com', + ); + + expect(isValid).toBe(true); + }); + + it('when the origin is from localhost, then it is accepted', () => { + const isValid = (service as any).isValidOrigin('http://localhost:3000'); + + expect(isValid).toBe(true); + }); + + it('when the origin is from an unknown domain, then it is rejected', () => { + const isValid = (service as any).isValidOrigin( + 'https://malicious-site.com', + ); + + expect(isValid).toBe(false); + }); + + it('when the origin is empty, then it is rejected', () => { + const isValid = (service as any).isValidOrigin(''); + + expect(isValid).toBe(false); + }); + }); + + describe('Handling authentication success messages', () => { + it('when a success message with valid credentials is received, then authentication completes successfully', () => { + const mockResolve = vi.fn(); + const mockReject = vi.fn(); + const mockTimeout = setTimeout(() => {}, 1000) as any; + + const payload: WebAuthParams = { + mnemonic: 'test-mnemonic', + newToken: 'test-token', + }; + + const message: WebAuthMessage = { + type: WEB_AUTH_MESSAGE_TYPES.SUCCESS, + payload, + }; + + (service as any).handleAuthSuccess( + message, + mockResolve, + mockReject, + mockTimeout, + ); + + expect(mockResolve).toHaveBeenCalledWith(payload); + expect(mockReject).not.toHaveBeenCalled(); + }); + + it('when a success message has incomplete credentials, then authentication fails', () => { + const mockResolve = vi.fn(); + const mockReject = vi.fn(); + const mockTimeout = setTimeout(() => {}, 1000) as any; + + const message: WebAuthMessage = { + type: WEB_AUTH_MESSAGE_TYPES.SUCCESS, + payload: { mnemonic: 'test' } as any, + }; + + (service as any).handleAuthSuccess( + message, + mockResolve, + mockReject, + mockTimeout, + ); + + expect(mockReject).toHaveBeenCalledWith( + expect.any(MissingAuthParamsToken), + ); + expect(mockResolve).not.toHaveBeenCalled(); + }); + }); + + describe('Handling authentication error messages', () => { + it('when an error message with a description is received, then authentication fails with that error', () => { + const mockReject = vi.fn(); + const mockTimeout = setTimeout(() => {}, 1000) as any; + + const message: WebAuthMessage = { + type: WEB_AUTH_MESSAGE_TYPES.ERROR, + error: 'Authentication failed', + }; + + (service as any).handleAuthError(message, mockReject, mockTimeout); + + expect(mockReject).toHaveBeenCalledWith( + new Error('Authentication failed'), + ); + }); + + it('when an error message without a description is received, then authentication fails with a default error', () => { + const mockReject = vi.fn(); + const mockTimeout = setTimeout(() => {}, 1000) as any; + + const message: WebAuthMessage = { + type: WEB_AUTH_MESSAGE_TYPES.ERROR, + }; + + (service as any).handleAuthError(message, mockReject, mockTimeout); + + expect(mockReject).toHaveBeenCalledWith( + new Error('Authentication failed'), + ); + }); + }); + + describe('Decoding base64 parameters', () => { + it('when a base64-encoded string is received, then it is decoded to plain text', () => { + const originalText = 'test text with spaces'; + const encoded = Buffer.from(originalText).toString('base64'); + + const decoded = (service as any).decodeBase64Param(encoded); + + expect(decoded).toBe(originalText); + }); + + it('when the encoded string contains special characters, then they are preserved after decoding', () => { + const originalText = 'test!@#$%^&*()_+-=[]{}|;:",.<>?'; + const encoded = Buffer.from(originalText).toString('base64'); + + const decoded = (service as any).decodeBase64Param(encoded); + + expect(decoded).toBe(originalText); + }); + + it('when the encoded string contains unicode characters, then they are preserved after decoding', () => { + const originalText = 'test émojis 😀🎉 and àccénts'; + const encoded = Buffer.from(originalText).toString('base64'); + + const decoded = (service as any).decodeBase64Param(encoded); + + expect(decoded).toBe(originalText); + }); + }); + + describe('Popup window positioning', () => { + it('when the popup is created, then it is centered on the screen', () => { + Object.defineProperty(window, 'screen', { + value: { + width: 1920, + height: 1080, + }, + writable: true, + }); + + const { left, top } = (service as any).calculatePopupPosition(); + + const expectedLeft = 1920 / 2 - WEB_AUTH_CONFIG.popupWidth / 2; + const expectedTop = 1080 / 2 - WEB_AUTH_CONFIG.popupHeight / 2; + + expect(left).toBe(expectedLeft); + expect(top).toBe(expectedTop); + }); + + it('when the screen size changes, then the popup position is recalculated correctly', () => { + Object.defineProperty(window, 'screen', { + value: { + width: 1366, + height: 768, + }, + writable: true, + }); + + const { left, top } = (service as any).calculatePopupPosition(); + + const expectedLeft = 1366 / 2 - WEB_AUTH_CONFIG.popupWidth / 2; + const expectedTop = 768 / 2 - WEB_AUTH_CONFIG.popupHeight / 2; + + expect(left).toBe(expectedLeft); + expect(top).toBe(expectedTop); + }); + }); + + describe('Popup window configuration', () => { + it('when the popup window is configured, then it includes all required security and layout features', () => { + const left = 100; + const top = 200; + + const features = (service as any).buildPopupFeatures(left, top); + + expect(features).toContain(`width=${WEB_AUTH_CONFIG.popupWidth}`); + expect(features).toContain(`height=${WEB_AUTH_CONFIG.popupHeight}`); + expect(features).toContain(`left=${left}`); + expect(features).toContain(`top=${top}`); + expect(features).toContain('toolbar=no'); + expect(features).toContain('menubar=no'); + expect(features).toContain('location=no'); + expect(features).toContain('status=no'); + }); + }); + + describe('Popup closed detection', () => { + it('when the popup is closed by the user, then authentication is cancelled', () => { + vi.useFakeTimers(); + + const mockReject = vi.fn(); + const mockTimeout = setTimeout(() => {}, 1000) as any; + const mockPopup = { closed: true } as Window; + + const interval = (service as any).setupPopupClosedChecker( + mockPopup, + mockReject, + mockTimeout, + ); + + // Trigger the interval check + vi.advanceTimersByTime(WEB_AUTH_CONFIG.popupCheckIntervalMs); + + expect(mockReject).toHaveBeenCalledWith( + expect.any(AuthCancelledByUserError), + ); + + clearInterval(interval); + vi.useRealTimers(); + }); + }); + + describe('Building login credentials', () => { + it('when user data is available, then login credentials are built correctly', () => { + const user = { + userId: '123', + email: 'test@example.com', + name: 'Test', + lastname: 'User', + }; + const mnemonic = 'test mnemonic'; + const newToken = 'test-token'; + + const credentials = (service as any).buildLoginCredentials( + user, + mnemonic, + newToken, + ); + + expect(credentials).toHaveProperty('user'); + expect(credentials).toHaveProperty('newToken', newToken); + expect(credentials).toHaveProperty('mnemonic', mnemonic); + expect(credentials.user).toHaveProperty('mnemonic', mnemonic); + expect(credentials.user).toHaveProperty('email', user.email); + }); + }); + + describe('Cleanup', () => { + it('when cleanup is called, then all resources are cleaned up', () => { + const mockPopup = { + closed: false, + close: vi.fn(), + }; + const mockListener = vi.fn(); + + (service as any).authPopup = mockPopup; + (service as any).messageListener = mockListener; + (service as any).popupCheckInterval = setInterval(() => {}, 1000); + + const removeEventListenerSpy = vi.spyOn(window, 'removeEventListener'); + + (service as any).cleanup(); + + expect(mockPopup.close).toHaveBeenCalled(); + expect((service as any).authPopup).toBeNull(); + expect(removeEventListenerSpy).toHaveBeenCalledWith( + 'message', + mockListener, + ); + expect((service as any).messageListener).toBeNull(); + expect((service as any).popupCheckInterval).toBeNull(); + }); + }); +}); diff --git a/src/services/oauth/oauth.service.ts b/src/services/oauth/oauth.service.ts index ef96bb2..25f7485 100644 --- a/src/services/oauth/oauth.service.ts +++ b/src/services/oauth/oauth.service.ts @@ -5,47 +5,53 @@ import { type LoginCredentials, type WebAuthMessage, type WebAuthParams, -} from '@/types/oauth' -import { UserService } from '../user/user.service' -import { ConfigService } from '../config' +} from '@/types/oauth'; +import { UserService } from '../user/user.service'; +import { ConfigService } from '../config'; import { AuthCancelledByUserError, AuthTimeoutError, MissingAuthParamsToken, OpenAuthPopupError, -} from './errors/oauth.errors' -import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' -import { LocalStorageService } from '../local-storage' - -const WEB_CLIENT_URL = ConfigService.instance.isProduction() - ? 'https://drive.internxt.com' - : 'http://localhost:3000' + WebAuthProcessingError, +} from './errors/oauth.errors'; +import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; +import { LocalStorageService } from '../local-storage'; export class OauthService { - public static readonly instance: OauthService = new OauthService() + public static readonly instance: OauthService = new OauthService(); + + private authPopup: Window | null = null; + private messageListener: ((event: MessageEvent) => void) | null = null; + private popupCheckInterval: NodeJS.Timeout | null = null; - private authPopup: Window | null = null - private messageListener: ((event: MessageEvent) => void) | null = null - private popupCheckInterval: NodeJS.Timeout | null = null + /** + * Get the web client URL based on current environment + */ + private get webClientUrl() { + return ConfigService.instance.isProduction() + ? 'https://drive.internxt.com' + : 'http://localhost:3000'; + } /** * Get the web auth URLs for login and signup */ public get urls() { return { - login: `${WEB_CLIENT_URL}${WEB_AUTH_CONFIG.loginPath}?${WEB_AUTH_CONFIG.authOriginParam}`, - signup: `${WEB_CLIENT_URL}${WEB_AUTH_CONFIG.signupPath}?${WEB_AUTH_CONFIG.authOriginParam}`, - } + login: `${this.webClientUrl}${WEB_AUTH_CONFIG.loginPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + signup: `${this.webClientUrl}${WEB_AUTH_CONFIG.signupPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + }; } /** * Calculate popup position to center it on screen */ private calculatePopupPosition() { - const left = window.screen.width / 2 - WEB_AUTH_CONFIG.popupWidth / 2 - const top = window.screen.height / 2 - WEB_AUTH_CONFIG.popupHeight / 2 + const left = window.screen.width / 2 - WEB_AUTH_CONFIG.popupWidth / 2; + const top = window.screen.height / 2 - WEB_AUTH_CONFIG.popupHeight / 2; - return { left, top } + return { left, top }; } /** @@ -61,7 +67,7 @@ export class OauthService { 'menubar=no', 'location=no', 'status=no', - ].join(',') + ].join(','); } /** @@ -70,19 +76,19 @@ export class OauthService { * @returns Window reference or null if popup was blocked */ private openAuthPopup(url: string): Window | null { - const { left, top } = this.calculatePopupPosition() - const features = this.buildPopupFeatures(left, top) + const { left, top } = this.calculatePopupPosition(); + const features = this.buildPopupFeatures(left, top); - const popup = window.open(url, WEB_AUTH_CONFIG.popupName, features) + const popup = window.open(url, WEB_AUTH_CONFIG.popupName, features); - return popup + return popup; } /** * Validate origin of postMessage event */ private isValidOrigin(origin: string): boolean { - return WEB_AUTH_VALID_ORIGINS.some((valid) => origin.includes(valid)) + return WEB_AUTH_VALID_ORIGINS.some((valid) => origin.includes(valid)); } /** @@ -91,7 +97,7 @@ export class OauthService { private validateAuthParams( params: Partial, ): params is WebAuthParams { - return !!(params.mnemonic && params.newToken) + return !!(params.mnemonic && params.newToken); } /** @@ -103,17 +109,17 @@ export class OauthService { reject: (reason: Error) => void, timeout: NodeJS.Timeout, ) { - clearTimeout(timeout) - this.cleanup() + clearTimeout(timeout); + this.cleanup(); - const { payload } = data + const { payload } = data; if (!payload || !this.validateAuthParams(payload)) { - reject(new MissingAuthParamsToken()) - return + reject(new MissingAuthParamsToken()); + return; } - resolve(payload) + resolve(payload); } /** @@ -124,9 +130,9 @@ export class OauthService { reject: (reason: Error) => void, timeout: NodeJS.Timeout, ) { - clearTimeout(timeout) - this.cleanup() - reject(new Error(data.error || 'Authentication failed')) + clearTimeout(timeout); + this.cleanup(); + reject(new Error(data.error || 'Authentication failed')); } /** @@ -139,12 +145,12 @@ export class OauthService { ): NodeJS.Timeout { return setInterval(() => { if (popup.closed) { - if (this.popupCheckInterval) clearInterval(this.popupCheckInterval) - clearTimeout(timeout) - this.cleanup() - reject(new AuthCancelledByUserError()) + if (this.popupCheckInterval) clearInterval(this.popupCheckInterval); + clearTimeout(timeout); + this.cleanup(); + reject(new AuthCancelledByUserError()); } - }, WEB_AUTH_CONFIG.popupCheckIntervalMs) + }, WEB_AUTH_CONFIG.popupCheckIntervalMs); } /** @@ -155,35 +161,35 @@ export class OauthService { private waitForAuthResponse(popup: Window): Promise { return new Promise((resolve, reject) => { const timeout = setTimeout(() => { - this.cleanup() - reject(new AuthTimeoutError()) - }, WEB_AUTH_CONFIG.authTimeoutMs) + this.cleanup(); + reject(new AuthTimeoutError()); + }, WEB_AUTH_CONFIG.authTimeoutMs); this.messageListener = (event: MessageEvent) => { if (!this.isValidOrigin(event.origin)) { - console.warn('Invalid origin for auth message:', event.origin) - return + console.warn('Invalid origin for auth message:', event.origin); + return; } - const { data } = event + const { data } = event; if (data?.type === WEB_AUTH_MESSAGE_TYPES.SUCCESS) { - this.handleAuthSuccess(data, resolve, reject, timeout) + this.handleAuthSuccess(data, resolve, reject, timeout); } if (data?.type === WEB_AUTH_MESSAGE_TYPES.ERROR) { - this.handleAuthError(data, reject, timeout) + this.handleAuthError(data, reject, timeout); } - } + }; - window.addEventListener('message', this.messageListener) + window.addEventListener('message', this.messageListener); this.popupCheckInterval = this.setupPopupClosedChecker( popup, reject, timeout, - ) - }) + ); + }); } /** @@ -191,18 +197,18 @@ export class OauthService { */ private cleanup() { if (this.authPopup && !this.authPopup.closed) { - this.authPopup.close() + this.authPopup.close(); } - this.authPopup = null + this.authPopup = null; if (this.messageListener) { - window.removeEventListener('message', this.messageListener) - this.messageListener = null + window.removeEventListener('message', this.messageListener); + this.messageListener = null; } if (this.popupCheckInterval) { - clearInterval(this.popupCheckInterval) - this.popupCheckInterval = null + clearInterval(this.popupCheckInterval); + this.popupCheckInterval = null; } } @@ -210,7 +216,7 @@ export class OauthService { * Decode base64 parameter */ private decodeBase64Param(param: string): string { - return Buffer.from(param, 'base64').toString('utf-8') + return Buffer.from(param, 'base64').toString('utf-8'); } /** @@ -228,7 +234,7 @@ export class OauthService { } as unknown as LoginCredentials['user'], newToken, mnemonic, - } + }; } /** @@ -240,23 +246,21 @@ export class OauthService { params: WebAuthParams, ): Promise { try { - const mnemonic = this.decodeBase64Param(params.mnemonic) - const newToken = this.decodeBase64Param(params.newToken) + const mnemonic = this.decodeBase64Param(params.mnemonic); + const newToken = this.decodeBase64Param(params.newToken); - LocalStorageService.instance.setToken(newToken) + LocalStorageService.instance.setToken(newToken); - const user = await UserService.instance.getUser() + const user = await UserService.instance.getUser(); return this.buildLoginCredentials( user as unknown as LoginCredentials['user'], mnemonic, newToken, - ) + ); } catch (error) { - console.error('Error while processing web auth params', error) - throw new Error( - `Web authentication processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, - ) + console.error('Error while processing web auth params', error); + throw new WebAuthProcessingError(error as Error); } } @@ -265,18 +269,18 @@ export class OauthService { */ private async executeWebAuth(url: string): Promise { try { - this.authPopup = this.openAuthPopup(url) + this.authPopup = this.openAuthPopup(url); if (!this.authPopup) { - throw new OpenAuthPopupError() + throw new OpenAuthPopupError(); } - const authParams = await this.waitForAuthResponse(this.authPopup) + const authParams = await this.waitForAuthResponse(this.authPopup); - return await this.processWebAuthParams(authParams) + return await this.processWebAuthParams(authParams); } catch (error) { - this.cleanup() - throw error + this.cleanup(); + throw error; } } @@ -285,7 +289,7 @@ export class OauthService { * @returns Promise that resolves with login credentials */ public async loginWithWeb(): Promise { - return this.executeWebAuth(this.urls.login) + return this.executeWebAuth(this.urls.login); } /** @@ -293,6 +297,6 @@ export class OauthService { * @returns Promise that resolves with login credentials */ public async signupWithWeb(): Promise { - return this.executeWebAuth(this.urls.signup) + return this.executeWebAuth(this.urls.signup); } } diff --git a/src/services/sdk/index.ts b/src/services/sdk/index.ts index a61f69e..9d1293f 100644 --- a/src/services/sdk/index.ts +++ b/src/services/sdk/index.ts @@ -1,77 +1,77 @@ -import { Auth, Drive } from '@internxt/sdk' -import type { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared' -import packageJson from '../../../package.json' -import { ConfigService } from '../config' -import { LocalStorageService } from '../local-storage' +import { Auth, Drive } from '@internxt/sdk'; +import type { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared'; +import packageJson from '../../../package.json'; +import { ConfigService } from '../config'; +import { LocalStorageService } from '../local-storage'; export type SdkManagerApiSecurity = ApiSecurity & { newToken: string } export class SdkManager { - public static readonly instance: SdkManager = new SdkManager() - private static apiSecurity?: SdkManagerApiSecurity - private readonly localStorage = LocalStorageService + public static readonly instance: SdkManager = new SdkManager(); + private static apiSecurity?: SdkManagerApiSecurity; + private readonly localStorage = LocalStorageService; public static readonly init = (apiSecurity: SdkManagerApiSecurity) => { - SdkManager.apiSecurity = apiSecurity - } + SdkManager.apiSecurity = apiSecurity; + }; public static readonly clean = () => { - SdkManager.apiSecurity = undefined - } + SdkManager.apiSecurity = undefined; + }; public static readonly getApiSecurity = ( config = { throwErrorOnMissingCredentials: true }, ): SdkManagerApiSecurity | undefined => { if (!SdkManager.apiSecurity && config.throwErrorOnMissingCredentials) - throw new Error('Api security properties not found in SdkManager') + throw new Error('Api security properties not found in SdkManager'); - return SdkManager.apiSecurity - } + return SdkManager.apiSecurity; + }; private getNewTokenApiSecurity(): ApiSecurity { return { token: this.localStorage.instance?.getToken() ?? '', unauthorizedCallback: () => { if (this.localStorage.instance) { - this.localStorage.instance.clearCredentials() + this.localStorage.instance.clearCredentials(); } }, - } + }; } public static readonly getAppDetails = (): AppDetails => { return { clientName: packageJson.name, clientVersion: packageJson.version, - } - } + }; + }; getNewAuth() { - const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL') + const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL'); const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false, - }) - const appDetails = SdkManager.getAppDetails() + }); + const appDetails = SdkManager.getAppDetails(); - return Auth.client(driveApi, appDetails, apiSecurity) + return Auth.client(driveApi, appDetails, apiSecurity); } getUsers() { - const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL') + const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL'); - const apiSecurity = this.getNewTokenApiSecurity() - const appDetails = SdkManager.getAppDetails() + const apiSecurity = this.getNewTokenApiSecurity(); + const appDetails = SdkManager.getAppDetails(); - return Drive.Users.client(driveApi, appDetails, apiSecurity) + return Drive.Users.client(driveApi, appDetails, apiSecurity); } getPayments() { - const paymentsApi = ConfigService.instance.getVariable('PAYMENTS_API_URL') + const paymentsApi = ConfigService.instance.getVariable('PAYMENTS_API_URL'); - const apiSecurity = this.getNewTokenApiSecurity() - const appDetails = SdkManager.getAppDetails() + const apiSecurity = this.getNewTokenApiSecurity(); + const appDetails = SdkManager.getAppDetails(); - return Drive.Payments.client(paymentsApi, appDetails, apiSecurity) + return Drive.Payments.client(paymentsApi, appDetails, apiSecurity); } } diff --git a/src/services/sdk/payments.service.test.ts b/src/services/sdk/payments.service.test.ts index 2683bb0..0c85f16 100644 --- a/src/services/sdk/payments.service.test.ts +++ b/src/services/sdk/payments.service.test.ts @@ -1,17 +1,17 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { describe, expect, test, vi, beforeEach, afterEach } from 'vitest' -import { SdkManager } from '.' -import { PaymentsService } from './payments.service' +import { describe, expect, test, vi, beforeEach, afterEach } from 'vitest'; +import { SdkManager } from '.'; +import { PaymentsService } from './payments.service'; describe('Payments Service', () => { beforeEach(() => { - vi.clearAllMocks() - }) + vi.clearAllMocks(); + }); afterEach(() => { - vi.restoreAllMocks() - }) + vi.restoreAllMocks(); + }); describe('User tier retrieval', () => { test('When fetching user tier, then tier data should be returned', async () => { @@ -28,74 +28,74 @@ describe('Payments Service', () => { features: ['feature-3', 'feature-4'], }, }, - } + }; const mockPaymentsClient = { getUserTier: vi.fn().mockResolvedValue(mockedTier), - } as any + } as any; vi.spyOn(SdkManager.instance, 'getPayments').mockReturnValue( mockPaymentsClient, - ) + ); - const result = await PaymentsService.instance.getUserTier() + const result = await PaymentsService.instance.getUserTier(); - expect(result).toStrictEqual(mockedTier) - expect(mockPaymentsClient.getUserTier).toHaveBeenCalledTimes(1) - }) + expect(result).toStrictEqual(mockedTier); + expect(mockPaymentsClient.getUserTier).toHaveBeenCalledTimes(1); + }); test('When tier retrieval fails, then error should be thrown', async () => { - const unexpectedError = new Error('Unexpected error') + const unexpectedError = new Error('Unexpected error'); const mockPaymentsClient = { getUserTier: vi.fn().mockRejectedValue(unexpectedError), - } as any + } as any; vi.spyOn(SdkManager.instance, 'getPayments').mockReturnValue( mockPaymentsClient, - ) + ); await expect(PaymentsService.instance.getUserTier()).rejects.toThrow( unexpectedError, - ) - }) - }) + ); + }); + }); describe('User subscription retrieval', () => { test('When fetching user subscription, then subscription data should be returned', async () => { const mockedSubscription = { id: 'subscription-id', status: 'active', - } + }; const mockPaymentsClient = { getUserSubscription: vi.fn().mockResolvedValue(mockedSubscription), - } as any + } as any; vi.spyOn(SdkManager.instance, 'getPayments').mockReturnValue( mockPaymentsClient, - ) + ); - const result = await PaymentsService.instance.getUserSubscription() + const result = await PaymentsService.instance.getUserSubscription(); - expect(result).toStrictEqual(mockedSubscription) - expect(mockPaymentsClient.getUserSubscription).toHaveBeenCalledTimes(1) - }) + expect(result).toStrictEqual(mockedSubscription); + expect(mockPaymentsClient.getUserSubscription).toHaveBeenCalledTimes(1); + }); test('When subscription retrieval fails, then error should be thrown', async () => { - const unexpectedError = new Error('Unexpected error') + const unexpectedError = new Error('Unexpected error'); const mockPaymentsClient = { getUserSubscription: vi.fn().mockRejectedValue(unexpectedError), - } as any + } as any; vi.spyOn(SdkManager.instance, 'getPayments').mockReturnValue( mockPaymentsClient, - ) + ); await expect( PaymentsService.instance.getUserSubscription(), - ).rejects.toThrow(unexpectedError) - }) - }) -}) + ).rejects.toThrow(unexpectedError); + }); + }); +}); diff --git a/src/services/sdk/payments.service.ts b/src/services/sdk/payments.service.ts index c0bf956..9be30fe 100644 --- a/src/services/sdk/payments.service.ts +++ b/src/services/sdk/payments.service.ts @@ -1,17 +1,17 @@ -import { type Tier } from '@internxt/sdk/dist/drive/payments/types/tiers' -import { type UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' -import { SdkManager } from '.' +import { type Tier } from '@internxt/sdk/dist/drive/payments/types/tiers'; +import { type UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types'; +import { SdkManager } from '.'; export class PaymentsService { - public static readonly instance: PaymentsService = new PaymentsService() + public static readonly instance: PaymentsService = new PaymentsService(); public getUserTier = async (): Promise => { - const paymentsClient = SdkManager.instance.getPayments() - return paymentsClient.getUserTier() - } + const paymentsClient = SdkManager.instance.getPayments(); + return paymentsClient.getUserTier(); + }; public getUserSubscription = async (): Promise => { - const paymentsClient = SdkManager.instance.getPayments() - return paymentsClient.getUserSubscription() - } + const paymentsClient = SdkManager.instance.getPayments(); + return paymentsClient.getUserSubscription(); + }; } diff --git a/src/services/sdk/sdk.service.test.ts b/src/services/sdk/sdk.service.test.ts index 3a0c327..0f12e68 100644 --- a/src/services/sdk/sdk.service.test.ts +++ b/src/services/sdk/sdk.service.test.ts @@ -1,8 +1,8 @@ -import { Auth, Drive } from '@internxt/sdk' -import { beforeEach, describe, expect, test, vi, afterEach } from 'vitest' -import { SdkManager } from '.' -import { ConfigService } from '../config' -import { LocalStorageService } from '../local-storage' +import { Auth, Drive } from '@internxt/sdk'; +import { beforeEach, describe, expect, test, vi, afterEach } from 'vitest'; +import { SdkManager } from '.'; +import { ConfigService } from '../config'; +import { LocalStorageService } from '../local-storage'; vi.mock('@internxt/sdk', () => ({ Auth: { @@ -31,33 +31,33 @@ vi.mock('@internxt/sdk', () => ({ })), }, }, -})) +})); describe('SDK Manager', () => { beforeEach(() => { - SdkManager.clean() - localStorage.clear() - vi.clearAllMocks() + SdkManager.clean(); + localStorage.clear(); + vi.clearAllMocks(); vi.spyOn(ConfigService.instance, 'getVariable').mockImplementation( (key: string) => { const config: Record = { DRIVE_API_URL: 'https://api-drive.internxt.com', PAYMENTS_API_URL: 'https://api-payments.internxt.com', - } - return config[key] || '' + }; + return config[key] || ''; }, - ) + ); vi.spyOn(LocalStorageService.instance, 'getToken').mockReturnValue( 'mock-token', - ) - vi.spyOn(LocalStorageService.instance, 'clearCredentials').mockReturnValue() - }) + ); + vi.spyOn(LocalStorageService.instance, 'clearCredentials').mockReturnValue(); + }); afterEach(() => { - vi.restoreAllMocks() - }) + vi.restoreAllMocks(); + }); describe('Security initialization', () => { test('When initializing with API security, then credentials should be stored', () => { @@ -65,57 +65,57 @@ describe('SDK Manager', () => { token: 'test-token', newToken: 'new-test-token', userId: 'test-user-id', - } + }; - SdkManager.init(mockApiSecurity) + SdkManager.init(mockApiSecurity); const storedSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false, - }) + }); - expect(storedSecurity).toEqual(mockApiSecurity) - }) + expect(storedSecurity).toEqual(mockApiSecurity); + }); test('When cleaning the manager, then security credentials should be removed', () => { const mockApiSecurity = { token: 'test-token', newToken: 'new-test-token', userId: 'test-user-id', - } + }; - SdkManager.init(mockApiSecurity) - SdkManager.clean() + SdkManager.init(mockApiSecurity); + SdkManager.clean(); const storedSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false, - }) - expect(storedSecurity).toBeUndefined() - }) + }); + expect(storedSecurity).toBeUndefined(); + }); test('When requesting credentials without initialization and throwError is true, then should throw error', () => { expect(() => SdkManager.getApiSecurity()).toThrow( 'Api security properties not found in SdkManager', - ) - }) + ); + }); test('When requesting credentials without initialization and throwError is false, then should return undefined', () => { const result = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false, - }) - expect(result).toBeUndefined() - }) - }) + }); + expect(result).toBeUndefined(); + }); + }); describe('App metadata', () => { test('When getting app details, then package information should be returned', () => { - const appDetails = SdkManager.getAppDetails() + const appDetails = SdkManager.getAppDetails(); expect(appDetails).toEqual({ clientName: 'mail-web', clientVersion: expect.any(String), - }) - expect(appDetails.clientVersion).toMatch(/^\d+\.\d+\.\d+$/) - }) - }) + }); + expect(appDetails.clientVersion).toMatch(/^\d+\.\d+\.\d+$/); + }); + }); describe('Auth client creation', () => { test('When creating Auth client with initialized security, then client should use provided credentials', () => { @@ -123,12 +123,12 @@ describe('SDK Manager', () => { token: 'test-token', newToken: 'new-test-token', userId: 'test-user-id', - } - SdkManager.init(mockApiSecurity) + }; + SdkManager.init(mockApiSecurity); - const authClient = SdkManager.instance.getNewAuth() + const authClient = SdkManager.instance.getNewAuth(); - expect(authClient).toBeDefined() + expect(authClient).toBeDefined(); expect(Auth.client).toHaveBeenCalledWith( 'https://api-drive.internxt.com', expect.objectContaining({ @@ -136,29 +136,29 @@ describe('SDK Manager', () => { clientVersion: expect.any(String), }), mockApiSecurity, - ) - }) + ); + }); test('When creating Auth client without initialized security, then client should use undefined credentials', () => { - const authClient = SdkManager.instance.getNewAuth() + const authClient = SdkManager.instance.getNewAuth(); - expect(authClient).toBeDefined() + expect(authClient).toBeDefined(); expect(Auth.client).toHaveBeenCalledWith( 'https://api-drive.internxt.com', expect.objectContaining({ clientName: 'mail-web', }), undefined, - ) - }) - }) + ); + }); + }); describe('Users client creation', () => { test('When creating Users client, then it should use token from localStorage', () => { - const usersClient = SdkManager.instance.getUsers() + const usersClient = SdkManager.instance.getUsers(); - expect(usersClient).toBeDefined() - expect(LocalStorageService.instance.getToken).toHaveBeenCalled() + expect(usersClient).toBeDefined(); + expect(LocalStorageService.instance.getToken).toHaveBeenCalled(); expect(Drive.Users.client).toHaveBeenCalledWith( 'https://api-drive.internxt.com', expect.objectContaining({ @@ -169,26 +169,26 @@ describe('SDK Manager', () => { token: 'mock-token', unauthorizedCallback: expect.any(Function), }), - ) - }) + ); + }); test('When Users client receives unauthorized response, then credentials should be cleared', () => { - SdkManager.instance.getUsers() + SdkManager.instance.getUsers(); // eslint-disable-next-line @typescript-eslint/no-explicit-any - const securityArg = (Drive.Users.client as any).mock.calls[0][2] - securityArg.unauthorizedCallback() + const securityArg = (Drive.Users.client as any).mock.calls[0][2]; + securityArg.unauthorizedCallback(); - expect(LocalStorageService.instance.clearCredentials).toHaveBeenCalled() - }) - }) + expect(LocalStorageService.instance.clearCredentials).toHaveBeenCalled(); + }); + }); describe('Payments client creation', () => { test('When creating Payments client, then it should use correct API URL and token', () => { - const paymentsClient = SdkManager.instance.getPayments() + const paymentsClient = SdkManager.instance.getPayments(); - expect(paymentsClient).toBeDefined() - expect(LocalStorageService.instance.getToken).toHaveBeenCalled() + expect(paymentsClient).toBeDefined(); + expect(LocalStorageService.instance.getToken).toHaveBeenCalled(); expect(Drive.Payments.client).toHaveBeenCalledWith( 'https://api-payments.internxt.com', expect.objectContaining({ @@ -199,17 +199,17 @@ describe('SDK Manager', () => { token: 'mock-token', unauthorizedCallback: expect.any(Function), }), - ) - }) + ); + }); test('When Payments client receives unauthorized response, then credentials should be cleared', () => { - SdkManager.instance.getPayments() + SdkManager.instance.getPayments(); // eslint-disable-next-line @typescript-eslint/no-explicit-any - const securityArg = (Drive.Payments.client as any).mock.calls[0][2] - securityArg.unauthorizedCallback() + const securityArg = (Drive.Payments.client as any).mock.calls[0][2]; + securityArg.unauthorizedCallback(); - expect(LocalStorageService.instance.clearCredentials).toHaveBeenCalled() - }) - }) -}) + expect(LocalStorageService.instance.clearCredentials).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/services/user/user.service.test.ts b/src/services/user/user.service.test.ts index 33cd1ea..d844527 100644 --- a/src/services/user/user.service.test.ts +++ b/src/services/user/user.service.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { describe, expect, test, vi } from 'vitest' -import { SdkManager } from '../sdk' -import { UserService } from './user.service' +import { describe, expect, test, vi } from 'vitest'; +import { SdkManager } from '../sdk'; +import { UserService } from './user.service'; describe('User Service', () => { describe('Get the current logged in user', () => { @@ -10,20 +10,20 @@ describe('User Service', () => { user: { name: 'John Doe' }, oldToken: 'oldToken', newToken: 'newToken', - } + }; const mockedUserClient = { refreshUser: vi.fn().mockResolvedValue(mockedUser), - } + }; vi.spyOn(SdkManager.instance, 'getUsers').mockReturnValue( mockedUserClient as any, - ) + ); - const result = await UserService.instance.getUser() + const result = await UserService.instance.getUser(); - expect(result).toEqual(mockedUser.user) - }) - }) + expect(result).toEqual(mockedUser.user); + }); + }); describe('Refresh user data and tokens', () => { test('When refreshing user data, then it should be returned', async () => { @@ -31,18 +31,18 @@ describe('User Service', () => { user: { name: 'John Doe' }, oldToken: 'oldToken', newToken: 'newToken', - } + }; const mockedUserClient = { refreshUser: vi.fn().mockResolvedValue(mockedUser), - } + }; vi.spyOn(SdkManager.instance, 'getUsers').mockReturnValue( mockedUserClient as any, - ) + ); - const result = await UserService.instance.refreshUserAndTokens() + const result = await UserService.instance.refreshUserAndTokens(); - expect(result).toEqual(mockedUser) - }) - }) -}) + expect(result).toEqual(mockedUser); + }); + }); +}); diff --git a/src/services/user/user.service.ts b/src/services/user/user.service.ts index cca8e32..5c012b9 100644 --- a/src/services/user/user.service.ts +++ b/src/services/user/user.service.ts @@ -1,7 +1,7 @@ -import { SdkManager } from '../sdk' +import { SdkManager } from '../sdk'; export class UserService { - public static readonly instance: UserService = new UserService() + public static readonly instance: UserService = new UserService(); /** * Obtains the current logged in user @@ -9,20 +9,20 @@ export class UserService { * @returns The current user */ public getUser = async () => { - const usersClient = SdkManager.instance.getUsers() + const usersClient = SdkManager.instance.getUsers(); - const { user } = await usersClient.refreshUser() + const { user } = await usersClient.refreshUser(); - return user - } + return user; + }; /** * Refreshes user tokens and data * @returns The refreshed user data and tokens */ public refreshUserAndTokens = async () => { - const usersClient = SdkManager.instance.getUsers() - const refreshResponse = await usersClient.refreshUser() - return refreshResponse - } + const usersClient = SdkManager.instance.getUsers(); + const refreshResponse = await usersClient.refreshUser(); + return refreshResponse; + }; } diff --git a/src/types/oauth/index.ts b/src/types/oauth/index.ts index 1057db9..7e364c3 100644 --- a/src/types/oauth/index.ts +++ b/src/types/oauth/index.ts @@ -1,4 +1,4 @@ -import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' +import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings'; export interface LoginCredentials { user: UserSettings @@ -33,7 +33,7 @@ export interface WebAuthConfig { export const WEB_AUTH_MESSAGE_TYPES = { SUCCESS: 'INTERNXT_AUTH_SUCCESS', ERROR: 'INTERNXT_AUTH_ERROR', -} as const +} as const; export const WEB_AUTH_CONFIG: WebAuthConfig = { popupWidth: 500, @@ -44,10 +44,10 @@ export const WEB_AUTH_CONFIG: WebAuthConfig = { authOriginParam: 'authOrigin=mail', loginPath: '/login', signupPath: '/new', -} +}; export const WEB_AUTH_VALID_ORIGINS = [ 'internxt.com', 'localhost', 'pages.dev', -] as const +] as const; diff --git a/vite.config.ts b/vite.config.ts index 5a5d3bd..48bc6b7 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,8 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import tailwindcss from '@tailwindcss/vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' -import path from 'node:path' +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; +import { nodePolyfills } from 'vite-plugin-node-polyfills'; +import path from 'node:path'; // https://vite.dev/config/ export default defineConfig({ @@ -26,4 +26,4 @@ export default defineConfig({ '@': path.resolve(__dirname, './src'), }, }, -}) +}); diff --git a/vitest.config.ts b/vitest.config.ts index e9babcb..77c29e7 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from 'vitest/config' -import path from 'node:path' +import { defineConfig } from 'vitest/config'; +import path from 'node:path'; export default defineConfig({ test: { @@ -18,4 +18,4 @@ export default defineConfig({ '@': path.resolve(__dirname, './src'), }, }, -}) +}); diff --git a/yarn.lock b/yarn.lock index b656b3e..0ee1bdf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -519,6 +519,14 @@ dependencies: tailwindcss "^4.1.17" +"@internxt/eslint-config-internxt@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@internxt/eslint-config-internxt/-/eslint-config-internxt-2.0.1.tgz#0d4c4f085245f10937a3b1914ba091811dba9d05" + integrity sha512-Ueczo0BAy8T9P8tXztRUoTnY7KU0ISoJ5H4cfqVTiJqkot09uPOaWmLTwI1xTMeKIkBF4h34PzNbGQ32N/nlMw== + dependencies: + eslint-config-prettier "^10.1.8" + typescript-eslint "^8.40.0" + "@internxt/sdk@^1.15.1": version "1.15.1" resolved "https://registry.yarnpkg.com/@internxt/sdk/-/sdk-1.15.1.tgz#69ad13a3c8cacbd929f025f24adc6fd2d1faf8ef" @@ -2727,6 +2735,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@^10.1.8: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + eslint-plugin-react-hooks@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" @@ -4607,7 +4620,7 @@ typed-array-buffer@^1.0.3: es-errors "^1.3.0" is-typed-array "^1.1.14" -typescript-eslint@^8.48.0: +typescript-eslint@^8.40.0, typescript-eslint@^8.48.0: version "8.56.1" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.56.1.tgz#15a9fcc5d2150a0d981772bb36f127a816fe103f" integrity sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ== From 59ad9252b1afdfb516ab15bf2b29d80db4853e4e Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Mon, 9 Mar 2026 11:49:53 +0100 Subject: [PATCH 12/12] fix: remove useless semi quotes and use globalThis --- .../mail/composeMessageDialog/components/editorBar/index.tsx | 4 ++-- src/features/welcome/index.tsx | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/mail/composeMessageDialog/components/editorBar/index.tsx b/src/components/mail/composeMessageDialog/components/editorBar/index.tsx index 795588d..bd3ba9b 100644 --- a/src/components/mail/composeMessageDialog/components/editorBar/index.tsx +++ b/src/components/mail/composeMessageDialog/components/editorBar/index.tsx @@ -100,7 +100,7 @@ export const EditorBar = ({ editor, disabled }: ActionBarProps) => { if (!editor) return; const previousUrl = editor.getAttributes('link').href; - const url = window.prompt('URL', previousUrl); + const url = globalThis.prompt('URL', previousUrl); if (url === null) return; @@ -116,7 +116,7 @@ export const EditorBar = ({ editor, disabled }: ActionBarProps) => { const addImage = useCallback(() => { if (!editor) return; - const url = window.prompt('Image URL'); + const url = globalThis.prompt('Image URL'); if (url) { editor.chain().focus().setImage({ src: url }).run(); diff --git a/src/features/welcome/index.tsx b/src/features/welcome/index.tsx index 5e70a0f..b648ba1 100644 --- a/src/features/welcome/index.tsx +++ b/src/features/welcome/index.tsx @@ -4,10 +4,6 @@ import MailAppImage from '../../assets/images/welcome/welcome-page.webp'; import { useTranslationContext } from '@/i18n'; import { useAuth } from '@/hooks/useAuth'; import { useNavigation } from '@/hooks/useNavigation'; -; -; -; -; const WelcomePage = () => { const { translate } = useTranslationContext();
+
+
+ logo +

{translate('meet')}

+
+
+ + +
+
+
+
+

+ + {translate('welcome.title.highlighted')} + {' '} +
{translate('welcome.title.normal')} +

+

+ {translate('welcome.description')} +

+
+
+
+ Mail app +
+
+
+ ) +} + +export default WelcomePage diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 0000000..7fc6429 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,120 @@ +import { useCallback, useState } from 'react' +import { OauthService } from '@/services/auth/oauth.service' +import { LocalStorageService } from '@/services/local-storage.service' +import { PaymentsService } from '@/services/payments.service' +import type { LoginCredentials } from '@/types' + +interface UseWebAuthProps { + onClose: () => void + onLogin?: (token: string) => void + translate: (key: string) => string +} + +export function useAuth({ onClose, onLogin, translate }: UseWebAuthProps) { + const [isLoggingIn, setIsLoggingIn] = useState(false) + const [webAuthError, setWebAuthError] = useState('') + + const saveUserSession = useCallback( + async (credentials: LoginCredentials) => { + LocalStorageService.instance.saveCredentials( + credentials.user, + credentials.mnemonic, + credentials.newToken, + ) + + try { + const subscription = + await PaymentsService.instance.getUserSubscription() + LocalStorageService.instance.setSubscription(subscription) + } catch (err) { + console.error('Error getting user subscription:', err) + } + + onLogin?.(credentials.newToken) + }, + [LocalStorageService, onLogin], + ) + + /** + * Handles web-based login using popup window + */ + const handleWebLogin = async () => { + setIsLoggingIn(true) + setWebAuthError('') + + try { + const credentials = await OauthService.instance.loginWithWeb() + + if (!credentials?.newToken || !credentials?.user) { + throw new Error(translate('meet.auth.modal.error.invalidCredentials')) + } + + await saveUserSession(credentials) + onClose() + } catch (err: unknown) { + if (err instanceof Error) { + if (err.message.includes('popup blocker')) { + setWebAuthError(translate('meet.auth.modal.error.popupBlocked')) + } else if (err.message.includes('cancelled')) { + setWebAuthError(translate('meet.auth.modal.error.authCancelled')) + } else if (err.message.includes('timeout')) { + setWebAuthError(translate('meet.auth.modal.error.authTimeout')) + } else { + setWebAuthError(err.message) + } + } else { + setWebAuthError(translate('meet.auth.modal.error.genericError')) + } + } finally { + setIsLoggingIn(false) + } + } + + /** + * Handles web-based signup using popup window + */ + const handleWebSignup = async () => { + setIsLoggingIn(true) + setWebAuthError('') + + try { + const credentials = await OauthService.instance.signupWithWeb() + + if (!credentials?.newToken || !credentials?.user) { + throw new Error(translate('meet.auth.modal.error.invalidCredentials')) + } + + await saveUserSession(credentials) + onClose() + } catch (err: unknown) { + if (err instanceof Error) { + if (err.message.includes('popup blocker')) { + setWebAuthError(translate('meet.auth.modal.error.popupBlocked')) + } else if (err.message.includes('cancelled')) { + setWebAuthError(translate('meet.auth.modal.error.authCancelled')) + } else if (err.message.includes('timeout')) { + setWebAuthError(translate('meet.auth.modal.error.authTimeout')) + } else { + setWebAuthError(err.message) + } + } else { + setWebAuthError(translate('meet.auth.modal.error.genericError')) + } + } finally { + setIsLoggingIn(false) + } + } + + const resetState = useCallback(() => { + setWebAuthError('') + setIsLoggingIn(false) + }, []) + + return { + isLoggingIn, + webAuthError, + handleWebLogin, + handleWebSignup, + resetState, + } +} diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index e00971d..b4b3f72 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -1,5 +1,19 @@ { - "sidenav": { + "meet": "Meet", + "actions": { + "logIn": "Log in", + "signUp": "Sign up", + "logOut": "Log out", + "newMessage": "New Message" + }, + "welcome": { + "title": { + "highlighted": "Email that protects", + "normal": "what you send" + }, + "description": "Encrypted email built for real privacy. Zero tracking. Full control." + }, + "sidebar": { "newMessage": "New Message", "inbox": "Inbox", "sent": "Sent", diff --git a/src/index.css b/src/index.css index 08a3ac9..c6a6b7b 100644 --- a/src/index.css +++ b/src/index.css @@ -1,68 +1,179 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; +@import 'tailwindcss'; +@config '../node_modules/@internxt/css-config/dist/index.js'; +@source '../src/**/*.{js,ts,jsx,tsx}'; +@source '../node_modules/@internxt/ui/src/**/*.{js,ts,jsx,tsx}'; - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +.body { + overscroll-behavior: none; } -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; +@theme { + --color-surface: rgb(var(--color-surface-rgb)); + --color-highlight: rgb(var(--color-highlight-rgb)); + --color-primary: rgb(var(--color-primary-rgb)); + --color-primary-dark: rgb(var(--color-primary-dark-rgb)); + --color-red: rgb(var(--color-red-rgb)); + --color-red-dark: rgb(var(--color-red-dark-rgb)); + --color-orange: rgb(var(--color-orange-rgb)); + --color-orange-dark: rgb(var(--color-orange-dark-rgb)); + --color-yellow: rgb(var(--color-yellow-rgb)); + --color-yellow-dark: rgb(var(--color-yellow-dark-rgb)); + --color-green: rgb(var(--color-green-rgb)); + --color-green-dark: rgb(var(--color-green-dark-rgb)); + --color-pink: rgb(var(--color-pink-rgb)); + --color-pink-dark: rgb(var(--color-pink-dark-rgb)); + --color-indigo: rgb(var(--color-indigo-rgb)); + --color-indigo-dark: rgb(var(--color-indigo-dark-rgb)); + --color-gray-1: rgb(var(--color-gray-1-rgb)); + --color-gray-5: rgb(var(--color-gray-5-rgb)); + --color-gray-10: rgb(var(--color-gray-10-rgb)); + --color-gray-20: rgb(var(--color-gray-20-rgb)); + --color-gray-30: rgb(var(--color-gray-30-rgb)); + --color-gray-40: rgb(var(--color-gray-40-rgb)); + --color-gray-50: rgb(var(--color-gray-50-rgb)); + --color-gray-60: rgb(var(--color-gray-60-rgb)); + --color-gray-70: rgb(var(--color-gray-70-rgb)); + --color-gray-80: rgb(var(--color-gray-80-rgb)); + --color-gray-90: rgb(var(--color-gray-90-rgb)); + --color-gray-100: rgb(var(--color-gray-100-rgb)); } button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; } @media (prefers-color-scheme: light) { :root { - color: #213547; - background-color: #ffffff; + color-scheme: light; + + --color-primary-rgb: 0 102 255; + --color-primary-dark-rgb: 0 88 219; + --color-red-rgb: 255 13 0; + --color-red-dark-rgb: 230 11 0; + --color-orange-rgb: 255 149 0; + --color-orange-dark-rgb: 230 134 0; + --color-yellow-rgb: 255 204 0; + --color-yellow-dark-rgb: 230 184 0; + --color-green-rgb: 50 195 86; + --color-green-dark-rgb: 45 174 77; + --color-pink-rgb: 255 36 76; + --color-pink-dark-rgb: 235 0 63; + --color-indigo-rgb: 81 78 212; + --color-indigo-dark-rgb: 60 58 207; + --color-surface-rgb: 255 255 255; + --color-highlight-rgb: 17 17 17; + --color-gray-1-rgb: 249 249 252; + --color-gray-5-rgb: 243 243 248; + --color-gray-10-rgb: 229 229 235; + --color-gray-20-rgb: 209 209 215; + --color-gray-30-rgb: 199 199 205; + --color-gray-40-rgb: 174 174 179; + --color-gray-50-rgb: 142 142 148; + --color-gray-60-rgb: 99 99 103; + --color-gray-70-rgb: 72 72 75; + --color-gray-80-rgb: 58 58 59; + --color-gray-90-rgb: 44 44 48; + --color-gray-100-rgb: 24 24 27; } - a:hover { - color: #747bff; + + :root.dark { + color-scheme: dark; + + --color-primary-rgb: 20 114 255; + --color-primary-dark-rgb: 0 96 240; + --color-red-rgb: 255 61 51; + --color-red-dark-rgb: 255 36 26; + --color-orange-rgb: 255 164 36; + --color-orange-dark-rgb: 255 153 10; + --color-yellow-rgb: 255 214 51; + --color-yellow-dark-rgb: 255 209 26; + --color-green-rgb: 72 208 106; + --color-green-dark-rgb: 52 203 90; + --color-pink-rgb: 255 71 105; + --color-pink-dark-rgb: 255 15 80; + --color-indigo-rgb: 106 103 218; + --color-indigo-dark-rgb: 85 83 213; + --color-surface-rgb: 17 17 17; + --color-highlight-rgb: 255 255 255; + --color-gray-1-rgb: 24 24 27; + --color-gray-5-rgb: 44 44 48; + --color-gray-10-rgb: 58 58 59; + --color-gray-20-rgb: 72 72 75; + --color-gray-30-rgb: 99 99 103; + --color-gray-40-rgb: 142 142 148; + --color-gray-50-rgb: 174 174 179; + --color-gray-60-rgb: 199 199 205; + --color-gray-70-rgb: 209 209 215; + --color-gray-80-rgb: 229 229 235; + --color-gray-90-rgb: 243 243 248; + --color-gray-100-rgb: 249 249 252; } - button { - background-color: #f9f9f9; +} + +@media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + + --color-primary-rgb: 20 114 255; + --color-primary-dark-rgb: 0 96 240; + --color-red-rgb: 255 61 51; + --color-red-dark-rgb: 255 36 26; + --color-orange-rgb: 255 164 36; + --color-orange-dark-rgb: 255 153 10; + --color-yellow-rgb: 255 214 51; + --color-yellow-dark-rgb: 255 209 26; + --color-green-rgb: 72 208 106; + --color-green-dark-rgb: 52 203 90; + --color-pink-rgb: 255 71 105; + --color-pink-dark-rgb: 255 15 80; + --color-indigo-rgb: 106 103 218; + --color-indigo-dark-rgb: 85 83 213; + --color-surface-rgb: 17 17 17; + --color-highlight-rgb: 255 255 255; + --color-gray-1-rgb: 24 24 27; + --color-gray-5-rgb: 44 44 48; + --color-gray-10-rgb: 58 58 59; + --color-gray-20-rgb: 72 72 75; + --color-gray-30-rgb: 99 99 103; + --color-gray-40-rgb: 142 142 148; + --color-gray-50-rgb: 174 174 179; + --color-gray-60-rgb: 199 199 205; + --color-gray-70-rgb: 209 209 215; + --color-gray-80-rgb: 229 229 235; + --color-gray-90-rgb: 243 243 248; + --color-gray-100-rgb: 249 249 252; + } + + :root:not(.dark) { + color-scheme: light; + + --color-primary-rgb: 0 102 255; + --color-primary-dark-rgb: 0 88 219; + --color-red-rgb: 255 13 0; + --color-red-dark-rgb: 230 11 0; + --color-orange-rgb: 255 149 0; + --color-orange-dark-rgb: 230 134 0; + --color-yellow-rgb: 255 204 0; + --color-yellow-dark-rgb: 230 184 0; + --color-green-rgb: 50 195 86; + --color-green-dark-rgb: 45 174 77; + --color-pink-rgb: 255 36 76; + --color-pink-dark-rgb: 235 0 63; + --color-indigo-rgb: 81 78 212; + --color-indigo-dark-rgb: 60 58 207; + --color-surface-rgb: 255 255 255; + --color-highlight-rgb: 17 17 17; + --color-gray-1-rgb: 249 249 252; + --color-gray-5-rgb: 243 243 248; + --color-gray-10-rgb: 229 229 235; + --color-gray-20-rgb: 209 209 215; + --color-gray-30-rgb: 199 199 205; + --color-gray-40-rgb: 174 174 179; + --color-gray-50-rgb: 142 142 148; + --color-gray-60-rgb: 99 99 103; + --color-gray-70-rgb: 72 72 75; + --color-gray-80-rgb: 58 58 59; + --color-gray-90-rgb: 44 44 48; + --color-gray-100-rgb: 24 24 27; } } diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 9ed46ea..155fcc2 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,15 +1,24 @@ import { type RouteObject, Navigate } from 'react-router-dom' import { lazy } from 'react' -import RootLayout from '@/layouts/RootLayout' +import RootLayout from '@/routes/layouts/RootLayout' +import WelcomePage from '@/features/welcome' const MailView = lazy(() => import('@/features/mail/MailView')) export const routes: RouteObject[] = [ + { + index: true, + path: '/welcome', + element: , + }, { path: '/', element: , children: [ - { index: true, element: }, + { + index: true, + element: , + }, { path: 'inbox', element: }, { path: 'trash', element: }, { diff --git a/src/layouts/RootLayout.tsx b/src/routes/layouts/RootLayout.tsx similarity index 100% rename from src/layouts/RootLayout.tsx rename to src/routes/layouts/RootLayout.tsx diff --git a/src/routes/paths.ts b/src/routes/paths.ts index 72969d2..b1686b8 100644 --- a/src/routes/paths.ts +++ b/src/routes/paths.ts @@ -1,4 +1,5 @@ export const PATHS = { + welcome: '/welcome', inbox: '/inbox', trash: '/trash', } as const diff --git a/src/services/auth/auth.service.ts b/src/services/auth/auth.service.ts new file mode 100644 index 0000000..0623180 --- /dev/null +++ b/src/services/auth/auth.service.ts @@ -0,0 +1,116 @@ +import { type LoginDetails } from '@internxt/sdk' +import { CryptoService } from '../crypto/crypto.service' +import { KeysService } from '../crypto/keys.service' +import { SdkManager } from '../sdk.service' +import type { LoginCredentials } from '@/types' + +export class AuthService { + public static readonly instance: AuthService = new AuthService() + + /** + * Login with user credentials and returns its tokens and properties + * @param email The user's email + * @param password The user's password + * @param twoFactorCode (Optional) The temporal two factor auth code + * @returns The user's properties and the tokens needed for auth + * @async + **/ + public doLogin = async ( + email: string, + password: string, + twoFactorCode?: string, + ): Promise => { + const authClient = SdkManager.instance.getNewAuth() + const loginDetails: LoginDetails = { + email: email.toLowerCase(), + password: password, + tfaCode: twoFactorCode, + } + + const data = await authClient.login( + loginDetails, + CryptoService.cryptoProvider, + ) + const { user, token, newToken } = data + const { privateKey, publicKey } = user + + const plainPrivateKeyInBase64 = privateKey + ? Buffer.from( + KeysService.instance.decryptPrivateKey(privateKey, password), + ).toString('base64') + : '' + + if (privateKey) { + await KeysService.instance.assertPrivateKeyIsValid(privateKey, password) + await KeysService.instance.assertValidateKeys( + Buffer.from(plainPrivateKeyInBase64, 'base64').toString(), + Buffer.from(publicKey, 'base64').toString(), + ) + } + + const clearMnemonic = CryptoService.instance.decryptTextWithKey( + user.mnemonic, + password, + ) + + const clearUser = { + ...user, + mnemonic: clearMnemonic, + privateKey: plainPrivateKeyInBase64, + } + return { + user: clearUser, + token: token, + newToken: newToken, + mnemonic: clearMnemonic, + } + } + + /** + * Checks from user's security details if it has enabled two factor auth + * @param email The user's email + * @throws {Error} If auth.securityDetails endpoint fails + * @returns True if user has enabled two factor auth + * @async + **/ + public is2FANeeded = async (email: string): Promise => { + const authClient = SdkManager.instance.getNewAuth() + const securityDetails = await authClient + .securityDetails(email) + .catch((error) => { + throw new Error(error.message ?? 'Login error') + }) + return securityDetails.tfaEnabled + } + + /** + * Obtains the current logged in user + * + * @returns The current user + */ + public getUser = async () => { + const usersClient = SdkManager.instance.getUsers() + + const { user } = await usersClient.refreshUser() + + return user + } + + /** + * Refreshes user tokens and data + * @returns The refreshed user data and tokens + */ + public refreshUserAndTokens = async () => { + const usersClient = SdkManager.instance.getUsers() + const refreshResponse = await usersClient.refreshUser() + return refreshResponse + } + + /** + * Refreshes user avatar independently + */ + public refreshAvatarUser = async (): Promise<{ avatar: string | null }> => { + const usersClient = SdkManager.instance.getUsers() + return usersClient.refreshAvatarUser() + } +} diff --git a/src/services/auth/oauth.service.ts b/src/services/auth/oauth.service.ts new file mode 100644 index 0000000..96d604d --- /dev/null +++ b/src/services/auth/oauth.service.ts @@ -0,0 +1,310 @@ +import { + WEB_AUTH_CONFIG, + WEB_AUTH_MESSAGE_TYPES, + WEB_AUTH_STORAGE_KEYS, + WEB_AUTH_VALID_ORIGINS, + type LoginCredentials, + type WebAuthMessage, + type WebAuthParams, +} from '@/types' +import { AuthService } from './auth.service' +import { ConfigService } from '../config/config.service' + +export class OauthService { + public static readonly instance: OauthService = new OauthService() + + private readonly WEB_CLIENT_URL = ConfigService.instance.isProduction() + ? 'https://drive.internxt.com' + : 'http://localhost:3000' + + private authPopup: Window | null = null + private messageListener: ((event: MessageEvent) => void) | null = null + private popupCheckInterval: NodeJS.Timeout | null = null + + /** + * Get the web auth URLs for login and signup + */ + public get urls() { + return { + login: `${this.WEB_CLIENT_URL}${WEB_AUTH_CONFIG.loginPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + signup: `${this.WEB_CLIENT_URL}${WEB_AUTH_CONFIG.signupPath}?${WEB_AUTH_CONFIG.authOriginParam}`, + } + } + + /** + * Calculate popup position to center it on screen + */ + private calculatePopupPosition() { + const left = window.screen.width / 2 - WEB_AUTH_CONFIG.popupWidth / 2 + const top = window.screen.height / 2 - WEB_AUTH_CONFIG.popupHeight / 2 + + return { left, top } + } + + /** + * Build popup window features string + */ + private buildPopupFeatures(left: number, top: number): string { + return [ + `width=${WEB_AUTH_CONFIG.popupWidth}`, + `height=${WEB_AUTH_CONFIG.popupHeight}`, + `left=${left}`, + `top=${top}`, + 'toolbar=no', + 'menubar=no', + 'location=no', + 'status=no', + ].join(',') + } + + /** + * Opens a popup window for web authentication + * @param url The URL to open in the popup + * @returns Window reference or null if popup was blocked + */ + private openAuthPopup(url: string): Window | null { + const { left, top } = this.calculatePopupPosition() + const features = this.buildPopupFeatures(left, top) + + const popup = window.open(url, WEB_AUTH_CONFIG.popupName, features) + + return popup + } + + /** + * Validate origin of postMessage event + */ + private isValidOrigin(origin: string): boolean { + return WEB_AUTH_VALID_ORIGINS.some((valid) => origin.includes(valid)) + } + + /** + * Validate authentication parameters + */ + private validateAuthParams( + params: Partial, + ): params is WebAuthParams { + return !!(params.mnemonic && params.newToken) + } + + /** + * Handle auth success message + */ + private handleAuthSuccess( + data: WebAuthMessage, + resolve: (value: WebAuthParams) => void, + reject: (reason: Error) => void, + timeout: NodeJS.Timeout, + ) { + clearTimeout(timeout) + this.cleanup() + + const { payload } = data + + if (!payload || !this.validateAuthParams(payload)) { + reject(new Error('Missing authentication parameters')) + return + } + + console.log('handleAuthSuccess', payload) + + resolve(payload) + } + + /** + * Handle auth error message + */ + private handleAuthError( + data: WebAuthMessage, + reject: (reason: Error) => void, + timeout: NodeJS.Timeout, + ) { + clearTimeout(timeout) + this.cleanup() + reject(new Error(data.error || 'Authentication failed')) + } + + /** + * Setup popup closed checker interval + */ + private setupPopupClosedChecker( + popup: Window, + reject: (reason: Error) => void, + timeout: NodeJS.Timeout, + ): NodeJS.Timeout { + return setInterval(() => { + if (popup.closed) { + clearInterval(this.popupCheckInterval!) + clearTimeout(timeout) + this.cleanup() + reject(new Error('Authentication cancelled by user')) + } + }, WEB_AUTH_CONFIG.popupCheckIntervalMs) + } + + /** + * Waits for authentication response from the popup window + * @param popup The popup window reference + * @returns Promise that resolves with the authentication parameters + */ + private waitForAuthResponse(popup: Window): Promise { + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + this.cleanup() + reject(new Error('Authentication timeout')) + }, WEB_AUTH_CONFIG.authTimeoutMs) + + this.messageListener = (event: MessageEvent) => { + if (!this.isValidOrigin(event.origin)) { + console.warn('Invalid origin for auth message:', event.origin) + return + } + + const { data } = event + + if (data?.type === WEB_AUTH_MESSAGE_TYPES.SUCCESS) { + this.handleAuthSuccess(data, resolve, reject, timeout) + } + + if (data?.type === WEB_AUTH_MESSAGE_TYPES.ERROR) { + this.handleAuthError(data, reject, timeout) + } + } + + window.addEventListener('message', this.messageListener) + + this.popupCheckInterval = this.setupPopupClosedChecker( + popup, + reject, + timeout, + ) + }) + } + + /** + * Cleanup popup and event listeners + */ + private cleanup() { + if (this.authPopup && !this.authPopup.closed) { + this.authPopup.close() + } + this.authPopup = null + + if (this.messageListener) { + window.removeEventListener('message', this.messageListener) + this.messageListener = null + } + + if (this.popupCheckInterval) { + clearInterval(this.popupCheckInterval) + this.popupCheckInterval = null + } + } + + /** + * Decode base64 parameter + */ + private decodeBase64Param(param: string): string { + return Buffer.from(param, 'base64').toString('utf-8') + } + + /** + * Store tokens in localStorage + */ + private storeTokens(newToken: string): void { + localStorage.setItem(WEB_AUTH_STORAGE_KEYS.NEW_TOKEN, newToken) + } + + /** + * Fetch user data with provided tokens + */ + private async fetchUserData() { + const { user } = await AuthService.instance.refreshUserAndTokens() + + return user + } + + /** + * Build login credentials response + */ + private buildLoginCredentials( + user: any, + mnemonic: string, + newToken: string, + ): LoginCredentials { + console.log('buildLoginCredentials', user, mnemonic, newToken) + return { + user: { + ...user, + mnemonic, + } as unknown as LoginCredentials['user'], + token: '', // Token is not used in web auth flow, remove when remove all old token references + newToken, + mnemonic, + } + } + + /** + * Process web authentication parameters and return login credentials + * @param params The authentication parameters from the web + * @returns The processed login credentials + */ + private async processWebAuthParams( + params: WebAuthParams, + ): Promise { + try { + const mnemonic = this.decodeBase64Param(params.mnemonic) + const newToken = this.decodeBase64Param(params.newToken) + this.storeTokens(newToken) + + const user = await this.fetchUserData() + + console.log('user', user) + + return this.buildLoginCredentials(user, mnemonic, newToken) + } catch (error) { + console.log('processWebAuthParams error', error) + throw new Error( + `Web authentication processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`, + ) + } + } + + /** + * Execute web authentication flow + */ + private async executeWebAuth(url: string): Promise { + try { + this.authPopup = this.openAuthPopup(url) + + if (!this.authPopup) { + throw new Error( + 'Failed to open authentication popup. Please check your popup blocker settings.', + ) + } + + const authParams = await this.waitForAuthResponse(this.authPopup) + console.log('authParams', authParams) + return await this.processWebAuthParams(authParams) + } catch (error) { + this.cleanup() + throw error + } + } + + /** + * Initiates web-based login flow + * @returns Promise that resolves with login credentials + */ + public async loginWithWeb(): Promise { + return this.executeWebAuth(this.urls.login) + } + + /** + * Initiates web-based signup flow + * @returns Promise that resolves with login credentials + */ + public async signupWithWeb(): Promise { + return this.executeWebAuth(this.urls.signup) + } +} diff --git a/src/services/config/config.errors.ts b/src/services/config/config.errors.ts new file mode 100644 index 0000000..1aee6b2 --- /dev/null +++ b/src/services/config/config.errors.ts @@ -0,0 +1,7 @@ +export class VariableNotFoundError extends Error { + constructor(variableName: string) { + super(`Variable not found: ${variableName}`) + + Object.setPrototypeOf(this, VariableNotFoundError.prototype) + } +} diff --git a/src/services/config/config.service.ts b/src/services/config/config.service.ts new file mode 100644 index 0000000..8891e65 --- /dev/null +++ b/src/services/config/config.service.ts @@ -0,0 +1,33 @@ +import { VariableNotFoundError } from './config.errors' + +interface ConfigKeys { + DRIVE_API_URL: string + MAIL_API_URL: string + PAYMENTS_API_URL: string + CRYPTO_SECRET: string + MAGIC_IV: string + MAGIC_SALT: string +} + +const configKeys: ConfigKeys = { + DRIVE_API_URL: 'VITE_DRIVE_API_URL', + MAIL_API_URL: 'VITE_MAIL_API_URL', + PAYMENTS_API_URL: 'VITE_PAYMENTS_API_URL', + CRYPTO_SECRET: 'VITE_CRYPTO_SECRET', + MAGIC_IV: 'VITE_MAGIC_IV', + MAGIC_SALT: 'VITE_MAGIC_SALT', +} + +export class ConfigService { + public static readonly instance: ConfigService = new ConfigService() + + public getVariable = (key: keyof ConfigKeys): string => { + const value = import.meta.env[configKeys[key]] + if (!value) throw new VariableNotFoundError(key) + return value + } + + public isProduction = (): boolean => { + return import.meta.env.PROD + } +} diff --git a/src/services/crypto/crypto.service.ts b/src/services/crypto/crypto.service.ts new file mode 100644 index 0000000..841fcfd --- /dev/null +++ b/src/services/crypto/crypto.service.ts @@ -0,0 +1,163 @@ +import { type CryptoProvider } from '@internxt/sdk' +import { type Keys, type Password } from '@internxt/sdk/dist/auth' +import crypto from 'node:crypto' +import { ConfigService } from '../config/config.service' +import { KeysService } from './keys.service' + +export class CryptoService { + public static readonly instance: CryptoService = new CryptoService() + + public static readonly cryptoProvider: CryptoProvider = { + encryptPasswordHash(password: Password, encryptedSalt: string): string { + const salt = CryptoService.instance.decryptText(encryptedSalt) + const hashObj = CryptoService.instance.passToHash({ password, salt }) + return CryptoService.instance.encryptText(hashObj.hash) + }, + async generateKeys(password: Password): Promise { + const { + privateKeyArmoredEncrypted, + publicKeyArmored, + revocationCertificate, + } = await KeysService.instance.generateNewKeysWithEncrypted(password) + const keys: Keys = { + privateKeyEncrypted: privateKeyArmoredEncrypted, + publicKey: publicKeyArmored, + revocationCertificate: revocationCertificate, + ecc: { + publicKey: publicKeyArmored, + privateKeyEncrypted: privateKeyArmoredEncrypted, + }, + kyber: { + publicKey: null, + privateKeyEncrypted: null, + }, + } + return keys + }, + } + + /** + * Generates the hash for a password, if salt is provided it uses it, in other case it is generated from crypto + * @param passObject The object containing the password and an optional salt hex encoded + * @returns The hashed password and the salt + **/ + public passToHash = (passObject: { + password: string + salt?: string | null + }): { salt: string; hash: string } => { + const salt = passObject.salt + ? passObject.salt + : crypto.randomBytes(128 / 8).toString('hex') + const hash = crypto + .pbkdf2Sync( + passObject.password, + Buffer.from(salt, 'hex'), + 10000, + 256 / 8, + 'sha1', + ) + .toString('hex') + const hashedObjetc = { + salt, + hash, + } + + return hashedObjetc + } + + /** + * Encrypts a plain message into an AES encrypted text using APP_CRYPTO_SECRET value from env + * @param textToEncrypt The plain text to be encrypted + * @returns The encrypted string in 'hex' encoding + **/ + public encryptText = (textToEncrypt: string): string => { + const APP_CRYPTO_SECRET = ConfigService.instance.get('CRYPTO_SECRET') + return this.encryptTextWithKey(textToEncrypt, APP_CRYPTO_SECRET) + } + + /** + * Decrypts an AES encrypted text using APP_CRYPTO_SECRET value from env + * @param encryptedText The AES encrypted text in 'HEX' encoding + * @returns The decrypted string in 'utf8' encoding + **/ + public decryptText = (encryptedText: string): string => { + const APP_CRYPTO_SECRET = ConfigService.instance.get('CRYPTO_SECRET') + return this.decryptTextWithKey(encryptedText, APP_CRYPTO_SECRET) + } + + /** + * Encrypts a plain message into an AES encrypted text using a secret. + * [Crypto.JS compatible]: + * First 8 bytes are reserved for 'Salted__', next 8 bytes are the salt, and the rest is aes content + * @param textToEncrypt The plain text to be encrypted + * @param secret The secret used to encrypt + * @returns The encrypted private string in 'hex' encoding + **/ + public encryptTextWithKey = (textToEncrypt: string, secret: string) => { + const salt = crypto.randomBytes(8) + const { key, iv } = this.getKeyAndIvFrom(secret, salt) + + const cipher = crypto.createCipheriv('aes-256-cbc', key, iv) + + const encrypted = Buffer.concat([ + cipher.update(textToEncrypt, 'utf8'), + cipher.final(), + ]) + + /* CryptoJS applies the OpenSSL format for the ciphertext, i.e. the encrypted data starts with the ASCII + encoding of 'Salted__' followed by the salt and then the ciphertext. + Therefore the beginning of the Base64 encoded ciphertext starts always with U2FsdGVkX1 + */ + const openSSLstart = Buffer.from('Salted__') + + return Buffer.concat([openSSLstart, salt, encrypted]).toString('hex') + } + + /** + * Decrypts an AES encrypted text using a secret. + * [Crypto.JS compatible]: + * First 8 bytes are reserved for 'Salted__', next 8 bytes are the salt, and the rest is aes content + * @param encryptedText The AES encrypted text in 'HEX' encoding + * @param secret The secret used to encrypt + * @returns The decrypted string in 'utf8' encoding + **/ + public decryptTextWithKey = (encryptedText: string, secret: string) => { + const cypherText = Buffer.from(encryptedText, 'hex') + + const salt = cypherText.subarray(8, 16) + const { key, iv } = this.getKeyAndIvFrom(secret, salt) + + const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv) + + const contentsToDecrypt = cypherText.subarray(16) + + return Buffer.concat([ + decipher.update(contentsToDecrypt), + decipher.final(), + ]).toString('utf8') + } + + /** + * Generates the key and the iv by transforming a secret and a salt. + * It will generate the same key and iv if the same secret and salt is used. + * This function is needed to be Crypto.JS compatible and encrypt/decrypt without errors + * @param secret The secret used to encrypt + * @param salt The salt used to encrypt + * @returns The key and the iv resulted from the secret and the salt combination + **/ + private readonly getKeyAndIvFrom = (secret: string, salt: Buffer) => { + const TRANSFORM_ROUNDS = 3 + const password = Buffer.concat([Buffer.from(secret, 'binary'), salt]) + const md5Hashes: Buffer[] = [] + let digest = password + + for (let i = 0; i < TRANSFORM_ROUNDS; i++) { + md5Hashes[i] = crypto.createHash('md5').update(digest).digest() + digest = Buffer.concat([md5Hashes[i], password]) + } + + const key = Buffer.concat([md5Hashes[0], md5Hashes[1]]) + const iv = md5Hashes[2] + return { key, iv } + } +} diff --git a/src/services/crypto/errors/keys.errors.ts b/src/services/crypto/errors/keys.errors.ts new file mode 100644 index 0000000..9b85200 --- /dev/null +++ b/src/services/crypto/errors/keys.errors.ts @@ -0,0 +1,39 @@ +export class BadEncodedPrivateKeyError extends Error { + constructor() { + super('Private key is bad encoded') + + Object.setPrototypeOf(this, BadEncodedPrivateKeyError.prototype) + } +} + +export class WrongIterationsToEncryptPrivateKeyError extends Error { + constructor() { + super('Private key was encrypted using the wrong iterations number') + + Object.setPrototypeOf( + this, + WrongIterationsToEncryptPrivateKeyError.prototype, + ) + } +} + +export class CorruptedEncryptedPrivateKeyError extends Error { + constructor() { + super('Private key is corrupted') + + Object.setPrototypeOf(this, CorruptedEncryptedPrivateKeyError.prototype) + } +} + +export class KeysDoNotMatchError extends Error { + constructor() { + super('Keys do not match') + + Object.setPrototypeOf(this, KeysDoNotMatchError.prototype) + } +} + +export interface AesInit { + iv: string + salt: string +} diff --git a/src/services/crypto/keys.service.ts b/src/services/crypto/keys.service.ts new file mode 100644 index 0000000..8c01590 --- /dev/null +++ b/src/services/crypto/keys.service.ts @@ -0,0 +1,245 @@ +import { aes } from '@internxt/lib' +import { type Keys } from '@internxt/sdk' +import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' +import * as openpgp from 'openpgp' +import { generateNewKeys, getOpenpgp } from './pgp.service' +import { + BadEncodedPrivateKeyError, + CorruptedEncryptedPrivateKeyError, + KeysDoNotMatchError, + WrongIterationsToEncryptPrivateKeyError, +} from './errors/keys.errors' +import { ConfigService } from '../config/config.service' + +export interface AesInit { + iv: string + salt: string +} + +export class KeysService { + public static readonly instance: KeysService = new KeysService() + MINIMAL_ENCRYPTED_KEY_LEN = 129 + + private getAesInit(): { iv: string; salt: string } { + return { + iv: ConfigService.instance.get('MAGIC_IV'), + salt: ConfigService.instance.get('MAGIC_SALT'), + } + } + + public async getKeys(password: string): Promise { + const { + privateKeyArmored, + publicKeyArmored, + revocationCertificate, + publicKyberKeyBase64, + privateKyberKeyBase64, + } = await generateNewKeys() + const encPrivateKey = aes.encrypt( + privateKeyArmored, + password, + this.getAesInit(), + ) + const encPrivateKyberKey = aes.encrypt( + privateKyberKeyBase64, + password, + this.getAesInit(), + ) + + const keys: Keys = { + privateKeyEncrypted: encPrivateKey, + publicKey: publicKeyArmored, + revocationCertificate: revocationCertificate, + ecc: { + privateKeyEncrypted: encPrivateKey, + publicKey: publicKeyArmored, + }, + kyber: { + publicKey: publicKyberKeyBase64, + privateKeyEncrypted: encPrivateKyberKey, + }, + } + return keys + } + + public parseAndDecryptUserKeys( + user: UserSettings, + password: string, + ): { + publicKey: string + privateKey: string + publicKyberKey: string + privateKyberKey: string + } { + const decryptedPrivateKey = this.decryptPrivateKey( + user.privateKey, + password, + ) + const privateKey = user.privateKey + ? Buffer.from(decryptedPrivateKey).toString('base64') + : '' + + let privateKyberKey = '' + if (user.keys?.kyber?.privateKey) { + privateKyberKey = this.decryptPrivateKey( + user.keys.kyber.privateKey, + password, + ) + } + + const publicKey = user.keys?.ecc?.publicKey ?? user.publicKey + const publicKyberKey = user.keys?.kyber?.publicKey ?? '' + + return { publicKey, privateKey, publicKyberKey, privateKyberKey } + } + + /** + * Checks if a private key can be decrypted with a password, otherwise it throws an error + * @param privateKey The encrypted private key + * @param password The password used to encrypt the private key + * @throws {BadEncodedPrivateKeyError} If the PLAIN private key is base64 encoded (known issue introduced in the past) + * @throws {WrongIterationsToEncryptPrivateKeyError} If the ENCRYPTED private key was encrypted using the wrong iterations number (known issue introduced in the past) + * @throws {CorruptedEncryptedPrivateKeyError} If the ENCRYPTED private key is un-decryptable (corrupted) + * @async + */ + public assertPrivateKeyIsValid = async ( + privateKey: string, + password: string, + ): Promise => { + let privateKeyDecrypted: string | undefined + + let badIterations = true + try { + aes.decrypt(privateKey, password, 9999) + } catch { + badIterations = false + } + if (badIterations === true) + throw new WrongIterationsToEncryptPrivateKeyError() + + let badEncrypted = false + try { + privateKeyDecrypted = this.decryptPrivateKey(privateKey, password) + } catch { + badEncrypted = true + } + + let hasValidFormat = false + try { + if (privateKeyDecrypted !== undefined) { + hasValidFormat = await this.isValidKey(privateKeyDecrypted) + } + } catch { + /* no op */ + } + + if (badEncrypted === true) throw new CorruptedEncryptedPrivateKeyError() + if (hasValidFormat === false) throw new BadEncodedPrivateKeyError() + } + + /** + * Encrypts a private key using a password + * @param privateKey The plain private key + * @param password The password to encrypt + * @returns The encrypted private key + **/ + public encryptPrivateKey = (privateKey: string, password: string): string => { + return aes.encrypt(privateKey, password, this.getAesInit()) + } + + /** + * Decrypts a private key using a password + * @param privateKey The encrypted private key + * @param password The password used to encrypt the private key + * @returns The decrypted private key + **/ + public decryptPrivateKey = (privateKey: string, password: string): string => { + if (!privateKey || privateKey.length <= this.MINIMAL_ENCRYPTED_KEY_LEN) + return '' + else { + try { + const result = aes.decrypt(privateKey, password) + return result + } catch { + throw new CorruptedEncryptedPrivateKeyError() + } + } + } + + /** + * Checks if a message encrypted with the public key can be decrypted with a private key, otherwise it throws an error + * @param privateKey The plain private key + * @param publicKey The plain public key + * @throws {KeysDoNotMatchError} If the keys can not be used together to encrypt/decrypt a message + * @async + **/ + public assertValidateKeys = async ( + privateKey: string, + publicKey: string, + ): Promise => { + const openpgp = await getOpenpgp() + const publicKeyArmored = await openpgp.readKey({ armoredKey: publicKey }) + const privateKeyArmored = await openpgp.readPrivateKey({ + armoredKey: privateKey, + }) + + const plainMessage = 'validate-keys' + const originalText = await openpgp.createMessage({ text: plainMessage }) + const encryptedMessage = await openpgp.encrypt({ + message: originalText, + encryptionKeys: publicKeyArmored, + }) + + const decryptedMessage = ( + await openpgp.decrypt({ + message: await openpgp.readMessage({ + armoredMessage: encryptedMessage, + }), + verificationKeys: publicKeyArmored, + decryptionKeys: privateKeyArmored, + }) + ).data + + if (decryptedMessage !== plainMessage) { + throw new KeysDoNotMatchError() + } + } + + /** + * Checks if a pgp key can be read + * @param key The openpgp key to be validated + * @returns True if it can be read, false otherwise + * @async + **/ + public isValidKey = async (key: string): Promise => { + try { + await openpgp.readKey({ armoredKey: key }) + return true + } catch { + return false + } + } + + /** + * Generates pgp keys adding an AES-encrypted private key property by using a password + * @param password The password for encrypting the private key + * @returns The keys { privateKeyArmored, privateKeyArmoredEncrypted, publicKeyArmored, revocationCertificate } + * @async + **/ + public generateNewKeysWithEncrypted = async (password: string) => { + const { privateKey, publicKey, revocationCertificate } = + await openpgp.generateKey({ + userIDs: [{ email: 'inxt@inxt.com' }], + curve: 'ed25519Legacy', + }) + + return { + privateKeyArmored: privateKey, + privateKeyArmoredEncrypted: this.encryptPrivateKey(privateKey, password), + publicKeyArmored: Buffer.from(publicKey).toString('base64'), + revocationCertificate: Buffer.from(revocationCertificate).toString( + 'base64', + ), + } + } +} diff --git a/src/services/crypto/pgp.service.ts b/src/services/crypto/pgp.service.ts new file mode 100644 index 0000000..932b4bd --- /dev/null +++ b/src/services/crypto/pgp.service.ts @@ -0,0 +1,35 @@ +import kemBuilder from '@dashlane/pqc-kem-kyber512-browser' +import { Buffer } from 'node:buffer' + +export async function getOpenpgp(): Promise { + return import('openpgp') +} +export async function generateNewKeys(): Promise<{ + privateKeyArmored: string + publicKeyArmored: string + revocationCertificate: string + publicKyberKeyBase64: string + privateKyberKeyBase64: string +}> { + const openpgp = await getOpenpgp() + + const { privateKey, publicKey, revocationCertificate } = + await openpgp.generateKey({ + userIDs: [{ email: 'inxt@inxt.com' }], + curve: 'ed25519Legacy', + }) + + const kem = await kemBuilder() + const { publicKey: publicKyberKey, privateKey: privateKyberKey } = + await kem.keypair() + + return { + privateKeyArmored: privateKey, + publicKeyArmored: Buffer.from(publicKey).toString('base64'), + revocationCertificate: Buffer.from(revocationCertificate).toString( + 'base64', + ), + publicKyberKeyBase64: Buffer.from(publicKyberKey).toString('base64'), + privateKyberKeyBase64: Buffer.from(privateKyberKey).toString('base64'), + } +} diff --git a/src/services/local-storage.service.ts b/src/services/local-storage.service.ts new file mode 100644 index 0000000..0763d36 --- /dev/null +++ b/src/services/local-storage.service.ts @@ -0,0 +1,74 @@ +import type { UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' +import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' + +const LocalStorageKeys = { + xUser: 'xUser', + xNewToken: 'xNewToken', +} + +export class LocalStorageService { + public static readonly instance = new LocalStorageService() + + set(key: string, value: string) { + localStorage.setItem(key, value) + } + + get(key: string): string | null { + return localStorage.getItem(key) + } + + remove(key: string) { + localStorage.removeItem(key) + } + + clear() { + localStorage.clear() + } + + setUser(user: UserSettings) { + localStorage.setItem(LocalStorageKeys.xUser, JSON.stringify(user)) + } + + getUser(): UserSettings | null { + const user = localStorage.getItem(LocalStorageKeys.xUser) + return user ? JSON.parse(user) : null + } + + setToken(token: string) { + localStorage.setItem(LocalStorageKeys.xNewToken, token) + } + + getToken(): string | null { + return localStorage.getItem(LocalStorageKeys.xNewToken) + } + + setMnemonic(mnemonic: string) { + localStorage.setItem('xMnemonic', mnemonic) + } + + getMnemonic(): string | null { + return localStorage.getItem('xMnemonic') + } + + setSubscription(subscription: UserSubscription) { + localStorage.setItem('xSubscription', JSON.stringify(subscription)) + } + + getSubscription(): UserSubscription | null { + const subscription = localStorage.getItem('xSubscription') + return subscription ? JSON.parse(subscription) : null + } + + saveCredentials(user: UserSettings, mnemonic: string, token: string) { + this.setUser(user) + this.setMnemonic(mnemonic) + this.setToken(token) + } + + clearCredentials() { + localStorage.removeItem('xUser') + localStorage.removeItem('xNewToken') + localStorage.removeItem('xSubscription') + localStorage.removeItem('xMnemonic') + } +} diff --git a/src/services/payments.service.ts b/src/services/payments.service.ts new file mode 100644 index 0000000..cc0e8a2 --- /dev/null +++ b/src/services/payments.service.ts @@ -0,0 +1,23 @@ +import { type Tier } from '@internxt/sdk/dist/drive/payments/types/tiers' +import { type UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' +import { SdkManager } from './sdk.service' + +export class PaymentsService { + public static readonly instance: PaymentsService = new PaymentsService() + + /** + * Gets the user's tier information. + * This includes meeting availability, plan name, and all other service features. + * + * @returns Promise The complete tier information + */ + public getUserTier = async (): Promise => { + const paymentsClient = SdkManager.instance.getPayments() + return paymentsClient.getUserTier() + } + + public getUserSubscription = async (): Promise => { + const paymentsClient = SdkManager.instance.getPayments() + return paymentsClient.getUserSubscription() + } +} diff --git a/src/services/sdk.service.ts b/src/services/sdk.service.ts new file mode 100644 index 0000000..86d2b91 --- /dev/null +++ b/src/services/sdk.service.ts @@ -0,0 +1,77 @@ +import { Auth, Drive } from '@internxt/sdk' +import type { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared' +import packageJson from '../../package.json' +import { ConfigService } from './config/config.service' +import { LocalStorageService } from './local-storage.service' + +export type SdkManagerApiSecurity = ApiSecurity & { newToken: string } + +export class SdkManager { + public static readonly instance: SdkManager = new SdkManager() + private static apiSecurity?: SdkManagerApiSecurity + private readonly localStorage = LocalStorageService + + public static readonly init = (apiSecurity: SdkManagerApiSecurity) => { + SdkManager.apiSecurity = apiSecurity + } + + public static readonly clean = () => { + SdkManager.apiSecurity = undefined + } + + public static readonly getApiSecurity = ( + config = { throwErrorOnMissingCredentials: true }, + ): SdkManagerApiSecurity => { + if (!SdkManager.apiSecurity && config.throwErrorOnMissingCredentials) + throw new Error('Api security properties not found in SdkManager') + + return SdkManager.apiSecurity as SdkManagerApiSecurity + } + + private getNewTokenApiSecurity(): ApiSecurity { + return { + token: this.localStorage.instance?.getToken() ?? '', + unauthorizedCallback: () => { + if (this.localStorage.instance) { + this.localStorage.instance.clearCredentials() + } + }, + } + } + + public static readonly getAppDetails = (): AppDetails => { + return { + clientName: packageJson.name, + clientVersion: packageJson.version, + } + } + + getNewAuth() { + const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL') + + const apiSecurity = SdkManager.getApiSecurity({ + throwErrorOnMissingCredentials: false, + }) + const appDetails = SdkManager.getAppDetails() + + return Auth.client(driveApi, appDetails, apiSecurity) + } + + getUsers() { + const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL') + + const apiSecurity = this.getNewTokenApiSecurity() + const appDetails = SdkManager.getAppDetails() + + return Drive.Users.client(driveApi, appDetails, apiSecurity) + } + + getPayments() { + const paymentsApi = ConfigService.instance.getVariable('PAYMENTS_API_URL') + + const apiSecurity = this.getNewTokenApiSecurity() + const appDetails = SdkManager.getAppDetails() + + return Drive.Payments.client(paymentsApi, appDetails, apiSecurity) + } +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..6800c1a --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,56 @@ +import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' + +export interface LoginCredentials { + user: UserSettings + token: string + newToken: string + mnemonic: string +} + +export interface WebAuthParams { + mnemonic: string + newToken: string +} + +export interface WebAuthMessage { + type: 'INTERNXT_AUTH_SUCCESS' | 'INTERNXT_AUTH_ERROR' + payload?: WebAuthParams + error?: string +} + +export interface WebAuthConfig { + popupWidth: number + popupHeight: number + authTimeoutMs: number + popupCheckIntervalMs: number + popupName: string + authOriginParam: string + loginPath: string + signupPath: string +} + +export const WEB_AUTH_MESSAGE_TYPES = { + SUCCESS: 'INTERNXT_AUTH_SUCCESS', + ERROR: 'INTERNXT_AUTH_ERROR', +} as const + +export const WEB_AUTH_STORAGE_KEYS = { + NEW_TOKEN: 'xNewToken', +} as const + +export const WEB_AUTH_CONFIG: WebAuthConfig = { + popupWidth: 500, + popupHeight: 700, + authTimeoutMs: 5 * 60 * 1000, + popupCheckIntervalMs: 500, + popupName: 'InternxtAuth', + authOriginParam: 'authOrigin=mail', + loginPath: '/login', + signupPath: '/new', +} + +export const WEB_AUTH_VALID_ORIGINS = [ + 'internxt.com', + 'localhost', + 'pages.dev', +] as const diff --git a/tsconfig.app.json b/tsconfig.app.json index 1735586..f04f4c2 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -5,7 +5,7 @@ "useDefineForClassFields": true, "lib": ["ES2022", "DOM", "DOM.Iterable"], "module": "ESNext", - "types": ["vite/client"], + "types": ["vite/client", "node"], "skipLibCheck": true, /* Bundler mode */ diff --git a/vite.config.ts b/vite.config.ts index fabe4d0..24775bc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,12 +1,26 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' +import { nodePolyfills } from 'vite-plugin-node-polyfills' import path from 'node:path' // https://vite.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [ + react(), + tailwindcss(), + nodePolyfills({ + globals: { + process: true, + Buffer: true, + global: true, + }, + protocolImports: true, + }), + ], + server: { - port: 3000, + port: 3001, }, resolve: { alias: { diff --git a/yarn.lock b/yarn.lock index 975d3ca..1120ed3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -165,6 +165,33 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" +"@dashlane/pqc-kem-kyber512-browser@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@dashlane/pqc-kem-kyber512-browser/-/pqc-kem-kyber512-browser-1.0.0.tgz#10a1b07e396616e574b9acad78d53076f271ac1d" + integrity sha512-lGWwF/5qkcnlZNZ5n2KkqjzC4q6EUre85ZotxOUQii9pCcZpeJBjK+naZoKAQz1pQZjGIZNHxIfzX5UxWsaouA== + +"@emnapi/core@^1.7.1", "@emnapi/core@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" + integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg== + dependencies: + "@emnapi/wasi-threads" "1.1.0" + tslib "^2.4.0" + +"@emnapi/runtime@^1.7.1", "@emnapi/runtime@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" + integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.1.0", "@emnapi/wasi-threads@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" + integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== + dependencies: + tslib "^2.4.0" + "@esbuild/aix-ppc64@0.27.3": version "0.27.3" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" @@ -413,13 +440,28 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@internxt/css-config@1.1.0": +"@internxt/css-config@1.1.0", "@internxt/css-config@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@internxt/css-config/-/css-config-1.1.0.tgz#5435c123b185c3c507ac087a13562f76124fa98d" integrity sha512-UN0wR+94P/X4kjZHrxZx8ISYSkSo4/RwDx/+SgwX5BLGhga4PY8OTtmPTLir4LqyPc5fWeQ7jsMHq8NWub8p7g== dependencies: tailwindcss "^4.1.17" +"@internxt/lib@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@internxt/lib/-/lib-1.4.1.tgz#dd4974cb49ab6bba118cf218434e69e95cc4a481" + integrity sha512-sWNp57IKCk0HjzTdPSuxOgZWvrSDWGYrzNOq90LIZTzr1HwkxObicUaZqSzmw4uDKrJhsdFdzwdywk3g8gwDDA== + dependencies: + uuid "^11.1.0" + +"@internxt/sdk@^1.15.1": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@internxt/sdk/-/sdk-1.15.1.tgz#69ad13a3c8cacbd929f025f24adc6fd2d1faf8ef" + integrity sha512-CEH/fNjDWenmFAl8NHaykb85AY4uEZDO5pA2ap8/GD4SXmxC3rcWsKnMsYO9jc8R2vpOPxmE3oBlNqOVcI/llQ== + dependencies: + axios "1.13.5" + internxt-crypto "0.0.13" + "@internxt/ui@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@internxt/ui/-/ui-0.1.6.tgz#79cef40941be133408e689cf4679c9cd16957fdc" @@ -451,7 +493,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== @@ -464,6 +506,35 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@napi-rs/wasm-runtime@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz#c3705ab549d176b8dc5172723d6156c3dc426af2" + integrity sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A== + dependencies: + "@emnapi/core" "^1.7.1" + "@emnapi/runtime" "^1.7.1" + "@tybys/wasm-util" "^0.10.1" + +"@noble/curves@~2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-2.0.1.tgz#64ba8bd5e8564a02942655602515646df1cdb3ad" + integrity sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw== + dependencies: + "@noble/hashes" "2.0.1" + +"@noble/hashes@2.0.1", "@noble/hashes@^2.0.1", "@noble/hashes@~2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-2.0.1.tgz#fc1a928061d1232b0a52bb754393c37a5216c89e" + integrity sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw== + +"@noble/post-quantum@^0.5.2": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@noble/post-quantum/-/post-quantum-0.5.4.tgz#bd1095647c61e4c8fd317fa8a3977db8cd28a4b9" + integrity sha512-leww0zzIirrvwaYMPI9fj6aRIlA/c6Y0/lifQQ1YOOyHEr0MNH3yYpjXeiVG+tWdPps4XxGclFWX2INPO3Yo5w== + dependencies: + "@noble/curves" "~2.0.0" + "@noble/hashes" "~2.0.0" + "@phosphor-icons/react@^2.1.10": version "2.1.10" resolved "https://registry.yarnpkg.com/@phosphor-icons/react/-/react-2.1.10.tgz#3a97ec5b7a4b8d53afeb29125bc17e74ed2daf92" @@ -1159,6 +1230,24 @@ resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz#8a88cc92a0f741befc7bc109cb1a4c6b9408e1c5" integrity sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q== +"@rollup/plugin-inject@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3" + integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + estree-walker "^2.0.2" + magic-string "^0.30.3" + +"@rollup/pluginutils@^5.0.1": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" + integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + "@rollup/rollup-android-arm-eabi@4.59.0": version "4.59.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz#a6742c74c7d9d6d604ef8a48f99326b4ecda3d82" @@ -1284,6 +1373,126 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz#4584a8a87b29188a4c1fe987a9fcf701e256d86c" integrity sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA== +"@scure/base@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-2.0.0.tgz#ba6371fddf92c2727e88ad6ab485db6e624f9a98" + integrity sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w== + +"@scure/bip39@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-2.0.1.tgz#47a6dc15e04faf200041239d46ae3bb7c3c96add" + integrity sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg== + dependencies: + "@noble/hashes" "2.0.1" + "@scure/base" "2.0.0" + +"@tailwindcss/node@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.2.1.tgz#e963ac242a885353a4660e7e3e9c695cde7d3fc9" + integrity sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg== + dependencies: + "@jridgewell/remapping" "^2.3.5" + enhanced-resolve "^5.19.0" + jiti "^2.6.1" + lightningcss "1.31.1" + magic-string "^0.30.21" + source-map-js "^1.2.1" + tailwindcss "4.2.1" + +"@tailwindcss/oxide-android-arm64@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz#a7c24919b607e7f884e6ab97799d12c7fb5b47bd" + integrity sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg== + +"@tailwindcss/oxide-darwin-arm64@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz#6f6e91ff0e1b5476cc0dad0da1ea8474f4563212" + integrity sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw== + +"@tailwindcss/oxide-darwin-x64@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz#1e59ef0665f6cb9e658bf0ebcb3cb50f21b2c175" + integrity sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw== + +"@tailwindcss/oxide-freebsd-x64@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz#6b0c75e9dac7f1a241cb9a5eaa89f0d9664835b6" + integrity sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz#717044d8fe746b1f0760485946c0c9a900174f7b" + integrity sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw== + +"@tailwindcss/oxide-linux-arm64-gnu@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz#f544b0faf166d80791347911b2dd4372a893129d" + integrity sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ== + +"@tailwindcss/oxide-linux-arm64-musl@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz#9fbaf8dc00b858a2b955526abb15d88f5678d1ef" + integrity sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ== + +"@tailwindcss/oxide-linux-x64-gnu@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz#6ab4e6b8d308d037a1155b8443df5941dbfa6aa1" + integrity sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g== + +"@tailwindcss/oxide-linux-x64-musl@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz#52c55593394dff85f1fa88172f69f8fdcde182b6" + integrity sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g== + +"@tailwindcss/oxide-wasm32-wasi@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz#7401e35f881d3654b6180badd1243d75a2702ea5" + integrity sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q== + dependencies: + "@emnapi/core" "^1.8.1" + "@emnapi/runtime" "^1.8.1" + "@emnapi/wasi-threads" "^1.1.0" + "@napi-rs/wasm-runtime" "^1.1.1" + "@tybys/wasm-util" "^0.10.1" + tslib "^2.8.1" + +"@tailwindcss/oxide-win32-arm64-msvc@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz#63a502e7b696dcd976aa356b94ce0f4f8f832c44" + integrity sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA== + +"@tailwindcss/oxide-win32-x64-msvc@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz#8cc59b28ebc4dc866c0c14d7057f07f0ed04c4a8" + integrity sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ== + +"@tailwindcss/oxide@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.2.1.tgz#43ae4217268a7e8b4736f1c056d0ef6f393c79d3" + integrity sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw== + optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.2.1" + "@tailwindcss/oxide-darwin-arm64" "4.2.1" + "@tailwindcss/oxide-darwin-x64" "4.2.1" + "@tailwindcss/oxide-freebsd-x64" "4.2.1" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.2.1" + "@tailwindcss/oxide-linux-arm64-gnu" "4.2.1" + "@tailwindcss/oxide-linux-arm64-musl" "4.2.1" + "@tailwindcss/oxide-linux-x64-gnu" "4.2.1" + "@tailwindcss/oxide-linux-x64-musl" "4.2.1" + "@tailwindcss/oxide-wasm32-wasi" "4.2.1" + "@tailwindcss/oxide-win32-arm64-msvc" "4.2.1" + "@tailwindcss/oxide-win32-x64-msvc" "4.2.1" + +"@tailwindcss/vite@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.2.1.tgz#8e6cd2a270229bd54990b700ca6faf621eadc3c1" + integrity sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w== + dependencies: + "@tailwindcss/node" "4.2.1" + "@tailwindcss/oxide" "4.2.1" + tailwindcss "4.2.1" + "@tiptap/core@^3.20.0": version "3.20.0" resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-3.20.0.tgz#dac72894d83829f2fbbabee2e90a748d7c1479ee" @@ -1504,6 +1713,13 @@ "@tiptap/extensions" "^3.20.0" "@tiptap/pm" "^3.20.0" +"@tybys/wasm-util@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" + integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== + dependencies: + tslib "^2.4.0" + "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1537,7 +1753,7 @@ dependencies: "@babel/types" "^7.28.2" -"@types/estree@1.0.8", "@types/estree@^1.0.6": +"@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== @@ -1565,12 +1781,12 @@ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== -"@types/node@^24.10.1": - version "24.10.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.15.tgz#83e016a4c3dbf4e672dc257cf4c941527f1a3aa3" - integrity sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg== +"@types/node@^25.3.3": + version "25.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.3.3.tgz#605862544ee7ffd7a936bcbf0135a14012f1e549" + integrity sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ== dependencies: - undici-types "~7.16.0" + undici-types "~7.18.0" "@types/react-dom@^19.2.3": version "19.2.3" @@ -1736,6 +1952,47 @@ aria-hidden@^1.2.4: dependencies: tslib "^2.0.0" +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@1.13.5: + version "1.13.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" + integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== + dependencies: + follow-redirects "^1.15.11" + form-data "^4.0.5" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1746,11 +2003,26 @@ balanced-match@^4.0.2: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + baseline-browser-mapping@^2.9.0: version "2.10.0" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.3.tgz#2cc2c679188eb35b006f2d0d4710bed8437a769e" + integrity sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g== + +bn.js@^5.2.1, bn.js@^5.2.2: + version "5.2.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.3.tgz#16a9e409616b23fef3ccbedb8d42f13bff80295e" + integrity sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w== + brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -1766,6 +2038,80 @@ brace-expansion@^5.0.2: dependencies: balanced-match "^4.0.2" +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browserify-aes@^1.0.4, browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" + integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== + dependencies: + bn.js "^5.2.1" + randombytes "^2.1.0" + safe-buffer "^5.2.1" + +browserify-sign@^4.2.3: + version "4.2.5" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.5.tgz#3979269fa8af55ba18aac35deef11b45515cd27d" + integrity sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw== + dependencies: + bn.js "^5.2.2" + browserify-rsa "^4.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.6.1" + inherits "^2.0.4" + parse-asn1 "^5.1.9" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + browserslist@^4.24.0: version "4.28.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" @@ -1777,6 +2123,50 @@ browserslist@^4.24.0: node-releases "^2.0.27" update-browserslist-db "^1.2.0" +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1795,6 +2185,15 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" + integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.2" + classnames@^2.3.2: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" @@ -1812,11 +2211,28 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -1827,6 +2243,47 @@ cookie@^1.0.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.1.1.tgz#3bb9bdfc82369db9c2f69c93c9c3ceb310c88b3c" integrity sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + crelt@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" @@ -1841,6 +2298,24 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" +crypto-browserify@^3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" + integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== + dependencies: + browserify-cipher "^1.0.1" + browserify-sign "^4.2.3" + create-ecdh "^4.0.4" + create-hash "^1.2.0" + create-hmac "^1.1.7" + diffie-hellman "^5.0.3" + hash-base "~3.0.4" + inherits "^2.0.4" + pbkdf2 "^3.1.2" + public-encrypt "^4.0.3" + randombytes "^2.1.0" + randomfill "^1.0.4" + csstype@^3.2.2: version "3.2.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" @@ -1863,21 +2338,128 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== +diffie-hellman@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@4.22.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f" + integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + electron-to-chromium@^1.5.263: version "1.5.302" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz#032a5802b31f7119269959c69fe2015d8dad5edb" integrity sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg== +elliptic@^6.5.3, elliptic@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +enhanced-resolve@^5.19.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" + integrity sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.3.0" + entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + esbuild@^0.27.0: version "0.27.3" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" @@ -2027,11 +2609,29 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2085,21 +2685,83 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== +flexsearch@^0.8.205: + version "0.8.212" + resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.8.212.tgz#b9509af778a991b938292e36fe0809a4ece4b940" + integrity sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw== + +follow-redirects@^1.15.11: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +form-data@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -2117,11 +2779,78 @@ globals@^16.5.0: resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash-base@^3.0.0, hash-base@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" + integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== + dependencies: + inherits "^2.0.4" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + to-buffer "^1.2.1" + +hash-base@~3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a" + integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + +hash-wasm@^4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/hash-wasm/-/hash-wasm-4.12.0.tgz#f9f1a9f9121e027a9acbf6db5d59452ace1ef9bb" + integrity sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ== + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hermes-estree@0.25.1: version "0.25.1" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" @@ -2134,6 +2863,15 @@ hermes-parser@^0.25.1: dependencies: hermes-estree "0.25.1" +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + html-parse-stringify@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" @@ -2141,6 +2879,16 @@ html-parse-stringify@^3.0.1: dependencies: void-elements "3.1.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +husky@^9.1.7: + version "9.1.7" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" + integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== + i18next@^25.8.13: version "25.8.13" resolved "https://registry.yarnpkg.com/i18next/-/i18next-25.8.13.tgz#1f9df59329f1706f02b2b58b5d1f75196ddb6e4a" @@ -2148,6 +2896,16 @@ i18next@^25.8.13: dependencies: "@babel/runtime" "^7.28.4" +idb@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.3.tgz#c91e558f15a8d53f1d7f53a094d226fc3ad71fd9" + integrity sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -2171,11 +2929,61 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internxt-crypto@0.0.13: + version "0.0.13" + resolved "https://registry.yarnpkg.com/internxt-crypto/-/internxt-crypto-0.0.13.tgz#90c83828a34667ecf6938ad7c22d94c9f0d9808b" + integrity sha512-V8Epf4oFZQZwMyIt8mcw7w36M+tryQ9VcfaiKtcruNW/129bawZnPXEeoOfLvAV+9OYlY2ZAwIYP0EtOD2ec6g== + dependencies: + "@noble/hashes" "^2.0.1" + "@noble/post-quantum" "^0.5.2" + "@scure/bip39" "^2.0.1" + flexsearch "^0.8.205" + hash-wasm "^4.12.0" + husky "^9.1.7" + idb "^8.0.3" + uuid "^13.0.0" + +is-arguments@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-generator-function@^1.0.7: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + dependencies: + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -2183,11 +2991,56 @@ is-glob@^4.0.0, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-typed-array@^1.1.14, is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-timers-promises@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" + integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== + +jiti@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" + integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2240,6 +3093,80 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lightningcss-android-arm64@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz#609ff48332adff452a8157a7c2842fd692a8eac4" + integrity sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg== + +lightningcss-darwin-arm64@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz#a13da040a7929582bab3ace9a67bdc146e99fc2d" + integrity sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg== + +lightningcss-darwin-x64@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz#f7482c311273571ec0c2bd8277c1f5f6e90e03a4" + integrity sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA== + +lightningcss-freebsd-x64@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz#91df1bb290f1cb7bb2af832d7d0d8809225e0124" + integrity sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A== + +lightningcss-linux-arm-gnueabihf@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz#c3cad5ae8b70045f21600dc95295ab6166acf57e" + integrity sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g== + +lightningcss-linux-arm64-gnu@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz#a5c4f6a5ac77447093f61b209c0bd7fef1f0a3e3" + integrity sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg== + +lightningcss-linux-arm64-musl@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz#af26ab8f829b727ada0a200938a6c8796ff36900" + integrity sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg== + +lightningcss-linux-x64-gnu@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz#a891d44e84b71c0d88959feb9a7522bbf61450ee" + integrity sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA== + +lightningcss-linux-x64-musl@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz#8c8b21def851f4d477fa897b80cb3db2b650bc6e" + integrity sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA== + +lightningcss-win32-arm64-msvc@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz#79000fb8c57e94a91b8fc643e74d5a54407d7080" + integrity sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w== + +lightningcss-win32-x64-msvc@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz#7f025274c81c7d659829731e09c8b6f442209837" + integrity sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw== + +lightningcss@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.31.1.tgz#1a19dd327b547a7eda1d5c296ebe1e72df5a184b" + integrity sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.31.1" + lightningcss-darwin-arm64 "1.31.1" + lightningcss-darwin-x64 "1.31.1" + lightningcss-freebsd-x64 "1.31.1" + lightningcss-linux-arm-gnueabihf "1.31.1" + lightningcss-linux-arm64-gnu "1.31.1" + lightningcss-linux-arm64-musl "1.31.1" + lightningcss-linux-x64-gnu "1.31.1" + lightningcss-linux-x64-musl "1.31.1" + lightningcss-win32-arm64-msvc "1.31.1" + lightningcss-win32-x64-msvc "1.31.1" + linkify-it@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" @@ -2271,6 +3198,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +magic-string@^0.30.21, magic-string@^0.30.3: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + markdown-it@^14.0.0: version "14.1.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" @@ -2283,11 +3217,55 @@ markdown-it@^14.0.0: punycode.js "^2.3.1" uc.micro "^2.1.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + mdurl@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^10.2.2: version "10.2.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" @@ -2322,6 +3300,74 @@ node-releases@^2.0.27: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== +node-stdlib-browser@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz#f41fa554f720a3df951e40339f4d92ac512222ac" + integrity sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw== + dependencies: + assert "^2.0.0" + browser-resolve "^2.0.0" + browserify-zlib "^0.2.0" + buffer "^5.7.1" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + create-require "^1.1.1" + crypto-browserify "^3.12.1" + domain-browser "4.22.0" + events "^3.0.0" + https-browserify "^1.0.0" + isomorphic-timers-promises "^1.0.1" + os-browserify "^0.3.0" + path-browserify "^1.0.1" + pkg-dir "^5.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + readable-stream "^3.6.0" + stream-browserify "^3.0.0" + stream-http "^3.2.0" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.1" + url "^0.11.4" + util "^0.12.4" + vm-browserify "^1.0.1" + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +openpgp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-6.3.0.tgz#e5f72f3f10dd8bb43660225e421c4fda80bafd6e" + integrity sha512-pLzCU8IgyKXPSO11eeharQkQ4GzOKNWhXq79pQarIRZEMt1/ssyr+MIuWBv1mNoenJLg04gvPx+fi4gcKZ4bag== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -2339,6 +3385,11 @@ orderedmap@^2.0.0: resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -2353,6 +3404,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -2360,6 +3416,22 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0, parse-asn1@^5.1.9: + version "5.1.9" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.9.tgz#8dd24c3ea8da77dffbc708d94eaf232fd6156e95" + integrity sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + pbkdf2 "^3.1.5" + safe-buffer "^5.2.1" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2370,16 +3442,45 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pbkdf2@^3.1.2, pbkdf2@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.5.tgz#444a59d7a259a95536c56e80c89de31cc01ed366" + integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== + dependencies: + create-hash "^1.2.0" + create-hmac "^1.1.7" + ripemd160 "^2.0.3" + safe-buffer "^5.2.1" + sha.js "^2.4.12" + to-buffer "^1.2.1" + picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.3: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + postcss@^8.5.6: version "8.5.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" @@ -2394,6 +3495,16 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prosemirror-changeset@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.4.0.tgz#8d8ea0290cb9545c298ec427ac3a8f298c39170f" @@ -2548,16 +3659,50 @@ prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, pros prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +public-encrypt@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + punycode.js@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qs@^6.12.3: + version "6.15.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" + integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== + dependencies: + side-channel "^1.1.0" + +querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + radix-ui@^1.1.3: version "1.4.3" resolved "https://registry.yarnpkg.com/radix-ui/-/radix-ui-1.4.3.tgz#17712d9e26ee61fdf4cd3969f4e16a794419508b" @@ -2619,6 +3764,21 @@ radix-ui@^1.1.3: "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-visually-hidden" "1.2.3" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + react-dom@^19.2.0: version "19.2.4" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591" @@ -2687,11 +3847,50 @@ react@^19.2.0: resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve@^1.17.0: + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== + dependencies: + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" + integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== + dependencies: + hash-base "^3.1.2" + inherits "^2.0.4" + rollup@^4.43.0: version "4.59.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.59.0.tgz#cf74edac17c1486f562d728a4d923a694abdf06f" @@ -2731,6 +3930,25 @@ rope-sequence@^1.3.0: resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + scheduler@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" @@ -2751,6 +3969,32 @@ set-cookie-parser@^2.6.0: resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2763,11 +4007,83 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -2780,11 +4096,28 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -tailwindcss@^4.1.17: +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@4.2.1, tailwindcss@^4.1.17, tailwindcss@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.2.1.tgz#018c4720b58baf98a6bf56b0a12aa797c6cfef1d" integrity sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw== +tapable@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" @@ -2793,16 +4126,30 @@ tinyglobby@^0.2.15: fdir "^6.5.0" picomatch "^4.0.3" +to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" + ts-api-utils@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== -tslib@^2.0.0, tslib@^2.1.0: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -2810,6 +4157,15 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + typescript-eslint@^8.48.0: version "8.56.1" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.56.1.tgz#15a9fcc5d2150a0d981772bb36f127a816fe103f" @@ -2830,10 +4186,10 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== update-browserslist-db@^1.2.0: version "1.2.3" @@ -2850,6 +4206,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== + dependencies: + punycode "^1.4.1" + qs "^6.12.3" + use-callback-ref@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" @@ -2870,6 +4234,40 @@ use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0, use-sync-externa resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4, util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + +uuid@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" + integrity sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w== + +vite-plugin-node-polyfills@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.25.0.tgz#dccbb76b3c81a4981a89403feabc1b74d2dc60d4" + integrity sha512-rHZ324W3LhfGPxWwQb2N048TThB6nVvnipsqBUJEzh3R9xeK9KI3si+GMQxCuAcpPJBVf0LpDtJ+beYzB3/chg== + dependencies: + "@rollup/plugin-inject" "^5.0.5" + node-stdlib-browser "^1.3.1" + vite@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.1.tgz#7f6cfe8fb9074138605e822a75d9d30b814d6507" @@ -2884,6 +4282,11 @@ vite@^7.3.1: optionalDependencies: fsevents "~2.3.3" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + void-elements@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" @@ -2894,6 +4297,19 @@ w3c-keyname@^2.2.0: resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== +which-typed-array@^1.1.16, which-typed-array@^1.1.2: + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -2906,6 +4322,11 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" From f5147e05e1742bf455b99edcc002a29546f4f273 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 13:42:00 +0100 Subject: [PATCH 02/12] feat: crypto services --- package.json | 5 +- src/services/crypto/crypto.service.test.ts | 147 ++++++++++ src/services/crypto/crypto.service.ts | 165 +++++++++++ src/services/crypto/errors/keys.errors.ts | 39 +++ src/services/crypto/keys.service.test.ts | 306 +++++++++++++++++++++ src/services/crypto/keys.service.ts | 245 +++++++++++++++++ src/services/crypto/pgp.service.ts | 35 +++ tsconfig.app.json | 2 +- yarn.lock | 40 ++- 9 files changed, 973 insertions(+), 11 deletions(-) create mode 100644 src/services/crypto/crypto.service.test.ts create mode 100644 src/services/crypto/crypto.service.ts create mode 100644 src/services/crypto/errors/keys.errors.ts create mode 100644 src/services/crypto/keys.service.test.ts create mode 100644 src/services/crypto/keys.service.ts create mode 100644 src/services/crypto/pgp.service.ts diff --git a/package.json b/package.json index 010b98c..c2971b6 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "test:coverage": "vitest run --coverage" }, "dependencies": { + "@dashlane/pqc-kem-kyber512-browser": "^1.0.0", "@internxt/css-config": "^1.1.0", + "@internxt/lib": "^1.4.1", "@internxt/sdk": "^1.15.1", "@internxt/ui": "^0.1.9", "@phosphor-icons/react": "^2.1.10", @@ -32,6 +34,7 @@ "@tiptap/starter-kit": "^3.20.0", "dayjs": "^1.11.19", "i18next": "^25.8.13", + "openpgp": "^6.3.0", "react": "^19.2.0", "react-dom": "^19.2.0", "react-i18next": "^16.5.4", @@ -40,7 +43,7 @@ }, "devDependencies": { "@eslint/js": "^9.39.1", - "@types/node": "^24.10.1", + "@types/node": "^25.3.3", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", diff --git a/src/services/crypto/crypto.service.test.ts b/src/services/crypto/crypto.service.test.ts new file mode 100644 index 0000000..1dd3fbc --- /dev/null +++ b/src/services/crypto/crypto.service.test.ts @@ -0,0 +1,147 @@ +import { describe, test, expect, beforeEach, vi } from 'vitest' +import { CryptoService } from './crypto.service' +import { KeysService } from './keys.service' +import { ConfigService } from '../config' + +vi.mock('openpgp', () => ({ + default: { + readKey: vi.fn(), + readPrivateKey: vi.fn(), + readMessage: vi.fn(), + encrypt: vi.fn(), + decrypt: vi.fn(), + generateKey: vi.fn(), + }, + readKey: vi.fn(), + readPrivateKey: vi.fn(), + readMessage: vi.fn(), + encrypt: vi.fn(), + decrypt: vi.fn(), + generateKey: vi.fn(), +})); + +describe('Crypto Service', () => { + beforeEach(() => { + vi.clearAllMocks() + + vi.spyOn(ConfigService.instance, 'getVariable').mockReturnValue( + 'test-secret', + ) + }) + + describe('Password hashing', () => { + test('When hashing a password without salt, then a new salt is generated', () => { + const password = 'test-password' + const result = CryptoService.instance.passToHash({ password }) + + expect(result.salt).toBeDefined() + expect(result.hash).toBeDefined() + expect(result.salt.length).toBe(32) // 128/8 = 16 bytes = 32 hex chars + expect(result.hash.length).toBe(64) // 256/8 = 32 bytes = 64 hex chars + }) + + test('When hashing a password with provided salt, then that salt is used', () => { + const password = 'test-password' + // Valid hex string (32 chars = 16 bytes) + const salt = 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6' + const result = CryptoService.instance.passToHash({ password, salt }) + + expect(result.salt).toBe(salt) + expect(result.hash).toBeDefined() + expect(result.hash.length).toBe(64) + }) + }) + + describe('Text encryption and decryption', () => { + test('When encrypting and decrypting text, then original text is recovered', () => { + const originalText = 'test-text' + const encrypted = CryptoService.instance.encryptText(originalText) + const decrypted = CryptoService.instance.decryptText(encrypted) + + expect(encrypted).not.toBe(originalText) + expect(decrypted).toBe(originalText) + }) + + test('When encrypting with a custom key, then it can be decrypted with the same key', () => { + const originalText = 'test-text' + const key = 'test-key' + const encrypted = CryptoService.instance.encryptTextWithKey( + originalText, + key, + ) + const decrypted = CryptoService.instance.decryptTextWithKey( + encrypted, + key, + ) + + expect(encrypted).not.toBe(originalText) + expect(decrypted).toBe(originalText) + }) + }) + + describe('Crypto provider', () => { + test('When generating keys, then it returns the expected structure with ECC keys', async () => { + const mockKeys = { + privateKeyArmored: 'private', + privateKeyArmoredEncrypted: 'encrypted-private', + publicKeyArmored: 'public', + revocationCertificate: 'revocation', + } + + vi.spyOn( + KeysService.instance, + 'generateNewKeysWithEncrypted', + ).mockResolvedValue(mockKeys) + + const password = 'test-password' + const keys = await CryptoService.cryptoProvider.generateKeys(password) + + expect(keys).toEqual({ + privateKeyEncrypted: mockKeys.privateKeyArmoredEncrypted, + publicKey: mockKeys.publicKeyArmored, + revocationCertificate: mockKeys.revocationCertificate, + ecc: { + publicKey: mockKeys.publicKeyArmored, + privateKeyEncrypted: mockKeys.privateKeyArmoredEncrypted, + }, + kyber: { + publicKey: null, + privateKeyEncrypted: null, + }, + }) + }) + + test('When encrypting password hash, then it decrypts salt, hashes password, and encrypts result', () => { + const password = 'test-password' + const encryptedSalt = 'encrypted-salt' + const decryptedSalt = 'decrypted-salt' + const hash = 'test-hash' + + vi.spyOn(CryptoService.instance, 'decryptText').mockReturnValue( + decryptedSalt, + ) + vi.spyOn(CryptoService.instance, 'passToHash').mockReturnValue({ + salt: decryptedSalt, + hash, + }) + vi.spyOn(CryptoService.instance, 'encryptText').mockReturnValue( + 'encrypted-hash', + ) + + const result = CryptoService.cryptoProvider.encryptPasswordHash( + password, + encryptedSalt, + ) + + expect(CryptoService.instance.decryptText).toHaveBeenCalledWith( + encryptedSalt, + ) + expect(CryptoService.instance.passToHash).toHaveBeenCalledWith({ + password, + salt: decryptedSalt, + }) + expect(CryptoService.instance.encryptText).toHaveBeenCalledWith(hash) + expect(result).toBe('encrypted-hash') + }) + }) +}) diff --git a/src/services/crypto/crypto.service.ts b/src/services/crypto/crypto.service.ts new file mode 100644 index 0000000..2ddcbc4 --- /dev/null +++ b/src/services/crypto/crypto.service.ts @@ -0,0 +1,165 @@ +import { type CryptoProvider } from '@internxt/sdk' +import { type Keys, type Password } from '@internxt/sdk/dist/auth' +import crypto from 'node:crypto' +import { ConfigService } from '../config' +import { KeysService } from './keys.service' + +export class CryptoService { + public static readonly instance: CryptoService = new CryptoService() + + public static readonly cryptoProvider: CryptoProvider = { + encryptPasswordHash(password: Password, encryptedSalt: string): string { + const salt = CryptoService.instance.decryptText(encryptedSalt) + const hashObj = CryptoService.instance.passToHash({ password, salt }) + return CryptoService.instance.encryptText(hashObj.hash) + }, + async generateKeys(password: Password): Promise { + const { + privateKeyArmoredEncrypted, + publicKeyArmored, + revocationCertificate, + } = await KeysService.instance.generateNewKeysWithEncrypted(password) + const keys: Keys = { + privateKeyEncrypted: privateKeyArmoredEncrypted, + publicKey: publicKeyArmored, + revocationCertificate: revocationCertificate, + ecc: { + publicKey: publicKeyArmored, + privateKeyEncrypted: privateKeyArmoredEncrypted, + }, + kyber: { + publicKey: null, + privateKeyEncrypted: null, + }, + } + return keys + }, + } + + /** + * Generates the hash for a password, if salt is provided it uses it, in other case it is generated from crypto + * @param passObject The object containing the password and an optional salt hex encoded + * @returns The hashed password and the salt + **/ + public passToHash = (passObject: { + password: string + salt?: string | null + }): { salt: string; hash: string } => { + const salt = passObject.salt + ? passObject.salt + : crypto.randomBytes(128 / 8).toString('hex') + const hash = crypto + .pbkdf2Sync( + passObject.password, + Buffer.from(salt, 'hex'), + 10000, + 256 / 8, + 'sha1', + ) + .toString('hex') + const hashedObjetc = { + salt, + hash, + } + + return hashedObjetc + } + + /** + * Encrypts a plain message into an AES encrypted text using APP_CRYPTO_SECRET value from env + * @param textToEncrypt The plain text to be encrypted + * @returns The encrypted string in 'hex' encoding + **/ + public encryptText = (textToEncrypt: string): string => { + const APP_CRYPTO_SECRET = + ConfigService.instance.getVariable('CRYPTO_SECRET') + return this.encryptTextWithKey(textToEncrypt, APP_CRYPTO_SECRET) + } + + /** + * Decrypts an AES encrypted text using APP_CRYPTO_SECRET value from env + * @param encryptedText The AES encrypted text in 'HEX' encoding + * @returns The decrypted string in 'utf8' encoding + **/ + public decryptText = (encryptedText: string): string => { + const APP_CRYPTO_SECRET = + ConfigService.instance.getVariable('CRYPTO_SECRET') + return this.decryptTextWithKey(encryptedText, APP_CRYPTO_SECRET) + } + + /** + * Encrypts a plain message into an AES encrypted text using a secret. + * [Crypto.JS compatible]: + * First 8 bytes are reserved for 'Salted__', next 8 bytes are the salt, and the rest is aes content + * @param textToEncrypt The plain text to be encrypted + * @param secret The secret used to encrypt + * @returns The encrypted private string in 'hex' encoding + **/ + public encryptTextWithKey = (textToEncrypt: string, secret: string) => { + const salt = crypto.randomBytes(8) + const { key, iv } = this.getKeyAndIvFrom(secret, salt) + + const cipher = crypto.createCipheriv('aes-256-cbc', key, iv) + + const encrypted = Buffer.concat([ + cipher.update(textToEncrypt, 'utf8'), + cipher.final(), + ]) + + /* CryptoJS applies the OpenSSL format for the ciphertext, i.e. the encrypted data starts with the ASCII + encoding of 'Salted__' followed by the salt and then the ciphertext. + Therefore the beginning of the Base64 encoded ciphertext starts always with U2FsdGVkX1 + */ + const openSSLstart = Buffer.from('Salted__') + + return Buffer.concat([openSSLstart, salt, encrypted]).toString('hex') + } + + /** + * Decrypts an AES encrypted text using a secret. + * [Crypto.JS compatible]: + * First 8 bytes are reserved for 'Salted__', next 8 bytes are the salt, and the rest is aes content + * @param encryptedText The AES encrypted text in 'HEX' encoding + * @param secret The secret used to encrypt + * @returns The decrypted string in 'utf8' encoding + **/ + public decryptTextWithKey = (encryptedText: string, secret: string) => { + const cypherText = Buffer.from(encryptedText, 'hex') + + const salt = cypherText.subarray(8, 16) + const { key, iv } = this.getKeyAndIvFrom(secret, salt) + + const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv) + + const contentsToDecrypt = cypherText.subarray(16) + + return Buffer.concat([ + decipher.update(contentsToDecrypt), + decipher.final(), + ]).toString('utf8') + } + + /** + * Generates the key and the iv by transforming a secret and a salt. + * It will generate the same key and iv if the same secret and salt is used. + * This function is needed to be Crypto.JS compatible and encrypt/decrypt without errors + * @param secret The secret used to encrypt + * @param salt The salt used to encrypt + * @returns The key and the iv resulted from the secret and the salt combination + **/ + private readonly getKeyAndIvFrom = (secret: string, salt: Buffer) => { + const TRANSFORM_ROUNDS = 3 + const password = Buffer.concat([Buffer.from(secret, 'binary'), salt]) + const md5Hashes: Buffer[] = [] + let digest = password + + for (let i = 0; i < TRANSFORM_ROUNDS; i++) { + md5Hashes[i] = crypto.createHash('md5').update(digest).digest() + digest = Buffer.concat([md5Hashes[i], password]) + } + + const key = Buffer.concat([md5Hashes[0], md5Hashes[1]]) + const iv = md5Hashes[2] + return { key, iv } + } +} diff --git a/src/services/crypto/errors/keys.errors.ts b/src/services/crypto/errors/keys.errors.ts new file mode 100644 index 0000000..9b85200 --- /dev/null +++ b/src/services/crypto/errors/keys.errors.ts @@ -0,0 +1,39 @@ +export class BadEncodedPrivateKeyError extends Error { + constructor() { + super('Private key is bad encoded') + + Object.setPrototypeOf(this, BadEncodedPrivateKeyError.prototype) + } +} + +export class WrongIterationsToEncryptPrivateKeyError extends Error { + constructor() { + super('Private key was encrypted using the wrong iterations number') + + Object.setPrototypeOf( + this, + WrongIterationsToEncryptPrivateKeyError.prototype, + ) + } +} + +export class CorruptedEncryptedPrivateKeyError extends Error { + constructor() { + super('Private key is corrupted') + + Object.setPrototypeOf(this, CorruptedEncryptedPrivateKeyError.prototype) + } +} + +export class KeysDoNotMatchError extends Error { + constructor() { + super('Keys do not match') + + Object.setPrototypeOf(this, KeysDoNotMatchError.prototype) + } +} + +export interface AesInit { + iv: string + salt: string +} diff --git a/src/services/crypto/keys.service.test.ts b/src/services/crypto/keys.service.test.ts new file mode 100644 index 0000000..2b850fb --- /dev/null +++ b/src/services/crypto/keys.service.test.ts @@ -0,0 +1,306 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { aes } from '@internxt/lib' +import type { DecryptMessageResult, WebStream } from 'openpgp' +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { KeysService } from './keys.service' +import { + BadEncodedPrivateKeyError, + CorruptedEncryptedPrivateKeyError, + KeysDoNotMatchError, + WrongIterationsToEncryptPrivateKeyError, +} from './errors/keys.errors' +import * as pgpService from './pgp.service' + +const MOCK_AES_INIT = { iv: 'test-iv', salt: 'test-salt' } +const MOCK_PASSWORD = 'test-password' + +vi.mock('@internxt/lib', () => ({ + aes: { + encrypt: vi.fn((data: string) => `encrypted-${data}`), + decrypt: vi.fn((data: string, _password: string, iterations?: number) => { + if (iterations === 9999) { + throw new Error('Wrong iterations') + } + if (data.startsWith('corrupted')) { + throw new Error('Decryption failed') + } + if (data.startsWith('encrypted-')) { + return data.replace('encrypted-', '') + } + return data + }), + }, +})) + +vi.mock('./pgp.service', () => ({ + generateNewKeys: vi.fn().mockResolvedValue({ + privateKeyArmored: 'pgp-private-key', + publicKeyArmored: 'pgp-public-key', + revocationCertificate: 'revocation-cert', + publicKyberKeyBase64: 'kyber-public-key', + privateKyberKeyBase64: 'kyber-private-key', + }), + getOpenpgp: vi.fn().mockResolvedValue({ + readKey: vi.fn().mockResolvedValue('mocked-public-key-object'), + readPrivateKey: vi.fn().mockResolvedValue('mocked-private-key-object'), + createMessage: vi.fn().mockResolvedValue('mocked-message-object'), + readMessage: vi.fn().mockResolvedValue('mocked-encrypted-message'), + encrypt: vi.fn().mockResolvedValue('mocked-encrypted-data'), + decrypt: vi.fn().mockResolvedValue({ + data: 'validate-keys', + }), + }), +})) + +vi.mock('openpgp', () => ({ + readKey: vi.fn().mockImplementation(async ({ armoredKey }) => { + if (armoredKey === 'invalid-format-key') { + throw new Error('Invalid key') + } + return { isValid: true } + }), +})) + +vi.mock('../config', () => ({ + ConfigService: { + instance: { + getVariable: vi.fn((key: string) => { + if (key === 'MAGIC_IV') return MOCK_AES_INIT.iv + if (key === 'MAGIC_SALT') return MOCK_AES_INIT.salt + return '' + }), + }, + }, +})) + +describe('Keys Service', () => { + let keysService: KeysService + + beforeEach(() => { + vi.clearAllMocks() + keysService = new KeysService() + }) + + describe('Get keys', () => { + test('When generating keys, then it returns encrypted ECC and Kyber keys', async () => { + const result = await keysService.getKeys(MOCK_PASSWORD) + + expect(pgpService.generateNewKeys).toHaveBeenCalled() + expect(aes.encrypt).toHaveBeenCalledWith( + 'pgp-private-key', + MOCK_PASSWORD, + MOCK_AES_INIT, + ) + expect(aes.encrypt).toHaveBeenCalledWith( + 'kyber-private-key', + MOCK_PASSWORD, + MOCK_AES_INIT, + ) + + expect(result).toEqual({ + privateKeyEncrypted: 'encrypted-pgp-private-key', + publicKey: 'pgp-public-key', + revocationCertificate: 'revocation-cert', + ecc: { + privateKeyEncrypted: 'encrypted-pgp-private-key', + publicKey: 'pgp-public-key', + }, + kyber: { + publicKey: 'kyber-public-key', + privateKeyEncrypted: 'encrypted-kyber-private-key', + }, + }) + }) + }) + + describe('Parse and decrypt keys', () => { + test('When user has both ECC and Kyber keys, then it decrypts and returns both', () => { + vi.spyOn(keysService, 'decryptPrivateKey') + .mockReturnValueOnce('decrypted-ecc-key') + .mockReturnValueOnce('decrypted-kyber-key') + + const mockUserSettings = { + privateKey: 'encrypted-ecc-private-key', + publicKey: 'legacy-public-key', + keys: { + ecc: { + publicKey: 'ecc-public-key', + privateKey: 'encrypted-ecc-private-key', + }, + kyber: { + publicKey: 'kyber-public-key', + privateKey: 'encrypted-kyber-private-key', + }, + }, + } as any + + const result = keysService.parseAndDecryptUserKeys( + mockUserSettings, + MOCK_PASSWORD, + ) + + expect(result).toEqual({ + publicKey: 'ecc-public-key', + privateKey: Buffer.from('decrypted-ecc-key').toString('base64'), + publicKyberKey: 'kyber-public-key', + privateKyberKey: 'decrypted-kyber-key', + }) + }) + + test('When user has only ECC keys, then it returns empty Kyber keys', () => { + vi.spyOn(keysService, 'decryptPrivateKey').mockReturnValueOnce( + 'decrypted-ecc-key', + ) + + const mockUserSettings = { + privateKey: 'encrypted-private-key', + publicKey: 'public-key', + keys: { + ecc: { + publicKey: 'ecc-public-key', + privateKey: 'encrypted-ecc-private-key', + }, + }, + } as any + + const result = keysService.parseAndDecryptUserKeys( + mockUserSettings, + MOCK_PASSWORD, + ) + + expect(result).toEqual({ + publicKey: 'ecc-public-key', + privateKey: Buffer.from('decrypted-ecc-key').toString('base64'), + publicKyberKey: '', + privateKyberKey: '', + }) + }) + + test('When user has only legacy keys format, then it parses them correctly', () => { + vi.spyOn(keysService, 'decryptPrivateKey').mockReturnValueOnce( + 'decrypted-private-key', + ) + + const mockUserSettings = { + privateKey: 'encrypted-private-key', + publicKey: 'legacy-public-key', + } as any + + const result = keysService.parseAndDecryptUserKeys( + mockUserSettings, + MOCK_PASSWORD, + ) + + expect(result).toEqual({ + publicKey: 'legacy-public-key', + privateKey: Buffer.from('decrypted-private-key').toString('base64'), + publicKyberKey: '', + privateKyberKey: '', + }) + }) + + test('When user has no private key, then it returns empty private key', () => { + const mockUserSettings = { + privateKey: '', + publicKey: 'public-key', + } as any + + const result = keysService.parseAndDecryptUserKeys( + mockUserSettings, + MOCK_PASSWORD, + ) + + expect(result.privateKey).toBe('') + }) + }) + + describe('Decrypt private key', () => { + test('When key is shorter than minimum length, then it returns empty string', () => { + const shortKey = 'x'.repeat(keysService.MINIMAL_ENCRYPTED_KEY_LEN) + + const result = keysService.decryptPrivateKey(shortKey, MOCK_PASSWORD) + + expect(result).toBe('') + expect(aes.decrypt).not.toHaveBeenCalled() + }) + + test('When decrypting a valid encrypted key, then it returns the decrypted value', () => { + const validKey = 'encrypted-valid-key'.padEnd(150, 'x') + + const result = keysService.decryptPrivateKey(validKey, MOCK_PASSWORD) + + expect(aes.decrypt).toHaveBeenCalledWith(validKey, MOCK_PASSWORD) + expect(result).toBe( + 'valid-key' + 'x'.repeat(150 - 'encrypted-valid-key'.length), + ) + }) + + test('When decryption fails, then an error indicating so is thrown', () => { + const corruptedKey = 'corrupted-key'.padEnd(150, 'x') + + expect(() => + keysService.decryptPrivateKey(corruptedKey, MOCK_PASSWORD), + ).toThrow(CorruptedEncryptedPrivateKeyError) + }) + }) + + describe('Check if the private key is valid', () => { + test('When key was encrypted with wrong iterations, then an error indicating so is thrown', async () => { + vi.mocked(aes.decrypt).mockImplementationOnce(() => 'should-not-work') + + await expect( + keysService.assertPrivateKeyIsValid('some-key', MOCK_PASSWORD), + ).rejects.toThrow(WrongIterationsToEncryptPrivateKeyError) + + expect(aes.decrypt).toHaveBeenCalledWith('some-key', MOCK_PASSWORD, 9999) + }) + + test('When decryption fails, then an error indicating so is thrown', async () => { + vi.mocked(aes.decrypt).mockImplementationOnce( + (_data, _password, iterations) => { + if (iterations === 9999) throw new Error('Expected error') + return 'should-not-reach' + }, + ) + + vi.spyOn(keysService, 'decryptPrivateKey').mockImplementationOnce(() => { + throw new CorruptedEncryptedPrivateKeyError() + }) + + await expect( + keysService.assertPrivateKeyIsValid('corrupted-key', MOCK_PASSWORD), + ).rejects.toThrow(CorruptedEncryptedPrivateKeyError) + }) + + test('When decrypted key has invalid format, then an error indicating so is thrown', async () => { + vi.mocked(aes.decrypt).mockImplementationOnce( + (_data, _password, iterations) => { + if (iterations === 9999) throw new Error('Expected error') + return 'invalid-format-key' + }, + ) + + vi.spyOn(keysService, 'isValidKey').mockResolvedValueOnce(false) + + await expect( + keysService.assertPrivateKeyIsValid( + 'encrypted-invalid-format', + MOCK_PASSWORD, + ), + ).rejects.toThrow(BadEncodedPrivateKeyError) + }) + }) + + describe('Validating keys', () => { + test('When decrypted message does not match the original, then an error indicating so is thrown', async () => { + const mockOpenpgp = await pgpService.getOpenpgp() + vi.mocked(mockOpenpgp.decrypt).mockResolvedValueOnce({ + data: 'wrong-message', + } as unknown as DecryptMessageResult & { data: WebStream }) + + await expect( + keysService.assertValidateKeys('private-key', 'public-key'), + ).rejects.toThrow(KeysDoNotMatchError) + }) + }) +}) diff --git a/src/services/crypto/keys.service.ts b/src/services/crypto/keys.service.ts new file mode 100644 index 0000000..5801e1d --- /dev/null +++ b/src/services/crypto/keys.service.ts @@ -0,0 +1,245 @@ +import { aes } from '@internxt/lib' +import { type Keys } from '@internxt/sdk' +import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' +import * as openpgp from 'openpgp' +import { generateNewKeys, getOpenpgp } from './pgp.service' +import { + BadEncodedPrivateKeyError, + CorruptedEncryptedPrivateKeyError, + KeysDoNotMatchError, + WrongIterationsToEncryptPrivateKeyError, +} from './errors/keys.errors' +import { ConfigService } from '../config' + +export interface AesInit { + iv: string + salt: string +} + +export class KeysService { + public static readonly instance: KeysService = new KeysService() + MINIMAL_ENCRYPTED_KEY_LEN = 129 + + private getAesInit(): { iv: string; salt: string } { + return { + iv: ConfigService.instance.getVariable('MAGIC_IV'), + salt: ConfigService.instance.getVariable('MAGIC_SALT'), + } + } + + public async getKeys(password: string): Promise { + const { + privateKeyArmored, + publicKeyArmored, + revocationCertificate, + publicKyberKeyBase64, + privateKyberKeyBase64, + } = await generateNewKeys() + const encPrivateKey = aes.encrypt( + privateKeyArmored, + password, + this.getAesInit(), + ) + const encPrivateKyberKey = aes.encrypt( + privateKyberKeyBase64, + password, + this.getAesInit(), + ) + + const keys: Keys = { + privateKeyEncrypted: encPrivateKey, + publicKey: publicKeyArmored, + revocationCertificate: revocationCertificate, + ecc: { + privateKeyEncrypted: encPrivateKey, + publicKey: publicKeyArmored, + }, + kyber: { + publicKey: publicKyberKeyBase64, + privateKeyEncrypted: encPrivateKyberKey, + }, + } + return keys + } + + public parseAndDecryptUserKeys( + user: UserSettings, + password: string, + ): { + publicKey: string + privateKey: string + publicKyberKey: string + privateKyberKey: string + } { + const decryptedPrivateKey = this.decryptPrivateKey( + user.privateKey, + password, + ) + const privateKey = user.privateKey + ? Buffer.from(decryptedPrivateKey).toString('base64') + : '' + + let privateKyberKey = '' + if (user.keys?.kyber?.privateKey) { + privateKyberKey = this.decryptPrivateKey( + user.keys.kyber.privateKey, + password, + ) + } + + const publicKey = user.keys?.ecc?.publicKey ?? user.publicKey + const publicKyberKey = user.keys?.kyber?.publicKey ?? '' + + return { publicKey, privateKey, publicKyberKey, privateKyberKey } + } + + /** + * Checks if a private key can be decrypted with a password, otherwise it throws an error + * @param privateKey The encrypted private key + * @param password The password used to encrypt the private key + * @throws {BadEncodedPrivateKeyError} If the PLAIN private key is base64 encoded (known issue introduced in the past) + * @throws {WrongIterationsToEncryptPrivateKeyError} If the ENCRYPTED private key was encrypted using the wrong iterations number (known issue introduced in the past) + * @throws {CorruptedEncryptedPrivateKeyError} If the ENCRYPTED private key is un-decryptable (corrupted) + * @async + */ + public assertPrivateKeyIsValid = async ( + privateKey: string, + password: string, + ): Promise => { + let privateKeyDecrypted: string | undefined + + let badIterations = true + try { + aes.decrypt(privateKey, password, 9999) + } catch { + badIterations = false + } + if (badIterations === true) + throw new WrongIterationsToEncryptPrivateKeyError() + + let badEncrypted = false + try { + privateKeyDecrypted = this.decryptPrivateKey(privateKey, password) + } catch { + badEncrypted = true + } + + let hasValidFormat = false + try { + if (privateKeyDecrypted !== undefined) { + hasValidFormat = await this.isValidKey(privateKeyDecrypted) + } + } catch { + /* no op */ + } + + if (badEncrypted === true) throw new CorruptedEncryptedPrivateKeyError() + if (hasValidFormat === false) throw new BadEncodedPrivateKeyError() + } + + /** + * Encrypts a private key using a password + * @param privateKey The plain private key + * @param password The password to encrypt + * @returns The encrypted private key + **/ + public encryptPrivateKey = (privateKey: string, password: string): string => { + return aes.encrypt(privateKey, password, this.getAesInit()) + } + + /** + * Decrypts a private key using a password + * @param privateKey The encrypted private key + * @param password The password used to encrypt the private key + * @returns The decrypted private key + **/ + public decryptPrivateKey = (privateKey: string, password: string): string => { + if (!privateKey || privateKey.length <= this.MINIMAL_ENCRYPTED_KEY_LEN) + return '' + else { + try { + const result = aes.decrypt(privateKey, password) + return result + } catch { + throw new CorruptedEncryptedPrivateKeyError() + } + } + } + + /** + * Checks if a message encrypted with the public key can be decrypted with a private key, otherwise it throws an error + * @param privateKey The plain private key + * @param publicKey The plain public key + * @throws {KeysDoNotMatchError} If the keys can not be used together to encrypt/decrypt a message + * @async + **/ + public assertValidateKeys = async ( + privateKey: string, + publicKey: string, + ): Promise => { + const openpgp = await getOpenpgp() + const publicKeyArmored = await openpgp.readKey({ armoredKey: publicKey }) + const privateKeyArmored = await openpgp.readPrivateKey({ + armoredKey: privateKey, + }) + + const plainMessage = 'validate-keys' + const originalText = await openpgp.createMessage({ text: plainMessage }) + const encryptedMessage = await openpgp.encrypt({ + message: originalText, + encryptionKeys: publicKeyArmored, + }) + + const decryptedMessage = ( + await openpgp.decrypt({ + message: await openpgp.readMessage({ + armoredMessage: encryptedMessage, + }), + verificationKeys: publicKeyArmored, + decryptionKeys: privateKeyArmored, + }) + ).data + + if (decryptedMessage !== plainMessage) { + throw new KeysDoNotMatchError() + } + } + + /** + * Checks if a pgp key can be read + * @param key The openpgp key to be validated + * @returns True if it can be read, false otherwise + * @async + **/ + public isValidKey = async (key: string): Promise => { + try { + await openpgp.readKey({ armoredKey: key }) + return true + } catch { + return false + } + } + + /** + * Generates pgp keys adding an AES-encrypted private key property by using a password + * @param password The password for encrypting the private key + * @returns The keys { privateKeyArmored, privateKeyArmoredEncrypted, publicKeyArmored, revocationCertificate } + * @async + **/ + public generateNewKeysWithEncrypted = async (password: string) => { + const { privateKey, publicKey, revocationCertificate } = + await openpgp.generateKey({ + userIDs: [{ email: 'inxt@inxt.com' }], + curve: 'ed25519Legacy', + }) + + return { + privateKeyArmored: privateKey, + privateKeyArmoredEncrypted: this.encryptPrivateKey(privateKey, password), + publicKeyArmored: Buffer.from(publicKey).toString('base64'), + revocationCertificate: Buffer.from(revocationCertificate).toString( + 'base64', + ), + } + } +} diff --git a/src/services/crypto/pgp.service.ts b/src/services/crypto/pgp.service.ts new file mode 100644 index 0000000..932b4bd --- /dev/null +++ b/src/services/crypto/pgp.service.ts @@ -0,0 +1,35 @@ +import kemBuilder from '@dashlane/pqc-kem-kyber512-browser' +import { Buffer } from 'node:buffer' + +export async function getOpenpgp(): Promise { + return import('openpgp') +} +export async function generateNewKeys(): Promise<{ + privateKeyArmored: string + publicKeyArmored: string + revocationCertificate: string + publicKyberKeyBase64: string + privateKyberKeyBase64: string +}> { + const openpgp = await getOpenpgp() + + const { privateKey, publicKey, revocationCertificate } = + await openpgp.generateKey({ + userIDs: [{ email: 'inxt@inxt.com' }], + curve: 'ed25519Legacy', + }) + + const kem = await kemBuilder() + const { publicKey: publicKyberKey, privateKey: privateKyberKey } = + await kem.keypair() + + return { + privateKeyArmored: privateKey, + publicKeyArmored: Buffer.from(publicKey).toString('base64'), + revocationCertificate: Buffer.from(revocationCertificate).toString( + 'base64', + ), + publicKyberKeyBase64: Buffer.from(publicKyberKey).toString('base64'), + privateKyberKeyBase64: Buffer.from(privateKyberKey).toString('base64'), + } +} diff --git a/tsconfig.app.json b/tsconfig.app.json index 1735586..f04f4c2 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -5,7 +5,7 @@ "useDefineForClassFields": true, "lib": ["ES2022", "DOM", "DOM.Iterable"], "module": "ESNext", - "types": ["vite/client"], + "types": ["vite/client", "node"], "skipLibCheck": true, /* Bundler mode */ diff --git a/yarn.lock b/yarn.lock index 5463bc2..d03db54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -237,6 +237,11 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz#798a33950d11226a0ebb6acafa60f5594424967f" integrity sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== +"@dashlane/pqc-kem-kyber512-browser@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@dashlane/pqc-kem-kyber512-browser/-/pqc-kem-kyber512-browser-1.0.0.tgz#10a1b07e396616e574b9acad78d53076f271ac1d" + integrity sha512-lGWwF/5qkcnlZNZ5n2KkqjzC4q6EUre85ZotxOUQii9pCcZpeJBjK+naZoKAQz1pQZjGIZNHxIfzX5UxWsaouA== + "@emnapi/core@^1.7.1", "@emnapi/core@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" @@ -519,6 +524,13 @@ dependencies: tailwindcss "^4.1.17" +"@internxt/lib@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@internxt/lib/-/lib-1.4.1.tgz#dd4974cb49ab6bba118cf218434e69e95cc4a481" + integrity sha512-sWNp57IKCk0HjzTdPSuxOgZWvrSDWGYrzNOq90LIZTzr1HwkxObicUaZqSzmw4uDKrJhsdFdzwdywk3g8gwDDA== + dependencies: + uuid "^11.1.0" + "@internxt/sdk@^1.15.1": version "1.15.1" resolved "https://registry.yarnpkg.com/@internxt/sdk/-/sdk-1.15.1.tgz#69ad13a3c8cacbd929f025f24adc6fd2d1faf8ef" @@ -1864,12 +1876,12 @@ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== -"@types/node@^24.10.1": - version "24.10.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.15.tgz#83e016a4c3dbf4e672dc257cf4c941527f1a3aa3" - integrity sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg== +"@types/node@^25.3.3": + version "25.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.3.3.tgz#605862544ee7ffd7a936bcbf0135a14012f1e549" + integrity sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ== dependencies: - undici-types "~7.16.0" + undici-types "~7.18.0" "@types/react-dom@^19.2.3": version "19.2.3" @@ -3649,6 +3661,11 @@ obug@^2.1.1: resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== +openpgp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-6.3.0.tgz#e5f72f3f10dd8bb43660225e421c4fda80bafd6e" + integrity sha512-pLzCU8IgyKXPSO11eeharQkQ4GzOKNWhXq79pQarIRZEMt1/ssyr+MIuWBv1mNoenJLg04gvPx+fi4gcKZ4bag== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -4552,10 +4569,10 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== undici@^7.21.0: version "7.22.0" @@ -4621,6 +4638,11 @@ util@^0.12.4, util@^0.12.5: is-typed-array "^1.1.3" which-typed-array "^1.1.2" +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + uuid@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" From 79ef091855e233a421b680c70dc2675233e709ba Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 14:58:03 +0100 Subject: [PATCH 03/12] fix: remove useless function --- src/services/auth/auth.service.ts | 63 ------------------------------- 1 file changed, 63 deletions(-) diff --git a/src/services/auth/auth.service.ts b/src/services/auth/auth.service.ts index 0623180..0a3105f 100644 --- a/src/services/auth/auth.service.ts +++ b/src/services/auth/auth.service.ts @@ -1,71 +1,8 @@ -import { type LoginDetails } from '@internxt/sdk' -import { CryptoService } from '../crypto/crypto.service' -import { KeysService } from '../crypto/keys.service' import { SdkManager } from '../sdk.service' -import type { LoginCredentials } from '@/types' export class AuthService { public static readonly instance: AuthService = new AuthService() - /** - * Login with user credentials and returns its tokens and properties - * @param email The user's email - * @param password The user's password - * @param twoFactorCode (Optional) The temporal two factor auth code - * @returns The user's properties and the tokens needed for auth - * @async - **/ - public doLogin = async ( - email: string, - password: string, - twoFactorCode?: string, - ): Promise => { - const authClient = SdkManager.instance.getNewAuth() - const loginDetails: LoginDetails = { - email: email.toLowerCase(), - password: password, - tfaCode: twoFactorCode, - } - - const data = await authClient.login( - loginDetails, - CryptoService.cryptoProvider, - ) - const { user, token, newToken } = data - const { privateKey, publicKey } = user - - const plainPrivateKeyInBase64 = privateKey - ? Buffer.from( - KeysService.instance.decryptPrivateKey(privateKey, password), - ).toString('base64') - : '' - - if (privateKey) { - await KeysService.instance.assertPrivateKeyIsValid(privateKey, password) - await KeysService.instance.assertValidateKeys( - Buffer.from(plainPrivateKeyInBase64, 'base64').toString(), - Buffer.from(publicKey, 'base64').toString(), - ) - } - - const clearMnemonic = CryptoService.instance.decryptTextWithKey( - user.mnemonic, - password, - ) - - const clearUser = { - ...user, - mnemonic: clearMnemonic, - privateKey: plainPrivateKeyInBase64, - } - return { - user: clearUser, - token: token, - newToken: newToken, - mnemonic: clearMnemonic, - } - } - /** * Checks from user's security details if it has enabled two factor auth * @param email The user's email From 9b4e4c7e10d82437ce9cad85d7c691cf13f59fd9 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 14:59:27 +0100 Subject: [PATCH 04/12] fix: remove useless services --- src/services/crypto/crypto.service.test.ts | 147 ---------- src/services/crypto/crypto.service.ts | 165 ----------- src/services/crypto/errors/keys.errors.ts | 39 --- src/services/crypto/keys.service.test.ts | 306 --------------------- src/services/crypto/keys.service.ts | 245 ----------------- src/services/crypto/pgp.service.ts | 35 --- 6 files changed, 937 deletions(-) delete mode 100644 src/services/crypto/crypto.service.test.ts delete mode 100644 src/services/crypto/crypto.service.ts delete mode 100644 src/services/crypto/errors/keys.errors.ts delete mode 100644 src/services/crypto/keys.service.test.ts delete mode 100644 src/services/crypto/keys.service.ts delete mode 100644 src/services/crypto/pgp.service.ts diff --git a/src/services/crypto/crypto.service.test.ts b/src/services/crypto/crypto.service.test.ts deleted file mode 100644 index 1dd3fbc..0000000 --- a/src/services/crypto/crypto.service.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { describe, test, expect, beforeEach, vi } from 'vitest' -import { CryptoService } from './crypto.service' -import { KeysService } from './keys.service' -import { ConfigService } from '../config' - -vi.mock('openpgp', () => ({ - default: { - readKey: vi.fn(), - readPrivateKey: vi.fn(), - readMessage: vi.fn(), - encrypt: vi.fn(), - decrypt: vi.fn(), - generateKey: vi.fn(), - }, - readKey: vi.fn(), - readPrivateKey: vi.fn(), - readMessage: vi.fn(), - encrypt: vi.fn(), - decrypt: vi.fn(), - generateKey: vi.fn(), -})); - -describe('Crypto Service', () => { - beforeEach(() => { - vi.clearAllMocks() - - vi.spyOn(ConfigService.instance, 'getVariable').mockReturnValue( - 'test-secret', - ) - }) - - describe('Password hashing', () => { - test('When hashing a password without salt, then a new salt is generated', () => { - const password = 'test-password' - const result = CryptoService.instance.passToHash({ password }) - - expect(result.salt).toBeDefined() - expect(result.hash).toBeDefined() - expect(result.salt.length).toBe(32) // 128/8 = 16 bytes = 32 hex chars - expect(result.hash.length).toBe(64) // 256/8 = 32 bytes = 64 hex chars - }) - - test('When hashing a password with provided salt, then that salt is used', () => { - const password = 'test-password' - // Valid hex string (32 chars = 16 bytes) - const salt = 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6' - const result = CryptoService.instance.passToHash({ password, salt }) - - expect(result.salt).toBe(salt) - expect(result.hash).toBeDefined() - expect(result.hash.length).toBe(64) - }) - }) - - describe('Text encryption and decryption', () => { - test('When encrypting and decrypting text, then original text is recovered', () => { - const originalText = 'test-text' - const encrypted = CryptoService.instance.encryptText(originalText) - const decrypted = CryptoService.instance.decryptText(encrypted) - - expect(encrypted).not.toBe(originalText) - expect(decrypted).toBe(originalText) - }) - - test('When encrypting with a custom key, then it can be decrypted with the same key', () => { - const originalText = 'test-text' - const key = 'test-key' - const encrypted = CryptoService.instance.encryptTextWithKey( - originalText, - key, - ) - const decrypted = CryptoService.instance.decryptTextWithKey( - encrypted, - key, - ) - - expect(encrypted).not.toBe(originalText) - expect(decrypted).toBe(originalText) - }) - }) - - describe('Crypto provider', () => { - test('When generating keys, then it returns the expected structure with ECC keys', async () => { - const mockKeys = { - privateKeyArmored: 'private', - privateKeyArmoredEncrypted: 'encrypted-private', - publicKeyArmored: 'public', - revocationCertificate: 'revocation', - } - - vi.spyOn( - KeysService.instance, - 'generateNewKeysWithEncrypted', - ).mockResolvedValue(mockKeys) - - const password = 'test-password' - const keys = await CryptoService.cryptoProvider.generateKeys(password) - - expect(keys).toEqual({ - privateKeyEncrypted: mockKeys.privateKeyArmoredEncrypted, - publicKey: mockKeys.publicKeyArmored, - revocationCertificate: mockKeys.revocationCertificate, - ecc: { - publicKey: mockKeys.publicKeyArmored, - privateKeyEncrypted: mockKeys.privateKeyArmoredEncrypted, - }, - kyber: { - publicKey: null, - privateKeyEncrypted: null, - }, - }) - }) - - test('When encrypting password hash, then it decrypts salt, hashes password, and encrypts result', () => { - const password = 'test-password' - const encryptedSalt = 'encrypted-salt' - const decryptedSalt = 'decrypted-salt' - const hash = 'test-hash' - - vi.spyOn(CryptoService.instance, 'decryptText').mockReturnValue( - decryptedSalt, - ) - vi.spyOn(CryptoService.instance, 'passToHash').mockReturnValue({ - salt: decryptedSalt, - hash, - }) - vi.spyOn(CryptoService.instance, 'encryptText').mockReturnValue( - 'encrypted-hash', - ) - - const result = CryptoService.cryptoProvider.encryptPasswordHash( - password, - encryptedSalt, - ) - - expect(CryptoService.instance.decryptText).toHaveBeenCalledWith( - encryptedSalt, - ) - expect(CryptoService.instance.passToHash).toHaveBeenCalledWith({ - password, - salt: decryptedSalt, - }) - expect(CryptoService.instance.encryptText).toHaveBeenCalledWith(hash) - expect(result).toBe('encrypted-hash') - }) - }) -}) diff --git a/src/services/crypto/crypto.service.ts b/src/services/crypto/crypto.service.ts deleted file mode 100644 index 2ddcbc4..0000000 --- a/src/services/crypto/crypto.service.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { type CryptoProvider } from '@internxt/sdk' -import { type Keys, type Password } from '@internxt/sdk/dist/auth' -import crypto from 'node:crypto' -import { ConfigService } from '../config' -import { KeysService } from './keys.service' - -export class CryptoService { - public static readonly instance: CryptoService = new CryptoService() - - public static readonly cryptoProvider: CryptoProvider = { - encryptPasswordHash(password: Password, encryptedSalt: string): string { - const salt = CryptoService.instance.decryptText(encryptedSalt) - const hashObj = CryptoService.instance.passToHash({ password, salt }) - return CryptoService.instance.encryptText(hashObj.hash) - }, - async generateKeys(password: Password): Promise { - const { - privateKeyArmoredEncrypted, - publicKeyArmored, - revocationCertificate, - } = await KeysService.instance.generateNewKeysWithEncrypted(password) - const keys: Keys = { - privateKeyEncrypted: privateKeyArmoredEncrypted, - publicKey: publicKeyArmored, - revocationCertificate: revocationCertificate, - ecc: { - publicKey: publicKeyArmored, - privateKeyEncrypted: privateKeyArmoredEncrypted, - }, - kyber: { - publicKey: null, - privateKeyEncrypted: null, - }, - } - return keys - }, - } - - /** - * Generates the hash for a password, if salt is provided it uses it, in other case it is generated from crypto - * @param passObject The object containing the password and an optional salt hex encoded - * @returns The hashed password and the salt - **/ - public passToHash = (passObject: { - password: string - salt?: string | null - }): { salt: string; hash: string } => { - const salt = passObject.salt - ? passObject.salt - : crypto.randomBytes(128 / 8).toString('hex') - const hash = crypto - .pbkdf2Sync( - passObject.password, - Buffer.from(salt, 'hex'), - 10000, - 256 / 8, - 'sha1', - ) - .toString('hex') - const hashedObjetc = { - salt, - hash, - } - - return hashedObjetc - } - - /** - * Encrypts a plain message into an AES encrypted text using APP_CRYPTO_SECRET value from env - * @param textToEncrypt The plain text to be encrypted - * @returns The encrypted string in 'hex' encoding - **/ - public encryptText = (textToEncrypt: string): string => { - const APP_CRYPTO_SECRET = - ConfigService.instance.getVariable('CRYPTO_SECRET') - return this.encryptTextWithKey(textToEncrypt, APP_CRYPTO_SECRET) - } - - /** - * Decrypts an AES encrypted text using APP_CRYPTO_SECRET value from env - * @param encryptedText The AES encrypted text in 'HEX' encoding - * @returns The decrypted string in 'utf8' encoding - **/ - public decryptText = (encryptedText: string): string => { - const APP_CRYPTO_SECRET = - ConfigService.instance.getVariable('CRYPTO_SECRET') - return this.decryptTextWithKey(encryptedText, APP_CRYPTO_SECRET) - } - - /** - * Encrypts a plain message into an AES encrypted text using a secret. - * [Crypto.JS compatible]: - * First 8 bytes are reserved for 'Salted__', next 8 bytes are the salt, and the rest is aes content - * @param textToEncrypt The plain text to be encrypted - * @param secret The secret used to encrypt - * @returns The encrypted private string in 'hex' encoding - **/ - public encryptTextWithKey = (textToEncrypt: string, secret: string) => { - const salt = crypto.randomBytes(8) - const { key, iv } = this.getKeyAndIvFrom(secret, salt) - - const cipher = crypto.createCipheriv('aes-256-cbc', key, iv) - - const encrypted = Buffer.concat([ - cipher.update(textToEncrypt, 'utf8'), - cipher.final(), - ]) - - /* CryptoJS applies the OpenSSL format for the ciphertext, i.e. the encrypted data starts with the ASCII - encoding of 'Salted__' followed by the salt and then the ciphertext. - Therefore the beginning of the Base64 encoded ciphertext starts always with U2FsdGVkX1 - */ - const openSSLstart = Buffer.from('Salted__') - - return Buffer.concat([openSSLstart, salt, encrypted]).toString('hex') - } - - /** - * Decrypts an AES encrypted text using a secret. - * [Crypto.JS compatible]: - * First 8 bytes are reserved for 'Salted__', next 8 bytes are the salt, and the rest is aes content - * @param encryptedText The AES encrypted text in 'HEX' encoding - * @param secret The secret used to encrypt - * @returns The decrypted string in 'utf8' encoding - **/ - public decryptTextWithKey = (encryptedText: string, secret: string) => { - const cypherText = Buffer.from(encryptedText, 'hex') - - const salt = cypherText.subarray(8, 16) - const { key, iv } = this.getKeyAndIvFrom(secret, salt) - - const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv) - - const contentsToDecrypt = cypherText.subarray(16) - - return Buffer.concat([ - decipher.update(contentsToDecrypt), - decipher.final(), - ]).toString('utf8') - } - - /** - * Generates the key and the iv by transforming a secret and a salt. - * It will generate the same key and iv if the same secret and salt is used. - * This function is needed to be Crypto.JS compatible and encrypt/decrypt without errors - * @param secret The secret used to encrypt - * @param salt The salt used to encrypt - * @returns The key and the iv resulted from the secret and the salt combination - **/ - private readonly getKeyAndIvFrom = (secret: string, salt: Buffer) => { - const TRANSFORM_ROUNDS = 3 - const password = Buffer.concat([Buffer.from(secret, 'binary'), salt]) - const md5Hashes: Buffer[] = [] - let digest = password - - for (let i = 0; i < TRANSFORM_ROUNDS; i++) { - md5Hashes[i] = crypto.createHash('md5').update(digest).digest() - digest = Buffer.concat([md5Hashes[i], password]) - } - - const key = Buffer.concat([md5Hashes[0], md5Hashes[1]]) - const iv = md5Hashes[2] - return { key, iv } - } -} diff --git a/src/services/crypto/errors/keys.errors.ts b/src/services/crypto/errors/keys.errors.ts deleted file mode 100644 index 9b85200..0000000 --- a/src/services/crypto/errors/keys.errors.ts +++ /dev/null @@ -1,39 +0,0 @@ -export class BadEncodedPrivateKeyError extends Error { - constructor() { - super('Private key is bad encoded') - - Object.setPrototypeOf(this, BadEncodedPrivateKeyError.prototype) - } -} - -export class WrongIterationsToEncryptPrivateKeyError extends Error { - constructor() { - super('Private key was encrypted using the wrong iterations number') - - Object.setPrototypeOf( - this, - WrongIterationsToEncryptPrivateKeyError.prototype, - ) - } -} - -export class CorruptedEncryptedPrivateKeyError extends Error { - constructor() { - super('Private key is corrupted') - - Object.setPrototypeOf(this, CorruptedEncryptedPrivateKeyError.prototype) - } -} - -export class KeysDoNotMatchError extends Error { - constructor() { - super('Keys do not match') - - Object.setPrototypeOf(this, KeysDoNotMatchError.prototype) - } -} - -export interface AesInit { - iv: string - salt: string -} diff --git a/src/services/crypto/keys.service.test.ts b/src/services/crypto/keys.service.test.ts deleted file mode 100644 index 2b850fb..0000000 --- a/src/services/crypto/keys.service.test.ts +++ /dev/null @@ -1,306 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { aes } from '@internxt/lib' -import type { DecryptMessageResult, WebStream } from 'openpgp' -import { beforeEach, describe, expect, test, vi } from 'vitest' -import { KeysService } from './keys.service' -import { - BadEncodedPrivateKeyError, - CorruptedEncryptedPrivateKeyError, - KeysDoNotMatchError, - WrongIterationsToEncryptPrivateKeyError, -} from './errors/keys.errors' -import * as pgpService from './pgp.service' - -const MOCK_AES_INIT = { iv: 'test-iv', salt: 'test-salt' } -const MOCK_PASSWORD = 'test-password' - -vi.mock('@internxt/lib', () => ({ - aes: { - encrypt: vi.fn((data: string) => `encrypted-${data}`), - decrypt: vi.fn((data: string, _password: string, iterations?: number) => { - if (iterations === 9999) { - throw new Error('Wrong iterations') - } - if (data.startsWith('corrupted')) { - throw new Error('Decryption failed') - } - if (data.startsWith('encrypted-')) { - return data.replace('encrypted-', '') - } - return data - }), - }, -})) - -vi.mock('./pgp.service', () => ({ - generateNewKeys: vi.fn().mockResolvedValue({ - privateKeyArmored: 'pgp-private-key', - publicKeyArmored: 'pgp-public-key', - revocationCertificate: 'revocation-cert', - publicKyberKeyBase64: 'kyber-public-key', - privateKyberKeyBase64: 'kyber-private-key', - }), - getOpenpgp: vi.fn().mockResolvedValue({ - readKey: vi.fn().mockResolvedValue('mocked-public-key-object'), - readPrivateKey: vi.fn().mockResolvedValue('mocked-private-key-object'), - createMessage: vi.fn().mockResolvedValue('mocked-message-object'), - readMessage: vi.fn().mockResolvedValue('mocked-encrypted-message'), - encrypt: vi.fn().mockResolvedValue('mocked-encrypted-data'), - decrypt: vi.fn().mockResolvedValue({ - data: 'validate-keys', - }), - }), -})) - -vi.mock('openpgp', () => ({ - readKey: vi.fn().mockImplementation(async ({ armoredKey }) => { - if (armoredKey === 'invalid-format-key') { - throw new Error('Invalid key') - } - return { isValid: true } - }), -})) - -vi.mock('../config', () => ({ - ConfigService: { - instance: { - getVariable: vi.fn((key: string) => { - if (key === 'MAGIC_IV') return MOCK_AES_INIT.iv - if (key === 'MAGIC_SALT') return MOCK_AES_INIT.salt - return '' - }), - }, - }, -})) - -describe('Keys Service', () => { - let keysService: KeysService - - beforeEach(() => { - vi.clearAllMocks() - keysService = new KeysService() - }) - - describe('Get keys', () => { - test('When generating keys, then it returns encrypted ECC and Kyber keys', async () => { - const result = await keysService.getKeys(MOCK_PASSWORD) - - expect(pgpService.generateNewKeys).toHaveBeenCalled() - expect(aes.encrypt).toHaveBeenCalledWith( - 'pgp-private-key', - MOCK_PASSWORD, - MOCK_AES_INIT, - ) - expect(aes.encrypt).toHaveBeenCalledWith( - 'kyber-private-key', - MOCK_PASSWORD, - MOCK_AES_INIT, - ) - - expect(result).toEqual({ - privateKeyEncrypted: 'encrypted-pgp-private-key', - publicKey: 'pgp-public-key', - revocationCertificate: 'revocation-cert', - ecc: { - privateKeyEncrypted: 'encrypted-pgp-private-key', - publicKey: 'pgp-public-key', - }, - kyber: { - publicKey: 'kyber-public-key', - privateKeyEncrypted: 'encrypted-kyber-private-key', - }, - }) - }) - }) - - describe('Parse and decrypt keys', () => { - test('When user has both ECC and Kyber keys, then it decrypts and returns both', () => { - vi.spyOn(keysService, 'decryptPrivateKey') - .mockReturnValueOnce('decrypted-ecc-key') - .mockReturnValueOnce('decrypted-kyber-key') - - const mockUserSettings = { - privateKey: 'encrypted-ecc-private-key', - publicKey: 'legacy-public-key', - keys: { - ecc: { - publicKey: 'ecc-public-key', - privateKey: 'encrypted-ecc-private-key', - }, - kyber: { - publicKey: 'kyber-public-key', - privateKey: 'encrypted-kyber-private-key', - }, - }, - } as any - - const result = keysService.parseAndDecryptUserKeys( - mockUserSettings, - MOCK_PASSWORD, - ) - - expect(result).toEqual({ - publicKey: 'ecc-public-key', - privateKey: Buffer.from('decrypted-ecc-key').toString('base64'), - publicKyberKey: 'kyber-public-key', - privateKyberKey: 'decrypted-kyber-key', - }) - }) - - test('When user has only ECC keys, then it returns empty Kyber keys', () => { - vi.spyOn(keysService, 'decryptPrivateKey').mockReturnValueOnce( - 'decrypted-ecc-key', - ) - - const mockUserSettings = { - privateKey: 'encrypted-private-key', - publicKey: 'public-key', - keys: { - ecc: { - publicKey: 'ecc-public-key', - privateKey: 'encrypted-ecc-private-key', - }, - }, - } as any - - const result = keysService.parseAndDecryptUserKeys( - mockUserSettings, - MOCK_PASSWORD, - ) - - expect(result).toEqual({ - publicKey: 'ecc-public-key', - privateKey: Buffer.from('decrypted-ecc-key').toString('base64'), - publicKyberKey: '', - privateKyberKey: '', - }) - }) - - test('When user has only legacy keys format, then it parses them correctly', () => { - vi.spyOn(keysService, 'decryptPrivateKey').mockReturnValueOnce( - 'decrypted-private-key', - ) - - const mockUserSettings = { - privateKey: 'encrypted-private-key', - publicKey: 'legacy-public-key', - } as any - - const result = keysService.parseAndDecryptUserKeys( - mockUserSettings, - MOCK_PASSWORD, - ) - - expect(result).toEqual({ - publicKey: 'legacy-public-key', - privateKey: Buffer.from('decrypted-private-key').toString('base64'), - publicKyberKey: '', - privateKyberKey: '', - }) - }) - - test('When user has no private key, then it returns empty private key', () => { - const mockUserSettings = { - privateKey: '', - publicKey: 'public-key', - } as any - - const result = keysService.parseAndDecryptUserKeys( - mockUserSettings, - MOCK_PASSWORD, - ) - - expect(result.privateKey).toBe('') - }) - }) - - describe('Decrypt private key', () => { - test('When key is shorter than minimum length, then it returns empty string', () => { - const shortKey = 'x'.repeat(keysService.MINIMAL_ENCRYPTED_KEY_LEN) - - const result = keysService.decryptPrivateKey(shortKey, MOCK_PASSWORD) - - expect(result).toBe('') - expect(aes.decrypt).not.toHaveBeenCalled() - }) - - test('When decrypting a valid encrypted key, then it returns the decrypted value', () => { - const validKey = 'encrypted-valid-key'.padEnd(150, 'x') - - const result = keysService.decryptPrivateKey(validKey, MOCK_PASSWORD) - - expect(aes.decrypt).toHaveBeenCalledWith(validKey, MOCK_PASSWORD) - expect(result).toBe( - 'valid-key' + 'x'.repeat(150 - 'encrypted-valid-key'.length), - ) - }) - - test('When decryption fails, then an error indicating so is thrown', () => { - const corruptedKey = 'corrupted-key'.padEnd(150, 'x') - - expect(() => - keysService.decryptPrivateKey(corruptedKey, MOCK_PASSWORD), - ).toThrow(CorruptedEncryptedPrivateKeyError) - }) - }) - - describe('Check if the private key is valid', () => { - test('When key was encrypted with wrong iterations, then an error indicating so is thrown', async () => { - vi.mocked(aes.decrypt).mockImplementationOnce(() => 'should-not-work') - - await expect( - keysService.assertPrivateKeyIsValid('some-key', MOCK_PASSWORD), - ).rejects.toThrow(WrongIterationsToEncryptPrivateKeyError) - - expect(aes.decrypt).toHaveBeenCalledWith('some-key', MOCK_PASSWORD, 9999) - }) - - test('When decryption fails, then an error indicating so is thrown', async () => { - vi.mocked(aes.decrypt).mockImplementationOnce( - (_data, _password, iterations) => { - if (iterations === 9999) throw new Error('Expected error') - return 'should-not-reach' - }, - ) - - vi.spyOn(keysService, 'decryptPrivateKey').mockImplementationOnce(() => { - throw new CorruptedEncryptedPrivateKeyError() - }) - - await expect( - keysService.assertPrivateKeyIsValid('corrupted-key', MOCK_PASSWORD), - ).rejects.toThrow(CorruptedEncryptedPrivateKeyError) - }) - - test('When decrypted key has invalid format, then an error indicating so is thrown', async () => { - vi.mocked(aes.decrypt).mockImplementationOnce( - (_data, _password, iterations) => { - if (iterations === 9999) throw new Error('Expected error') - return 'invalid-format-key' - }, - ) - - vi.spyOn(keysService, 'isValidKey').mockResolvedValueOnce(false) - - await expect( - keysService.assertPrivateKeyIsValid( - 'encrypted-invalid-format', - MOCK_PASSWORD, - ), - ).rejects.toThrow(BadEncodedPrivateKeyError) - }) - }) - - describe('Validating keys', () => { - test('When decrypted message does not match the original, then an error indicating so is thrown', async () => { - const mockOpenpgp = await pgpService.getOpenpgp() - vi.mocked(mockOpenpgp.decrypt).mockResolvedValueOnce({ - data: 'wrong-message', - } as unknown as DecryptMessageResult & { data: WebStream }) - - await expect( - keysService.assertValidateKeys('private-key', 'public-key'), - ).rejects.toThrow(KeysDoNotMatchError) - }) - }) -}) diff --git a/src/services/crypto/keys.service.ts b/src/services/crypto/keys.service.ts deleted file mode 100644 index 5801e1d..0000000 --- a/src/services/crypto/keys.service.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { aes } from '@internxt/lib' -import { type Keys } from '@internxt/sdk' -import { type UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' -import * as openpgp from 'openpgp' -import { generateNewKeys, getOpenpgp } from './pgp.service' -import { - BadEncodedPrivateKeyError, - CorruptedEncryptedPrivateKeyError, - KeysDoNotMatchError, - WrongIterationsToEncryptPrivateKeyError, -} from './errors/keys.errors' -import { ConfigService } from '../config' - -export interface AesInit { - iv: string - salt: string -} - -export class KeysService { - public static readonly instance: KeysService = new KeysService() - MINIMAL_ENCRYPTED_KEY_LEN = 129 - - private getAesInit(): { iv: string; salt: string } { - return { - iv: ConfigService.instance.getVariable('MAGIC_IV'), - salt: ConfigService.instance.getVariable('MAGIC_SALT'), - } - } - - public async getKeys(password: string): Promise { - const { - privateKeyArmored, - publicKeyArmored, - revocationCertificate, - publicKyberKeyBase64, - privateKyberKeyBase64, - } = await generateNewKeys() - const encPrivateKey = aes.encrypt( - privateKeyArmored, - password, - this.getAesInit(), - ) - const encPrivateKyberKey = aes.encrypt( - privateKyberKeyBase64, - password, - this.getAesInit(), - ) - - const keys: Keys = { - privateKeyEncrypted: encPrivateKey, - publicKey: publicKeyArmored, - revocationCertificate: revocationCertificate, - ecc: { - privateKeyEncrypted: encPrivateKey, - publicKey: publicKeyArmored, - }, - kyber: { - publicKey: publicKyberKeyBase64, - privateKeyEncrypted: encPrivateKyberKey, - }, - } - return keys - } - - public parseAndDecryptUserKeys( - user: UserSettings, - password: string, - ): { - publicKey: string - privateKey: string - publicKyberKey: string - privateKyberKey: string - } { - const decryptedPrivateKey = this.decryptPrivateKey( - user.privateKey, - password, - ) - const privateKey = user.privateKey - ? Buffer.from(decryptedPrivateKey).toString('base64') - : '' - - let privateKyberKey = '' - if (user.keys?.kyber?.privateKey) { - privateKyberKey = this.decryptPrivateKey( - user.keys.kyber.privateKey, - password, - ) - } - - const publicKey = user.keys?.ecc?.publicKey ?? user.publicKey - const publicKyberKey = user.keys?.kyber?.publicKey ?? '' - - return { publicKey, privateKey, publicKyberKey, privateKyberKey } - } - - /** - * Checks if a private key can be decrypted with a password, otherwise it throws an error - * @param privateKey The encrypted private key - * @param password The password used to encrypt the private key - * @throws {BadEncodedPrivateKeyError} If the PLAIN private key is base64 encoded (known issue introduced in the past) - * @throws {WrongIterationsToEncryptPrivateKeyError} If the ENCRYPTED private key was encrypted using the wrong iterations number (known issue introduced in the past) - * @throws {CorruptedEncryptedPrivateKeyError} If the ENCRYPTED private key is un-decryptable (corrupted) - * @async - */ - public assertPrivateKeyIsValid = async ( - privateKey: string, - password: string, - ): Promise => { - let privateKeyDecrypted: string | undefined - - let badIterations = true - try { - aes.decrypt(privateKey, password, 9999) - } catch { - badIterations = false - } - if (badIterations === true) - throw new WrongIterationsToEncryptPrivateKeyError() - - let badEncrypted = false - try { - privateKeyDecrypted = this.decryptPrivateKey(privateKey, password) - } catch { - badEncrypted = true - } - - let hasValidFormat = false - try { - if (privateKeyDecrypted !== undefined) { - hasValidFormat = await this.isValidKey(privateKeyDecrypted) - } - } catch { - /* no op */ - } - - if (badEncrypted === true) throw new CorruptedEncryptedPrivateKeyError() - if (hasValidFormat === false) throw new BadEncodedPrivateKeyError() - } - - /** - * Encrypts a private key using a password - * @param privateKey The plain private key - * @param password The password to encrypt - * @returns The encrypted private key - **/ - public encryptPrivateKey = (privateKey: string, password: string): string => { - return aes.encrypt(privateKey, password, this.getAesInit()) - } - - /** - * Decrypts a private key using a password - * @param privateKey The encrypted private key - * @param password The password used to encrypt the private key - * @returns The decrypted private key - **/ - public decryptPrivateKey = (privateKey: string, password: string): string => { - if (!privateKey || privateKey.length <= this.MINIMAL_ENCRYPTED_KEY_LEN) - return '' - else { - try { - const result = aes.decrypt(privateKey, password) - return result - } catch { - throw new CorruptedEncryptedPrivateKeyError() - } - } - } - - /** - * Checks if a message encrypted with the public key can be decrypted with a private key, otherwise it throws an error - * @param privateKey The plain private key - * @param publicKey The plain public key - * @throws {KeysDoNotMatchError} If the keys can not be used together to encrypt/decrypt a message - * @async - **/ - public assertValidateKeys = async ( - privateKey: string, - publicKey: string, - ): Promise => { - const openpgp = await getOpenpgp() - const publicKeyArmored = await openpgp.readKey({ armoredKey: publicKey }) - const privateKeyArmored = await openpgp.readPrivateKey({ - armoredKey: privateKey, - }) - - const plainMessage = 'validate-keys' - const originalText = await openpgp.createMessage({ text: plainMessage }) - const encryptedMessage = await openpgp.encrypt({ - message: originalText, - encryptionKeys: publicKeyArmored, - }) - - const decryptedMessage = ( - await openpgp.decrypt({ - message: await openpgp.readMessage({ - armoredMessage: encryptedMessage, - }), - verificationKeys: publicKeyArmored, - decryptionKeys: privateKeyArmored, - }) - ).data - - if (decryptedMessage !== plainMessage) { - throw new KeysDoNotMatchError() - } - } - - /** - * Checks if a pgp key can be read - * @param key The openpgp key to be validated - * @returns True if it can be read, false otherwise - * @async - **/ - public isValidKey = async (key: string): Promise => { - try { - await openpgp.readKey({ armoredKey: key }) - return true - } catch { - return false - } - } - - /** - * Generates pgp keys adding an AES-encrypted private key property by using a password - * @param password The password for encrypting the private key - * @returns The keys { privateKeyArmored, privateKeyArmoredEncrypted, publicKeyArmored, revocationCertificate } - * @async - **/ - public generateNewKeysWithEncrypted = async (password: string) => { - const { privateKey, publicKey, revocationCertificate } = - await openpgp.generateKey({ - userIDs: [{ email: 'inxt@inxt.com' }], - curve: 'ed25519Legacy', - }) - - return { - privateKeyArmored: privateKey, - privateKeyArmoredEncrypted: this.encryptPrivateKey(privateKey, password), - publicKeyArmored: Buffer.from(publicKey).toString('base64'), - revocationCertificate: Buffer.from(revocationCertificate).toString( - 'base64', - ), - } - } -} diff --git a/src/services/crypto/pgp.service.ts b/src/services/crypto/pgp.service.ts deleted file mode 100644 index 932b4bd..0000000 --- a/src/services/crypto/pgp.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import kemBuilder from '@dashlane/pqc-kem-kyber512-browser' -import { Buffer } from 'node:buffer' - -export async function getOpenpgp(): Promise { - return import('openpgp') -} -export async function generateNewKeys(): Promise<{ - privateKeyArmored: string - publicKeyArmored: string - revocationCertificate: string - publicKyberKeyBase64: string - privateKyberKeyBase64: string -}> { - const openpgp = await getOpenpgp() - - const { privateKey, publicKey, revocationCertificate } = - await openpgp.generateKey({ - userIDs: [{ email: 'inxt@inxt.com' }], - curve: 'ed25519Legacy', - }) - - const kem = await kemBuilder() - const { publicKey: publicKyberKey, privateKey: privateKyberKey } = - await kem.keypair() - - return { - privateKeyArmored: privateKey, - publicKeyArmored: Buffer.from(publicKey).toString('base64'), - revocationCertificate: Buffer.from(revocationCertificate).toString( - 'base64', - ), - publicKyberKeyBase64: Buffer.from(publicKyberKey).toString('base64'), - privateKyberKeyBase64: Buffer.from(privateKyberKey).toString('base64'), - } -} From a8faf9613ecd1c27d830e1400922bc2f151a2fec Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:11:36 +0100 Subject: [PATCH 05/12] fix: remove useless services --- src/assets/images/welcome/welcome-image.webp | Bin 344690 -> 0 bytes src/features/welcome/index.tsx | 2 +- src/hooks/useAuth.ts | 4 +- src/routes/index.tsx | 1 - src/services/auth/auth.service.ts | 2 +- src/services/auth/oauth.service.ts | 2 +- src/services/config/config.service.ts | 33 -------- src/services/local-storage.service.ts | 74 ------------------ src/services/payments.service.ts | 23 ------ src/services/sdk.service.ts | 77 ------------------- 10 files changed, 5 insertions(+), 213 deletions(-) delete mode 100644 src/assets/images/welcome/welcome-image.webp delete mode 100644 src/services/config/config.service.ts delete mode 100644 src/services/local-storage.service.ts delete mode 100644 src/services/payments.service.ts delete mode 100644 src/services/sdk.service.ts diff --git a/src/assets/images/welcome/welcome-image.webp b/src/assets/images/welcome/welcome-image.webp deleted file mode 100644 index 745fb255b6b0836c7ff33109025235047966c5bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344690 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
&FWOBPQm7G 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℘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 { const { translate } = useTranslationContext() diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index 7fc6429..2d7c1f1 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { OauthService } from '@/services/auth/oauth.service' -import { LocalStorageService } from '@/services/local-storage.service' -import { PaymentsService } from '@/services/payments.service' +import { LocalStorageService } from '@/services/local-storage' +import { PaymentsService } from '@/services/sdk/payments.service' import type { LoginCredentials } from '@/types' interface UseWebAuthProps { diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 868e31a..e6ac410 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,7 +1,6 @@ import { type RouteObject, Navigate } from 'react-router-dom' import { lazy } from 'react' import RootLayout from '@/routes/layouts/RootLayout' -import WelcomePage from '@/features/welcome' const WelcomePage = lazy(() => import('@/features/welcome')) const MailView = lazy(() => import('@/features/mail/MailView')) diff --git a/src/services/auth/auth.service.ts b/src/services/auth/auth.service.ts index 0a3105f..64cf358 100644 --- a/src/services/auth/auth.service.ts +++ b/src/services/auth/auth.service.ts @@ -1,4 +1,4 @@ -import { SdkManager } from '../sdk.service' +import { SdkManager } from '../sdk' export class AuthService { public static readonly instance: AuthService = new AuthService() diff --git a/src/services/auth/oauth.service.ts b/src/services/auth/oauth.service.ts index 96d604d..6a066b1 100644 --- a/src/services/auth/oauth.service.ts +++ b/src/services/auth/oauth.service.ts @@ -8,7 +8,7 @@ import { type WebAuthParams, } from '@/types' import { AuthService } from './auth.service' -import { ConfigService } from '../config/config.service' +import { ConfigService } from '../config' export class OauthService { public static readonly instance: OauthService = new OauthService() diff --git a/src/services/config/config.service.ts b/src/services/config/config.service.ts deleted file mode 100644 index 8891e65..0000000 --- a/src/services/config/config.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { VariableNotFoundError } from './config.errors' - -interface ConfigKeys { - DRIVE_API_URL: string - MAIL_API_URL: string - PAYMENTS_API_URL: string - CRYPTO_SECRET: string - MAGIC_IV: string - MAGIC_SALT: string -} - -const configKeys: ConfigKeys = { - DRIVE_API_URL: 'VITE_DRIVE_API_URL', - MAIL_API_URL: 'VITE_MAIL_API_URL', - PAYMENTS_API_URL: 'VITE_PAYMENTS_API_URL', - CRYPTO_SECRET: 'VITE_CRYPTO_SECRET', - MAGIC_IV: 'VITE_MAGIC_IV', - MAGIC_SALT: 'VITE_MAGIC_SALT', -} - -export class ConfigService { - public static readonly instance: ConfigService = new ConfigService() - - public getVariable = (key: keyof ConfigKeys): string => { - const value = import.meta.env[configKeys[key]] - if (!value) throw new VariableNotFoundError(key) - return value - } - - public isProduction = (): boolean => { - return import.meta.env.PROD - } -} diff --git a/src/services/local-storage.service.ts b/src/services/local-storage.service.ts deleted file mode 100644 index 0763d36..0000000 --- a/src/services/local-storage.service.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' -import type { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings' - -const LocalStorageKeys = { - xUser: 'xUser', - xNewToken: 'xNewToken', -} - -export class LocalStorageService { - public static readonly instance = new LocalStorageService() - - set(key: string, value: string) { - localStorage.setItem(key, value) - } - - get(key: string): string | null { - return localStorage.getItem(key) - } - - remove(key: string) { - localStorage.removeItem(key) - } - - clear() { - localStorage.clear() - } - - setUser(user: UserSettings) { - localStorage.setItem(LocalStorageKeys.xUser, JSON.stringify(user)) - } - - getUser(): UserSettings | null { - const user = localStorage.getItem(LocalStorageKeys.xUser) - return user ? JSON.parse(user) : null - } - - setToken(token: string) { - localStorage.setItem(LocalStorageKeys.xNewToken, token) - } - - getToken(): string | null { - return localStorage.getItem(LocalStorageKeys.xNewToken) - } - - setMnemonic(mnemonic: string) { - localStorage.setItem('xMnemonic', mnemonic) - } - - getMnemonic(): string | null { - return localStorage.getItem('xMnemonic') - } - - setSubscription(subscription: UserSubscription) { - localStorage.setItem('xSubscription', JSON.stringify(subscription)) - } - - getSubscription(): UserSubscription | null { - const subscription = localStorage.getItem('xSubscription') - return subscription ? JSON.parse(subscription) : null - } - - saveCredentials(user: UserSettings, mnemonic: string, token: string) { - this.setUser(user) - this.setMnemonic(mnemonic) - this.setToken(token) - } - - clearCredentials() { - localStorage.removeItem('xUser') - localStorage.removeItem('xNewToken') - localStorage.removeItem('xSubscription') - localStorage.removeItem('xMnemonic') - } -} diff --git a/src/services/payments.service.ts b/src/services/payments.service.ts deleted file mode 100644 index cc0e8a2..0000000 --- a/src/services/payments.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { type Tier } from '@internxt/sdk/dist/drive/payments/types/tiers' -import { type UserSubscription } from '@internxt/sdk/dist/drive/payments/types/types' -import { SdkManager } from './sdk.service' - -export class PaymentsService { - public static readonly instance: PaymentsService = new PaymentsService() - - /** - * Gets the user's tier information. - * This includes meeting availability, plan name, and all other service features. - * - * @returns Promise The complete tier information - */ - public getUserTier = async (): Promise => { - const paymentsClient = SdkManager.instance.getPayments() - return paymentsClient.getUserTier() - } - - public getUserSubscription = async (): Promise => { - const paymentsClient = SdkManager.instance.getPayments() - return paymentsClient.getUserSubscription() - } -} diff --git a/src/services/sdk.service.ts b/src/services/sdk.service.ts deleted file mode 100644 index 86d2b91..0000000 --- a/src/services/sdk.service.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Auth, Drive } from '@internxt/sdk' -import type { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared' -import packageJson from '../../package.json' -import { ConfigService } from './config/config.service' -import { LocalStorageService } from './local-storage.service' - -export type SdkManagerApiSecurity = ApiSecurity & { newToken: string } - -export class SdkManager { - public static readonly instance: SdkManager = new SdkManager() - private static apiSecurity?: SdkManagerApiSecurity - private readonly localStorage = LocalStorageService - - public static readonly init = (apiSecurity: SdkManagerApiSecurity) => { - SdkManager.apiSecurity = apiSecurity - } - - public static readonly clean = () => { - SdkManager.apiSecurity = undefined - } - - public static readonly getApiSecurity = ( - config = { throwErrorOnMissingCredentials: true }, - ): SdkManagerApiSecurity => { - if (!SdkManager.apiSecurity && config.throwErrorOnMissingCredentials) - throw new Error('Api security properties not found in SdkManager') - - return SdkManager.apiSecurity as SdkManagerApiSecurity - } - - private getNewTokenApiSecurity(): ApiSecurity { - return { - token: this.localStorage.instance?.getToken() ?? '', - unauthorizedCallback: () => { - if (this.localStorage.instance) { - this.localStorage.instance.clearCredentials() - } - }, - } - } - - public static readonly getAppDetails = (): AppDetails => { - return { - clientName: packageJson.name, - clientVersion: packageJson.version, - } - } - - getNewAuth() { - const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL') - - const apiSecurity = SdkManager.getApiSecurity({ - throwErrorOnMissingCredentials: false, - }) - const appDetails = SdkManager.getAppDetails() - - return Auth.client(driveApi, appDetails, apiSecurity) - } - - getUsers() { - const driveApi = ConfigService.instance.getVariable('DRIVE_API_URL') - - const apiSecurity = this.getNewTokenApiSecurity() - const appDetails = SdkManager.getAppDetails() - - return Drive.Users.client(driveApi, appDetails, apiSecurity) - } - - getPayments() { - const paymentsApi = ConfigService.instance.getVariable('PAYMENTS_API_URL') - - const apiSecurity = this.getNewTokenApiSecurity() - const appDetails = SdkManager.getAppDetails() - - return Drive.Payments.client(paymentsApi, appDetails, apiSecurity) - } -} From 1743bbee9c72b343f367808333c0565f1870ffe0 Mon Sep 17 00:00:00 2001 From: Xavier Abad <77491413+xabg2@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:49:18 +0100 Subject: [PATCH 06/12] fix: remove useless code --- package.json | 3 -- src/features/welcome/index.tsx | 23 ++++++-- src/hooks/useAuth.ts | 41 +++++--------- src/services/auth/auth.service.ts | 53 ------------------- src/services/oauth/errors/oauth.errors.ts | 33 ++++++++++++ src/services/{auth => oauth}/oauth.service.ts | 45 ++++++++-------- src/services/user/user.service.ts | 28 ++++++++++ src/types/index.ts | 5 +- yarn.lock | 22 -------- 9 files changed, 120 insertions(+), 133 deletions(-) delete mode 100644 src/services/auth/auth.service.ts create mode 100644 src/services/oauth/errors/oauth.errors.ts rename src/services/{auth => oauth}/oauth.service.ts (88%) create mode 100644 src/services/user/user.service.ts diff --git a/package.json b/package.json index c2971b6..cba8e94 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,7 @@ "test:coverage": "vitest run --coverage" }, "dependencies": { - "@dashlane/pqc-kem-kyber512-browser": "^1.0.0", "@internxt/css-config": "^1.1.0", - "@internxt/lib": "^1.4.1", "@internxt/sdk": "^1.15.1", "@internxt/ui": "^0.1.9", "@phosphor-icons/react": "^2.1.10", @@ -34,7 +32,6 @@ "@tiptap/starter-kit": "^3.20.0", "dayjs": "^1.11.19", "i18next": "^25.8.13", - "openpgp": "^6.3.0", "react": "^19.2.0", "react-dom": "^19.2.0", "react-i18next": "^16.5.4", diff --git a/src/features/welcome/index.tsx b/src/features/welcome/index.tsx index 2318bed..fcab03d 100644 --- a/src/features/welcome/index.tsx +++ b/src/features/welcome/index.tsx @@ -1,10 +1,23 @@ import { Button } from '@internxt/ui' -import { useTranslationContext } from '@/i18n' import smallLogo from '../../assets/logos/small-logo.svg' import MailAppImage from '../../assets/images/welcome/welcome-page.webp' +import { useTranslationContext } from '@/i18n' +import { useAuth } from '@/hooks/useAuth' +import { useNavigation } from '@/hooks/useNavigation' const WelcomePage = () => { const { translate } = useTranslationContext() + const { goTo } = useNavigation() + + const handleOnLogin = () => { + console.log('onLogin') + goTo('/inbox') + } + + const { handleWebLogin, handleWebSignup } = useAuth({ + onLogin: handleOnLogin, + translate, + }) return (
@@ -15,8 +28,12 @@ const WelcomePage = () => {

{translate('meet')}

- - + +